From 2c80e2e02cc27a32bd17b31417088ca52d4c2636 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 22 Jul 2016 15:25:03 -0700 Subject: [PATCH 001/338] 0.7.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 51ee1695f..1dd8fb25a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.0", + "version": "0.7.1", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 413bc7902a63a7676044d994ebf04e2abed07413 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 22 Jul 2016 15:25:58 -0700 Subject: [PATCH 002/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d058acfd8..14b588254 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,7 @@ # Change Log -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) - -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.0...HEAD) +## [v0.7.1](https://github.com/shelljs/shelljs/tree/v0.7.1) (2016-07-22) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.0...v0.7.1) **Closed issues:** From 3367e0c6c709c77dbcd2b498efaf54678dd1ec05 Mon Sep 17 00:00:00 2001 From: Shubham Joshi Date: Sat, 23 Jul 2016 04:19:09 +0530 Subject: [PATCH 003/338] feat(command): new command: uniq() (#453) * Added uniq.js, need to add tests * Added basic tests for uniq.js * Implemented uniq and added tests * Generated docs for uniq * Fixed lint error * Added suport for -c and -d to uniq * Generated docs * Fixed formatting errors. Uniq now correctly returns empty string when output is specified * Added uniq to piped methods * Improved comment legibility * Cleaned up the pipeline * Added pipe test for uniq * Converted uniq pipe test file to use linux line endings * Fixed linting errors --- README.md | 18 ++++++++ shell.js | 4 ++ src/uniq.js | 76 ++++++++++++++++++++++++++++++++++ test/pipe.js | 5 +++ test/resources/uniq/file1 | 4 ++ test/resources/uniq/file1c | 3 ++ test/resources/uniq/file1d | 1 + test/resources/uniq/file1t | 3 ++ test/resources/uniq/file1u | 3 ++ test/resources/uniq/file2 | 4 ++ test/resources/uniq/file2u | 3 ++ test/resources/uniq/file3 | 3 ++ test/resources/uniq/pipe | 50 ++++++++++++++++++++++ test/resources/uniq/pipeSorted | 3 ++ test/uniq.js | 67 ++++++++++++++++++++++++++++++ 15 files changed, 247 insertions(+) create mode 100644 src/uniq.js create mode 100644 test/resources/uniq/file1 create mode 100644 test/resources/uniq/file1c create mode 100644 test/resources/uniq/file1d create mode 100644 test/resources/uniq/file1t create mode 100644 test/resources/uniq/file1u create mode 100644 test/resources/uniq/file2 create mode 100644 test/resources/uniq/file2u create mode 100644 test/resources/uniq/file3 create mode 100644 test/resources/uniq/pipe create mode 100644 test/resources/uniq/pipeSorted create mode 100644 test/uniq.js diff --git a/README.md b/README.md index adf0a0e91..0f4e646c9 100644 --- a/README.md +++ b/README.md @@ -406,6 +406,24 @@ Return the contents of the files, sorted line-by-line. Sorting multiple files mixes their content, just like unix sort does. +### uniq([options,] [input, [output]]) +Available options: + ++ `-i`: Ignore case while comparing ++ `-c`: Prefix lines by the number of occurrences ++ `-d`: Only print duplicate lines, one for each group of identical lines + +Examples: + +```javascript +uniq('foo.txt'); +uniq('-i', 'foo.txt'); +uniq('-cd', 'foo.txt', 'bar.txt'); +``` + +Filter adjacent matching lines from input + + ### grep([options,] regex_filter, file [, file ...]) ### grep([options,] regex_filter, file_array) Available options: diff --git a/shell.js b/shell.js index c1449b661..027fbb1b5 100644 --- a/shell.js +++ b/shell.js @@ -79,6 +79,10 @@ require('./src/sed'); //@include ./src/sort require('./src/sort'); +//@include ./src/uniq +var _uniq = require('./src/uniq'); +exports.uniq = common.wrap('uniq', _uniq, {idx: 1, canReceivePipe: true}); + //@include ./src/grep require('./src/grep'); diff --git a/src/uniq.js b/src/uniq.js new file mode 100644 index 000000000..ae7cd2510 --- /dev/null +++ b/src/uniq.js @@ -0,0 +1,76 @@ +var common = require('./common'); +var fs = require('fs'); + +//add c spaces to the left of str +function lpad(c, str){ + var res = '' + str; + if(res.length < c){ + res = Array((c-res.length)+1).join(' ') + res; + } + return res; +} + +//@ +//@ ### uniq([options,] [input, [output]]) +//@ Available options: +//@ +//@ + `-i`: Ignore case while comparing +//@ + `-c`: Prefix lines by the number of occurrences +//@ + `-d`: Only print duplicate lines, one for each group of identical lines +//@ +//@ Examples: +//@ +//@ ```javascript +//@ uniq('foo.txt'); +//@ uniq('-i', 'foo.txt'); +//@ uniq('-cd', 'foo.txt', 'bar.txt'); +//@ ``` +//@ +//@ Filter adjacent matching lines from input +function _uniq(options, input, output) { + options = common.parseOptions(options, { + 'i': 'ignoreCase', + 'c': 'count', + 'd': 'duplicates' + }); + + // Check if this is coming from a pipe + var pipe = common.readFromPipe(this); + + if (!input && !pipe) + common.error('no input given'); + + var lines = (input ? fs.readFileSync(input, 'utf8') : pipe). + trimRight(). + split(/\r*\n/); + + var compare = function(a, b){ + return options.ignoreCase ? + a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase()) : + a.localeCompare(b); + }; + var uniqed = lines.reduceRight(function(res, e){ + //Perform uniq -c on the input + return res.length === 0 ? [{count: 1, ln: e}] : + (compare(res[0].ln,e) === 0 ? + [{count: res[0].count + 1, ln: e}].concat(res.slice(1)) : + [{count: 1, ln: e}].concat(res)); + }, []).filter(function(obj){ + //Do we want only duplicated objects? + return options.duplicates ? obj.count > 1 : true; + }).map(function(obj){ + //Are we tracking the counts of each line? + return (options.count ? (lpad(7,obj.count) + ' ') : '') + obj.ln; + }).join('\n') + '\n'; + + var res = new common.ShellString(uniqed, common.state.error, common.state.errorCode); + if(output){ + res.to(output); + //if uniq writes to output, nothing is passed to the next command in the pipeline (if any) + return new common.ShellString('', common.state.error, common.state.errorCode); + }else{ + return res; + } +} + +module.exports = _uniq; diff --git a/test/pipe.js b/test/pipe.js index 5bc273942..44ea1a723 100644 --- a/test/pipe.js +++ b/test/pipe.js @@ -44,6 +44,11 @@ var result = shell.cat('resources/grep/file').sed(/l*\.js/, ''); assert.ok(!shell.error()); assert.equal(result.toString(), 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n'); +//Sort a file by frequency of each line +result = shell.sort('resources/uniq/pipe').uniq('-c').sort('-n'); +assert.equal(shell.error(), null); +assert.equal(result.toString(), shell.cat('resources/uniq/pipeSorted').toString()); + // Synchronous exec // TODO: add windows tests if (process.platform !== 'win32') { diff --git a/test/resources/uniq/file1 b/test/resources/uniq/file1 new file mode 100644 index 000000000..8687fd613 --- /dev/null +++ b/test/resources/uniq/file1 @@ -0,0 +1,4 @@ +foo +bar +bar +baz diff --git a/test/resources/uniq/file1c b/test/resources/uniq/file1c new file mode 100644 index 000000000..7162bb424 --- /dev/null +++ b/test/resources/uniq/file1c @@ -0,0 +1,3 @@ + 1 foo + 2 bar + 1 baz diff --git a/test/resources/uniq/file1d b/test/resources/uniq/file1d new file mode 100644 index 000000000..5716ca598 --- /dev/null +++ b/test/resources/uniq/file1d @@ -0,0 +1 @@ +bar diff --git a/test/resources/uniq/file1t b/test/resources/uniq/file1t new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/test/resources/uniq/file1t @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/test/resources/uniq/file1u b/test/resources/uniq/file1u new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/test/resources/uniq/file1u @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/test/resources/uniq/file2 b/test/resources/uniq/file2 new file mode 100644 index 000000000..2bf57bbeb --- /dev/null +++ b/test/resources/uniq/file2 @@ -0,0 +1,4 @@ +foo +bar +Bar +baz diff --git a/test/resources/uniq/file2u b/test/resources/uniq/file2u new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/test/resources/uniq/file2u @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/test/resources/uniq/file3 b/test/resources/uniq/file3 new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/test/resources/uniq/file3 @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/test/resources/uniq/pipe b/test/resources/uniq/pipe new file mode 100644 index 000000000..b7eb19584 --- /dev/null +++ b/test/resources/uniq/pipe @@ -0,0 +1,50 @@ +bar +foo +foo +baz +foo +foo +bar +foo +baz +baz +foo +baz +baz +baz +bar +baz +bar +bar +baz +bar +baz +foo +baz +foo +baz +foo +bar +baz +bar +bar +bar +foo +foo +foo +foo +baz +foo +baz +foo +foo +bar +foo +foo +bar +foo +foo +baz +foo +foo +foo diff --git a/test/resources/uniq/pipeSorted b/test/resources/uniq/pipeSorted new file mode 100644 index 000000000..0e1845d37 --- /dev/null +++ b/test/resources/uniq/pipeSorted @@ -0,0 +1,3 @@ + 12 bar + 15 baz + 23 foo diff --git a/test/uniq.js b/test/uniq.js new file mode 100644 index 000000000..8a2d960a7 --- /dev/null +++ b/test/uniq.js @@ -0,0 +1,67 @@ +var shell = require('..'); + +var assert = require('assert'), + fs = require('fs'); + +shell.config.silent = true; + +shell.rm('-rf', 'tmp'); +shell.mkdir('tmp'); + +var result; + +// +// Invalids +// + +result = shell.uniq(); +assert.ok(shell.error()); +assert.ok(result.code); + +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +result = shell.sort('/adsfasdf'); // file does not exist +assert.ok(shell.error()); +assert.ok(result.code); + +// +//Valids +// + +//uniq file1 +result = shell.uniq('resources/uniq/file1'); +assert.equal(shell.error(), null); +assert.equal(result.code, 0); +assert.equal(result + '', shell.cat('resources/uniq/file1u').toString()); + +//uniq -i file2 +result = shell.uniq('-i', 'resources/uniq/file2'); +assert.equal(shell.error(), null); +assert.equal(result.code, 0); +assert.equal(result + '', shell.cat('resources/uniq/file2u').toString()); + +//uniq file1 file2 +shell.uniq('resources/uniq/file1', 'resources/uniq/file1t'); +assert.equal(shell.error(), null); +assert.equal(result.code, 0); +assert.equal(shell.cat('resources/uniq/file1u').toString(), + shell.cat('resources/uniq/file1t').toString()); + +//cat file1 |uniq +result = shell.cat('resources/uniq/file1').uniq(); +assert.equal(shell.error(), null); +assert.equal(result.code, 0); +assert.equal(result + '', shell.cat('resources/uniq/file1u').toString()); + +//uniq -c file1 +result = shell.uniq('-c', 'resources/uniq/file1'); +assert.equal(shell.error(), null); +assert.equal(result.code, 0); +assert.equal(result + '', shell.cat('resources/uniq/file1c').toString()); + +//uniq -d file1 +result = shell.uniq('-d', 'resources/uniq/file1'); +assert.equal(shell.error(), null); +assert.equal(result.code, 0); +assert.equal(result + '', shell.cat('resources/uniq/file1d').toString()); + +shell.exit(123); From bd6f96db33963c595cf730a3d6b643bf8cdbbf71 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 23 Jul 2016 10:56:26 -0700 Subject: [PATCH 004/338] refactor: hook new uniq() command using new format (#478) --- shell.js | 3 +-- src/uniq.js | 2 ++ test/uniq.js | 6 ++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/shell.js b/shell.js index 027fbb1b5..83e2dbda5 100644 --- a/shell.js +++ b/shell.js @@ -80,8 +80,7 @@ require('./src/sed'); require('./src/sort'); //@include ./src/uniq -var _uniq = require('./src/uniq'); -exports.uniq = common.wrap('uniq', _uniq, {idx: 1, canReceivePipe: true}); +require('./src/uniq'); //@include ./src/grep require('./src/grep'); diff --git a/src/uniq.js b/src/uniq.js index ae7cd2510..65bb51e0d 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -10,6 +10,8 @@ function lpad(c, str){ return res; } +common.register('uniq', _uniq, {globStart: 1, canReceivePipe: true}); + //@ //@ ### uniq([options,] [input, [output]]) //@ Available options: diff --git a/test/uniq.js b/test/uniq.js index 8a2d960a7..d4c448cd6 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -39,6 +39,12 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result + '', shell.cat('resources/uniq/file2u').toString()); +// with glob character +result = shell.uniq('-i', 'resources/uniq/fi?e2'); +assert.equal(shell.error(), null); +assert.equal(result.code, 0); +assert.equal(result + '', shell.cat('resources/uniq/file2u').toString()); + //uniq file1 file2 shell.uniq('resources/uniq/file1', 'resources/uniq/file1t'); assert.equal(shell.error(), null); From 39fd6d1ed7f9c23d3f8ad01a85047d7e8ced333f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 23 Jul 2016 16:21:59 -0700 Subject: [PATCH 005/338] Fix mkdir malformed path (#477) * Added recurs. mkdir dirname() failure check. Prevents an infinite loop with malformed UNCs and/or permission problems. * Now call common.error() instead of throwing (mkdir). * refactor: clean up style --- src/mkdir.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mkdir.js b/src/mkdir.js index 7a5036387..1ab76d530 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -8,6 +8,13 @@ common.register('mkdir', _mkdir, {globStart: 1}); function mkdirSyncRecursive(dir) { var baseDir = path.dirname(dir); + // Prevents some potential problems arising from malformed UNCs or + // insufficient permissions. + /* istanbul ignore next */ + if(baseDir === dir) { + common.error("dirname() failed: [" + dir + "]"); + } + // Base dir exists, no recursion necessary if (fs.existsSync(baseDir)) { fs.mkdirSync(dir, parseInt('0777', 8)); From 7b984e1c25d0c20c9746664c752126ff7ab634f4 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 24 Jul 2016 16:58:45 -0700 Subject: [PATCH 006/338] fix: mkdir for invalid perms does not kill process (#474) * fix: mkdir for invalid perms does not kill process * Re-throw exception in case it isn't `EACCES` --- src/mkdir.js | 15 +++++++++++---- test/mkdir.js | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/mkdir.js b/src/mkdir.js index 1ab76d530..5c51afd16 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -71,10 +71,17 @@ function _mkdir(options, dirs) { return; // skip dir } - if (options.fullpath) - mkdirSyncRecursive(dir); - else - fs.mkdirSync(dir, parseInt('0777', 8)); + try { + if (options.fullpath) + mkdirSyncRecursive(dir); + else + fs.mkdirSync(dir, parseInt('0777', 8)); + } catch (e) { + if (e.code === 'EACCES') + common.error('cannot create directory ' + dir + ': Permission denied'); + else + throw e; + } }); return new common.ShellString('', common.state.error, common.state.errorCode); } // mkdir diff --git a/test/mkdir.js b/test/mkdir.js index 7d51af29e..14511c8e7 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -41,6 +41,21 @@ assert.equal(result.stderr, 'mkdir: no such file or directory: /asdfasdf'); assert.equal(fs.existsSync('/asdfasdf'), false); assert.equal(fs.existsSync('/asdfasdf/foobar'), false); +// Check for invalid permissions +if (process.platform !== 'win32') { + // This test case only works on unix, but should work on Windows as well + var dirName = 'nowritedir'; + shell.mkdir(dirName); + assert.ok(!shell.error()); + shell.chmod('-w', dirName); + result = shell.mkdir(dirName + '/foo'); + assert.equal(result.code, 1); + assert.equal(result.stderr, 'mkdir: cannot create directory nowritedir/foo: Permission denied'); + assert.ok(shell.error()); + assert.equal(fs.existsSync(dirName + '/foo'), false); + shell.rm('-rf', dirName); // clean up +} + // // Valids // From 880d732611954e1d425fef2fdd1fb30c9e79b16e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 24 Jul 2016 17:52:28 -0700 Subject: [PATCH 007/338] fix: resolve a cylcic-dependency problem (#482) If a plugin was imported before the ShellJS instance was created, the program would crash (common.register wouldn't be instantiated yet). Now plugins can be imported either before or after the ShellJS instance is created. --- shell.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/shell.js b/shell.js index 83e2dbda5..5f8db2e00 100644 --- a/shell.js +++ b/shell.js @@ -6,7 +6,13 @@ // http://github.com/arturadib/shelljs // -var common = require('./src/common'); +var commonPath = './src/common'; +var common = require(commonPath); +if (!common.register) { + // If this isn't defined yet, we haven't fully finished loading ./src/common + delete require.cache[require.resolve(commonPath)]; + common = require(commonPath); +} //@ //@ All commands run synchronously, unless otherwise stated. From e438e61f453760b37de9727cf1e824d2f68686bb Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 24 Jul 2016 17:52:51 -0700 Subject: [PATCH 008/338] refactor: move option parsing into common.wrap() (#479) * refactor: move option parsing into common.wrap() * docs: update README --- README.md | 12 ++++++++---- src/common.js | 9 ++++++++- src/cp.js | 19 +++++++++---------- src/find.js | 2 +- src/grep.js | 14 ++++++++------ src/head.js | 17 +++++++++++------ src/ln.js | 13 +++++++------ src/ls.js | 20 +++++++++++--------- src/mkdir.js | 10 ++++++---- src/mv.js | 13 +++++++------ src/rm.js | 14 ++++++++------ src/sed.js | 12 +++++++----- src/sort.js | 15 +++++++++------ src/tail.js | 17 +++++++++++------ src/test.js | 27 ++++++++++++++------------- src/touch.js | 19 ++++++++++--------- src/uniq.js | 16 +++++++++------- 17 files changed, 144 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index 0f4e646c9..4a64329f3 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,9 @@ introduced between each file). ### head([{'-n', \},] file [, file ...]) ### head([{'-n', \},] file_array) +Available options: + ++ `-n `: Show the first `` lines of the files Examples: @@ -327,12 +330,14 @@ var str = head('file1', 'file2'); var str = head(['file1', 'file2']); // same as above ``` -Output the first 10 lines of a file (or the first `` if `-n` is -specified) +Read the start of a file. ### tail([{'-n', \},] file [, file ...]) ### tail([{'-n', \},] file_array) +Available options: + ++ `-n `: Show the last `` lines of the files Examples: @@ -342,8 +347,7 @@ var str = tail('file1', 'file2'); var str = tail(['file1', 'file2']); // same as above ``` -Output the last 10 lines of a file (or the last `` if `-n` is -specified) +Read the end of a file. ### ShellString.prototype.to(file) diff --git a/src/common.js b/src/common.js index 3986d4212..a154431a5 100644 --- a/src/common.js +++ b/src/common.js @@ -315,9 +315,16 @@ function wrap(cmd, fn, options) { // Perform glob-expansion on all arguments after globStart, but preserve // the arguments before it (like regexes for sed and grep) - if (!config.noglob && typeof options.globStart === 'number') + if (!config.noglob && typeof options.globStart === 'number') { args = args.slice(0, options.globStart).concat(expand(args.slice(options.globStart))); + } + try { + // parse options if options are provided + if (typeof options.cmdOptions === 'object') { + args[0] = parseOptions(args[0], options.cmdOptions); + } + retValue = fn.apply(this, args); } catch (e) { if (e.msg === 'earlyExit') diff --git a/src/cp.js b/src/cp.js index d124c4835..133fe08e1 100644 --- a/src/cp.js +++ b/src/cp.js @@ -3,7 +3,15 @@ var path = require('path'); var common = require('./common'); var os = require('os'); -common.register('cp', _cp, {globStart: 1}); +common.register('cp', _cp, {globStart: 1, cmdOptions: { + 'f': '!no_force', + 'n': 'no_force', + 'R': 'recursive', + 'r': 'recursive', + 'L': 'followsymlink', + 'P': 'noFollowsymlink', + } +}); // Buffered file copy, synchronous // (Using readFileSync() + writeFileSync() could easily cause a memory overflow @@ -173,15 +181,6 @@ function cpcheckcycle(sourceDir, srcFile) { //@ //@ Copies files. function _cp(options, sources, dest) { - options = common.parseOptions(options, { - 'f': '!no_force', - 'n': 'no_force', - 'R': 'recursive', - 'r': 'recursive', - 'L': 'followsymlink', - 'P': 'noFollowsymlink', - }); - // If we're missing -R, it actually implies -L (unless -P is explicit) if (options.followsymlink) options.noFollowsymlink = false; diff --git a/src/find.js b/src/find.js index 4069525b1..a13e23e24 100644 --- a/src/find.js +++ b/src/find.js @@ -42,7 +42,7 @@ function _find(options, paths) { pushFile(file); if (fs.statSync(file).isDirectory()) { - _ls('-RA', file).forEach(function(subfile) { + _ls({recursive: true, all: true}, file).forEach(function(subfile) { pushFile(path.join(file, subfile)); }); } diff --git a/src/grep.js b/src/grep.js index 3a3f5ca08..09787e623 100644 --- a/src/grep.js +++ b/src/grep.js @@ -1,7 +1,14 @@ var common = require('./common'); var fs = require('fs'); -common.register('grep', _grep, {globStart: 2, canReceivePipe: true}); // don't glob-expand the regex +common.register('grep', _grep, { + globStart: 2, // don't glob-expand the regex + canReceivePipe: true, + cmdOptions: { + 'v': 'inverse', + 'l': 'nameOnly', + }, +}); //@ //@ ### grep([options,] regex_filter, file [, file ...]) @@ -21,11 +28,6 @@ common.register('grep', _grep, {globStart: 2, canReceivePipe: true}); // don't g //@ Reads input string from given files and returns a string containing all lines of the //@ file that match the given `regex_filter`. function _grep(options, regex, files) { - options = common.parseOptions(options, { - 'v': 'inverse', - 'l': 'nameOnly' - }); - // Check if this is coming from a pipe var pipe = common.readFromPipe(this); diff --git a/src/head.js b/src/head.js index 305f92788..baf7972b3 100644 --- a/src/head.js +++ b/src/head.js @@ -1,7 +1,13 @@ var common = require('./common'); var fs = require('fs'); -common.register('head', _head, {globStart: 1, canReceivePipe: true}); +common.register('head', _head, { + globStart: 1, + canReceivePipe: true, + cmdOptions: { + 'n': 'numLines', + }, +}); // This reads n or more lines, or the entire file, whichever is less. function readSomeLines(file, numLines) { @@ -33,6 +39,9 @@ function readSomeLines(file, numLines) { //@ //@ ### head([{'-n', \},] file [, file ...]) //@ ### head([{'-n', \},] file_array) +//@ Available options: +//@ +//@ + `-n `: Show the first `` lines of the files //@ //@ Examples: //@ @@ -42,12 +51,8 @@ function readSomeLines(file, numLines) { //@ var str = head(['file1', 'file2']); // same as above //@ ``` //@ -//@ Output the first 10 lines of a file (or the first `` if `-n` is -//@ specified) +//@ Read the start of a file. function _head(options, files) { - options = common.parseOptions(options, { - 'n': 'numLines' - }); var head = []; var pipe = common.readFromPipe(this); diff --git a/src/ln.js b/src/ln.js index cdf15ca5c..6b11fc465 100644 --- a/src/ln.js +++ b/src/ln.js @@ -2,7 +2,13 @@ var fs = require('fs'); var path = require('path'); var common = require('./common'); -common.register('ln', _ln, {globStart: 1}); +common.register('ln', _ln, { + globStart: 1, + cmdOptions: { + 's': 'symlink', + 'f': 'force', + }, +}); //@ //@ ### ln([options,] source, dest) @@ -20,11 +26,6 @@ common.register('ln', _ln, {globStart: 1}); //@ //@ Links source to dest. Use -f to force the link, should dest already exist. function _ln(options, source, dest) { - options = common.parseOptions(options, { - 's': 'symlink', - 'f': 'force' - }); - if (!source || !dest) { common.error('Missing and/or '); } diff --git a/src/ls.js b/src/ls.js index fc4c767e1..d39506aff 100644 --- a/src/ls.js +++ b/src/ls.js @@ -5,7 +5,17 @@ var glob = require('glob'); var globPatternRecursive = path.sep + '**' + path.sep + '*'; -common.register('ls', _ls, {globStart: 1}); +common.register('ls', _ls, { + globStart: 1, + cmdOptions: { + 'R': 'recursive', + 'A': 'all', + 'a': 'all_deprecated', + 'd': 'directory', + 'l': 'long', + }, +}); + //@ //@ ### ls([options,] [path, ...]) @@ -31,14 +41,6 @@ common.register('ls', _ls, {globStart: 1}); //@ //@ Returns array of files in the given path, or in current directory if no path provided. function _ls(options, paths) { - options = common.parseOptions(options, { - 'R': 'recursive', - 'A': 'all', - 'a': 'all_deprecated', - 'd': 'directory', - 'l': 'long' - }); - if (options.all_deprecated) { // We won't support the -a option as it's hard to image why it's useful // (it includes '.' and '..' in addition to '.*' files) diff --git a/src/mkdir.js b/src/mkdir.js index 5c51afd16..7a8479ce4 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -2,7 +2,12 @@ var common = require('./common'); var fs = require('fs'); var path = require('path'); -common.register('mkdir', _mkdir, {globStart: 1}); +common.register('mkdir', _mkdir, { + globStart: 1, + cmdOptions: { + 'p': 'fullpath', + }, +}); // Recursively creates 'dir' function mkdirSyncRecursive(dir) { @@ -44,9 +49,6 @@ function mkdirSyncRecursive(dir) { //@ //@ Creates directories. function _mkdir(options, dirs) { - options = common.parseOptions(options, { - 'p': 'fullpath' - }); if (!dirs) common.error('no paths given'); diff --git a/src/mv.js b/src/mv.js index 6c42a5934..48f8451aa 100644 --- a/src/mv.js +++ b/src/mv.js @@ -4,7 +4,13 @@ var common = require('./common'); var cp = require('./cp'); var rm = require('./rm'); -common.register('mv', _mv, {globStart: 1}); +common.register('mv', _mv, { + globStart: 1, + cmdOptions: { + 'f': '!no_force', + 'n': 'no_force', + }, +}); //@ //@ ### mv([options ,] source [, source ...], dest') @@ -24,11 +30,6 @@ common.register('mv', _mv, {globStart: 1}); //@ //@ Moves files. function _mv(options, sources, dest) { - options = common.parseOptions(options, { - 'f': '!no_force', - 'n': 'no_force' - }); - // Get sources, dest if (arguments.length < 3) { common.error('missing and/or '); diff --git a/src/rm.js b/src/rm.js index ff43e9982..b4929c42b 100644 --- a/src/rm.js +++ b/src/rm.js @@ -1,7 +1,14 @@ var common = require('./common'); var fs = require('fs'); -common.register('rm', _rm, {globStart: 1}); +common.register('rm', _rm, { + globStart: 1, + cmdOptions: { + 'f': 'force', + 'r': 'recursive', + 'R': 'recursive', + }, +}); // Recursively removes 'dir' // Adapted from https://github.com/ryanmcgrath/wrench-js @@ -97,11 +104,6 @@ function isWriteable(file) { //@ //@ Removes files. function _rm(options, files) { - options = common.parseOptions(options, { - 'f': 'force', - 'r': 'recursive', - 'R': 'recursive' - }); if (!files) common.error('no paths given'); diff --git a/src/sed.js b/src/sed.js index 5a12217ee..7a55bc2ac 100644 --- a/src/sed.js +++ b/src/sed.js @@ -1,7 +1,13 @@ var common = require('./common'); var fs = require('fs'); -common.register('sed', _sed, {globStart: 3, canReceivePipe: true}); // don't glob-expand regexes +common.register('sed', _sed, { + globStart: 3, // don't glob-expand regexes + canReceivePipe: true, + cmdOptions: { + 'i': 'inplace', + }, +}); //@ //@ ### sed([options,] search_regex, replacement, file [, file ...]) @@ -20,10 +26,6 @@ common.register('sed', _sed, {globStart: 3, canReceivePipe: true}); // don't glo //@ Reads an input string from `files` and performs a JavaScript `replace()` on the input //@ using the given search regex and replacement string or function. Returns the new string after replacement. function _sed(options, regex, replacement, files) { - options = common.parseOptions(options, { - 'i': 'inplace' - }); - // Check if this is coming from a pipe var pipe = common.readFromPipe(this); diff --git a/src/sort.js b/src/sort.js index 2b111c40d..a67742d6a 100644 --- a/src/sort.js +++ b/src/sort.js @@ -1,7 +1,15 @@ var common = require('./common'); var fs = require('fs'); -common.register('sort', _sort, {globStart: 1, canReceivePipe: true}); +common.register('sort', _sort, { + globStart: 1, + canReceivePipe: true, + cmdOptions: { + 'r': 'reverse', + 'n': 'numerical', + } +}); + // parse out the number prefix of a line function parseNumber (str) { @@ -50,11 +58,6 @@ function numericalCmp(a, b) { //@ Return the contents of the files, sorted line-by-line. Sorting multiple //@ files mixes their content, just like unix sort does. function _sort(options, files) { - options = common.parseOptions(options, { - 'r': 'reverse', - 'n': 'numerical' - }); - // Check if this is coming from a pipe var pipe = common.readFromPipe(this); diff --git a/src/tail.js b/src/tail.js index d0fd8976e..e6a594820 100644 --- a/src/tail.js +++ b/src/tail.js @@ -1,11 +1,20 @@ var common = require('./common'); var fs = require('fs'); -common.register('tail', _tail, {globStart: 1, canReceivePipe: true}); +common.register('tail', _tail, { + globStart: 1, + canReceivePipe: true, + cmdOptions: { + 'n': 'numLines', + }, +}); //@ //@ ### tail([{'-n', \},] file [, file ...]) //@ ### tail([{'-n', \},] file_array) +//@ Available options: +//@ +//@ + `-n `: Show the last `` lines of the files //@ //@ Examples: //@ @@ -15,12 +24,8 @@ common.register('tail', _tail, {globStart: 1, canReceivePipe: true}); //@ var str = tail(['file1', 'file2']); // same as above //@ ``` //@ -//@ Output the last 10 lines of a file (or the last `` if `-n` is -//@ specified) +//@ Read the end of a file. function _tail(options, files) { - options = common.parseOptions(options, { - 'n': 'numLines' - }); var tail = []; var pipe = common.readFromPipe(this); diff --git a/src/test.js b/src/test.js index d4d84280f..6cb4f8a55 100644 --- a/src/test.js +++ b/src/test.js @@ -1,7 +1,20 @@ var common = require('./common'); var fs = require('fs'); -common.register('test', _test); +common.register('test', _test, { + cmdOptions: { + 'b': 'block', + 'c': 'character', + 'd': 'directory', + 'e': 'exists', + 'f': 'file', + 'L': 'link', + 'p': 'pipe', + 'S': 'socket', + }, +}); + + //@ //@ ### test(expression) @@ -28,18 +41,6 @@ function _test(options, path) { if (!path) common.error('no path given'); - // hack - only works with unary primaries - options = common.parseOptions(options, { - 'b': 'block', - 'c': 'character', - 'd': 'directory', - 'e': 'exists', - 'f': 'file', - 'L': 'link', - 'p': 'pipe', - 'S': 'socket' - }); - var canInterpret = false; for (var key in options) if (options[key] === true) { diff --git a/src/touch.js b/src/touch.js index a84a5a8e7..0eab4483a 100644 --- a/src/touch.js +++ b/src/touch.js @@ -1,7 +1,16 @@ var common = require('./common'); var fs = require('fs'); -common.register('touch', _touch, {globStart: 1}); +common.register('touch', _touch, { + globStart: 1, + cmdOptions: { + 'a': 'atime_only', + 'c': 'no_create', + 'd': 'date', + 'm': 'mtime_only', + 'r': 'reference', + }, +}); //@ //@ ### touch([options,] file [, file ...]) @@ -26,14 +35,6 @@ common.register('touch', _touch, {globStart: 1}); //@ A FILE argument that does not exist is created empty, unless -c is supplied. //@ This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. function _touch(opts, files) { - opts = common.parseOptions(opts, { - 'a': 'atime_only', - 'c': 'no_create', - 'd': 'date', - 'm': 'mtime_only', - 'r': 'reference', - }); - if (!files) common.error('no files given'); else if (typeof files === 'string') diff --git a/src/uniq.js b/src/uniq.js index 65bb51e0d..930c6b9cf 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -10,7 +10,15 @@ function lpad(c, str){ return res; } -common.register('uniq', _uniq, {globStart: 1, canReceivePipe: true}); +common.register('uniq', _uniq, { + globStart: 1, + canReceivePipe: true, + cmdOptions: { + 'i': 'ignoreCase', + 'c': 'count', + 'd': 'duplicates', + }, +}); //@ //@ ### uniq([options,] [input, [output]]) @@ -30,12 +38,6 @@ common.register('uniq', _uniq, {globStart: 1, canReceivePipe: true}); //@ //@ Filter adjacent matching lines from input function _uniq(options, input, output) { - options = common.parseOptions(options, { - 'i': 'ignoreCase', - 'c': 'count', - 'd': 'duplicates' - }); - // Check if this is coming from a pipe var pipe = common.readFromPipe(this); From 9c7e6a892a8bb15c19c6baf9101dac0dc55d7a9b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 24 Jul 2016 18:20:36 -0700 Subject: [PATCH 009/338] refactor: add wrapOutput option to auto-ShellString-ify command output (#481) --- src/cat.js | 8 ++++++-- src/cd.js | 7 +++++-- src/chmod.js | 7 +++++-- src/common.js | 5 +++++ src/echo.js | 4 ++-- src/find.js | 7 +++++-- src/grep.js | 3 ++- src/head.js | 3 ++- src/ln.js | 3 ++- src/ls.js | 4 ++-- src/mkdir.js | 3 ++- src/mv.js | 3 ++- src/pwd.js | 4 ++-- src/rm.js | 3 ++- src/sed.js | 3 ++- src/sort.js | 6 +++--- src/tail.js | 3 ++- src/touch.js | 3 ++- src/uniq.js | 8 ++++---- src/which.js | 4 ++-- 20 files changed, 59 insertions(+), 32 deletions(-) diff --git a/src/cat.js b/src/cat.js index 5469cd0a1..3d271ceae 100644 --- a/src/cat.js +++ b/src/cat.js @@ -1,7 +1,11 @@ var common = require('./common'); var fs = require('fs'); -common.register('cat', _cat, {globStart: 1, canReceivePipe: true}); +common.register('cat', _cat, { + globStart: 1, + canReceivePipe: true, + wrapOutput: true, +}); //@ //@ ### cat(file [, file ...]) @@ -33,6 +37,6 @@ function _cat(options, files) { cat += fs.readFileSync(file, 'utf8'); }); - return new common.ShellString(cat, common.state.error, common.state.errorCode); + return cat; } module.exports = _cat; diff --git a/src/cd.js b/src/cd.js index 0b6ef5375..50694a882 100644 --- a/src/cd.js +++ b/src/cd.js @@ -1,7 +1,10 @@ var fs = require('fs'); var common = require('./common'); -common.register('cd', _cd, {globStart: 1}); +common.register('cd', _cd, { + globStart: 1, + wrapOutput: true, +}); //@ //@ ### cd([dir]) @@ -33,6 +36,6 @@ function _cd(options, dir) { } if (err) common.error(err); } - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; } module.exports = _cd; diff --git a/src/chmod.js b/src/chmod.js index 16588f71d..7072bfe12 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -30,7 +30,10 @@ var PERMS = (function (base) { READ : 4 }); -common.register('chmod', _chmod, {globStart: 1}); +common.register('chmod', _chmod, { + globStart: 1, + wrapOutput: true, +}); //@ //@ ### chmod(octal_mode || octal_string, file) @@ -210,6 +213,6 @@ function _chmod(options, mode, filePattern) { fs.chmodSync(file, newPerms); } }); - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; } module.exports = _chmod; diff --git a/src/common.js b/src/common.js index a154431a5..6b2255a49 100644 --- a/src/common.js +++ b/src/common.js @@ -343,6 +343,11 @@ function wrap(cmd, fn, options) { throw e; } + if (options.wrapOutput && + (typeof retValue === 'string' || Array.isArray(retValue))) { + retValue = new ShellString(retValue, state.error, state.errorCode); + } + state.currentCmd = 'shell.js'; return retValue; }; diff --git a/src/echo.js b/src/echo.js index 0f53ea8f9..28066f68f 100644 --- a/src/echo.js +++ b/src/echo.js @@ -1,6 +1,6 @@ var common = require('./common'); -common.register('echo', _echo); +common.register('echo', _echo, {wrapOutput: true}); //@ //@ ### echo(string [, string ...]) @@ -18,6 +18,6 @@ function _echo(opts, messages) { // allow strings starting with '-', see issue #20 messages = [].slice.call(arguments, opts ? 0 : 1); console.log.apply(console, messages); - return new common.ShellString(messages.join(' '), '', 0); + return messages.join(' '); } module.exports = _echo; diff --git a/src/find.js b/src/find.js index a13e23e24..8e9bad0cd 100644 --- a/src/find.js +++ b/src/find.js @@ -3,7 +3,10 @@ var path = require('path'); var common = require('./common'); var _ls = require('./ls'); -common.register('find', _find, {globStart: 1}); +common.register('find', _find, { + globStart: 1, + wrapOutput: true, +}); //@ //@ ### find(path [, path ...]) @@ -48,6 +51,6 @@ function _find(options, paths) { } }); - return new common.ShellString(list, common.state.error, common.state.errorCode); + return list; } module.exports = _find; diff --git a/src/grep.js b/src/grep.js index 09787e623..e9987b868 100644 --- a/src/grep.js +++ b/src/grep.js @@ -8,6 +8,7 @@ common.register('grep', _grep, { 'v': 'inverse', 'l': 'nameOnly', }, + wrapOutput: true, }); //@ @@ -60,6 +61,6 @@ function _grep(options, regex, files) { } }); - return new common.ShellString(grep.join('\n')+'\n', common.state.error, common.state.errorCode); + return grep.join('\n')+'\n'; } module.exports = _grep; diff --git a/src/head.js b/src/head.js index baf7972b3..37c92a3c3 100644 --- a/src/head.js +++ b/src/head.js @@ -7,6 +7,7 @@ common.register('head', _head, { cmdOptions: { 'n': 'numLines', }, + wrapOutput: true, }); // This reads n or more lines, or the entire file, whichever is less. @@ -98,6 +99,6 @@ function _head(options, files) { if (shouldAppendNewline) head.push(''); // to add a trailing newline once we join - return new common.ShellString(head.join('\n'), common.state.error, common.state.errorCode); + return head.join('\n'); } module.exports = _head; diff --git a/src/ln.js b/src/ln.js index 6b11fc465..6dc1a2692 100644 --- a/src/ln.js +++ b/src/ln.js @@ -8,6 +8,7 @@ common.register('ln', _ln, { 's': 'symlink', 'f': 'force', }, + wrapOutput: true, }); //@ @@ -68,6 +69,6 @@ function _ln(options, source, dest) { common.error(err.message); } } - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; } module.exports = _ln; diff --git a/src/ls.js b/src/ls.js index d39506aff..e9b113736 100644 --- a/src/ls.js +++ b/src/ls.js @@ -14,9 +14,9 @@ common.register('ls', _ls, { 'd': 'directory', 'l': 'long', }, + wrapOutput: true, }); - //@ //@ ### ls([options,] [path, ...]) //@ ### ls([options,] path_array) @@ -104,7 +104,7 @@ function _ls(options, paths) { }); // Add methods, to make this more compatible with ShellStrings - return new common.ShellString(list, common.state.error, common.state.errorCode); + return list; } function addLsAttributes(path, stats) { diff --git a/src/mkdir.js b/src/mkdir.js index 7a8479ce4..9fa30a44c 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -7,6 +7,7 @@ common.register('mkdir', _mkdir, { cmdOptions: { 'p': 'fullpath', }, + wrapOutput: true, }); // Recursively creates 'dir' @@ -85,6 +86,6 @@ function _mkdir(options, dirs) { throw e; } }); - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; } // mkdir module.exports = _mkdir; diff --git a/src/mv.js b/src/mv.js index 48f8451aa..38244c8a8 100644 --- a/src/mv.js +++ b/src/mv.js @@ -10,6 +10,7 @@ common.register('mv', _mv, { 'f': '!no_force', 'n': 'no_force', }, + wrapOutput: true, }); //@ @@ -88,6 +89,6 @@ function _mv(options, sources, dest) { } } }); // forEach(src) - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; } // mv module.exports = _mv; diff --git a/src/pwd.js b/src/pwd.js index f94373b12..c10355ea7 100644 --- a/src/pwd.js +++ b/src/pwd.js @@ -1,13 +1,13 @@ var path = require('path'); var common = require('./common'); -common.register('pwd', _pwd); +common.register('pwd', _pwd, {wrapOutput: true}); //@ //@ ### pwd() //@ Returns the current directory. function _pwd() { var pwd = path.resolve(process.cwd()); - return new common.ShellString(pwd, '', common.state.errorCode); + return pwd; } module.exports = _pwd; diff --git a/src/rm.js b/src/rm.js index b4929c42b..68f571f62 100644 --- a/src/rm.js +++ b/src/rm.js @@ -8,6 +8,7 @@ common.register('rm', _rm, { 'r': 'recursive', 'R': 'recursive', }, + wrapOutput: true, }); // Recursively removes 'dir' @@ -149,6 +150,6 @@ function _rm(options, files) { rmdirSyncRecursive(file, options.force); } }); // forEach(file) - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; } // rm module.exports = _rm; diff --git a/src/sed.js b/src/sed.js index 7a55bc2ac..d78481f0f 100644 --- a/src/sed.js +++ b/src/sed.js @@ -7,6 +7,7 @@ common.register('sed', _sed, { cmdOptions: { 'i': 'inplace', }, + wrapOutput: true, }); //@ @@ -67,6 +68,6 @@ function _sed(options, regex, replacement, files) { fs.writeFileSync(file, result, 'utf8'); }); - return new common.ShellString(sed.join('\n'), common.state.error, common.state.errorCode); + return sed.join('\n'); } module.exports = _sed; diff --git a/src/sort.js b/src/sort.js index a67742d6a..761f47743 100644 --- a/src/sort.js +++ b/src/sort.js @@ -7,10 +7,10 @@ common.register('sort', _sort, { cmdOptions: { 'r': 'reverse', 'n': 'numerical', - } + }, + wrapOutput: true, }); - // parse out the number prefix of a line function parseNumber (str) { var match = str.match(/^\s*(\d*)\s*(.*)$/); @@ -86,7 +86,7 @@ function _sort(options, files) { if (options.reverse) sorted = sorted.reverse(); - return new common.ShellString(sorted.join('\n')+'\n', common.state.error, common.state.errorCode); + return sorted.join('\n')+'\n'; } module.exports = _sort; diff --git a/src/tail.js b/src/tail.js index e6a594820..84697d134 100644 --- a/src/tail.js +++ b/src/tail.js @@ -7,6 +7,7 @@ common.register('tail', _tail, { cmdOptions: { 'n': 'numLines', }, + wrapOutput: true, }); //@ @@ -67,6 +68,6 @@ function _tail(options, files) { if (shouldAppendNewline) tail.push(''); // to add a trailing newline once we join - return new common.ShellString(tail.join('\n'), common.state.error, common.state.errorCode); + return tail.join('\n'); } module.exports = _tail; diff --git a/src/touch.js b/src/touch.js index 0eab4483a..244050748 100644 --- a/src/touch.js +++ b/src/touch.js @@ -10,6 +10,7 @@ common.register('touch', _touch, { 'm': 'mtime_only', 'r': 'reference', }, + wrapOutput: true, }); //@ @@ -45,7 +46,7 @@ function _touch(opts, files) { files.forEach(function(f) { touchFile(opts, f); }); - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; } function touchFile(opts, file) { diff --git a/src/uniq.js b/src/uniq.js index 930c6b9cf..307294676 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -18,6 +18,7 @@ common.register('uniq', _uniq, { 'c': 'count', 'd': 'duplicates', }, + wrapOutput: true, }); //@ @@ -67,13 +68,12 @@ function _uniq(options, input, output) { return (options.count ? (lpad(7,obj.count) + ' ') : '') + obj.ln; }).join('\n') + '\n'; - var res = new common.ShellString(uniqed, common.state.error, common.state.errorCode); if(output){ - res.to(output); + (new common.ShellString(uniqed)).to(output); //if uniq writes to output, nothing is passed to the next command in the pipeline (if any) - return new common.ShellString('', common.state.error, common.state.errorCode); + return ''; }else{ - return res; + return uniqed; } } diff --git a/src/which.js b/src/which.js index e7234e3b1..bfd5cd30f 100644 --- a/src/which.js +++ b/src/which.js @@ -2,7 +2,7 @@ var common = require('./common'); var fs = require('fs'); var path = require('path'); -common.register('which', _which); +common.register('which', _which, {wrapOutput: true}); // XP's system default value for PATHEXT system variable, just in case it's not // set on Windows. @@ -95,6 +95,6 @@ function _which(options, cmd) { where = where || path.resolve(cmd); - return new common.ShellString(where, '', common.state.errorCode); + return where; } module.exports = _which; From dee29a07b273c1582d3d22b1f16c53f8b6f795c8 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 24 Jul 2016 23:40:09 -0700 Subject: [PATCH 010/338] 0.7.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1dd8fb25a..0d5d19933 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.1", + "version": "0.7.2", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From cec859e7093c2d72ada3596e070b07587e5023a1 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 25 Jul 2016 12:11:56 -0700 Subject: [PATCH 011/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14b588254..0cfcb7093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Change Log +## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) + +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.2...HEAD) + +**Closed issues:** + +- cp -r breaks when the directory contains a softlink [\#193](https://github.com/shelljs/shelljs/issues/193) +- Redirect output to file fails [\#60](https://github.com/shelljs/shelljs/issues/60) +- We need sed -n ? [\#38](https://github.com/shelljs/shelljs/issues/38) + +## [v0.7.2](https://github.com/shelljs/shelljs/tree/v0.7.2) (2016-07-25) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.1...v0.7.2) + +**Closed issues:** + +- shelljs should not kill process if node call throws exception [\#473](https://github.com/shelljs/shelljs/issues/473) +- `cp` work incorrectly when folder name contains '@' [\#463](https://github.com/shelljs/shelljs/issues/463) +- Something went wrong [\#158](https://github.com/shelljs/shelljs/issues/158) + +**Merged pull requests:** + +- fix: resolve a cylcic-dependency problem [\#482](https://github.com/shelljs/shelljs/pull/482) ([nfischer](https://github.com/nfischer)) +- refactor: add wrapOutput option to auto-ShellString-ify command output [\#481](https://github.com/shelljs/shelljs/pull/481) ([nfischer](https://github.com/nfischer)) +- refactor: move option parsing into common.wrap\(\) [\#479](https://github.com/shelljs/shelljs/pull/479) ([nfischer](https://github.com/nfischer)) +- refactor: hook new uniq\(\) command using new format [\#478](https://github.com/shelljs/shelljs/pull/478) ([nfischer](https://github.com/nfischer)) +- Fix mkdir malformed path [\#477](https://github.com/shelljs/shelljs/pull/477) ([nfischer](https://github.com/nfischer)) +- fix: mkdir for invalid perms does not kill process [\#474](https://github.com/shelljs/shelljs/pull/474) ([nfischer](https://github.com/nfischer)) +- feat\(command\): new command: uniq\(\) [\#453](https://github.com/shelljs/shelljs/pull/453) ([joshi-sh](https://github.com/joshi-sh)) + ## [v0.7.1](https://github.com/shelljs/shelljs/tree/v0.7.1) (2016-07-22) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.0...v0.7.1) From 8f7a7d8c57ad65ce83c0ef1ae1126ed2f2479554 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 26 Jul 2016 21:32:34 -0700 Subject: [PATCH 012/338] refactor: expose plugin utils & add initial tests (#484) * refactor: expose plugin utils & add initial tests * fix: plugins work with Node v0.12 --- plugin.js | 16 +++++++++ shell.js | 8 +---- test/plugin.js | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 plugin.js create mode 100644 test/plugin.js diff --git a/plugin.js b/plugin.js new file mode 100644 index 000000000..f879ab320 --- /dev/null +++ b/plugin.js @@ -0,0 +1,16 @@ +// Various utilties exposed to plugins + +require('./shell'); // Create the ShellJS instance (mandatory) + +var common = require('./src/common'); + +var exportedAttributes = [ + 'error', // For signaling errors from within commands + 'parseOptions', // For custom option parsing + 'readFromPipe', // For commands with the .canReceivePipe attribute + 'register', // For registering plugins +]; + +exportedAttributes.forEach(function (attr) { + exports[attr] = common[attr]; +}); diff --git a/shell.js b/shell.js index 5f8db2e00..83e2dbda5 100644 --- a/shell.js +++ b/shell.js @@ -6,13 +6,7 @@ // http://github.com/arturadib/shelljs // -var commonPath = './src/common'; -var common = require(commonPath); -if (!common.register) { - // If this isn't defined yet, we haven't fully finished loading ./src/common - delete require.cache[require.resolve(commonPath)]; - common = require(commonPath); -} +var common = require('./src/common'); //@ //@ All commands run synchronously, unless otherwise stated. diff --git a/test/plugin.js b/test/plugin.js new file mode 100644 index 000000000..ac4abf11a --- /dev/null +++ b/test/plugin.js @@ -0,0 +1,97 @@ +var plugin = require('../plugin'); +var shell = require('..'); + +var assert = require('assert'); + +shell.config.silent = true; + +var data = 0; +var ret; +var fname; + +function fooImplementation(options, arg) { + // Some sort of side effect, so we know when this is called + if (arg) + fname = arg; + else + fname = plugin.readFromPipe(this); + + if (arg === 'exitWithCode5') + plugin.error('Exited with code 5', 5); + + if (options.flag) + data = 12; + else + data++; + return 'hello world'; +} + +// All plugin utils exist +assert.equal(typeof plugin.error, 'function'); +assert.equal(typeof plugin.parseOptions, 'function'); +assert.equal(typeof plugin.readFromPipe, 'function'); +assert.equal(typeof plugin.register, 'function'); + +// The plugin does not exist before it's registered +assert.ok(!shell.foo); + +// Register the plugin +plugin.register('foo', fooImplementation, { + globStart: 1, + cmdOptions: { + 'f': 'flag', + }, + wrapOutput: true, + canReceivePipe: true, +}); + +// The plugin exists after registering +assert.equal(typeof shell.foo, 'function'); + +// The command fails for invalid options +ret = shell.foo('-n', 'filename'); +assert.equal(ret.code, 1); +assert.equal(ret.stdout, ''); +assert.equal(ret.stderr, 'foo: option not recognized: n'); +assert.equal(shell.error(), 'foo: option not recognized: n'); + +// The command succeeds for normal calls +assert.equal(data, 0); +shell.foo('filename'); +assert.equal(data, 1); +assert.equal(fname, 'filename'); +shell.foo('filename2'); +assert.equal(data, 2); +assert.equal(fname, 'filename2'); + +// The command parses options +shell.foo('-f', 'filename'); +assert.equal(data, 12); +assert.equal(fname, 'filename'); + +// The command supports globbing +shell.foo('-f', 're*u?ces'); +assert.equal(data, 12); +assert.equal(fname, 'resources'); + +// Plugins are also compatible with shelljs/global +require('../global'); +assert.equal(typeof global.foo, 'function'); +assert.equal(global.foo, shell.foo); + +// Plugins can be added as methods to ShellStrings +ret = shell.ShellString('hello world\n'); +assert.equal(ret.toString(), 'hello world\n'); +assert.equal(typeof ret.grep, 'function'); // existing methods persist +assert.equal(typeof ret.foo, 'function'); +ret.foo(); +assert.equal(fname, 'hello world\n'); // readFromPipe() works + +// Plugins can signal errors +ret = shell.foo('exitWithCode5'); +assert.equal(ret.code, 5); +assert.equal(ret.stdout, ''); +assert.equal(ret.stderr, 'foo: Exited with code 5'); +assert.equal(shell.error(), 'foo: Exited with code 5'); + +shell.exit(123); From 7b9ec7fb66f1c037cb603c75497944ce415f2a0f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 27 Jul 2016 09:26:45 -0700 Subject: [PATCH 013/338] refactor: allow pipeOnly commands (methods on ShellStrings) (#493) --- shell.js | 5 +++-- src/common.js | 20 +++++++++++++------- src/to.js | 7 ++++++- src/toEnd.js | 7 ++++++- test/to.js | 1 + test/toEnd.js | 1 + 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/shell.js b/shell.js index 83e2dbda5..9e49ef5e7 100644 --- a/shell.js +++ b/shell.js @@ -68,10 +68,11 @@ require('./src/head'); //@include ./src/tail require('./src/tail'); -// The below commands have been moved to common.ShellString(), and are only here -// for generating the docs //@include ./src/to +require('./src/to'); + //@include ./src/toEnd +require('./src/toEnd'); //@include ./src/sed require('./src/sed'); diff --git a/src/common.js b/src/common.js index 6b2255a49..75364475f 100644 --- a/src/common.js +++ b/src/common.js @@ -6,10 +6,9 @@ var os = require('os'); var fs = require('fs'); var glob = require('glob'); var shell = require('..'); -var _to = require('./to'); -var _toEnd = require('./toEnd'); var DEFAULT_ERROR_CODE = 1; +var shellMethods = Object.create(shell); // Module globals var config = { @@ -102,12 +101,11 @@ function ShellString(stdout, stderr, code) { } that.stderr = stderr; that.code = code; - that.to = function() {wrap('to', _to, {globStart: 1}).apply(that.stdout, arguments); return that;}; - that.toEnd = function() {wrap('toEnd', _toEnd, {globStart: 1}).apply(that.stdout, arguments); return that;}; + // A list of all commands that can appear on the right-hand side of a pipe // (populated by calls to common.wrap()) pipeMethods.forEach(function (cmd) { - that[cmd] = function() {return shell[cmd].apply(that.stdout, arguments);}; + that[cmd] = shellMethods[cmd].bind(that); }); return that; } @@ -357,12 +355,20 @@ exports.wrap = wrap; // This returns all the input that is piped into the current command (or the // empty string, if this isn't on the right-hand side of a pipe function _readFromPipe(that) { - return that instanceof String ? that.toString() : ''; + return typeof that.stdout === 'string' ? that.stdout : ''; } exports.readFromPipe = _readFromPipe; // Register a new ShellJS command function _register(name, implementation, wrapOptions) { - shell[name] = wrap(name, implementation, wrapOptions); + wrapOptions = wrapOptions || {}; + if (wrapOptions.pipeOnly && wrapOptions.canReceivePipe === false) + throw new Error('pipeOnly (true) conflicts with canReceivePipe (false)'); + if (wrapOptions.pipeOnly) { + wrapOptions.canReceivePipe = true; + shellMethods[name] = wrap(name, implementation, wrapOptions); + } else { + shell[name] = wrap(name, implementation, wrapOptions); + } } exports.register = _register; diff --git a/src/to.js b/src/to.js index 80d15cbe9..b60400d86 100644 --- a/src/to.js +++ b/src/to.js @@ -2,6 +2,11 @@ var common = require('./common'); var fs = require('fs'); var path = require('path'); +common.register('to', _to, { + globStart: 1, + pipeOnly: true, +}); + //@ //@ ### ShellString.prototype.to(file) //@ @@ -22,7 +27,7 @@ function _to(options, file) { common.error('no such file or directory: ' + path.dirname(file)); try { - fs.writeFileSync(file, this.toString(), 'utf8'); + fs.writeFileSync(file, this.stdout || this.toString(), 'utf8'); return this; } catch(e) { common.error('could not write to file (code '+e.code+'): '+file, true); diff --git a/src/toEnd.js b/src/toEnd.js index 01058ab9b..7a5c7fe2f 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -2,6 +2,11 @@ var common = require('./common'); var fs = require('fs'); var path = require('path'); +common.register('toEnd', _toEnd, { + globStart: 1, + pipeOnly: true, +}); + //@ //@ ### ShellString.prototype.toEnd(file) //@ @@ -21,7 +26,7 @@ function _toEnd(options, file) { common.error('no such file or directory: ' + path.dirname(file)); try { - fs.appendFileSync(file, this.toString(), 'utf8'); + fs.appendFileSync(file, this.stdout || this.toString(), 'utf8'); return this; } catch(e) { common.error('could not append to file (code '+e.code+'): '+file, true); diff --git a/test/to.js b/test/to.js index b8ca7f1b7..b22f9e406 100644 --- a/test/to.js +++ b/test/to.js @@ -39,6 +39,7 @@ assert.equal(result, 'hello world'); // With a glob shell.ShellString('goodbye').to('tmp/t*1'); +assert.equal(fs.existsSync('tmp/t*1'), false, 'globs are not interpreted literally'); result = shell.cat('tmp/to1'); assert.equal(shell.error(), null); assert.equal(result, 'goodbye'); diff --git a/test/toEnd.js b/test/toEnd.js index dce6250fe..751b72124 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -41,6 +41,7 @@ assert.equal(result, 'world'); //Check that the result is what we expect // With a glob shell.ShellString('good').to('tmp/toE*1'); shell.ShellString('bye').toEnd('tmp/toE*1'); +assert.equal(fs.existsSync('tmp/toE*1'), false, 'globs are not interpreted literally'); result = shell.cat('tmp/toEnd1'); assert.equal(shell.error(), null); assert.equal(result, 'goodbye'); From 11141a35ba55602cc84cd5ce0813a198a01d8c4c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 27 Jul 2016 09:27:12 -0700 Subject: [PATCH 014/338] refactor: switch from notUnix to unix in wrap() (#491) --- src/common.js | 2 +- src/exec.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/common.js b/src/common.js index 75364475f..345dd8c7f 100644 --- a/src/common.js +++ b/src/common.js @@ -272,7 +272,7 @@ function wrap(cmd, fn, options) { console.error.apply(console, [cmd].concat(args)); } - if (options.notUnix) { // this branch is for exec() + if (options.unix === false) { // this branch is for exec() retValue = fn.apply(this, args); } else { // and this branch is for everything else if (args[0] instanceof Object && args[0].constructor.name === 'Object') { diff --git a/src/exec.js b/src/exec.js index cb7290122..5c1c3eae9 100644 --- a/src/exec.js +++ b/src/exec.js @@ -7,7 +7,10 @@ var child = require('child_process'); var DEFAULT_MAXBUFFER_SIZE = 20*1024*1024; -common.register('exec', _exec, {notUnix:true, canReceivePipe: true}); +common.register('exec', _exec, { + unix: false, + canReceivePipe: true, +}); // Hack to run child_process.exec() synchronously (sync avoids callback hell) // Uses a custom wait loop that checks for a flag file, created when the child process is done. From add14adbf44454c0469e4e97ea8d1625ed98576e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 27 Jul 2016 09:28:11 -0700 Subject: [PATCH 015/338] refactor: switch common.extend() to Object.assign ponyfill (#490) --- src/common.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common.js b/src/common.js index 345dd8c7f..545089197 100644 --- a/src/common.js +++ b/src/common.js @@ -236,10 +236,10 @@ function randomFileName() { } exports.randomFileName = randomFileName; -// extend(target_obj, source_obj1 [, source_obj2 ...]) -// Shallow extend, e.g.: -// extend({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} -function extend(target) { +// objectAssign(target_obj, source_obj1 [, source_obj2 ...]) +// Ponyfill for Object.assign +// objectAssign({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} +function objectAssign(target) { var sources = [].slice.call(arguments, 1); sources.forEach(function(source) { for (var key in source) @@ -248,7 +248,7 @@ function extend(target) { return target; } -exports.extend = extend; +exports.extend = Object.assign || objectAssign; // Common wrapper for all Unix-like commands that performs glob expansion, // command-logging, and other nice things From 06ae7d9b881adb7a63988d2349f6c9bc55795c92 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 27 Jul 2016 09:31:38 -0700 Subject: [PATCH 016/338] fix: conflicting options now properly override each other (#489) --- src/common.js | 2 +- test/common.js | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/common.js b/src/common.js index 545089197..9821f3776 100644 --- a/src/common.js +++ b/src/common.js @@ -154,7 +154,7 @@ function parseOptions(opt, map) { if (c in map) { optionName = map[c]; if (optionName[0] === '!') - options[optionName.slice(1, optionName.length-1)] = false; + options[optionName.slice(1)] = false; else options[optionName] = true; } else { diff --git a/test/common.js b/test/common.js index 4c6214da6..69b90a97b 100644 --- a/test/common.js +++ b/test/common.js @@ -74,14 +74,19 @@ assert.ok(result.no_force === false); assert.ok(result.force === undefined); // this key shouldn't exist // common.parseOptions (the last of the conflicting options should hold) -result = common.parseOptions('-fn', { +var options = { 'n': 'no_force', 'f': '!no_force', 'R': 'recursive' -}); +}; +result = common.parseOptions('-fn', options); assert.ok(result.recursive === false); assert.ok(result.no_force === true); assert.ok(result.force === undefined); // this key shouldn't exist +result = common.parseOptions('-nf', options); +assert.ok(result.recursive === false); +assert.ok(result.no_force === false); +assert.ok(result.force === undefined); // this key shouldn't exist // common.parseOptions using an object to hold options result = common.parseOptions({'-v': 'some text here'}, { From d4111763a934abdd846ad8470a7033c1b27cc806 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 27 Jul 2016 16:43:01 -0700 Subject: [PATCH 017/338] refactor: glob by default for commands (#492) --- src/cat.js | 2 -- src/cd.js | 5 +---- src/chmod.js | 2 -- src/common.js | 17 +++++++++++++---- src/cp.js | 6 ++++-- src/dirs.js | 12 +++++++++--- src/echo.js | 4 +++- src/exec.js | 1 + src/find.js | 5 +---- src/grep.js | 1 - src/head.js | 2 -- src/ln.js | 2 -- src/ls.js | 2 -- src/mkdir.js | 2 -- src/mv.js | 2 -- src/pwd.js | 4 +++- src/rm.js | 2 -- src/sed.js | 1 - src/set.js | 5 ++++- src/sort.js | 2 -- src/tail.js | 2 -- src/tempdir.js | 5 ++++- src/test.js | 1 + src/to.js | 2 +- src/toEnd.js | 2 +- src/touch.js | 2 -- src/uniq.js | 2 -- src/which.js | 4 +++- test/plugin.js | 3 +-- 29 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/cat.js b/src/cat.js index 3d271ceae..1602d1c25 100644 --- a/src/cat.js +++ b/src/cat.js @@ -2,9 +2,7 @@ var common = require('./common'); var fs = require('fs'); common.register('cat', _cat, { - globStart: 1, canReceivePipe: true, - wrapOutput: true, }); //@ diff --git a/src/cd.js b/src/cd.js index 50694a882..4498ebcaa 100644 --- a/src/cd.js +++ b/src/cd.js @@ -1,10 +1,7 @@ var fs = require('fs'); var common = require('./common'); -common.register('cd', _cd, { - globStart: 1, - wrapOutput: true, -}); +common.register('cd', _cd, {}); //@ //@ ### cd([dir]) diff --git a/src/chmod.js b/src/chmod.js index 7072bfe12..4a9f9f592 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -31,8 +31,6 @@ var PERMS = (function (base) { }); common.register('chmod', _chmod, { - globStart: 1, - wrapOutput: true, }); //@ diff --git a/src/common.js b/src/common.js index 9821f3776..e8ff48366 100644 --- a/src/common.js +++ b/src/common.js @@ -101,7 +101,6 @@ function ShellString(stdout, stderr, code) { } that.stderr = stderr; that.code = code; - // A list of all commands that can appear on the right-hand side of a pipe // (populated by calls to common.wrap()) pipeMethods.forEach(function (cmd) { @@ -313,7 +312,7 @@ function wrap(cmd, fn, options) { // Perform glob-expansion on all arguments after globStart, but preserve // the arguments before it (like regexes for sed and grep) - if (!config.noglob && typeof options.globStart === 'number') { + if (!config.noglob && options.allowGlobbing === true) { args = args.slice(0, options.globStart).concat(expand(args.slice(options.globStart))); } @@ -359,11 +358,21 @@ function _readFromPipe(that) { } exports.readFromPipe = _readFromPipe; +var DEFAULT_WRAP_OPTIONS = { + allowGlobbing: true, + canReceivePipe: false, + cmdOptions: false, + globStart: 1, + pipeOnly: false, + unix: true, + wrapOutput: true, +}; + // Register a new ShellJS command function _register(name, implementation, wrapOptions) { wrapOptions = wrapOptions || {}; - if (wrapOptions.pipeOnly && wrapOptions.canReceivePipe === false) - throw new Error('pipeOnly (true) conflicts with canReceivePipe (false)'); + // If an option isn't specified, use the default + wrapOptions = objectAssign({}, DEFAULT_WRAP_OPTIONS, wrapOptions); if (wrapOptions.pipeOnly) { wrapOptions.canReceivePipe = true; shellMethods[name] = wrap(name, implementation, wrapOptions); diff --git a/src/cp.js b/src/cp.js index 133fe08e1..7a2ddcb14 100644 --- a/src/cp.js +++ b/src/cp.js @@ -3,14 +3,16 @@ var path = require('path'); var common = require('./common'); var os = require('os'); -common.register('cp', _cp, {globStart: 1, cmdOptions: { +common.register('cp', _cp, { + cmdOptions: { 'f': '!no_force', 'n': 'no_force', 'R': 'recursive', 'r': 'recursive', 'L': 'followsymlink', 'P': 'noFollowsymlink', - } + }, + wrapOutput: false, }); // Buffered file copy, synchronous diff --git a/src/dirs.js b/src/dirs.js index bb1eccb14..bb0688a22 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -2,9 +2,15 @@ var common = require('./common'); var _cd = require('./cd'); var path = require('path'); -common.register('dirs', _dirs, {globStart: 1}); -common.register('pushd', _pushd, {globStart: 1}); -common.register('popd', _popd, {globStart: 1}); +common.register('dirs', _dirs, { + wrapOutput: false, +}); +common.register('pushd', _pushd, { + wrapOutput: false, +}); +common.register('popd', _popd, { + wrapOutput: false, +}); // Pushd/popd/dirs internals var _dirStack = []; diff --git a/src/echo.js b/src/echo.js index 28066f68f..2871003a4 100644 --- a/src/echo.js +++ b/src/echo.js @@ -1,6 +1,8 @@ var common = require('./common'); -common.register('echo', _echo, {wrapOutput: true}); +common.register('echo', _echo, { + allowGlobbing: false, +}); //@ //@ ### echo(string [, string ...]) diff --git a/src/exec.js b/src/exec.js index 5c1c3eae9..80c3d6948 100644 --- a/src/exec.js +++ b/src/exec.js @@ -10,6 +10,7 @@ var DEFAULT_MAXBUFFER_SIZE = 20*1024*1024; common.register('exec', _exec, { unix: false, canReceivePipe: true, + wrapOutput: false, }); // Hack to run child_process.exec() synchronously (sync avoids callback hell) diff --git a/src/find.js b/src/find.js index 8e9bad0cd..1a33c9b6d 100644 --- a/src/find.js +++ b/src/find.js @@ -3,10 +3,7 @@ var path = require('path'); var common = require('./common'); var _ls = require('./ls'); -common.register('find', _find, { - globStart: 1, - wrapOutput: true, -}); +common.register('find', _find, {}); //@ //@ ### find(path [, path ...]) diff --git a/src/grep.js b/src/grep.js index e9987b868..04319df22 100644 --- a/src/grep.js +++ b/src/grep.js @@ -8,7 +8,6 @@ common.register('grep', _grep, { 'v': 'inverse', 'l': 'nameOnly', }, - wrapOutput: true, }); //@ diff --git a/src/head.js b/src/head.js index 37c92a3c3..623efe036 100644 --- a/src/head.js +++ b/src/head.js @@ -2,12 +2,10 @@ var common = require('./common'); var fs = require('fs'); common.register('head', _head, { - globStart: 1, canReceivePipe: true, cmdOptions: { 'n': 'numLines', }, - wrapOutput: true, }); // This reads n or more lines, or the entire file, whichever is less. diff --git a/src/ln.js b/src/ln.js index 6dc1a2692..66d7e59f0 100644 --- a/src/ln.js +++ b/src/ln.js @@ -3,12 +3,10 @@ var path = require('path'); var common = require('./common'); common.register('ln', _ln, { - globStart: 1, cmdOptions: { 's': 'symlink', 'f': 'force', }, - wrapOutput: true, }); //@ diff --git a/src/ls.js b/src/ls.js index e9b113736..85dd75ab5 100644 --- a/src/ls.js +++ b/src/ls.js @@ -6,7 +6,6 @@ var glob = require('glob'); var globPatternRecursive = path.sep + '**' + path.sep + '*'; common.register('ls', _ls, { - globStart: 1, cmdOptions: { 'R': 'recursive', 'A': 'all', @@ -14,7 +13,6 @@ common.register('ls', _ls, { 'd': 'directory', 'l': 'long', }, - wrapOutput: true, }); //@ diff --git a/src/mkdir.js b/src/mkdir.js index 9fa30a44c..6b308d16d 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -3,11 +3,9 @@ var fs = require('fs'); var path = require('path'); common.register('mkdir', _mkdir, { - globStart: 1, cmdOptions: { 'p': 'fullpath', }, - wrapOutput: true, }); // Recursively creates 'dir' diff --git a/src/mv.js b/src/mv.js index 38244c8a8..662f7b731 100644 --- a/src/mv.js +++ b/src/mv.js @@ -5,12 +5,10 @@ var cp = require('./cp'); var rm = require('./rm'); common.register('mv', _mv, { - globStart: 1, cmdOptions: { 'f': '!no_force', 'n': 'no_force', }, - wrapOutput: true, }); //@ diff --git a/src/pwd.js b/src/pwd.js index c10355ea7..38618518b 100644 --- a/src/pwd.js +++ b/src/pwd.js @@ -1,7 +1,9 @@ var path = require('path'); var common = require('./common'); -common.register('pwd', _pwd, {wrapOutput: true}); +common.register('pwd', _pwd, { + allowGlobbing: false, +}); //@ //@ ### pwd() diff --git a/src/rm.js b/src/rm.js index 68f571f62..40fc5076d 100644 --- a/src/rm.js +++ b/src/rm.js @@ -2,13 +2,11 @@ var common = require('./common'); var fs = require('fs'); common.register('rm', _rm, { - globStart: 1, cmdOptions: { 'f': 'force', 'r': 'recursive', 'R': 'recursive', }, - wrapOutput: true, }); // Recursively removes 'dir' diff --git a/src/sed.js b/src/sed.js index d78481f0f..bcaba40f1 100644 --- a/src/sed.js +++ b/src/sed.js @@ -7,7 +7,6 @@ common.register('sed', _sed, { cmdOptions: { 'i': 'inplace', }, - wrapOutput: true, }); //@ diff --git a/src/set.js b/src/set.js index b6faa0974..356611d1c 100644 --- a/src/set.js +++ b/src/set.js @@ -1,6 +1,9 @@ var common = require('./common'); -common.register('set', _set); +common.register('set', _set, { + allowGlobbing: false, + wrapOutput: false, +}); //@ //@ ### set(options) diff --git a/src/sort.js b/src/sort.js index 761f47743..e4772400f 100644 --- a/src/sort.js +++ b/src/sort.js @@ -2,13 +2,11 @@ var common = require('./common'); var fs = require('fs'); common.register('sort', _sort, { - globStart: 1, canReceivePipe: true, cmdOptions: { 'r': 'reverse', 'n': 'numerical', }, - wrapOutput: true, }); // parse out the number prefix of a line diff --git a/src/tail.js b/src/tail.js index 84697d134..a6614f451 100644 --- a/src/tail.js +++ b/src/tail.js @@ -2,12 +2,10 @@ var common = require('./common'); var fs = require('fs'); common.register('tail', _tail, { - globStart: 1, canReceivePipe: true, cmdOptions: { 'n': 'numLines', }, - wrapOutput: true, }); //@ diff --git a/src/tempdir.js b/src/tempdir.js index f797b8050..d24988efc 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -2,7 +2,10 @@ var common = require('./common'); var os = require('os'); var fs = require('fs'); -common.register('tempdir', _tempDir); +common.register('tempdir', _tempDir, { + allowGlobbing: false, + wrapOutput: false, +}); // Returns false if 'dir' is not a writeable directory, 'dir' otherwise function writeableDir(dir) { diff --git a/src/test.js b/src/test.js index 6cb4f8a55..078e90657 100644 --- a/src/test.js +++ b/src/test.js @@ -12,6 +12,7 @@ common.register('test', _test, { 'p': 'pipe', 'S': 'socket', }, + wrapOutput: false, }); diff --git a/src/to.js b/src/to.js index b60400d86..1640d184c 100644 --- a/src/to.js +++ b/src/to.js @@ -3,8 +3,8 @@ var fs = require('fs'); var path = require('path'); common.register('to', _to, { - globStart: 1, pipeOnly: true, + wrapOutput: false, }); //@ diff --git a/src/toEnd.js b/src/toEnd.js index 7a5c7fe2f..dd0506ea3 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -3,8 +3,8 @@ var fs = require('fs'); var path = require('path'); common.register('toEnd', _toEnd, { - globStart: 1, pipeOnly: true, + wrapOutput: false, }); //@ diff --git a/src/touch.js b/src/touch.js index 244050748..512307b3e 100644 --- a/src/touch.js +++ b/src/touch.js @@ -2,7 +2,6 @@ var common = require('./common'); var fs = require('fs'); common.register('touch', _touch, { - globStart: 1, cmdOptions: { 'a': 'atime_only', 'c': 'no_create', @@ -10,7 +9,6 @@ common.register('touch', _touch, { 'm': 'mtime_only', 'r': 'reference', }, - wrapOutput: true, }); //@ diff --git a/src/uniq.js b/src/uniq.js index 307294676..b8e500abf 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -11,14 +11,12 @@ function lpad(c, str){ } common.register('uniq', _uniq, { - globStart: 1, canReceivePipe: true, cmdOptions: { 'i': 'ignoreCase', 'c': 'count', 'd': 'duplicates', }, - wrapOutput: true, }); //@ diff --git a/src/which.js b/src/which.js index bfd5cd30f..c7a12a621 100644 --- a/src/which.js +++ b/src/which.js @@ -2,7 +2,9 @@ var common = require('./common'); var fs = require('fs'); var path = require('path'); -common.register('which', _which, {wrapOutput: true}); +common.register('which', _which, { + allowGlobbing: false, +}); // XP's system default value for PATHEXT system variable, just in case it's not // set on Windows. diff --git a/test/plugin.js b/test/plugin.js index ac4abf11a..3eeb1b7e6 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -37,7 +37,6 @@ assert.ok(!shell.foo); // Register the plugin plugin.register('foo', fooImplementation, { - globStart: 1, cmdOptions: { 'f': 'flag', }, @@ -69,7 +68,7 @@ shell.foo('-f', 'filename'); assert.equal(data, 12); assert.equal(fname, 'filename'); -// The command supports globbing +// The command supports globbing by default shell.foo('-f', 're*u?ces'); assert.equal(data, 12); assert.equal(fname, 'resources'); From cb8b6a7e11f1f8afa88f932c41fa9064b857403a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 27 Jul 2016 16:44:55 -0700 Subject: [PATCH 018/338] 0.7.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d5d19933..a6e3f6155 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.2", + "version": "0.7.3", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From e24b6754f2fcc2f3730b4bfe9522a4418204ebf5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 27 Jul 2016 16:45:51 -0700 Subject: [PATCH 019/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cfcb7093..0f3decf21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,25 @@ # Change Log -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) - -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.2...HEAD) +## [v0.7.3](https://github.com/shelljs/shelljs/tree/v0.7.3) (2016-07-27) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.2...v0.7.3) **Closed issues:** +- expose execSync [\#494](https://github.com/shelljs/shelljs/issues/494) +- Add a way to create commands that can receive from a pipe without being standalone commands [\#487](https://github.com/shelljs/shelljs/issues/487) - cp -r breaks when the directory contains a softlink [\#193](https://github.com/shelljs/shelljs/issues/193) - Redirect output to file fails [\#60](https://github.com/shelljs/shelljs/issues/60) - We need sed -n ? [\#38](https://github.com/shelljs/shelljs/issues/38) +**Merged pull requests:** + +- refactor: allow pipeOnly commands \(methods on ShellStrings\) [\#493](https://github.com/shelljs/shelljs/pull/493) ([nfischer](https://github.com/nfischer)) +- refactor: glob by default for commands [\#492](https://github.com/shelljs/shelljs/pull/492) ([nfischer](https://github.com/nfischer)) +- refactor: switch from notUnix to unix in wrap\(\) [\#491](https://github.com/shelljs/shelljs/pull/491) ([nfischer](https://github.com/nfischer)) +- refactor: switch common.extend\(\) to Object.assign ponyfill [\#490](https://github.com/shelljs/shelljs/pull/490) ([nfischer](https://github.com/nfischer)) +- fix: conflicting options now properly override each other [\#489](https://github.com/shelljs/shelljs/pull/489) ([nfischer](https://github.com/nfischer)) +- refactor: expose plugin utils & add initial tests [\#484](https://github.com/shelljs/shelljs/pull/484) ([nfischer](https://github.com/nfischer)) + ## [v0.7.2](https://github.com/shelljs/shelljs/tree/v0.7.2) (2016-07-25) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.1...v0.7.2) From cdd21c62f1c73477c56fb01a971412027c56a4ff Mon Sep 17 00:00:00 2001 From: Charles Read Date: Sun, 31 Jul 2016 15:58:21 -0400 Subject: [PATCH 020/338] fixed head/tail readme (#499) --- README.md | 12 ++++++------ src/head.js | 6 +++--- src/tail.js | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4a64329f3..24ae06584 100644 --- a/README.md +++ b/README.md @@ -316,8 +316,8 @@ containing the files if more than one file is given (a new line character is introduced between each file). -### head([{'-n', \},] file [, file ...]) -### head([{'-n', \},] file_array) +### head([{'-n': \},] file [, file ...]) +### head([{'-n': \},] file_array) Available options: + `-n `: Show the first `` lines of the files @@ -325,7 +325,7 @@ Available options: Examples: ```javascript -var str = head({'-n', 1}, 'file*.txt'); +var str = head({'-n': 1}, 'file*.txt'); var str = head('file1', 'file2'); var str = head(['file1', 'file2']); // same as above ``` @@ -333,8 +333,8 @@ var str = head(['file1', 'file2']); // same as above Read the start of a file. -### tail([{'-n', \},] file [, file ...]) -### tail([{'-n', \},] file_array) +### tail([{'-n': \},] file [, file ...]) +### tail([{'-n': \},] file_array) Available options: + `-n `: Show the last `` lines of the files @@ -342,7 +342,7 @@ Available options: Examples: ```javascript -var str = tail({'-n', 1}, 'file*.txt'); +var str = tail({'-n': 1}, 'file*.txt'); var str = tail('file1', 'file2'); var str = tail(['file1', 'file2']); // same as above ``` diff --git a/src/head.js b/src/head.js index 623efe036..cfaefa090 100644 --- a/src/head.js +++ b/src/head.js @@ -36,8 +36,8 @@ function readSomeLines(file, numLines) { return ret; } //@ -//@ ### head([{'-n', \},] file [, file ...]) -//@ ### head([{'-n', \},] file_array) +//@ ### head([{'-n': \},] file [, file ...]) +//@ ### head([{'-n': \},] file_array) //@ Available options: //@ //@ + `-n `: Show the first `` lines of the files @@ -45,7 +45,7 @@ function readSomeLines(file, numLines) { //@ Examples: //@ //@ ```javascript -//@ var str = head({'-n', 1}, 'file*.txt'); +//@ var str = head({'-n': 1}, 'file*.txt'); //@ var str = head('file1', 'file2'); //@ var str = head(['file1', 'file2']); // same as above //@ ``` diff --git a/src/tail.js b/src/tail.js index a6614f451..c2051446e 100644 --- a/src/tail.js +++ b/src/tail.js @@ -9,8 +9,8 @@ common.register('tail', _tail, { }); //@ -//@ ### tail([{'-n', \},] file [, file ...]) -//@ ### tail([{'-n', \},] file_array) +//@ ### tail([{'-n': \},] file [, file ...]) +//@ ### tail([{'-n': \},] file_array) //@ Available options: //@ //@ + `-n `: Show the last `` lines of the files @@ -18,7 +18,7 @@ common.register('tail', _tail, { //@ Examples: //@ //@ ```javascript -//@ var str = tail({'-n', 1}, 'file*.txt'); +//@ var str = tail({'-n': 1}, 'file*.txt'); //@ var str = tail('file1', 'file2'); //@ var str = tail(['file1', 'file2']); // same as above //@ ``` From 32db059a01e9b795cdf5ec2410380d5bdf83332c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 5 Aug 2016 15:57:57 -0700 Subject: [PATCH 021/338] chore: update issue template (#502) --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 4416a00c4..13d777fbc 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,4 +1,4 @@ -### Node version: +### Node version (or tell us if you're using electron or some other framework): ### ShellJS version (the most recent version/Github branch you see the bug on): From 2395214feec9b94e09c31b914c2a017e1a49e51f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 7 Aug 2016 12:16:29 -0700 Subject: [PATCH 022/338] chore: switch to eslint (#504) * chore: switch to eslint * fix: works on older versions of NodeJS now * chore: fix curly braces * chore: fix indents and remove jshint references --- .jshintignore => .eslintignore | 1 + .eslintrc.json | 32 +++++ .jshintrc | 12 -- .npmignore | 4 +- global.js | 4 +- package.json | 6 +- scripts/generate-docs.js | 6 +- scripts/run-tests.js | 4 +- src/cat.js | 8 +- src/cd.js | 10 +- src/chmod.js | 83 ++++++------- src/common.js | 126 ++++++++++--------- src/cp.js | 77 +++++++----- src/dirs.js | 11 +- src/exec.js | 127 +++++++++---------- src/find.js | 9 +- src/grep.js | 18 +-- src/head.js | 32 ++--- src/ln.js | 4 +- src/ls.js | 23 ++-- src/mkdir.js | 25 ++-- src/mv.js | 19 +-- src/popd.js | 2 +- src/pushd.js | 2 +- src/rm.js | 42 +++---- src/sed.js | 27 ++-- src/set.js | 11 +- src/sort.js | 17 +-- src/tail.js | 13 +- src/tempdir.js | 19 ++- src/test.js | 39 +++--- src/to.js | 12 +- src/toEnd.js | 12 +- src/touch.js | 9 +- src/uniq.js | 54 ++++---- src/which.js | 29 ++--- test/cat.js | 4 +- test/cd.js | 8 +- test/chmod.js | 7 +- test/common.js | 7 +- test/config.js | 20 +-- test/cp.js | 221 +++++++++++++++++---------------- test/dirs.js | 6 +- test/echo.js | 26 ++-- test/env.js | 6 +- test/exec.js | 51 ++++---- test/global.js | 1 - test/grep.js | 8 +- test/head.js | 52 ++++---- test/ln.js | 62 ++++----- test/ls.js | 9 +- test/make.js | 14 +-- test/mkdir.js | 6 +- test/mv.js | 6 +- test/pipe.js | 6 +- test/plugin.js | 13 +- test/popd.js | 45 +++---- test/pushd.js | 149 +++++++++++----------- test/pwd.js | 4 +- test/rm.js | 6 +- test/sed.js | 4 +- test/set.js | 13 +- test/shjs.js | 2 +- test/sort.js | 6 +- test/tail.js | 16 +-- test/tempdir.js | 4 +- test/test.js | 70 ++++++----- test/to.js | 4 +- test/toEnd.js | 14 +-- test/touch.js | 14 +-- test/uniq.js | 22 ++-- test/utils/utils.js | 2 +- test/which.js | 16 +-- 73 files changed, 956 insertions(+), 897 deletions(-) rename .jshintignore => .eslintignore (78%) create mode 100644 .eslintrc.json delete mode 100644 .jshintrc diff --git a/.jshintignore b/.eslintignore similarity index 78% rename from .jshintignore rename to .eslintignore index b17cb96ba..eff48079d 100644 --- a/.jshintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ test/resources/ node_modules/ +make.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..4f98ed05f --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,32 @@ +{ + "env": { + "node": true + }, + "extends": "airbnb-base/legacy", + "rules": { + "comma-dangle": 0, + "global-require": 0, + "vars-on-top": 0, + "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], + "no-param-reassign": 0, + "no-console": 0, + "curly": [2, "multi-line"], + "func-names": 0, + "quote-props": 0, + "no-underscore-dangle": 0, + "max-len": 0, + "no-use-before-define": 0, + "no-empty": 0, + "no-else-return": 0, + "no-throw-literal": 0, + "newline-per-chained-call": 0, + "consistent-return": 0, + "no-mixed-operators": 0, + "no-prototype-builtins": 0, + "new-cap": [2, { + "capIsNewExceptions": [ + "ShellString" + ]} + ] + } +} diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index d84d5351c..000000000 --- a/.jshintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "loopfunc": true, - "sub": true, - "undef": true, - "unused": true, - "futurehostile": true, - "latedef": "nofunc", - "nocomma": true, - "nonbsp": true, - "notypeof": true, - "node": true -} diff --git a/.npmignore b/.npmignore index b2379f590..e5c8da9a0 100644 --- a/.npmignore +++ b/.npmignore @@ -3,8 +3,8 @@ tmp/ .github/ .documentup.json .gitignore -.jshintrc -.jshintignore +.eslintrc +.eslintignore .lgtm .travis.yml .gitattributes diff --git a/global.js b/global.js index 506cc4a88..b232e66d5 100644 --- a/global.js +++ b/global.js @@ -1,7 +1,9 @@ +/* eslint no-extend-native: 0 */ var shell = require('./shell.js'); var common = require('./src/common'); -for (var cmd in shell) +Object.keys(shell).forEach(function (cmd) { global[cmd] = shell[cmd]; +}); var _to = require('./src/to'); String.prototype.to = common.wrap('to', _to); diff --git a/package.json b/package.json index a6e3f6155..2be9bd257 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "posttest": "npm run lint", "test": "node scripts/run-tests", "gendocs": "node scripts/generate-docs", - "lint": "jshint .", + "lint": "eslint .", "after-travis": "travis-check-changes", "changelog": "shelljs-changelog", "release:major": "shelljs-release major", @@ -43,8 +43,10 @@ "rechoir": "^0.6.2" }, "devDependencies": { + "eslint": "^2.0.0", + "eslint-config-airbnb-base": "^3.0.0", + "eslint-plugin-import": "^1.11.1", "coffee-script": "^1.10.0", - "jshint": "^2.9.2", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.2.0", "travis-check-changes": "^0.2.0" diff --git a/scripts/generate-docs.js b/scripts/generate-docs.js index 98a9a40d0..f777c8ad2 100755 --- a/scripts/generate-docs.js +++ b/scripts/generate-docs.js @@ -10,13 +10,13 @@ cd(__dirname + '/..'); var docs = grep('^//@', 'shell.js'); // Now extract docs from the appropriate src/*.js files -docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) { - var file = path.match('.js$') ? path : path+'.js'; +docs = docs.replace(/\/\/@include (.+)/g, function (match, path) { + var file = path.match('.js$') ? path : path + '.js'; return grep('^//@', file); }); // Remove '//@' -docs = docs.replace(/\/\/\@ ?/g, ''); +docs = docs.replace(/\/\/@ ?/g, ''); // Wipe out the old docs ShellString(cat('README.md').replace(/## Command reference(.|\n)*\n## Team/, '## Command reference\n## Team')).to('README.md'); diff --git a/scripts/run-tests.js b/scripts/run-tests.js index 1b361da22..99205623f 100755 --- a/scripts/run-tests.js +++ b/scripts/run-tests.js @@ -8,9 +8,9 @@ var failed = false; // Unit tests // cd(__dirname + '/../test'); -ls('*.js').forEach(function(file) { +ls('*.js').forEach(function (file) { echo('Running test:', file); - if (exec(JSON.stringify(process.execPath)+' '+file).code !== 123) { // 123 avoids false positives (e.g. premature exit) + if (exec(JSON.stringify(process.execPath) + ' ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) failed = true; echo('*** TEST FAILED! (missing exit code "123")'); echo(); diff --git a/src/cat.js b/src/cat.js index 1602d1c25..92ca95003 100644 --- a/src/cat.js +++ b/src/cat.js @@ -23,14 +23,14 @@ common.register('cat', _cat, { function _cat(options, files) { var cat = common.readFromPipe(this); - if (!files && !cat) - common.error('no paths given'); + if (!files && !cat) common.error('no paths given'); files = [].slice.call(arguments, 1); - files.forEach(function(file) { - if (!fs.existsSync(file)) + files.forEach(function (file) { + if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file); + } cat += fs.readFileSync(file, 'utf8'); }); diff --git a/src/cd.js b/src/cd.js index 4498ebcaa..634ed835c 100644 --- a/src/cd.js +++ b/src/cd.js @@ -8,14 +8,14 @@ common.register('cd', _cd, {}); //@ Changes to directory `dir` for the duration of the script. Changes to home //@ directory if no argument is supplied. function _cd(options, dir) { - if (!dir) - dir = common.getUserHome(); + if (!dir) dir = common.getUserHome(); if (dir === '-') { - if (!process.env.OLDPWD) + if (!process.env.OLDPWD) { common.error('could not find previous directory'); - else + } else { dir = process.env.OLDPWD; + } } try { @@ -28,7 +28,7 @@ function _cd(options, dir) { try { fs.statSync(dir); // if this succeeds, it must be some sort of file err = 'not a directory: ' + dir; - } catch (e) { + } catch (e2) { err = 'no such file or directory: ' + dir; } if (err) common.error(err); diff --git a/src/chmod.js b/src/chmod.js index 4a9f9f592..a1afd90e7 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -4,31 +4,30 @@ var path = require('path'); var PERMS = (function (base) { return { - OTHER_EXEC : base.EXEC, - OTHER_WRITE : base.WRITE, - OTHER_READ : base.READ, + OTHER_EXEC: base.EXEC, + OTHER_WRITE: base.WRITE, + OTHER_READ: base.READ, - GROUP_EXEC : base.EXEC << 3, - GROUP_WRITE : base.WRITE << 3, - GROUP_READ : base.READ << 3, + GROUP_EXEC: base.EXEC << 3, + GROUP_WRITE: base.WRITE << 3, + GROUP_READ: base.READ << 3, - OWNER_EXEC : base.EXEC << 6, - OWNER_WRITE : base.WRITE << 6, - OWNER_READ : base.READ << 6, + OWNER_EXEC: base.EXEC << 6, + OWNER_WRITE: base.WRITE << 6, + OWNER_READ: base.READ << 6, - // Literal octal numbers are apparently not allowed in "strict" javascript. Using parseInt is - // the preferred way, else a jshint warning is thrown. - STICKY : parseInt('01000', 8), - SETGID : parseInt('02000', 8), - SETUID : parseInt('04000', 8), + // Literal octal numbers are apparently not allowed in "strict" javascript. + STICKY: parseInt('01000', 8), + SETGID: parseInt('02000', 8), + SETUID: parseInt('04000', 8), - TYPE_MASK : parseInt('0770000', 8) + TYPE_MASK: parseInt('0770000', 8) }; -})({ - EXEC : 1, - WRITE : 2, - READ : 4 -}); +}({ + EXEC: 1, + WRITE: 2, + READ: 4 +})); common.register('chmod', _chmod, { }); @@ -66,8 +65,7 @@ function _chmod(options, mode, filePattern) { // get picked up by the option parser as command flags. // If we are down by one argument and options starts with -, shift everything over. [].unshift.call(arguments, ''); - } - else { + } else { common.error('You must specify a file.'); } } @@ -98,8 +96,7 @@ function _chmod(options, mode, filePattern) { } } }); - } - else { + } else { files = filePattern; } @@ -124,7 +121,6 @@ function _chmod(options, mode, filePattern) { if (isNaN(parseInt(mode, 8))) { // parse options mode.split(',').forEach(function (symbolicMode) { - /*jshint regexdash:true */ var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; var matches = pattern.exec(symbolicMode); @@ -133,19 +129,20 @@ function _chmod(options, mode, filePattern) { var operator = matches[2]; var change = matches[3]; - var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === ''; - var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === ''; - var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === ''; + var changeOwner = applyTo.indexOf('u') !== -1 || applyTo === 'a' || applyTo === ''; + var changeGroup = applyTo.indexOf('g') !== -1 || applyTo === 'a' || applyTo === ''; + var changeOther = applyTo.indexOf('o') !== -1 || applyTo === 'a' || applyTo === ''; - var changeRead = change.indexOf('r') != -1; - var changeWrite = change.indexOf('w') != -1; - var changeExec = change.indexOf('x') != -1; - var changeExecDir = change.indexOf('X') != -1; - var changeSticky = change.indexOf('t') != -1; - var changeSetuid = change.indexOf('s') != -1; + var changeRead = change.indexOf('r') !== -1; + var changeWrite = change.indexOf('w') !== -1; + var changeExec = change.indexOf('x') !== -1; + var changeExecDir = change.indexOf('X') !== -1; + var changeSticky = change.indexOf('t') !== -1; + var changeSetuid = change.indexOf('s') !== -1; - if (changeExecDir && isDir) + if (changeExecDir && isDir) { changeExec = true; + } var mask = 0; if (changeOwner) { @@ -175,35 +172,37 @@ function _chmod(options, mode, filePattern) { case '=': newPerms = type + mask; - // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared. + // According to POSIX, when using = to explicitly set the + // permissions, setuid and setgid can never be cleared. if (fs.statSync(file).isDirectory()) { newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; } break; + default: + common.error('Could not recognize operator: `' + operator + '`'); } if (options.verbose) { console.log(file + ' -> ' + newPerms.toString(8)); } - if (perms != newPerms) { + if (perms !== newPerms) { if (!options.verbose && options.changes) { console.log(file + ' -> ' + newPerms.toString(8)); } fs.chmodSync(file, newPerms); perms = newPerms; // for the next round of changes! } - } - else { + } else { common.error('Invalid symbolic mode change: ' + symbolicMode); } }); - } - else { + } else { // they gave us a full number newPerms = type + parseInt(mode, 8); - // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared. + // POSIX rules are that setuid and setgid can only be added using numeric + // form, but not cleared. if (fs.statSync(file).isDirectory()) { newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; } diff --git a/src/common.js b/src/common.js index e8ff48366..5b5cd9f69 100644 --- a/src/common.js +++ b/src/common.js @@ -1,5 +1,5 @@ -// jshint -W053 // Ignore warning about 'new String()' +/* eslint no-new-wrappers: 0 */ 'use strict'; var os = require('os'); @@ -38,8 +38,9 @@ exports.platform = platform; var pipeMethods = []; function log() { - if (!config.silent) + if (!config.silent) { console.error.apply(console, arguments); + } } exports.log = log; @@ -49,27 +50,29 @@ function error(msg, _code, _continue) { _continue = _code; _code = DEFAULT_ERROR_CODE; } - if (typeof _code !== 'number') + if (typeof _code !== 'number') { _code = DEFAULT_ERROR_CODE; + } - if (state.errorCode === 0) + if (state.errorCode === 0) { state.errorCode = _code; + } - if (state.error === null) + if (state.error === null) { state.error = ''; - var log_entry = state.currentCmd + ': ' + msg; - if (state.error === '') - state.error = log_entry; - else - state.error += '\n' + log_entry; + } + var logEntry = state.currentCmd + ': ' + msg; + if (state.error === '') { + state.error = logEntry; + } else { + state.error += '\n' + logEntry; + } - if(config.fatal) - throw new Error(log_entry); + if (config.fatal) throw new Error(logEntry); - if (msg.length > 0) - log(log_entry); + if (msg.length > 0) log(logEntry); - if(!_continue) { + if (!_continue) { throw { msg: 'earlyExit', retValue: (new ShellString('', state.error, state.errorCode)) @@ -115,10 +118,11 @@ exports.ShellString = ShellString; // older versions of node function getUserHome() { var result; - if (os.homedir) + if (os.homedir) { result = os.homedir(); // node 3+ - else + } else { result = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME']; + } return result; } exports.getUserHome = getUserHome; @@ -128,49 +132,50 @@ exports.getUserHome = getUserHome; // Returns {'reference': 'string-value', 'bob': false} when passed two dictionaries of the form: // parseOptions({'-r': 'string-value'}, {'r':'reference', 'b':'bob'}); function parseOptions(opt, map) { - if (!map) - error('parseOptions() internal error: no map given'); + if (!map) error('parseOptions() internal error: no map given'); // All options are false by default var options = {}; - for (var letter in map) { - if (map[letter][0] !== '!') + Object.keys(map).forEach(function (letter) { + if (map[letter][0] !== '!') { options[map[letter]] = false; - } + } + }); - if (!opt) - return options; // defaults + if (!opt) return options; // defaults var optionName; if (typeof opt === 'string') { - if (opt[0] !== '-') + if (opt[0] !== '-') { return options; + } // e.g. chars = ['R', 'f'] var chars = opt.slice(1).split(''); - chars.forEach(function(c) { + chars.forEach(function (c) { if (c in map) { optionName = map[c]; - if (optionName[0] === '!') + if (optionName[0] === '!') { options[optionName.slice(1)] = false; - else + } else { options[optionName] = true; + } } else { - error('option not recognized: '+c); + error('option not recognized: ' + c); } }); } else if (typeof opt === 'object') { - for (var key in opt) { + Object.keys(opt).forEach(function (key) { // key is a string of the form '-r', '-d', etc. var c = key[1]; if (c in map) { optionName = map[c]; options[optionName] = opt[key]; // assign the given value } else { - error('option not recognized: '+c); + error('option not recognized: ' + c); } - } + }); } else { error('options must be strings or key-value pairs'); } @@ -187,7 +192,7 @@ function expand(list) { throw new TypeError('must be an array'); } var expanded = []; - list.forEach(function(listEl) { + list.forEach(function (listEl) { // Don't expand non-strings if (typeof listEl !== 'string') { expanded.push(listEl); @@ -206,7 +211,7 @@ exports.expand = expand; function unlinkSync(file) { try { fs.unlinkSync(file); - } catch(e) { + } catch (e) { // Try to override file permission if (e.code === 'EPERM') { fs.chmodSync(file, '0666'); @@ -221,17 +226,17 @@ exports.unlinkSync = unlinkSync; // e.g. 'shelljs_a5f185d0443ca...' function randomFileName() { function randomHash(count) { - if (count === 1) - return parseInt(16*Math.random(), 10).toString(16); - else { - var hash = ''; - for (var i=0; i= common.config.maxdepth) { // Max depth has been reached, end copy. return; - } else { - opts.depth++; } + opts.depth++; - /* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */ + // Create the directory where all our junk is moving to; read the mode of the + // source directory and mirror it try { var checkDir = fs.statSync(sourceDir); fs.mkdirSync(destDir, checkDir.mode); } catch (e) { - //if the directory already exists, that's okay + // if the directory already exists, that's okay if (e.code !== 'EEXIST') throw e; } var files = fs.readdirSync(sourceDir); for (var i = 0; i < files.length; i++) { - var srcFile = sourceDir + "/" + files[i]; - var destFile = destDir + "/" + files[i]; + var srcFile = sourceDir + '/' + files[i]; + var destFile = destDir + '/' + files[i]; var srcFileStat = fs.lstatSync(srcFile); var symlinkFull; @@ -109,7 +110,7 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) { // Cycle link found. console.error('Cycle link found.'); symlinkFull = fs.readlinkSync(srcFile); - fs.symlinkSync(symlinkFull, destFile, os.platform() === "win32" ? "junction" : null); + fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); continue; } } @@ -124,7 +125,7 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) { } catch (e) { // it doesn't exist, so no work needs to be done } - fs.symlinkSync(symlinkFull, destFile, os.platform() === "win32" ? "junction" : null); + fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); } else if (srcFileStat.isSymbolicLink() && opts.followsymlink) { srcFileStat = fs.statSync(srcFile); if (srcFileStat.isDirectory()) { @@ -140,14 +141,18 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) { copyFileSync(srcFile, destFile, opts); } } - } // for files } // cpdirSyncRecursive function cpcheckcycle(sourceDir, srcFile) { var srcFileStat = fs.lstatSync(srcFile); if (srcFileStat.isSymbolicLink()) { - // Do cycle check. For example mkdir -p 1/2/3/4 ; cd 1/2/3/4; ln -s ../../3 link ; cd ../../../.. ; cp -RL 1 copy + // Do cycle check. For example: + // $ mkdir -p 1/2/3/4 + // $ cd 1/2/3/4 + // $ ln -s ../../3 link + // $ cd ../../../.. + // $ cp -RL 1 copy var cyclecheck = fs.statSync(srcFile); if (cyclecheck.isDirectory()) { var sourcerealpath = fs.realpathSync(sourceDir); @@ -184,10 +189,12 @@ function cpcheckcycle(sourceDir, srcFile) { //@ Copies files. function _cp(options, sources, dest) { // If we're missing -R, it actually implies -L (unless -P is explicit) - if (options.followsymlink) + if (options.followsymlink) { options.noFollowsymlink = false; - if (!options.recursive && !options.noFollowsymlink) + } + if (!options.recursive && !options.noFollowsymlink) { options.followsymlink = true; + } // Get sources, dest if (arguments.length < 3) { @@ -197,20 +204,22 @@ function _cp(options, sources, dest) { dest = arguments[arguments.length - 1]; } - var destExists = fs.existsSync(dest), - destStat = destExists && fs.statSync(dest); + var destExists = fs.existsSync(dest); + var destStat = destExists && fs.statSync(dest); // Dest is not existing dir, but multiple sources given - if ((!destExists || !destStat.isDirectory()) && sources.length > 1) + if ((!destExists || !destStat.isDirectory()) && sources.length > 1) { common.error('dest is not a directory (too many sources)'); + } // Dest is an existing file, but -n is given - if (destExists && destStat.isFile() && options.no_force) + if (destExists && destStat.isFile() && options.no_force) { return new common.ShellString('', '', 0); + } - sources.forEach(function(src) { + sources.forEach(function (src) { if (!fs.existsSync(src)) { - common.error('no such file or directory: '+src, true); + common.error('no such file or directory: ' + src, true); return; // skip file } var srcStat = fs.statSync(src); @@ -227,20 +236,20 @@ function _cp(options, sources, dest) { try { fs.statSync(path.dirname(dest)); - cpdirSyncRecursive(src, newDest, {no_force: options.no_force, followsymlink: options.followsymlink}); - } catch(e) { + cpdirSyncRecursive(src, newDest, { no_force: options.no_force, followsymlink: options.followsymlink }); + } catch (e) { common.error("cannot create directory '" + dest + "': No such file or directory"); } } - return; // done with dir } else { // If here, src is a file // When copying to '/path/dir': // thisDest = '/path/dir/file1' var thisDest = dest; - if (destStat && destStat.isDirectory()) + if (destStat && destStat.isDirectory()) { thisDest = path.normalize(dest + '/' + path.basename(src)); + } if (fs.existsSync(thisDest) && options.no_force) { return; // skip file diff --git a/src/dirs.js b/src/dirs.js index bb0688a22..cf5fe02f5 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -23,9 +23,8 @@ function _parseStackIndex(index) { if (_isStackIndex(index)) { if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd return (/^-/).test(index) ? Number(index) - 1 : Number(index); - } else { - common.error(index + ': directory stack index out of range'); } + common.error(index + ': directory stack index out of range'); } else { common.error(index + ': invalid number'); } @@ -64,7 +63,7 @@ function _pushd(options, dir) { } options = common.parseOptions(options, { - 'n' : 'no-cd' + 'n': 'no-cd' }); var dirs = _actualDirStack(); @@ -130,7 +129,7 @@ function _popd(options, index) { } options = common.parseOptions(options, { - 'n' : 'no-cd' + 'n': 'no-cd' }); if (!_dirStack.length) { @@ -173,10 +172,10 @@ function _dirs(options, index) { } options = common.parseOptions(options, { - 'c' : 'clear' + 'c': 'clear' }); - if (options['clear']) { + if (options.clear) { _dirStack = []; return _dirStack; } diff --git a/src/exec.js b/src/exec.js index 80c3d6948..380d3bf40 100644 --- a/src/exec.js +++ b/src/exec.js @@ -5,7 +5,7 @@ var path = require('path'); var fs = require('fs'); var child = require('child_process'); -var DEFAULT_MAXBUFFER_SIZE = 20*1024*1024; +var DEFAULT_MAXBUFFER_SIZE = 20 * 1024 * 1024; common.register('exec', _exec, { unix: false, @@ -20,11 +20,11 @@ common.register('exec', _exec, { // event loop). function execSync(cmd, opts, pipe) { var tempDir = _tempDir(); - var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()), - stderrFile = path.resolve(tempDir+'/'+common.randomFileName()), - codeFile = path.resolve(tempDir+'/'+common.randomFileName()), - scriptFile = path.resolve(tempDir+'/'+common.randomFileName()), - sleepFile = path.resolve(tempDir+'/'+common.randomFileName()); + var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); + var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); + var codeFile = path.resolve(tempDir + '/' + common.randomFileName()); + var scriptFile = path.resolve(tempDir + '/' + common.randomFileName()); + var sleepFile = path.resolve(tempDir + '/' + common.randomFileName()); opts = common.extend({ silent: common.config.silent, @@ -33,29 +33,31 @@ function execSync(cmd, opts, pipe) { maxBuffer: DEFAULT_MAXBUFFER_SIZE }, opts); - var previousStdoutContent = '', - previousStderrContent = ''; + var previousStdoutContent = ''; + var previousStderrContent = ''; // Echoes stdout and stderr changes from running process, if not silent function updateStream(streamFile) { - if (opts.silent || !fs.existsSync(streamFile)) + if (opts.silent || !fs.existsSync(streamFile)) { return; + } - var previousStreamContent, - proc_stream; + var previousStreamContent; + var procStream; if (streamFile === stdoutFile) { previousStreamContent = previousStdoutContent; - proc_stream = process.stdout; + procStream = process.stdout; } else { // assume stderr previousStreamContent = previousStderrContent; - proc_stream = process.stderr; + procStream = process.stderr; } var streamContent = fs.readFileSync(streamFile, 'utf8'); // No changes since last time? - if (streamContent.length <= previousStreamContent.length) + if (streamContent.length <= previousStreamContent.length) { return; + } - proc_stream.write(streamContent.substr(previousStreamContent.length)); + procStream.write(streamContent.substr(previousStreamContent.length)); previousStreamContent = streamContent; } @@ -72,23 +74,23 @@ function execSync(cmd, opts, pipe) { if (typeof child.execSync === 'function') { script = [ - "var child = require('child_process')", - " , fs = require('fs');", - "var childProcess = child.exec("+JSON.stringify(cmd)+", "+optString+", function(err) {", - " fs.writeFileSync("+JSON.stringify(codeFile)+", err ? err.code.toString() : '0');", - "});", - "var stdoutStream = fs.createWriteStream("+JSON.stringify(stdoutFile)+");", - "var stderrStream = fs.createWriteStream("+JSON.stringify(stderrFile)+");", - "childProcess.stdout.pipe(stdoutStream, {end: false});", - "childProcess.stderr.pipe(stderrStream, {end: false});", - "childProcess.stdout.pipe(process.stdout);", - "childProcess.stderr.pipe(process.stderr);" - ].join('\n') + - (pipe ? "\nchildProcess.stdin.end("+JSON.stringify(pipe)+");\n" : '\n') + + "var child = require('child_process')", + " , fs = require('fs');", + 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', + ' fs.writeFileSync(' + JSON.stringify(codeFile) + ", err ? err.code.toString() : '0');", + '});', + 'var stdoutStream = fs.createWriteStream(' + JSON.stringify(stdoutFile) + ');', + 'var stderrStream = fs.createWriteStream(' + JSON.stringify(stderrFile) + ');', + 'childProcess.stdout.pipe(stdoutStream, {end: false});', + 'childProcess.stderr.pipe(stderrStream, {end: false});', + 'childProcess.stdout.pipe(process.stdout);', + 'childProcess.stderr.pipe(process.stderr);' + ].join('\n') + + (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n') + [ - "var stdoutEnded = false, stderrEnded = false;", - "function tryClosingStdout(){ if(stdoutEnded){ stdoutStream.end(); } }", - "function tryClosingStderr(){ if(stderrEnded){ stderrStream.end(); } }", + 'var stdoutEnded = false, stderrEnded = false;', + 'function tryClosingStdout(){ if(stdoutEnded){ stdoutStream.end(); } }', + 'function tryClosingStderr(){ if(stderrEnded){ stderrStream.end(); } }', "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosingStdout(); });", "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosingStderr(); });" ].join('\n'); @@ -106,23 +108,23 @@ function execSync(cmd, opts, pipe) { child.execSync(execCommand, opts); } catch (e) { // Clean up immediately if we have an exception - try { common.unlinkSync(scriptFile); } catch(e) {} - try { common.unlinkSync(stdoutFile); } catch(e) {} - try { common.unlinkSync(stderrFile); } catch(e) {} - try { common.unlinkSync(codeFile); } catch(e) {} + try { common.unlinkSync(scriptFile); } catch (e2) {} + try { common.unlinkSync(stdoutFile); } catch (e2) {} + try { common.unlinkSync(stderrFile); } catch (e2) {} + try { common.unlinkSync(codeFile); } catch (e2) {} throw e; } } else { - cmd += ' > '+stdoutFile+' 2> '+stderrFile; // works on both win/unix + cmd += ' > ' + stdoutFile + ' 2> ' + stderrFile; // works on both win/unix script = [ - "var child = require('child_process')", - " , fs = require('fs');", - "var childProcess = child.exec("+JSON.stringify(cmd)+", "+optString+", function(err) {", - " fs.writeFileSync("+JSON.stringify(codeFile)+", err ? err.code.toString() : '0');", - "});" - ].join('\n') + - (pipe ? "\nchildProcess.stdin.end("+JSON.stringify(pipe)+");\n" : '\n'); + "var child = require('child_process')", + " , fs = require('fs');", + 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', + ' fs.writeFileSync(' + JSON.stringify(codeFile) + ", err ? err.code.toString() : '0');", + '});' + ].join('\n') + + (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n'); fs.writeFileSync(scriptFile, script); @@ -135,7 +137,7 @@ function execSync(cmd, opts, pipe) { while (!fs.existsSync(codeFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } while (!fs.existsSync(stdoutFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } while (!fs.existsSync(stderrFile)) { updateStream(stderrFile); fs.writeFileSync(sleepFile, 'a'); } - try { common.unlinkSync(sleepFile); } catch(e) {} + try { common.unlinkSync(sleepFile); } catch (e) {} } // At this point codeFile exists, but it's not necessarily flushed yet. @@ -149,12 +151,12 @@ function execSync(cmd, opts, pipe) { var stderr = fs.readFileSync(stderrFile, 'utf8'); // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { common.unlinkSync(scriptFile); } catch(e) {} - try { common.unlinkSync(stdoutFile); } catch(e) {} - try { common.unlinkSync(stderrFile); } catch(e) {} - try { common.unlinkSync(codeFile); } catch(e) {} + try { common.unlinkSync(scriptFile); } catch (e) {} + try { common.unlinkSync(stdoutFile); } catch (e) {} + try { common.unlinkSync(stderrFile); } catch (e) {} + try { common.unlinkSync(codeFile); } catch (e) {} - if (code !== 0) { + if (code !== 0) { common.error('', code, true); } var obj = common.ShellString(stdout, stderr, code); @@ -173,24 +175,22 @@ function execAsync(cmd, opts, pipe, callback) { maxBuffer: DEFAULT_MAXBUFFER_SIZE }, opts); - var c = child.exec(cmd, opts, function(err) { - if (callback) + var c = child.exec(cmd, opts, function (err) { + if (callback) { callback(err ? err.code : 0, stdout, stderr); + } }); - if (pipe) - c.stdin.end(pipe); + if (pipe) c.stdin.end(pipe); - c.stdout.on('data', function(data) { + c.stdout.on('data', function (data) { stdout += data; - if (!opts.silent) - process.stdout.write(data); + if (!opts.silent) process.stdout.write(data); }); - c.stderr.on('data', function(data) { + c.stderr.on('data', function (data) { stderr += data; - if (!opts.silent) - process.stderr.write(data); + if (!opts.silent) process.stderr.write(data); }); return c; @@ -236,8 +236,8 @@ function execAsync(cmd, opts, pipe, callback) { //@ the current synchronous implementation uses a lot of CPU. This should be getting //@ fixed soon. function _exec(command, options, callback) { - if (!command) - common.error('must specify command'); + options = options || {}; + if (!command) common.error('must specify command'); var pipe = common.readFromPipe(this); @@ -258,10 +258,11 @@ function _exec(command, options, callback) { }, options); try { - if (options.async) + if (options.async) { return execAsync(command, options, pipe, callback); - else + } else { return execSync(command, options, pipe); + } } catch (e) { common.error('internal error'); } diff --git a/src/find.js b/src/find.js index 1a33c9b6d..f96a51e78 100644 --- a/src/find.js +++ b/src/find.js @@ -21,10 +21,11 @@ common.register('find', _find, {}); //@ The main difference from `ls('-R', path)` is that the resulting file names //@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. function _find(options, paths) { - if (!paths) + if (!paths) { common.error('no path specified'); - else if (typeof paths === 'string') + } else if (typeof paths === 'string') { paths = [].slice.call(arguments, 1); + } var list = []; @@ -38,11 +39,11 @@ function _find(options, paths) { // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory - paths.forEach(function(file) { + paths.forEach(function (file) { pushFile(file); if (fs.statSync(file).isDirectory()) { - _ls({recursive: true, all: true}, file).forEach(function(subfile) { + _ls({ recursive: true, all: true }, file).forEach(function (subfile) { pushFile(path.join(file, subfile)); }); } diff --git a/src/grep.js b/src/grep.js index 04319df22..4781cdaf6 100644 --- a/src/grep.js +++ b/src/grep.js @@ -31,16 +31,16 @@ function _grep(options, regex, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(this); - if (!files && !pipe) - common.error('no paths given', 2); + if (!files && !pipe) common.error('no paths given', 2); files = [].slice.call(arguments, 2); - if (pipe) + if (pipe) { files.unshift('-'); + } var grep = []; - files.forEach(function(file) { + files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, 2, true); return; @@ -49,17 +49,19 @@ function _grep(options, regex, files) { var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); var lines = contents.split(/\r*\n/); if (options.nameOnly) { - if (contents.match(regex)) + if (contents.match(regex)) { grep.push(file); + } } else { - lines.forEach(function(line) { + lines.forEach(function (line) { var matched = line.match(regex); - if ((options.inverse && !matched) || (!options.inverse && matched)) + if ((options.inverse && !matched) || (!options.inverse && matched)) { grep.push(line); + } }); } }); - return grep.join('\n')+'\n'; + return grep.join('\n') + '\n'; } module.exports = _grep; diff --git a/src/head.js b/src/head.js index cfaefa090..6256fcb97 100644 --- a/src/head.js +++ b/src/head.js @@ -10,15 +10,15 @@ common.register('head', _head, { // This reads n or more lines, or the entire file, whichever is less. function readSomeLines(file, numLines) { - var BUF_LENGTH = 64*1024, - buf = new Buffer(BUF_LENGTH), - bytesRead = BUF_LENGTH, - pos = 0, - fdr = null; + var BUF_LENGTH = 64 * 1024; + var buf = new Buffer(BUF_LENGTH); + var bytesRead = BUF_LENGTH; + var pos = 0; + var fdr = null; try { fdr = fs.openSync(file, 'r'); - } catch(e) { + } catch (e) { common.error('cannot read file: ' + file); } @@ -55,8 +55,7 @@ function _head(options, files) { var head = []; var pipe = common.readFromPipe(this); - if (!files && !pipe) - common.error('no paths given'); + if (!files && !pipe) common.error('no paths given'); var idx = 1; if (options.numLines === true) { @@ -67,36 +66,39 @@ function _head(options, files) { } files = [].slice.call(arguments, idx); - if (pipe) + if (pipe) { files.unshift('-'); + } var shouldAppendNewline = false; - files.forEach(function(file) { + files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, true); return; } var contents; - if (file === '-') + if (file === '-') { contents = pipe; - else if (options.numLines < 0) { + } else if (options.numLines < 0) { contents = fs.readFileSync(file, 'utf8'); } else { contents = readSomeLines(file, options.numLines); } var lines = contents.split('\n'); - var hasTrailingNewline = (lines[lines.length-1] === ''); - if (hasTrailingNewline) + var hasTrailingNewline = (lines[lines.length - 1] === ''); + if (hasTrailingNewline) { lines.pop(); + } shouldAppendNewline = (hasTrailingNewline || options.numLines < lines.length); head = head.concat(lines.slice(0, options.numLines)); }); - if (shouldAppendNewline) + if (shouldAppendNewline) { head.push(''); // to add a trailing newline once we join + } return head.join('\n'); } module.exports = _head; diff --git a/src/ln.js b/src/ln.js index 66d7e59f0..22c1d89b4 100644 --- a/src/ln.js +++ b/src/ln.js @@ -49,11 +49,11 @@ function _ln(options, source, dest) { if (!fs.existsSync(resolvedSourcePath)) { common.error('Source file does not exist', true); } else if (isWindows && fs.statSync(resolvedSourcePath).isDirectory()) { - linkType = 'junction'; + linkType = 'junction'; } try { - fs.symlinkSync(linkType === 'junction' ? resolvedSourcePath: source, dest, linkType); + fs.symlinkSync(linkType === 'junction' ? resolvedSourcePath : source, dest, linkType); } catch (err) { common.error(err.message); } diff --git a/src/ls.js b/src/ls.js index 85dd75ab5..b1cd30eeb 100644 --- a/src/ls.js +++ b/src/ls.js @@ -47,16 +47,18 @@ function _ls(options, paths) { options.all = true; } - if (!paths) + if (!paths) { paths = ['.']; - else + } else { paths = [].slice.call(arguments, 1); + } var list = []; function pushFile(abs, relName, stat) { - if (process.platform === 'win32') + if (process.platform === 'win32') { relName = relName.replace(/\\/g, '/'); + } if (options.long) { stat = stat || fs.lstatSync(abs); list.push(addLsAttributes(relName, stat)); @@ -66,7 +68,7 @@ function _ls(options, paths) { } } - paths.forEach(function(p) { + paths.forEach(function (p) { var stat; try { @@ -82,8 +84,8 @@ function _ls(options, paths) { // use glob, because it's simple glob.sync(p + globPatternRecursive, { dot: options.all }) .forEach(function (item) { - pushFile(item, path.relative(p, item)); - }); + pushFile(item, path.relative(p, item)); + }); } else if (options.all) { // use fs.readdirSync, because it's fast fs.readdirSync(p).forEach(function (item) { @@ -92,8 +94,9 @@ function _ls(options, paths) { } else { // use fs.readdirSync and then filter out secret files fs.readdirSync(p).forEach(function (item) { - if (item[0] !== '.') + if (item[0] !== '.') { pushFile(path.join(p, item), item); + } }); } } else { @@ -105,10 +108,10 @@ function _ls(options, paths) { return list; } -function addLsAttributes(path, stats) { +function addLsAttributes(pathName, stats) { // Note: this object will contain more information than .toString() returns - stats.name = path; - stats.toString = function() { + stats.name = pathName; + stats.toString = function () { // Return a string resembling unix's `ls -l` format return [this.mode, this.nlink, this.uid, this.gid, this.size, this.mtime, this.name].join(' '); }; diff --git a/src/mkdir.js b/src/mkdir.js index 6b308d16d..d75a86bcb 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -15,8 +15,8 @@ function mkdirSyncRecursive(dir) { // Prevents some potential problems arising from malformed UNCs or // insufficient permissions. /* istanbul ignore next */ - if(baseDir === dir) { - common.error("dirname() failed: [" + dir + "]"); + if (baseDir === dir) { + common.error('dirname() failed: [' + dir + ']'); } // Base dir exists, no recursion necessary @@ -48,18 +48,19 @@ function mkdirSyncRecursive(dir) { //@ //@ Creates directories. function _mkdir(options, dirs) { - if (!dirs) - common.error('no paths given'); + if (!dirs) common.error('no paths given'); - if (typeof dirs === 'string') + if (typeof dirs === 'string') { dirs = [].slice.call(arguments, 1); + } // if it's array leave it as it is - dirs.forEach(function(dir) { + dirs.forEach(function (dir) { try { fs.lstatSync(dir); - if (!options.fullpath) + if (!options.fullpath) { common.error('path already exists: ' + dir, true); + } return; // skip dir } catch (e) { // do nothing @@ -73,15 +74,17 @@ function _mkdir(options, dirs) { } try { - if (options.fullpath) + if (options.fullpath) { mkdirSyncRecursive(dir); - else + } else { fs.mkdirSync(dir, parseInt('0777', 8)); + } } catch (e) { - if (e.code === 'EACCES') + if (e.code === 'EACCES') { common.error('cannot create directory ' + dir + ': Permission denied'); - else + } else { throw e; + } } }); return ''; diff --git a/src/mv.js b/src/mv.js index 662f7b731..5dd32a0af 100644 --- a/src/mv.js +++ b/src/mv.js @@ -41,20 +41,22 @@ function _mv(options, sources, dest) { common.error('invalid arguments'); } - var exists = fs.existsSync(dest), - stats = exists && fs.statSync(dest); + var exists = fs.existsSync(dest); + var stats = exists && fs.statSync(dest); // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) + if ((!exists || !stats.isDirectory()) && sources.length > 1) { common.error('dest is not a directory (too many sources)'); + } // Dest is an existing file, but no -f given - if (exists && stats.isFile() && options.no_force) + if (exists && stats.isFile() && options.no_force) { common.error('dest file already exists: ' + dest); + } - sources.forEach(function(src) { + sources.forEach(function (src) { if (!fs.existsSync(src)) { - common.error('no such file or directory: '+src, true); + common.error('no such file or directory: ' + src, true); return; // skip file } @@ -63,8 +65,9 @@ function _mv(options, sources, dest) { // When copying to '/path/dir': // thisDest = '/path/dir/file1' var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) + if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) { thisDest = path.normalize(dest + '/' + path.basename(src)); + } if (fs.existsSync(thisDest) && options.no_force) { common.error('dest file already exists: ' + thisDest, true); @@ -72,7 +75,7 @@ function _mv(options, sources, dest) { } if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { - common.error('cannot move to self: '+src, true); + common.error('cannot move to self: ' + src, true); return; // skip file } diff --git a/src/popd.js b/src/popd.js index 11ea24fa4..d9eac3f56 100644 --- a/src/popd.js +++ b/src/popd.js @@ -1 +1 @@ -// see dirs.js \ No newline at end of file +// see dirs.js diff --git a/src/pushd.js b/src/pushd.js index 11ea24fa4..d9eac3f56 100644 --- a/src/pushd.js +++ b/src/pushd.js @@ -1 +1 @@ -// see dirs.js \ No newline at end of file +// see dirs.js diff --git a/src/rm.js b/src/rm.js index 40fc5076d..0e9d5e4cf 100644 --- a/src/rm.js +++ b/src/rm.js @@ -23,18 +23,18 @@ function rmdirSyncRecursive(dir, force) { files = fs.readdirSync(dir); // Loop through and delete everything in the sub-tree after checking it - for(var i = 0; i < files.length; i++) { - var file = dir + "/" + files[i], - currFile = fs.lstatSync(file); + for (var i = 0; i < files.length; i++) { + var file = dir + '/' + files[i]; + var currFile = fs.lstatSync(file); - if(currFile.isDirectory()) { // Recursive function back to the beginning + if (currFile.isDirectory()) { // Recursive function back to the beginning rmdirSyncRecursive(file, force); } else { // Assume it's a file - perhaps a try/catch belongs here? if (force || isWriteable(file)) { try { common.unlinkSync(file); } catch (e) { - common.error('could not remove file (code '+e.code+'): ' + file, true); + common.error('could not remove file (code ' + e.code + '): ' + file, true); } } } @@ -50,13 +50,13 @@ function rmdirSyncRecursive(dir, force) { while (true) { try { result = fs.rmdirSync(dir); - if (fs.existsSync(dir)) throw { code: "EAGAIN" }; + if (fs.existsSync(dir)) throw { code: 'EAGAIN' }; break; - } catch(er) { + } catch (er) { // In addition to error codes, also check if the directory still exists and loop again if true - if (process.platform === "win32" && (er.code === "ENOTEMPTY" || er.code === "EBUSY" || er.code === "EPERM" || er.code === "EAGAIN")) { + if (process.platform === 'win32' && (er.code === 'ENOTEMPTY' || er.code === 'EBUSY' || er.code === 'EPERM' || er.code === 'EAGAIN')) { if (Date.now() - start > 1000) throw er; - } else if (er.code === "ENOENT") { + } else if (er.code === 'ENOENT') { // Directory did not exist, deletion was successful break; } else { @@ -64,8 +64,8 @@ function rmdirSyncRecursive(dir, force) { } } } - } catch(e) { - common.error('could not remove directory (code '+e.code+'): ' + dir, true); + } catch (e) { + common.error('could not remove directory (code ' + e.code + '): ' + dir, true); } return result; @@ -78,7 +78,7 @@ function isWriteable(file) { try { var __fd = fs.openSync(file, 'a'); fs.closeSync(__fd); - } catch(e) { + } catch (e) { writePermission = false; } @@ -103,36 +103,36 @@ function isWriteable(file) { //@ //@ Removes files. function _rm(options, files) { - if (!files) - common.error('no paths given'); + if (!files) common.error('no paths given'); // Convert to array files = [].slice.call(arguments, 1); - files.forEach(function(file) { + files.forEach(function (file) { var stats; try { stats = fs.lstatSync(file); // test for existence } catch (e) { // Path does not exist, no force flag given - if (!options.force) - common.error('no such file or directory: '+file, true); + if (!options.force) { + common.error('no such file or directory: ' + file, true); + } return; // skip file } // If here, path exists if (stats.isFile() || stats.isSymbolicLink()) { - // Do not check for file writing permissions if (options.force) { common.unlinkSync(file); return; } - if (isWriteable(file)) + if (isWriteable(file)) { common.unlinkSync(file); - else - common.error('permission denied: '+file, true); + } else { + common.error('permission denied: ' + file, true); + } return; } // simple file diff --git a/src/sed.js b/src/sed.js index bcaba40f1..8286e8e46 100644 --- a/src/sed.js +++ b/src/sed.js @@ -29,27 +29,31 @@ function _sed(options, regex, replacement, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(this); - if (typeof replacement === 'string' || typeof replacement === 'function') - replacement = replacement; // no-op - else if (typeof replacement === 'number') - replacement = replacement.toString(); // fallback - else - common.error('invalid replacement string'); + if (typeof replacement !== 'string' && typeof replacement !== 'function') { + if (typeof replacement === 'number') { + replacement = replacement.toString(); // fallback + } else { + common.error('invalid replacement string'); + } + } // Convert all search strings to RegExp - if (typeof regex === 'string') + if (typeof regex === 'string') { regex = RegExp(regex); + } - if (!files && !pipe) + if (!files && !pipe) { common.error('no files given'); + } files = [].slice.call(arguments, 3); - if (pipe) + if (pipe) { files.unshift('-'); + } var sed = []; - files.forEach(function(file) { + files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, 2, true); return; @@ -63,8 +67,9 @@ function _sed(options, regex, replacement, files) { sed.push(result); - if (options.inplace) + if (options.inplace) { fs.writeFileSync(file, result, 'utf8'); + } }); return sed.join('\n'); diff --git a/src/set.js b/src/set.js index 356611d1c..3402cd660 100644 --- a/src/set.js +++ b/src/set.js @@ -24,8 +24,7 @@ common.register('set', _set, { function _set(options) { if (!options) { var args = [].slice.call(arguments, 0); - if (args.length < 2) - common.error('must provide an argument'); + if (args.length < 2) common.error('must provide an argument'); options = args[1]; } var negate = (options[0] === '+'); @@ -38,19 +37,19 @@ function _set(options) { 'f': 'noglob' }); - var key; if (negate) { - for (key in options) + Object.keys(options).forEach(function (key) { options[key] = !options[key]; + }); } - for (key in options) { + Object.keys(options).forEach(function (key) { // Only change the global config if `negate` is false and the option is true // or if `negate` is true and the option is false (aka negate !== option) if (negate !== options[key]) { common.config[key] = options[key]; } - } + }); return; } module.exports = _set; diff --git a/src/sort.js b/src/sort.js index e4772400f..b70b094e5 100644 --- a/src/sort.js +++ b/src/sort.js @@ -10,9 +10,9 @@ common.register('sort', _sort, { }); // parse out the number prefix of a line -function parseNumber (str) { +function parseNumber(str) { var match = str.match(/^\s*(\d*)\s*(.*)$/); - return {num: Number(match[1]), value: match[2]}; + return { num: Number(match[1]), value: match[2] }; } // compare two strings case-insensitively, but examine case for strings that are @@ -59,16 +59,16 @@ function _sort(options, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(this); - if (!files && !pipe) - common.error('no files given'); + if (!files && !pipe) common.error('no files given'); files = [].slice.call(arguments, 1); - if (pipe) + if (pipe) { files.unshift('-'); + } var lines = []; - files.forEach(function(file) { + files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { // exit upon any sort of error common.error('no such file or directory: ' + file); @@ -81,10 +81,11 @@ function _sort(options, files) { var sorted; sorted = lines.sort(options.numerical ? numericalCmp : unixCmp); - if (options.reverse) + if (options.reverse) { sorted = sorted.reverse(); + } - return sorted.join('\n')+'\n'; + return sorted.join('\n') + '\n'; } module.exports = _sort; diff --git a/src/tail.js b/src/tail.js index c2051446e..0b0150235 100644 --- a/src/tail.js +++ b/src/tail.js @@ -28,8 +28,7 @@ function _tail(options, files) { var tail = []; var pipe = common.readFromPipe(this); - if (!files && !pipe) - common.error('no paths given'); + if (!files && !pipe) common.error('no paths given'); var idx = 1; if (options.numLines === true) { @@ -41,11 +40,12 @@ function _tail(options, files) { options.numLines = -1 * Math.abs(options.numLines); files = [].slice.call(arguments, idx); - if (pipe) + if (pipe) { files.unshift('-'); + } var shouldAppendNewline = false; - files.forEach(function(file) { + files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, true); return; @@ -54,7 +54,7 @@ function _tail(options, files) { var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); var lines = contents.split('\n'); - if (lines[lines.length-1] === '') { + if (lines[lines.length - 1] === '') { lines.pop(); shouldAppendNewline = true; } else { @@ -64,8 +64,9 @@ function _tail(options, files) { tail = tail.concat(lines.slice(options.numLines)); }); - if (shouldAppendNewline) + if (shouldAppendNewline) { tail.push(''); // to add a trailing newline once we join + } return tail.join('\n'); } module.exports = _tail; diff --git a/src/tempdir.js b/src/tempdir.js index d24988efc..cfd56b379 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -9,13 +9,11 @@ common.register('tempdir', _tempDir, { // Returns false if 'dir' is not a writeable directory, 'dir' otherwise function writeableDir(dir) { - if (!dir || !fs.existsSync(dir)) - return false; + if (!dir || !fs.existsSync(dir)) return false; - if (!fs.statSync(dir).isDirectory()) - return false; + if (!fs.statSync(dir).isDirectory()) return false; - var testFile = dir+'/'+common.randomFileName(); + var testFile = dir + '/' + common.randomFileName(); try { fs.writeFileSync(testFile, ' '); common.unlinkSync(testFile); @@ -39,15 +37,14 @@ function writeableDir(dir) { //@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). function _tempDir() { var state = common.state; - if (state.tempDir) - return state.tempDir; // from cache + if (state.tempDir) return state.tempDir; // from cache state.tempDir = writeableDir(os.tmpdir && os.tmpdir()) || // node 0.10+ writeableDir(os.tmpDir && os.tmpDir()) || // node 0.8+ - writeableDir(process.env['TMPDIR']) || - writeableDir(process.env['TEMP']) || - writeableDir(process.env['TMP']) || - writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS + writeableDir(process.env.TMPDIR) || + writeableDir(process.env.TEMP) || + writeableDir(process.env.TMP) || + writeableDir(process.env.Wimp$ScrapDir) || // RiscOS writeableDir('C:\\TEMP') || // Windows writeableDir('C:\\TMP') || // Windows writeableDir('\\TEMP') || // Windows diff --git a/src/test.js b/src/test.js index 078e90657..b3926a482 100644 --- a/src/test.js +++ b/src/test.js @@ -16,7 +16,6 @@ common.register('test', _test, { }); - //@ //@ ### test(expression) //@ Available expression primaries: @@ -39,51 +38,43 @@ common.register('test', _test, { //@ //@ Evaluates expression using the available primaries and returns corresponding value. function _test(options, path) { - if (!path) - common.error('no path given'); + if (!path) common.error('no path given'); var canInterpret = false; - for (var key in options) + Object.keys(options).forEach(function (key) { if (options[key] === true) { canInterpret = true; - break; } + }); - if (!canInterpret) - common.error('could not interpret expression'); + if (!canInterpret) common.error('could not interpret expression'); if (options.link) { try { return fs.lstatSync(path).isSymbolicLink(); - } catch(e) { + } catch (e) { return false; } } - if (!fs.existsSync(path)) - return false; + if (!fs.existsSync(path)) return false; - if (options.exists) - return true; + if (options.exists) return true; var stats = fs.statSync(path); - if (options.block) - return stats.isBlockDevice(); + if (options.block) return stats.isBlockDevice(); + + if (options.character) return stats.isCharacterDevice(); - if (options.character) - return stats.isCharacterDevice(); + if (options.directory) return stats.isDirectory(); - if (options.directory) - return stats.isDirectory(); + if (options.file) return stats.isFile(); - if (options.file) - return stats.isFile(); + if (options.pipe) return stats.isFIFO(); - if (options.pipe) - return stats.isFIFO(); + if (options.socket) return stats.isSocket(); - if (options.socket) - return stats.isSocket(); + return false; // fallback } // test module.exports = _test; diff --git a/src/to.js b/src/to.js index 1640d184c..31e84a60f 100644 --- a/src/to.js +++ b/src/to.js @@ -20,17 +20,17 @@ common.register('to', _to, { //@ ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix //@ redirections, `to()` will overwrite any existing file!_ function _to(options, file) { - if (!file) - common.error('wrong arguments'); + if (!file) common.error('wrong arguments'); - if (!fs.existsSync( path.dirname(file) )) - common.error('no such file or directory: ' + path.dirname(file)); + if (!fs.existsSync(path.dirname(file))) { + common.error('no such file or directory: ' + path.dirname(file)); + } try { fs.writeFileSync(file, this.stdout || this.toString(), 'utf8'); return this; - } catch(e) { - common.error('could not write to file (code '+e.code+'): '+file, true); + } catch (e) { + common.error('could not write to file (code ' + e.code + '): ' + file, true); } } module.exports = _to; diff --git a/src/toEnd.js b/src/toEnd.js index dd0506ea3..5d58f1d10 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -19,17 +19,17 @@ common.register('toEnd', _toEnd, { //@ Analogous to the redirect-and-append operator `>>` in Unix, but works with //@ ShellStrings (such as those returned by `cat`, `grep`, etc). function _toEnd(options, file) { - if (!file) - common.error('wrong arguments'); + if (!file) common.error('wrong arguments'); - if (!fs.existsSync( path.dirname(file) )) - common.error('no such file or directory: ' + path.dirname(file)); + if (!fs.existsSync(path.dirname(file))) { + common.error('no such file or directory: ' + path.dirname(file)); + } try { fs.appendFileSync(file, this.stdout || this.toString(), 'utf8'); return this; - } catch(e) { - common.error('could not append to file (code '+e.code+'): '+file, true); + } catch (e) { + common.error('could not append to file (code ' + e.code + '): ' + file, true); } } module.exports = _toEnd; diff --git a/src/touch.js b/src/touch.js index 512307b3e..b672b2d25 100644 --- a/src/touch.js +++ b/src/touch.js @@ -34,14 +34,15 @@ common.register('touch', _touch, { //@ A FILE argument that does not exist is created empty, unless -c is supplied. //@ This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. function _touch(opts, files) { - if (!files) + if (!files) { common.error('no files given'); - else if (typeof files === 'string') + } else if (typeof files === 'string') { files = [].slice.call(arguments, 1); - else + } else { common.error('file arg should be a string file path or an Array of string file paths'); + } - files.forEach(function(f) { + files.forEach(function (f) { touchFile(opts, f); }); return ''; diff --git a/src/uniq.js b/src/uniq.js index b8e500abf..9fe77358f 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -1,11 +1,11 @@ var common = require('./common'); var fs = require('fs'); -//add c spaces to the left of str -function lpad(c, str){ +// add c spaces to the left of str +function lpad(c, str) { var res = '' + str; - if(res.length < c){ - res = Array((c-res.length)+1).join(' ') + res; + if (res.length < c) { + res = Array((c - res.length) + 1).join(' ') + res; } return res; } @@ -40,37 +40,39 @@ function _uniq(options, input, output) { // Check if this is coming from a pipe var pipe = common.readFromPipe(this); - if (!input && !pipe) - common.error('no input given'); + if (!input && !pipe) common.error('no input given'); var lines = (input ? fs.readFileSync(input, 'utf8') : pipe). trimRight(). split(/\r*\n/); - var compare = function(a, b){ - return options.ignoreCase ? - a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase()) : - a.localeCompare(b); + var compare = function (a, b) { + return options.ignoreCase ? + a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase()) : + a.localeCompare(b); }; - var uniqed = lines.reduceRight(function(res, e){ - //Perform uniq -c on the input - return res.length === 0 ? [{count: 1, ln: e}] : - (compare(res[0].ln,e) === 0 ? - [{count: res[0].count + 1, ln: e}].concat(res.slice(1)) : - [{count: 1, ln: e}].concat(res)); - }, []).filter(function(obj){ - //Do we want only duplicated objects? - return options.duplicates ? obj.count > 1 : true; - }).map(function(obj){ - //Are we tracking the counts of each line? - return (options.count ? (lpad(7,obj.count) + ' ') : '') + obj.ln; - }).join('\n') + '\n'; + var uniqed = lines.reduceRight(function (res, e) { + // Perform uniq -c on the input + if (res.length === 0) { + return [{ count: 1, ln: e }]; + } else if (compare(res[0].ln, e) === 0) { + return [{ count: res[0].count + 1, ln: e }].concat(res.slice(1)); + } else { + return [{ count: 1, ln: e }].concat(res); + } + }, []).filter(function (obj) { + // Do we want only duplicated objects? + return options.duplicates ? obj.count > 1 : true; + }).map(function (obj) { + // Are we tracking the counts of each line? + return (options.count ? (lpad(7, obj.count) + ' ') : '') + obj.ln; + }).join('\n') + '\n'; - if(output){ + if (output) { (new common.ShellString(uniqed)).to(output); - //if uniq writes to output, nothing is passed to the next command in the pipeline (if any) + // if uniq writes to output, nothing is passed to the next command in the pipeline (if any) return ''; - }else{ + } else { return uniqed; } } diff --git a/src/which.js b/src/which.js index c7a12a621..ef5d185eb 100644 --- a/src/which.js +++ b/src/which.js @@ -12,17 +12,17 @@ var XP_DEFAULT_PATHEXT = '.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh'; // Cross-platform method for splitting environment PATH variables function splitPath(p) { - if (!p) - return []; + if (!p) return []; - if (common.platform === 'win') + if (common.platform === 'win') { return p.split(';'); - else + } else { return p.split(':'); + } } -function checkPath(path) { - return fs.existsSync(path) && !fs.statSync(path).isDirectory(); +function checkPath(pathName) { + return fs.existsSync(pathName) && !fs.statSync(pathName).isDirectory(); } //@ @@ -38,19 +38,17 @@ function checkPath(path) { //@ `PATHEXT` variable to append the extension if it's not already executable. //@ Returns string containing the absolute path to the command. function _which(options, cmd) { - if (!cmd) - common.error('must specify command'); + if (!cmd) common.error('must specify command'); - var pathEnv = process.env.path || process.env.Path || process.env.PATH, - pathArray = splitPath(pathEnv), - where = null; + var pathEnv = process.env.path || process.env.Path || process.env.PATH; + var pathArray = splitPath(pathEnv); + var where = null; // No relative/absolute paths provided? if (cmd.search(/\//) === -1) { // Search for command in PATH - pathArray.forEach(function(dir) { - if (where) - return; // already found it + pathArray.forEach(function (dir) { + if (where) return; // already found it var attempt = path.resolve(dir, cmd); @@ -92,8 +90,7 @@ function _which(options, cmd) { } // Command not found anywhere? - if (!checkPath(cmd) && !where) - return null; + if (!checkPath(cmd) && !where) return null; where = where || path.resolve(cmd); diff --git a/test/cat.js b/test/cat.js index 3435beb03..ea3306a65 100644 --- a/test/cat.js +++ b/test/cat.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; diff --git a/test/cd.js b/test/cd.js index 1745ff6e4..482324e76 100644 --- a/test/cd.js +++ b/test/cd.js @@ -1,9 +1,9 @@ var shell = require('..'); -var assert = require('assert'), - path = require('path'), - fs = require('fs'), - common = require('../src/common'); +var assert = require('assert'); +var path = require('path'); +var fs = require('fs'); +var common = require('../src/common'); shell.config.silent = true; diff --git a/test/chmod.js b/test/chmod.js index f433f22cb..16dec0e28 100644 --- a/test/chmod.js +++ b/test/chmod.js @@ -1,8 +1,8 @@ var shell = require('..'); var common = require('../src/common'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -22,8 +22,7 @@ assert.equal(result.code, 1); // // On Windows, chmod acts VERY differently so skip those tests for now -if (common.platform === 'win') - shell.exit(123); +if (common.platform === 'win') shell.exit(123); // Test files - the bitmasking is to ignore the upper bits. result = shell.chmod('755', 'resources/chmod/file1'); diff --git a/test/common.js b/test/common.js index 69b90a97b..746762c38 100644 --- a/test/common.js +++ b/test/common.js @@ -19,7 +19,7 @@ assert.throws(function () { // should be a list assert.throws(function () { - common.expand("resources"); + common.expand('resources'); }, TypeError); // @@ -46,7 +46,7 @@ assert.deepEqual(result.sort(), ['resources/file1.txt', 'resources/file2.txt'].s // multiple file, glob syntax, ** for directory name result = common.expand(['**/file*.js']); assert.equal(shell.error(), null); -assert.deepEqual(result.sort(), ["resources/file1.js","resources/file2.js","resources/ls/file1.js","resources/ls/file2.js"].sort()); +assert.deepEqual(result.sort(), ['resources/file1.js', 'resources/file2.js', 'resources/ls/file1.js', 'resources/ls/file2.js'].sort()); // broken links still expand result = common.expand(['resources/b*dlink']); @@ -89,7 +89,7 @@ assert.ok(result.no_force === false); assert.ok(result.force === undefined); // this key shouldn't exist // common.parseOptions using an object to hold options -result = common.parseOptions({'-v': 'some text here'}, { +result = common.parseOptions({ '-v': 'some text here' }, { 'v': 'value', 'f': 'force', 'r': 'reverse' @@ -113,4 +113,3 @@ assert.equal(result.stderr, 'ls: no such file or directory: noexist\ncd: no such shell.exit(123); - diff --git a/test/config.js b/test/config.js index ea024a470..8392e76d6 100644 --- a/test/config.js +++ b/test/config.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - child = require('child_process'); +var assert = require('assert'); +var child = require('child_process'); var common = require('../src/common'); // @@ -26,21 +26,21 @@ assert.equal(shell.config.fatal, false); // default // config.fatal = false // shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; +var file = 'tmp/tempscript' + Math.random() + '.js'; +var script = 'require(\'../../global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; shell.ShellString(script).to(file); -child.exec(JSON.stringify(process.execPath)+' '+file, function(err, stdout) { +child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err, stdout) { assert.ok(stdout.match('got here')); // // config.fatal = true // shell.mkdir('-p', 'tmp'); - var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; + file = 'tmp/tempscript' + Math.random() + '.js'; + script = 'require(\'../../global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; shell.ShellString(script).to(file); - child.exec(JSON.stringify(process.execPath)+' '+file, function(err, stdout) { - assert.ok(!stdout.match('got here')); + child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err2, stdout2) { + assert.ok(!stdout2.match('got here')); shell.exit(123); }); @@ -60,7 +60,7 @@ assert.ok(result.indexOf('resources/head') > -1); assert.ok(result.indexOf('resources/external') > -1); // Check to make sure options get passed through (nodir is an example) -shell.config.globOptions = {nodir: true}; +shell.config.globOptions = { nodir: true }; result = common.expand(['resources/*a*']); assert.equal(result.length, 2); assert.ok(result.indexOf('resources/a.txt') > -1); diff --git a/test/cp.js b/test/cp.js index 17240cfaa..463168e3c 100644 --- a/test/cp.js +++ b/test/cp.js @@ -1,9 +1,9 @@ var shell = require('..'); var common = require('../src/common'); -var assert = require('assert'), - fs = require('fs'), - numLines = require('./utils/utils').numLines; +var assert = require('assert'); +var fs = require('fs'); +var numLines = require('./utils/utils').numLines; shell.config.silent = true; @@ -11,15 +11,15 @@ var isWindows = common.platform === 'win'; // On Windows, symlinks for files need admin permissions. This helper // skips certain tests if we are on Windows and got an EPERM error -function skipOnWinForEPERM (action, test) { - action(); - var error = shell.error(); - - if (isWindows && error && /EPERM:/.test(error)) { - console.log("Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test."); - } else { - test(); - } +function skipOnWinForEPERM(action, test) { + action(); + var error = shell.error(); + + if (isWindows && error && /EPERM:/.test(error)) { + console.log('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); + } else { + test(); + } } @@ -199,7 +199,7 @@ assert.ok(!result.stderr); assert.equal(result.code, 0); assert.equal(shell.ls('-R', 'resources/cp') + '', shell.ls('-R', 'tmp/cp') + ''); -//recursive, nothing exists, source ends in '/' (see Github issue #15) +// recursive, nothing exists, source ends in '/' (see Github issue #15) shell.rm('-rf', 'tmp/*'); result = shell.cp('-R', 'resources/cp/', 'tmp/'); assert.equal(shell.error(), null); @@ -225,7 +225,7 @@ assert.equal(result.code, 0); assert.ok(fs.existsSync('tmp/file1.txt')); assert.ok(!fs.statSync('tmp/file1.txt').isDirectory()); // don't let it be a dir -//recursive, everything exists, no force flag +// recursive, everything exists, no force flag shell.rm('-rf', 'tmp/*'); result = shell.cp('-R', 'resources/cp', 'tmp'); result = shell.cp('-R', 'resources/cp', 'tmp'); @@ -266,7 +266,7 @@ if (process.platform !== 'win32') { assert.equal(shell.cat('tmp/links/sym.lnk').toString(), shell.cat('tmp/fakeLinks/sym.lnk').toString()); } -//recursive, everything exists, with force flag +// recursive, everything exists, with force flag shell.rm('-rf', 'tmp/*'); result = shell.cp('-R', 'resources/cp', 'tmp'); shell.ShellString('changing things around').to('tmp/cp/dir_a/z'); @@ -277,7 +277,7 @@ assert.ok(!result.stderr); assert.equal(result.code, 0); assert.equal(shell.cat('resources/cp/dir_a/z') + '', shell.cat('tmp/cp/dir_a/z') + ''); // after cp -//recursive, creates dest dir since it's only one level deep (see Github issue #44) +// recursive, creates dest dir since it's only one level deep (see Github issue #44) shell.rm('-rf', 'tmp/*'); result = shell.cp('-r', 'resources/issue44', 'tmp/dir2'); assert.equal(shell.error(), null); @@ -286,7 +286,7 @@ assert.equal(result.code, 0); assert.equal(shell.ls('-R', 'resources/issue44') + '', shell.ls('-R', 'tmp/dir2') + ''); assert.equal(shell.cat('resources/issue44/main.js') + '', shell.cat('tmp/dir2/main.js') + ''); -//recursive, does *not* create dest dir since it's too deep (see Github issue #44) +// recursive, does *not* create dest dir since it's too deep (see Github issue #44) shell.rm('-rf', 'tmp/*'); result = shell.cp('-r', 'resources/issue44', 'tmp/dir2/dir3'); assert.ok(shell.error()); @@ -294,7 +294,7 @@ assert.equal(result.stderr, 'cp: cannot create directory \'tmp/dir2/dir3\': No s assert.equal(result.code, 1); assert.equal(fs.existsSync('tmp/dir2'), false); -//recursive, copies entire directory +// recursive, copies entire directory shell.rm('-rf', 'tmp/*'); result = shell.cp('-r', 'resources/cp/dir_a', 'tmp/dest'); assert.equal(shell.error(), null); @@ -302,7 +302,7 @@ assert.ok(!result.stderr); assert.equal(result.code, 0); assert.equal(fs.existsSync('tmp/dest/z'), true); -//recursive, with trailing slash, does the exact same +// recursive, with trailing slash, does the exact same shell.rm('-rf', 'tmp/*'); result = shell.cp('-r', 'resources/cp/dir_a/', 'tmp/dest'); assert.equal(shell.error(), null); @@ -310,7 +310,7 @@ assert.equal(fs.existsSync('tmp/dest/z'), true); // On Windows, permission bits are quite different so skip those tests for now if (common.platform !== 'win') { - //preserve mode bits + // preserve mode bits shell.rm('-rf', 'tmp/*'); var execBit = parseInt('001', 8); assert.equal(fs.statSync('resources/cp-mode-bits/executable').mode & execBit, execBit); @@ -417,108 +417,109 @@ shell.rm('-rf', 'tmp/'); shell.mkdir('tmp/'); shell.config.maxdepth = 32; var directory = ''; -for (var i = 1; i < 40; i++) { - directory += '/'+i; +var i; +for (i = 1; i < 40; i++) { + directory += '/' + i; } var directory32deep = ''; -for (var i = 1; i < 32; i++) { - directory32deep += '/'+i; +for (i = 1; i < 32; i++) { + directory32deep += '/' + i; } shell.mkdir('-p', 'tmp/0' + directory); shell.cp('-r', 'tmp/0', 'tmp/copytestdepth'); // Check full directory exists. assert.ok(shell.test('-d', 'tmp/0/' + directory)); // Check full copy of directory does not exist. -assert.ok(!shell.test('-d', 'tmp/copytestdepth'+directory)); +assert.ok(!shell.test('-d', 'tmp/copytestdepth' + directory)); // Check last directory to exist is bellow maxdepth. -assert.ok(shell.test('-d', 'tmp/copytestdepth'+directory32deep)); -assert.ok(!shell.test('-d', 'tmp/copytestdepth'+directory32deep+'/32')); +assert.ok(shell.test('-d', 'tmp/copytestdepth' + directory32deep)); +assert.ok(!shell.test('-d', 'tmp/copytestdepth' + directory32deep + '/32')); // Only complete sym link checks if script has permission to do so. skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'tmp/0', 'tmp/symlinktest'), function () { - if (!shell.test('-L', 'tmp/symlinktest')) { - return; - } - shell.rm('-rf', 'tmp/symlinktest'); - // Create sym links to check for cycle. - shell.cd('tmp/0/1/2/3/4'); - shell.ln('-s', '../../../2', 'link'); - shell.ln('-s', './5/6/7', 'link1'); - shell.cd('../../../../../..'); - assert.ok(shell.test('-d', 'tmp/')); - - shell.rm('-fr', 'tmp/copytestdepth'); - shell.cp('-r', 'tmp/0', 'tmp/copytestdepth'); - assert.ok(shell.test('-d', 'tmp/copytestdepth/1/2/3/4/link/3/4/link/3/4')); - - // Test copying of symlinked files cp -L. - shell.rm('-fr', 'tmp'); - shell.mkdir('-p', 'tmp/sub'); - shell.mkdir('-p', 'tmp/new'); - shell.cp('-f', 'resources/file1.txt', 'tmp/sub/file.txt'); - shell.cd('tmp/sub'); - shell.ln('-s', 'file.txt', 'foo.lnk'); - shell.ln('-s', 'file.txt', 'sym.lnk'); - shell.cd('..'); - shell.cp('-L', 'sub/*', 'new/'); - - // Ensure copies are files. - shell.cd('new'); - shell.cp('-f', '../../resources/file2.txt', 'file.txt'); - assert.equal(shell.cat('file.txt').toString(), 'test2\n'); - // Ensure other files have not changed. - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - - // Ensure the links are converted to files. - assert.equal(shell.test('-L', 'foo.lnk'), false); - assert.equal(shell.test('-L', 'sym.lnk'), false); - shell.cd('../..'); - - // Test with recurisve option and symlinks. - - shell.rm('-fr', 'tmp'); - shell.mkdir('-p', 'tmp/sub/sub1'); - shell.cp('-f', 'resources/file1.txt', 'tmp/sub/file.txt'); - shell.cp('-f', 'resources/file1.txt', 'tmp/sub/sub1/file.txt'); - shell.cd('tmp/sub'); - shell.ln('-s', 'file.txt', 'foo.lnk'); - shell.ln('-s', 'file.txt', 'sym.lnk'); - shell.cd('sub1'); - shell.ln('-s', '../file.txt', 'foo.lnk'); - shell.ln('-s', '../file.txt', 'sym.lnk'); - - // Ensure file reads from proper source. - assert.equal(shell.cat('file.txt').toString(), 'test1\n'); - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - assert.equal(shell.test('-L', 'foo.lnk'), true); - assert.equal(shell.test('-L', 'sym.lnk'), true); - shell.cd('../..'); - shell.cp('-rL', 'sub/', 'new/'); - shell.cd('new'); - - // Ensure copies of files are symlinks by updating file contents. - shell.cp('-f', '../../resources/file2.txt', 'file.txt'); - assert.equal(shell.cat('file.txt').toString(), 'test2\n'); - // Ensure other files have not changed. - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - - // Ensure the links are converted to files. - assert.equal(shell.test('-L', 'foo.lnk'), false); - assert.equal(shell.test('-L', 'sym.lnk'), false); - - shell.cd('sub1'); - shell.cp('-f', '../../../resources/file2.txt', 'file.txt'); - assert.equal(shell.cat('file.txt').toString(), 'test2\n'); - // Ensure other files have not changed. - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - - // Ensure the links are converted to files. - assert.equal(shell.test('-L', 'foo.lnk'), false); - assert.equal(shell.test('-L', 'sym.lnk'), false); + if (!shell.test('-L', 'tmp/symlinktest')) { + return; + } + shell.rm('-rf', 'tmp/symlinktest'); + // Create sym links to check for cycle. + shell.cd('tmp/0/1/2/3/4'); + shell.ln('-s', '../../../2', 'link'); + shell.ln('-s', './5/6/7', 'link1'); + shell.cd('../../../../../..'); + assert.ok(shell.test('-d', 'tmp/')); + + shell.rm('-fr', 'tmp/copytestdepth'); + shell.cp('-r', 'tmp/0', 'tmp/copytestdepth'); + assert.ok(shell.test('-d', 'tmp/copytestdepth/1/2/3/4/link/3/4/link/3/4')); + + // Test copying of symlinked files cp -L. + shell.rm('-fr', 'tmp'); + shell.mkdir('-p', 'tmp/sub'); + shell.mkdir('-p', 'tmp/new'); + shell.cp('-f', 'resources/file1.txt', 'tmp/sub/file.txt'); + shell.cd('tmp/sub'); + shell.ln('-s', 'file.txt', 'foo.lnk'); + shell.ln('-s', 'file.txt', 'sym.lnk'); + shell.cd('..'); + shell.cp('-L', 'sub/*', 'new/'); + + // Ensure copies are files. + shell.cd('new'); + shell.cp('-f', '../../resources/file2.txt', 'file.txt'); + assert.equal(shell.cat('file.txt').toString(), 'test2\n'); + // Ensure other files have not changed. + assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); + assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); + + // Ensure the links are converted to files. + assert.equal(shell.test('-L', 'foo.lnk'), false); + assert.equal(shell.test('-L', 'sym.lnk'), false); + shell.cd('../..'); + + // Test with recursive option and symlinks. + + shell.rm('-fr', 'tmp'); + shell.mkdir('-p', 'tmp/sub/sub1'); + shell.cp('-f', 'resources/file1.txt', 'tmp/sub/file.txt'); + shell.cp('-f', 'resources/file1.txt', 'tmp/sub/sub1/file.txt'); + shell.cd('tmp/sub'); + shell.ln('-s', 'file.txt', 'foo.lnk'); + shell.ln('-s', 'file.txt', 'sym.lnk'); + shell.cd('sub1'); + shell.ln('-s', '../file.txt', 'foo.lnk'); + shell.ln('-s', '../file.txt', 'sym.lnk'); + + // Ensure file reads from proper source. + assert.equal(shell.cat('file.txt').toString(), 'test1\n'); + assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); + assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); + assert.equal(shell.test('-L', 'foo.lnk'), true); + assert.equal(shell.test('-L', 'sym.lnk'), true); + shell.cd('../..'); + shell.cp('-rL', 'sub/', 'new/'); + shell.cd('new'); + + // Ensure copies of files are symlinks by updating file contents. + shell.cp('-f', '../../resources/file2.txt', 'file.txt'); + assert.equal(shell.cat('file.txt').toString(), 'test2\n'); + // Ensure other files have not changed. + assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); + assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); + + // Ensure the links are converted to files. + assert.equal(shell.test('-L', 'foo.lnk'), false); + assert.equal(shell.test('-L', 'sym.lnk'), false); + + shell.cd('sub1'); + shell.cp('-f', '../../../resources/file2.txt', 'file.txt'); + assert.equal(shell.cat('file.txt').toString(), 'test2\n'); + // Ensure other files have not changed. + assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); + assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); + + // Ensure the links are converted to files. + assert.equal(shell.test('-L', 'foo.lnk'), false); + assert.equal(shell.test('-L', 'sym.lnk'), false); }); shell.exit(123); diff --git a/test/dirs.js b/test/dirs.js index a589893b0..a8db4f935 100644 --- a/test/dirs.js +++ b/test/dirs.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - path = require('path'); +var assert = require('assert'); +var path = require('path'); shell.config.silent = true; @@ -30,4 +30,4 @@ assert.equal(shell.dirs('-2'), trail[0]); assert.deepEqual(shell.dirs('-c'), []); assert(!shell.error()); -shell.exit(123); \ No newline at end of file +shell.exit(123); diff --git a/test/echo.js b/test/echo.js index 09b5f1a31..08cce4272 100644 --- a/test/echo.js +++ b/test/echo.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - child = require('child_process'); +var assert = require('assert'); +var child = require('child_process'); shell.config.silent = true; @@ -18,27 +18,27 @@ shell.mkdir('tmp'); // simple test with defaults shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); echo("-asdf", "111");'; // test '-' bug (see issue #20) +var file = 'tmp/tempscript' + Math.random() + '.js'; +var script = 'require(\'../../global.js\'); echo("-asdf", "111");'; // test '-' bug (see issue #20) shell.ShellString(script).to(file); -child.exec(JSON.stringify(process.execPath)+' '+file, function(err, stdout) { +child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err, stdout) { assert.equal(stdout, '-asdf 111\n'); // using null as an explicit argument doesn't crash the function - file = 'tmp/tempscript'+Math.random()+'.js'; + file = 'tmp/tempscript' + Math.random() + '.js'; script = 'require(\'../../global.js\'); echo(null);'; shell.ShellString(script).to(file); - child.exec(JSON.stringify(process.execPath)+' '+file, function(err, stdout, stderr) { - assert.equal(stdout, 'null\n'); - assert.equal(stderr, ''); + child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err2, stdout2, stderr2) { + assert.equal(stdout2, 'null\n'); + assert.equal(stderr2, ''); // simple test with silent(true) shell.mkdir('-p', 'tmp'); - var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); config.silent=true; echo(555);'; + file = 'tmp/tempscript' + Math.random() + '.js'; + script = 'require(\'../../global.js\'); config.silent=true; echo(555);'; shell.ShellString(script).to(file); - child.exec(JSON.stringify(process.execPath)+' '+file, function(err, stdout) { - assert.equal(stdout, '555\n'); + child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err3, stdout3) { + assert.equal(stdout3, '555\n'); theEnd(); }); diff --git a/test/env.js b/test/env.js index 0e041d6ad..c9edcb6b0 100644 --- a/test/env.js +++ b/test/env.js @@ -11,9 +11,9 @@ shell.mkdir('tmp'); // Valids // -assert.equal(shell.env['PATH'], process.env['PATH']); +assert.equal(shell.env.PATH, process.env.PATH); -shell.env['SHELLJS_TEST'] = 'hello world'; -assert.equal(shell.env['SHELLJS_TEST'], process.env['SHELLJS_TEST']); +shell.env.SHELLJS_TEST = 'hello world'; +assert.equal(shell.env.SHELLJS_TEST, process.env.SHELLJS_TEST); shell.exit(123); diff --git a/test/exec.js b/test/exec.js index 8ab6bc6ec..1c725c383 100644 --- a/test/exec.js +++ b/test/exec.js @@ -18,15 +18,15 @@ var result = shell.exec('asdfasdf'); // could not find command assert.ok(result.code > 0); // Test 'fatal' mode for exec, temporarily overriding process.exit -var old_fatal = shell.config.fatal; +var oldFatal = shell.config.fatal; shell.config.fatal = true; -assert.throws(function() { +assert.throws(function () { shell.exec('asdfasdf'); // could not find command }, /exec: internal error/); -shell.config.fatal = old_fatal; +shell.config.fatal = oldFatal; // // Valids @@ -37,47 +37,47 @@ shell.config.fatal = old_fatal; // // check if stdout goes to output -var result = shell.exec(JSON.stringify(process.execPath)+' -e \"console.log(1234);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(1234);"'); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.ok(result.stdout === '1234\n' || result.stdout === '1234\nundefined\n'); // 'undefined' for v0.4 // check if stderr goes to output -var result = shell.exec(JSON.stringify(process.execPath)+' -e \"console.error(1234);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "console.error(1234);"'); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.ok(result.stdout === '' || result.stdout === 'undefined\n'); // 'undefined' for v0.4 assert.ok(result.stderr === '1234\n' || result.stderr === '1234\nundefined\n'); // 'undefined' for v0.4 // check if stdout + stderr go to output -var result = shell.exec(JSON.stringify(process.execPath)+' -e \"console.error(1234); console.log(666);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "console.error(1234); console.log(666);"'); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.ok(result.stdout === '666\n' || result.stdout === '666\nundefined\n'); // 'undefined' for v0.4 assert.ok(result.stderr === '1234\n' || result.stderr === '1234\nundefined\n'); // 'undefined' for v0.4 // check exit code -var result = shell.exec(JSON.stringify(process.execPath)+' -e \"process.exit(12);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "process.exit(12);"'); assert.ok(shell.error()); assert.equal(result.code, 12); // interaction with cd shell.cd('resources/external'); -var result = shell.exec(JSON.stringify(process.execPath)+' node_script.js'); +result = shell.exec(JSON.stringify(process.execPath) + ' node_script.js'); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result.stdout, 'node_script_1234\n'); shell.cd('../..'); // check quotes escaping -var result = shell.exec( util.format(JSON.stringify(process.execPath)+' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"") ); +result = shell.exec(util.format(JSON.stringify(process.execPath) + ' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"")); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result.stdout, "'+'_'+'\n"); // set cwd var cmdString = process.platform === 'win32' ? 'cd' : 'pwd'; -result = shell.exec(cmdString, {cwd: '..'}); +result = shell.exec(cmdString, { cwd: '..' }); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result.stdout, path.resolve('..') + os.EOL); @@ -88,16 +88,16 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result.stdout, '1234567890' + os.EOL); if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - shell.exec('echo 1234567890', {maxBuffer: 6}); + shell.exec('echo 1234567890', { maxBuffer: 6 }); assert.ok(shell.error()); } // set timeout option -result = shell.exec(JSON.stringify(process.execPath)+' resources/exec/slow.js 100'); // default timeout is ok +result = shell.exec(JSON.stringify(process.execPath) + ' resources/exec/slow.js 100'); // default timeout is ok assert.ok(!shell.error()); assert.equal(result.code, 0); if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - result = shell.exec(JSON.stringify(process.execPath)+' resources/exec/slow.js 100', {timeout: 10}); // times out + result = shell.exec(JSON.stringify(process.execPath) + ' resources/exec/slow.js 100', { timeout: 10 }); // times out assert.ok(shell.error()); } @@ -119,7 +119,7 @@ if (process.platform !== 'win32') { var bashPath = shell.which('bash').trim(); // this option doesn't work on v0.10 if (bashPath && process.version >= 'v0.11') { - result = shell.exec('echo $0', {shell: '/bin/bash'}); + result = shell.exec('echo $0', { shell: '/bin/bash' }); assert.ok(!shell.error()); assert.equal(result.code, 0); assert.equal(result.stdout, '/bin/bash\n'); @@ -138,14 +138,14 @@ assert.strictEqual(result.toString(), result.stdout); // // no callback -var c = shell.exec(JSON.stringify(process.execPath)+' -e \"console.log(1234)\"', {async:true}); +var c = shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(1234)"', { async: true }); assert.equal(shell.error(), null); assert.ok('stdout' in c, 'async exec returns child process object'); // // callback as 2nd argument // -shell.exec(JSON.stringify(process.execPath)+' -e \"console.log(5678);\"', function(code, stdout, stderr) { +shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(5678);"', function (code, stdout, stderr) { assert.equal(code, 0); assert.ok(stdout === '5678\n' || stdout === '5678\nundefined\n'); // 'undefined' for v0.4 assert.ok(stderr === '' || stderr === 'undefined\n'); // 'undefined' for v0.4 @@ -153,25 +153,22 @@ shell.exec(JSON.stringify(process.execPath)+' -e \"console.log(5678);\"', functi // // callback as 3rd argument // - shell.exec(JSON.stringify(process.execPath)+' -e \"console.log(5566);\"', {async:true}, function(code, stdout, stderr) { - assert.equal(code, 0); - assert.ok(stdout === '5566\n' || stdout === '5566\nundefined\n'); // 'undefined' for v0.4 - assert.ok(stderr === '' || stderr === 'undefined\n'); // 'undefined' for v0.4 + shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(5566);"', { async: true }, function (code2, stdout2, stderr2) { + assert.equal(code2, 0); + assert.ok(stdout2 === '5566\n' || stdout2 === '5566\nundefined\n'); // 'undefined' for v0.4 + assert.ok(stderr2 === '' || stderr2 === 'undefined\n'); // 'undefined' for v0.4 // // callback as 3rd argument (slient:true) // - shell.exec(JSON.stringify(process.execPath)+' -e \"console.log(5678);\"', {silent:true}, function(code, stdout, stderr) { - assert.equal(code, 0); - assert.ok(stdout === '5678\n' || stdout === '5678\nundefined\n'); // 'undefined' for v0.4 - assert.ok(stderr === '' || stderr === 'undefined\n'); // 'undefined' for v0.4 + shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(5678);"', { silent: true }, function (code3, stdout3, stderr3) { + assert.equal(code3, 0); + assert.ok(stdout3 === '5678\n' || stdout3 === '5678\nundefined\n'); // 'undefined' for v0.4 + assert.ok(stderr3 === '' || stderr3 === 'undefined\n'); // 'undefined' for v0.4 shell.exit(123); - }); - }); - }); assert.equal(shell.error(), null); diff --git a/test/global.js b/test/global.js index e5db65417..e3c1b2769 100644 --- a/test/global.js +++ b/test/global.js @@ -38,4 +38,3 @@ assert.equal('foobar', cat('tmp/testfile.txt')); exit(123); - diff --git a/test/grep.js b/test/grep.js index 70249cee8..fe377d1e4 100644 --- a/test/grep.js +++ b/test/grep.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -66,12 +66,12 @@ assert.equal(result, 'test1\ntest2\n'); // multiple files, glob syntax, * for file name result = shell.grep(/test/, 'resources/file*.txt'); assert.equal(shell.error(), null); -assert.ok(result == 'test1\ntest2\n' || result == 'test2\ntest1\n'); +assert.ok(result.toString() === 'test1\ntest2\n' || result.toString() === 'test2\ntest1\n'); // multiple files, glob syntax, * for directory name result = shell.grep(/test/, '*/file*.txt'); assert.equal(shell.error(), null); -assert.ok(result == 'test1\ntest2\n' || result == 'test2\ntest1\n'); +assert.ok(result.toString() === 'test1\ntest2\n' || result.toString() === 'test2\ntest1\n'); // multiple files, glob syntax, ** for directory name result = shell.grep(/test/, '**/file*.js'); diff --git a/test/head.js b/test/head.js index 1465ecf50..4692bdad2 100644 --- a/test/head.js +++ b/test/head.js @@ -27,12 +27,12 @@ assert.equal(result.code, 1); // Valids // -var topOfFile1 = ['file1 1', 'file1 2', 'file1 3', 'file1 4', 'file1 5', - 'file1 6', 'file1 7', 'file1 8', 'file1 9', 'file1 10', +var topOfFile1 = ['file1 1', 'file1 2', 'file1 3', 'file1 4', 'file1 5', + 'file1 6', 'file1 7', 'file1 8', 'file1 9', 'file1 10', 'file1 11', 'file1 12', 'file1 13', 'file1 14', 'file1 15', 'file1 16', 'file1 17', 'file1 18', 'file1 19', 'file1 20']; -var topOfFile2 = ['file2 1', 'file2 2', 'file2 3', 'file2 4', 'file2 5', - 'file2 6', 'file2 7', 'file2 8', 'file2 9', 'file2 10', +var topOfFile2 = ['file2 1', 'file2 2', 'file2 3', 'file2 4', 'file2 5', + 'file2 6', 'file2 7', 'file2 8', 'file2 9', 'file2 10', 'file2 11', 'file2 12', 'file2 13', 'file2 14', 'file2 15', 'file2 16', 'file2 17', 'file2 18', 'file2 19', 'file2 20']; @@ -40,23 +40,27 @@ var topOfFile2 = ['file2 1', 'file2 2', 'file2 3', 'file2 4', 'file2 5', result = shell.head('resources/head/file1.txt'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(result, topOfFile1.slice(0, 10).join('\n')+'\n'); +assert.equal(result, topOfFile1.slice(0, 10).join('\n') + '\n'); // multiple files result = shell.head('resources/head/file2.txt', 'resources/head/file1.txt'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(result, topOfFile2.slice(0, 10).concat( - topOfFile1.slice(0, 10) - ).join('\n')+'\n'); +assert.equal(result, topOfFile2 + .slice(0, 10) + .concat(topOfFile1.slice(0, 10)) + .join('\n') + '\n' +); // multiple files, array syntax result = shell.head(['resources/head/file2.txt', 'resources/head/file1.txt']); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(result, topOfFile2.slice(0, 10).concat( - topOfFile1.slice(0, 10) - ).join('\n')+'\n'); +assert.equal(result, topOfFile2 + .slice(0, 10) + .concat(topOfFile1.slice(0, 10)) + .join('\n') + '\n' +); // reading more lines than are in the file (no trailing newline) result = shell.head('resources/file2', 'resources/file1'); @@ -74,25 +78,31 @@ assert.equal(result, 'short2\nshort1\n'); // these files only have one line (wit result = shell.head('resources/head/file?.txt'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(result, topOfFile1.slice(0, 10).concat( - topOfFile2.slice(0, 10) - ).join('\n')+'\n'); +assert.equal(result, topOfFile1 + .slice(0, 10) + .concat(topOfFile2.slice(0, 10)) + .join('\n') + '\n' +); // With `'-n' ` option result = shell.head('-n', 4, 'resources/head/file2.txt', 'resources/head/file1.txt'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(result, topOfFile2.slice(0, 4).concat( - topOfFile1.slice(0, 4) - ).join('\n')+'\n'); +assert.equal(result, topOfFile2 + .slice(0, 4) + .concat(topOfFile1.slice(0, 4)) + .join('\n') + '\n' +); // With `{'-n': }` option -result = shell.head({'-n': 4}, 'resources/head/file2.txt', 'resources/head/file1.txt'); +result = shell.head({ '-n': 4 }, 'resources/head/file2.txt', 'resources/head/file1.txt'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(result, topOfFile2.slice(0, 4).concat( - topOfFile1.slice(0, 4) - ).join('\n')+'\n'); +assert.equal(result, topOfFile2 + .slice(0, 4) + .concat(topOfFile1.slice(0, 4)) + .join('\n') + '\n' +); // negative values (-num) are the same as (numLines - num) result = shell.head('-n', -46, 'resources/head/file1.txt'); diff --git a/test/ln.js b/test/ln.js index 8a8e0e6c0..b2d1ebc80 100644 --- a/test/ln.js +++ b/test/ln.js @@ -2,23 +2,23 @@ var shell = require('..'); var common = require('../src/common'); var isWindows = common.platform === 'win'; -var assert = require('assert'), - fs = require('fs'), - path = require('path'); +var assert = require('assert'); +var fs = require('fs'); +var path = require('path'); shell.config.silent = true; // On Windows, symlinks for files need admin permissions. This helper // skips certain tests if we are on Windows and got an EPERM error -function skipOnWinForEPERM (action, test) { - action(); - var error = shell.error(); - - if (isWindows && error && /EPERM:/.test(error)) { - console.log("Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test."); - } else { - test(); - } +function skipOnWinForEPERM(action, test) { + action(); + var error = shell.error(); + + if (isWindows && error && /EPERM:/.test(error)) { + console.log('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); + } else { + test(); + } } shell.rm('-rf', 'tmp'); @@ -96,13 +96,13 @@ assert.equal( assert.equal(result.code, 0); skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'file2', 'tmp/linkfile2'), function () { - assert(fs.existsSync('tmp/linkfile2')); - assert.equal( + assert(fs.existsSync('tmp/linkfile2')); + assert.equal( fs.readFileSync('tmp/file2').toString(), fs.readFileSync('tmp/linkfile2').toString() ); - fs.writeFileSync('tmp/file2', 'new content 2'); - assert.equal( + fs.writeFileSync('tmp/file2', 'new content 2'); + assert.equal( fs.readFileSync('tmp/linkfile2').toString(), 'new content 2' ); @@ -150,13 +150,13 @@ assert.equal( ); skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), function () { - assert(fs.existsSync('tmp/file2.txt')); - assert.equal( + assert(fs.existsSync('tmp/file2.txt')); + assert.equal( fs.readFileSync('tmp/file1.txt').toString(), fs.readFileSync('tmp/file2.txt').toString() ); - fs.writeFileSync('tmp/file1.txt', 'new content txt'); - assert.equal( + fs.writeFileSync('tmp/file1.txt', 'new content txt'); + assert.equal( fs.readFileSync('tmp/file2.txt').toString(), 'new content txt' ); @@ -164,13 +164,13 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), fun // Abspath regression skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1', path.resolve('tmp/abspath')), function () { - assert(fs.existsSync('tmp/abspath')); - assert.equal( + assert(fs.existsSync('tmp/abspath')); + assert.equal( fs.readFileSync('tmp/file1').toString(), fs.readFileSync('tmp/abspath').toString() ); - fs.writeFileSync('tmp/file1', 'new content 3'); - assert.equal( + fs.writeFileSync('tmp/file1', 'new content 3'); + assert.equal( fs.readFileSync('tmp/abspath').toString(), 'new content 3' ); @@ -178,17 +178,17 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1', path.resolve('tmp/abspath // Relative regression skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), function () { - shell.mkdir('-p', 'tmp/new'); + shell.mkdir('-p', 'tmp/new'); // Move the symlink first, as the reverse confuses `mv`. - shell.mv('tmp/file2.txt', 'tmp/new/file2.txt'); - shell.mv('tmp/file1.txt', 'tmp/new/file1.txt'); - assert(fs.existsSync('tmp/new/file2.txt')); - assert.equal( + shell.mv('tmp/file2.txt', 'tmp/new/file2.txt'); + shell.mv('tmp/file1.txt', 'tmp/new/file1.txt'); + assert(fs.existsSync('tmp/new/file2.txt')); + assert.equal( fs.readFileSync('tmp/new/file1.txt').toString(), fs.readFileSync('tmp/new/file2.txt').toString() ); - fs.writeFileSync('tmp/new/file1.txt', 'new content txt'); - assert.equal( + fs.writeFileSync('tmp/new/file1.txt', 'new content txt'); + assert.equal( fs.readFileSync('tmp/new/file2.txt').toString(), 'new content txt' ); diff --git a/test/ls.js b/test/ls.js index 1666773d5..e74c4d056 100644 --- a/test/ls.js +++ b/test/ls.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -9,6 +9,7 @@ shell.rm('-rf', 'tmp'); shell.mkdir('tmp'); var idx; +var k; // // Invalids @@ -336,7 +337,7 @@ result = shell.ls('-l', 'resources/ls'); assert.equal(shell.error(), null); assert.equal(result.code, 0); idx = -1; -for (var k=0; k < result.length; k++) { +for (k = 0; k < result.length; k++) { if (result[k].name === 'file1') { idx = k; break; @@ -361,7 +362,7 @@ result = shell.ls('-lR', 'resources/ls/'); assert.equal(shell.error(), null); assert.equal(result.code, 0); idx = -1; -for (var k=0; k < result.length; k++) { +for (k = 0; k < result.length; k++) { if (result[k].name === 'a_dir/b_dir') { idx = k; break; diff --git a/test/make.js b/test/make.js index b54c0af13..cc46e07bb 100644 --- a/test/make.js +++ b/test/make.js @@ -1,18 +1,18 @@ -var shell = require('..'), - child = require('child_process'), - assert = require('assert'); +var shell = require('..'); +var child = require('child_process'); +var assert = require('assert'); shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../make.js\');' + +var file = 'tmp/tempscript' + Math.random() + '.js'; +var script = 'require(\'../../make.js\');' + 'target.all=function(){' + - ' echo("first"); '+ + ' echo("first"); ' + ' cp("this_file_doesnt_exist", ".");' + ' echo("second");' + '}'; shell.ShellString(script).to(file); -child.exec(JSON.stringify(process.execPath)+' '+file, function(err, stdout) { +child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err, stdout) { assert.ok(stdout.match('first')); assert.ok(!stdout.match('second')); // Make should die on errors, so this should never get echoed diff --git a/test/mkdir.js b/test/mkdir.js index 14511c8e7..71927d953 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -1,8 +1,8 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'), - numLines = require('./utils/utils').numLines; +var assert = require('assert'); +var fs = require('fs'); +var numLines = require('./utils/utils').numLines; shell.config.silent = true; diff --git a/test/mv.js b/test/mv.js index a519bf40e..2bb62efef 100644 --- a/test/mv.js +++ b/test/mv.js @@ -1,8 +1,8 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'), - numLines = require('./utils/utils').numLines; +var assert = require('assert'); +var fs = require('fs'); +var numLines = require('./utils/utils').numLines; shell.config.silent = true; diff --git a/test/pipe.js b/test/pipe.js index 44ea1a723..41045732a 100644 --- a/test/pipe.js +++ b/test/pipe.js @@ -40,11 +40,11 @@ assert.equal(shell.error(), null); assert.equal(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); // Equivalent to a simple sed() test case -var result = shell.cat('resources/grep/file').sed(/l*\.js/, ''); +result = shell.cat('resources/grep/file').sed(/l*\.js/, ''); assert.ok(!shell.error()); assert.equal(result.toString(), 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n'); -//Sort a file by frequency of each line +// Sort a file by frequency of each line result = shell.sort('resources/uniq/pipe').uniq('-c').sort('-n'); assert.equal(shell.error(), null); assert.equal(result.toString(), shell.cat('resources/uniq/pipeSorted').toString()); @@ -69,7 +69,7 @@ if (process.platform !== 'win32') { if (process.platform !== 'win32') { // unix-specific if (shell.which('grep').stdout) { - shell.cat('resources/grep/file').exec("grep 'alpha*beta'", function(code, stdout) { + shell.cat('resources/grep/file').exec("grep 'alpha*beta'", function (code, stdout) { assert.equal(code, 0); assert.equal(stdout, 'alphaaaaaaabeta\nalphbeta\n'); shell.exit(123); diff --git a/test/plugin.js b/test/plugin.js index 3eeb1b7e6..bcc9c62c0 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -11,18 +11,21 @@ var fname; function fooImplementation(options, arg) { // Some sort of side effect, so we know when this is called - if (arg) + if (arg) { fname = arg; - else + } else { fname = plugin.readFromPipe(this); + } - if (arg === 'exitWithCode5') + if (arg === 'exitWithCode5') { plugin.error('Exited with code 5', 5); + } - if (options.flag) + if (options.flag) { data = 12; - else + } else { data++; + } return 'hello world'; } diff --git a/test/popd.js b/test/popd.js index cb7371c25..c7d596738 100644 --- a/test/popd.js +++ b/test/popd.js @@ -1,15 +1,16 @@ var shell = require('..'); -var assert = require('assert'), - path = require('path'); +var assert = require('assert'); +var path = require('path'); shell.config.silent = true; -var root = path.resolve(), trail; +var root = path.resolve(); +var trail; function reset() { - shell.dirs('-c'); - shell.cd(root); + shell.dirs('-c'); + shell.cd(root); } // Valid @@ -17,7 +18,7 @@ shell.pushd('resources/pushd'); trail = shell.popd(); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); +assert.deepEqual(trail, [root]); shell.pushd('resources/pushd'); shell.pushd('a'); @@ -25,8 +26,8 @@ trail = shell.popd(); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd'), + root ]); shell.pushd('b'); @@ -34,8 +35,8 @@ trail = shell.popd(); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd'), + root ]); shell.pushd('b'); @@ -44,56 +45,56 @@ trail = shell.popd(); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd'), + root ]); trail = shell.popd(); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd'), + root ]); trail = shell.popd(); assert.equal(shell.error(), null); assert.equal(trail.length, 1); assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); +assert.deepEqual(trail, [root]); // Valid by index shell.pushd('resources/pushd'); trail = shell.popd('+0'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); +assert.deepEqual(trail, [root]); shell.pushd('resources/pushd'); trail = shell.popd('+1'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ path.resolve(root, 'resources/pushd') ]); +assert.deepEqual(trail, [path.resolve(root, 'resources/pushd')]); reset(); shell.pushd('resources/pushd'); trail = shell.popd('-0'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ path.resolve(root, 'resources/pushd') ]); +assert.deepEqual(trail, [path.resolve(root, 'resources/pushd')]); reset(); shell.pushd('resources/pushd'); trail = shell.popd('-1'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); +assert.deepEqual(trail, [root]); reset(); shell.pushd('resources/pushd'); trail = shell.popd('-n'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ path.resolve(root, 'resources/pushd') ]); +assert.deepEqual(trail, [path.resolve(root, 'resources/pushd')]); // Invalid trail = shell.popd(); @@ -111,4 +112,4 @@ assert.ok(shell.error(), null); shell.cd(root); -shell.exit(123); \ No newline at end of file +shell.exit(123); diff --git a/test/pushd.js b/test/pushd.js index d588c13ff..cc694074b 100644 --- a/test/pushd.js +++ b/test/pushd.js @@ -1,15 +1,16 @@ var shell = require('..'); -var assert = require('assert'), - path = require('path'); +var assert = require('assert'); +var path = require('path'); shell.config.silent = true; -var root = path.resolve(), trail; +var root = path.resolve(); +var trail; function reset() { - shell.dirs('-c'); - shell.cd(root); + shell.dirs('-c'); + shell.cd(root); } // Push valid directories @@ -17,38 +18,38 @@ trail = shell.pushd('resources/pushd'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd'), + root ]); trail = shell.pushd('a'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root ]); trail = shell.pushd('../b'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root ]); trail = shell.pushd('c'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root ]); // Push stuff around with positive indices @@ -56,55 +57,55 @@ trail = shell.pushd('+0'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root ]); trail = shell.pushd('+1'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c') + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root, + path.resolve(root, 'resources/pushd/b/c') ]); trail = shell.pushd('+2'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a') + path.resolve(root, 'resources/pushd'), + root, + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a') ]); trail = shell.pushd('+3'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c') + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root, + path.resolve(root, 'resources/pushd/b/c') ]); trail = shell.pushd('+4'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root ]); // Push stuff around with negative indices @@ -112,55 +113,55 @@ trail = shell.pushd('-0'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd') + root, + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd') ]); trail = shell.pushd('-1'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b') + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root, + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b') ]); trail = shell.pushd('-2'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd') + root, + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd') ]); trail = shell.pushd('-3'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root ]); trail = shell.pushd('-4'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root + path.resolve(root, 'resources/pushd/b/c'), + path.resolve(root, 'resources/pushd/b'), + path.resolve(root, 'resources/pushd/a'), + path.resolve(root, 'resources/pushd'), + root ]); // Push without changing directory or resolving paths @@ -168,17 +169,17 @@ reset(); trail = shell.pushd('-n', 'resources/pushd'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - root, - 'resources/pushd' + root, + 'resources/pushd' ]); trail = shell.pushd('-n', 'resources/pushd/a'); assert.equal(shell.error(), null); assert.equal(process.cwd(), trail[0]); assert.deepEqual(trail, [ - root, - 'resources/pushd/a', - 'resources/pushd' + root, + 'resources/pushd/a', + 'resources/pushd' ]); // Push invalid directory diff --git a/test/pwd.js b/test/pwd.js index fe4652597..8d86b2460 100644 --- a/test/pwd.js +++ b/test/pwd.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - path = require('path'); +var assert = require('assert'); +var path = require('path'); shell.config.silent = true; diff --git a/test/rm.js b/test/rm.js index ffe133940..ab98a72fe 100644 --- a/test/rm.js +++ b/test/rm.js @@ -1,8 +1,8 @@ var shell = require('..'); -var assert = require('assert'), - path = require('path'), - fs = require('fs'); +var assert = require('assert'); +var path = require('path'); +var fs = require('fs'); shell.config.silent = true; diff --git a/test/sed.js b/test/sed.js index 3ff041b08..2105dcc4d 100644 --- a/test/sed.js +++ b/test/sed.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; diff --git a/test/set.js b/test/set.js index d64036f3f..005cab8f3 100644 --- a/test/set.js +++ b/test/set.js @@ -22,27 +22,27 @@ assert.strictEqual(shell.config.noglob, false); shell.cp('-R', 'resources/', 'tmp'); // default behavior -result = shell.exec(JSON.stringify(process.execPath)+' -e \"require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); assert.equal(result.code, 0); assert.equal(result.stdout, '1234\n'); assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); // set -e -result = shell.exec(JSON.stringify(process.execPath)+' -e \"require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);\"'); -var nodeVersion = process.versions.node.split('.').map(function(str) { return parseInt(str, 10); }); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); +var nodeVersion = process.versions.node.split('.').map(function (str) { return parseInt(str, 10); }); var uncaughtErrorExitCode = (nodeVersion[0] === 0 && nodeVersion[1] < 11) ? 8 : 1; assert.equal(result.code, uncaughtErrorExitCode); assert.equal(result.stdout, ''); assert(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); // set -v -result = shell.exec(JSON.stringify(process.execPath)+' -e \"require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); assert.equal(result.code, 0); assert.equal(result.stdout, '1234\n'); assert.equal(result.stderr, 'ls file_doesnt_exist\nls: no such file or directory: file_doesnt_exist\necho 1234\n'); // set -ev -result = shell.exec(JSON.stringify(process.execPath)+' -e \"require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); assert.equal(result.code, uncaughtErrorExitCode); assert.equal(result.stdout, ''); assert(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); @@ -50,7 +50,7 @@ assert(result.stderr.indexOf('ls file_doesnt_exist\n') >= 0); assert.equal(result.stderr.indexOf('echo 1234\n'), -1); // set -e, set +e -result = shell.exec(JSON.stringify(process.execPath)+' -e \"require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);\"'); +result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); assert.equal(result.code, 0); assert.equal(result.stdout, '1234\n'); assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); @@ -65,4 +65,3 @@ assert.ok(!shell.error()); // globbing works, so rm succeeds shell.exit(123); - diff --git a/test/shjs.js b/test/shjs.js index 8a257ac8f..15a2a90b5 100644 --- a/test/shjs.js +++ b/test/shjs.js @@ -4,7 +4,7 @@ var assert = require('assert'); function runScript(name) { // prefix with 'node ' for Windows, don't prefix for OSX/Linux - var cmd = (process.platform === 'win32' ? JSON.stringify(process.execPath)+ ' ' : '') + path.resolve(__dirname, '../bin/shjs'); + var cmd = (process.platform === 'win32' ? JSON.stringify(process.execPath) + ' ' : '') + path.resolve(__dirname, '../bin/shjs'); var script = path.resolve(__dirname, 'resources', 'shjs', name); return shell.exec(cmd + ' ' + script, { silent: true }); } diff --git a/test/sort.js b/test/sort.js index 6e6b6202b..4e50fd405 100644 --- a/test/sort.js +++ b/test/sort.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -13,7 +13,7 @@ var result; var doubleSorted = shell.cat('resources/sort/sorted') .trimRight() .split('\n') - .reduce(function(prev, cur) { + .reduce(function (prev, cur) { return prev.concat([cur, cur]); }, []) .join('\n') + '\n'; diff --git a/test/tail.js b/test/tail.js index de37f17ab..1aa077e21 100644 --- a/test/tail.js +++ b/test/tail.js @@ -40,7 +40,7 @@ var bottomOfFile2 = ['file2 50', 'file2 49', 'file2 48', 'file2 47', 'file2 46', result = shell.tail('resources/head/file1.txt'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(result, bottomOfFile1.slice(0, 10).reverse().join('\n')+'\n'); +assert.equal(result, bottomOfFile1.slice(0, 10).reverse().join('\n') + '\n'); // multiple files result = shell.tail('resources/head/file2.txt', 'resources/head/file1.txt'); @@ -48,7 +48,7 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result, bottomOfFile2.slice(0, 10).reverse().concat( bottomOfFile1.slice(0, 10).reverse() - ).join('\n')+'\n'); + ).join('\n') + '\n'); // multiple files, array syntax result = shell.tail(['resources/head/file2.txt', 'resources/head/file1.txt']); @@ -56,7 +56,7 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result, bottomOfFile2.slice(0, 10).reverse().concat( bottomOfFile1.slice(0, 10).reverse() - ).join('\n')+'\n'); + ).join('\n') + '\n'); // reading more lines than are in the file (no trailing newline) result = shell.tail('resources/file2', 'resources/file1'); @@ -76,7 +76,7 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result, bottomOfFile1.slice(0, 10).reverse().concat( bottomOfFile2.slice(0, 10).reverse() - ).join('\n')+'\n'); + ).join('\n') + '\n'); // With `'-n' ` option result = shell.tail('-n', 4, 'resources/head/file2.txt', 'resources/head/file1.txt'); @@ -84,15 +84,15 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result, bottomOfFile2.slice(0, 4).reverse().concat( bottomOfFile1.slice(0, 4).reverse() - ).join('\n')+'\n'); + ).join('\n') + '\n'); // With `{'-n': }` option -result = shell.tail({'-n': 4}, 'resources/head/file2.txt', 'resources/head/file1.txt'); +result = shell.tail({ '-n': 4 }, 'resources/head/file2.txt', 'resources/head/file1.txt'); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result, bottomOfFile2.slice(0, 4).reverse().concat( bottomOfFile1.slice(0, 4).reverse() - ).join('\n')+'\n'); + ).join('\n') + '\n'); // negative values are the same as positive values result = shell.tail('-n', -4, 'resources/head/file2.txt', 'resources/head/file1.txt'); @@ -100,6 +100,6 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result, bottomOfFile2.slice(0, 4).reverse().concat( bottomOfFile1.slice(0, 4).reverse() - ).join('\n')+'\n'); + ).join('\n') + '\n'); shell.exit(123); diff --git a/test/tempdir.js b/test/tempdir.js index e47ddd8ff..beddec289 100644 --- a/test/tempdir.js +++ b/test/tempdir.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; diff --git a/test/test.js b/test/test.js index 8fc9e8c10..1dc470482 100644 --- a/test/test.js +++ b/test/test.js @@ -12,79 +12,81 @@ shell.mkdir('tmp'); // Invalids // -var result = shell.test(); // no expression given +var result; + +result = shell.test(); // no expression given assert.ok(shell.error()); -var result = shell.test('asdf'); // bad expression +result = shell.test('asdf'); // bad expression assert.ok(shell.error()); -var result = shell.test('f', 'resources/file1'); // bad expression +result = shell.test('f', 'resources/file1'); // bad expression assert.ok(shell.error()); -var result = shell.test('-f'); // no file +result = shell.test('-f'); // no file assert.ok(shell.error()); // // Valids // -//exists -var result = shell.test('-e', 'resources/file1'); +// exists +result = shell.test('-e', 'resources/file1'); assert.equal(shell.error(), null); -assert.equal(result, true);//true +assert.equal(result, true);// true -var result = shell.test('-e', 'resources/404'); +result = shell.test('-e', 'resources/404'); assert.equal(shell.error(), null); assert.equal(result, false); -//directory -var result = shell.test('-d', 'resources'); +// directory +result = shell.test('-d', 'resources'); assert.equal(shell.error(), null); -assert.equal(result, true);//true +assert.equal(result, true);// true -var result = shell.test('-f', 'resources'); +result = shell.test('-f', 'resources'); assert.equal(shell.error(), null); assert.equal(result, false); -var result = shell.test('-L', 'resources'); +result = shell.test('-L', 'resources'); assert.equal(shell.error(), null); assert.equal(result, false); -//file -var result = shell.test('-d', 'resources/file1'); +// file +result = shell.test('-d', 'resources/file1'); assert.equal(shell.error(), null); assert.equal(result, false); -var result = shell.test('-f', 'resources/file1'); +result = shell.test('-f', 'resources/file1'); assert.equal(shell.error(), null); -assert.equal(result, true);//true +assert.equal(result, true);// true -var result = shell.test('-L', 'resources/file1'); +result = shell.test('-L', 'resources/file1'); assert.equal(shell.error(), null); assert.equal(result, false); -//link +// link // Windows is weird with links so skip these tests if (common.platform !== 'win') { - var result = shell.test('-d', 'resources/link'); - assert.equal(shell.error(), null); - assert.equal(result, false); + result = shell.test('-d', 'resources/link'); + assert.equal(shell.error(), null); + assert.equal(result, false); - var result = shell.test('-f', 'resources/link'); - assert.equal(shell.error(), null); - assert.equal(result, true);//true + result = shell.test('-f', 'resources/link'); + assert.equal(shell.error(), null); + assert.equal(result, true);// true - var result = shell.test('-L', 'resources/link'); - assert.equal(shell.error(), null); - assert.equal(result, true);//true + result = shell.test('-L', 'resources/link'); + assert.equal(shell.error(), null); + assert.equal(result, true);// true - var result = shell.test('-L', 'resources/badlink'); - assert.equal(shell.error(), null); - assert.equal(result, true);//true + result = shell.test('-L', 'resources/badlink'); + assert.equal(shell.error(), null); + assert.equal(result, true);// true - var result = shell.test('-L', 'resources/404'); - assert.equal(shell.error(), null); - assert.equal(result, false);//false + result = shell.test('-L', 'resources/404'); + assert.equal(shell.error(), null); + assert.equal(result, false);// false } shell.exit(123); diff --git a/test/to.js b/test/to.js index b22f9e406..1b5b86805 100644 --- a/test/to.js +++ b/test/to.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; diff --git a/test/toEnd.js b/test/toEnd.js index 751b72124..a2936f613 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -26,17 +26,17 @@ assert.ok(shell.error()); // var result; -assert.equal(fs.existsSync('tmp/toEnd1'), false); //Check file toEnd() creates does not already exist +assert.equal(fs.existsSync('tmp/toEnd1'), false); // Check file toEnd() creates does not already exist assert.equal(fs.existsSync('tmp/toEnd2'), false); shell.ShellString('hello ').toEnd('tmp/toEnd1'); -assert.equal(fs.existsSync('tmp/toEnd1'), true); //Check that file was created -shell.ShellString('world').toEnd('tmp/toEnd1').toEnd('tmp/toEnd2'); //Write some more to the file +assert.equal(fs.existsSync('tmp/toEnd1'), true); // Check that file was created +shell.ShellString('world').toEnd('tmp/toEnd1').toEnd('tmp/toEnd2'); // Write some more to the file result = shell.cat('tmp/toEnd1'); assert.equal(shell.error(), null); -assert.equal(result, 'hello world'); //Check that the result is what we expect +assert.equal(result, 'hello world'); // Check that the result is what we expect result = shell.cat('tmp/toEnd2'); assert.equal(shell.error(), null); -assert.equal(result, 'world'); //Check that the result is what we expect +assert.equal(result, 'world'); // Check that the result is what we expect // With a glob shell.ShellString('good').to('tmp/toE*1'); diff --git a/test/touch.js b/test/touch.js index e9cccd436..3b8d5d919 100644 --- a/test/touch.js +++ b/test/touch.js @@ -28,12 +28,12 @@ assert.ok(!shell.error()); assert.equal(result.code, 0); // creates new files -var testFile = tmpFile(); +testFile = tmpFile(); result = shell.touch(testFile); assert(fs.existsSync(testFile)); // does not create a file if told not to -var testFile = tmpFile(true); +testFile = tmpFile(true); result = shell.touch('-c', testFile); assert.equal(result.code, 0); assert.ok(!fs.existsSync(testFile)); @@ -49,23 +49,23 @@ assert.ok(files.indexOf('tmp/file.js') > -1); assert.equal(files.length, 2); // errors if reference file is not found -var testFile = tmpFile(); +testFile = tmpFile(); var refFile = tmpFile(true); -result = shell.touch({'-r': refFile}, testFile); +result = shell.touch({ '-r': refFile }, testFile); assert.equal(result.code, 1); assert.ok(shell.error()); // uses a reference file for mtime -var testFile = tmpFile(false); +testFile = tmpFile(false); var testFile2 = tmpFile(); shell.touch(testFile2); -shell.exec(JSON.stringify(process.execPath)+' resources/exec/slow.js 3000'); +shell.exec(JSON.stringify(process.execPath) + ' resources/exec/slow.js 3000'); result = shell.touch(testFile); assert.ok(!shell.error()); assert.equal(result.code, 0); assert.notEqual(fs.statSync(testFile).mtime.getTime(), fs.statSync(testFile2).mtime.getTime()); assert.notEqual(fs.statSync(testFile).atime.getTime(), fs.statSync(testFile2).atime.getTime()); -result = shell.touch({'-r': testFile2}, testFile); +result = shell.touch({ '-r': testFile2 }, testFile); assert.ok(!shell.error()); assert.equal(result.code, 0); assert.equal(fs.statSync(testFile).mtime.getTime(), fs.statSync(testFile2).mtime.getTime()); diff --git a/test/uniq.js b/test/uniq.js index d4c448cd6..82a8d5672 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -24,16 +24,16 @@ assert.ok(shell.error()); assert.ok(result.code); // -//Valids +// Valids // -//uniq file1 +// uniq file1 result = shell.uniq('resources/uniq/file1'); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result + '', shell.cat('resources/uniq/file1u').toString()); -//uniq -i file2 +// uniq -i file2 result = shell.uniq('-i', 'resources/uniq/file2'); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -45,26 +45,26 @@ assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result + '', shell.cat('resources/uniq/file2u').toString()); -//uniq file1 file2 +// uniq file1 file2 shell.uniq('resources/uniq/file1', 'resources/uniq/file1t'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(shell.cat('resources/uniq/file1u').toString(), +assert.equal(shell.cat('resources/uniq/file1u').toString(), shell.cat('resources/uniq/file1t').toString()); - -//cat file1 |uniq + +// cat file1 |uniq result = shell.cat('resources/uniq/file1').uniq(); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result + '', shell.cat('resources/uniq/file1u').toString()); -//uniq -c file1 +// uniq -c file1 result = shell.uniq('-c', 'resources/uniq/file1'); assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.equal(result + '', shell.cat('resources/uniq/file1c').toString()); -//uniq -d file1 +// uniq -d file1 result = shell.uniq('-d', 'resources/uniq/file1'); assert.equal(shell.error(), null); assert.equal(result.code, 0); diff --git a/test/utils/utils.js b/test/utils/utils.js index 98bd8a2d0..88fcc9855 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -1,5 +1,5 @@ function _numLines(str) { - return typeof str === 'string' ? (str.match(/\n/g)||[]).length+1 : 0; + return typeof str === 'string' ? (str.match(/\n/g) || []).length + 1 : 0; } exports.numLines = _numLines; diff --git a/test/which.js b/test/which.js index 70ba5db47..fdf96c2cc 100644 --- a/test/which.js +++ b/test/which.js @@ -1,7 +1,7 @@ var shell = require('..'); -var assert = require('assert'), - fs = require('fs'); +var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -30,12 +30,12 @@ assert.ok(!shell.error()); assert.ok(fs.existsSync(node + '')); if (process.platform === 'win32') { - // This should be equivalent on Windows - var nodeExe = shell.which('node.exe'); - assert.ok(!shell.error()); - // If the paths are equal, then this file *should* exist, since that's - // already been checked. - assert.equal(node + '', nodeExe + ''); + // This should be equivalent on Windows + var nodeExe = shell.which('node.exe'); + assert.ok(!shell.error()); + // If the paths are equal, then this file *should* exist, since that's + // already been checked. + assert.equal(node + '', nodeExe + ''); } shell.exit(123); From 902f92ab5b10e02ad23461f76fbf69cba4f5bb7c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 8 Aug 2016 11:44:16 -0700 Subject: [PATCH 023/338] feat: add overWrite option for commands (#503) * feat: add overWrite option for commands * fix: throws an error if a command is overwritten --- src/common.js | 6 ++++++ test/plugin.js | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/src/common.js b/src/common.js index 5b5cd9f69..919aee23f 100644 --- a/src/common.js +++ b/src/common.js @@ -372,6 +372,7 @@ var DEFAULT_WRAP_OPTIONS = { pipeOnly: false, unix: true, wrapOutput: true, + overWrite: false, }; // Register a new ShellJS command @@ -379,6 +380,11 @@ function _register(name, implementation, wrapOptions) { wrapOptions = wrapOptions || {}; // If an option isn't specified, use the default wrapOptions = objectAssign({}, DEFAULT_WRAP_OPTIONS, wrapOptions); + + if (shell[name] && !wrapOptions.overWrite) { + throw new Error('unable to overwrite `' + name + '` command'); + } + if (wrapOptions.pipeOnly) { wrapOptions.canReceivePipe = true; shellMethods[name] = wrap(name, implementation, wrapOptions); diff --git a/test/plugin.js b/test/plugin.js index bcc9c62c0..42a7830e6 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -96,4 +96,11 @@ assert.equal(ret.stdout, ''); assert.equal(ret.stderr, 'foo: Exited with code 5'); assert.equal(shell.error(), 'foo: Exited with code 5'); +// Cannot overwrite an existing command by default +var oldCat = shell.cat; +assert.throws(function () { + plugin.register('cat', fooImplementation); +}, 'Error: unable to overwrite `cat` command'); +assert.equal(shell.cat, oldCat); + shell.exit(123); From a0c90320727baf202e43c8fb39ce24dda5cb832f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 13 Aug 2016 15:50:31 -0700 Subject: [PATCH 024/338] refactor: readFromPipe() requires no arguments (#506) --- src/cat.js | 2 +- src/common.js | 8 ++++++-- src/exec.js | 2 +- src/grep.js | 2 +- src/head.js | 2 +- src/sed.js | 2 +- src/sort.js | 2 +- src/tail.js | 2 +- src/uniq.js | 2 +- test/plugin.js | 2 +- 10 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/cat.js b/src/cat.js index 92ca95003..a74a25c84 100644 --- a/src/cat.js +++ b/src/cat.js @@ -21,7 +21,7 @@ common.register('cat', _cat, { //@ containing the files if more than one file is given (a new line character is //@ introduced between each file). function _cat(options, files) { - var cat = common.readFromPipe(this); + var cat = common.readFromPipe(); if (!files && !cat) common.error('no paths given'); diff --git a/src/common.js b/src/common.js index 919aee23f..472525c09 100644 --- a/src/common.js +++ b/src/common.js @@ -277,6 +277,10 @@ function wrap(cmd, fn, options) { console.error.apply(console, [cmd].concat(args)); } + // If this is coming from a pipe, let's set the pipedValue (otherwise, set + // it to the empty string) + state.pipedValue = (this && typeof this.stdout === 'string') ? this.stdout : ''; + if (options.unix === false) { // this branch is for exec() retValue = fn.apply(this, args); } else { // and this branch is for everything else @@ -359,8 +363,8 @@ exports.wrap = wrap; // This returns all the input that is piped into the current command (or the // empty string, if this isn't on the right-hand side of a pipe -function _readFromPipe(that) { - return typeof that.stdout === 'string' ? that.stdout : ''; +function _readFromPipe() { + return state.pipedValue; } exports.readFromPipe = _readFromPipe; diff --git a/src/exec.js b/src/exec.js index 380d3bf40..5608f8d1f 100644 --- a/src/exec.js +++ b/src/exec.js @@ -239,7 +239,7 @@ function _exec(command, options, callback) { options = options || {}; if (!command) common.error('must specify command'); - var pipe = common.readFromPipe(this); + var pipe = common.readFromPipe(); // Callback is defined instead of options. if (typeof options === 'function') { diff --git a/src/grep.js b/src/grep.js index 4781cdaf6..e8eee5970 100644 --- a/src/grep.js +++ b/src/grep.js @@ -29,7 +29,7 @@ common.register('grep', _grep, { //@ file that match the given `regex_filter`. function _grep(options, regex, files) { // Check if this is coming from a pipe - var pipe = common.readFromPipe(this); + var pipe = common.readFromPipe(); if (!files && !pipe) common.error('no paths given', 2); diff --git a/src/head.js b/src/head.js index 6256fcb97..3dec07569 100644 --- a/src/head.js +++ b/src/head.js @@ -53,7 +53,7 @@ function readSomeLines(file, numLines) { //@ Read the start of a file. function _head(options, files) { var head = []; - var pipe = common.readFromPipe(this); + var pipe = common.readFromPipe(); if (!files && !pipe) common.error('no paths given'); diff --git a/src/sed.js b/src/sed.js index 8286e8e46..19a51e715 100644 --- a/src/sed.js +++ b/src/sed.js @@ -27,7 +27,7 @@ common.register('sed', _sed, { //@ using the given search regex and replacement string or function. Returns the new string after replacement. function _sed(options, regex, replacement, files) { // Check if this is coming from a pipe - var pipe = common.readFromPipe(this); + var pipe = common.readFromPipe(); if (typeof replacement !== 'string' && typeof replacement !== 'function') { if (typeof replacement === 'number') { diff --git a/src/sort.js b/src/sort.js index b70b094e5..041b03772 100644 --- a/src/sort.js +++ b/src/sort.js @@ -57,7 +57,7 @@ function numericalCmp(a, b) { //@ files mixes their content, just like unix sort does. function _sort(options, files) { // Check if this is coming from a pipe - var pipe = common.readFromPipe(this); + var pipe = common.readFromPipe(); if (!files && !pipe) common.error('no files given'); diff --git a/src/tail.js b/src/tail.js index 0b0150235..bb4aee2fc 100644 --- a/src/tail.js +++ b/src/tail.js @@ -26,7 +26,7 @@ common.register('tail', _tail, { //@ Read the end of a file. function _tail(options, files) { var tail = []; - var pipe = common.readFromPipe(this); + var pipe = common.readFromPipe(); if (!files && !pipe) common.error('no paths given'); diff --git a/src/uniq.js b/src/uniq.js index 9fe77358f..8f5da0028 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -38,7 +38,7 @@ common.register('uniq', _uniq, { //@ Filter adjacent matching lines from input function _uniq(options, input, output) { // Check if this is coming from a pipe - var pipe = common.readFromPipe(this); + var pipe = common.readFromPipe(); if (!input && !pipe) common.error('no input given'); diff --git a/test/plugin.js b/test/plugin.js index 42a7830e6..9a1591c85 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -14,7 +14,7 @@ function fooImplementation(options, arg) { if (arg) { fname = arg; } else { - fname = plugin.readFromPipe(this); + fname = plugin.readFromPipe(); } if (arg === 'exitWithCode5') { From ab8cf5a8e027b28fc7b784587e4339d2b6d0f08f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 20 Aug 2016 18:28:49 -0700 Subject: [PATCH 025/338] refactor: replace fs.existsSync (#509) * refactor: replace fs.existsSync * fix: add support for v0.10 --- src/cat.js | 2 +- src/chmod.js | 2 +- src/common.js | 10 ++++++ src/cp.js | 10 +++--- src/exec.js | 16 ++++----- src/grep.js | 2 +- src/head.js | 2 +- src/ln.js | 6 ++-- src/mkdir.js | 4 +-- src/mv.js | 8 ++--- src/rm.js | 2 +- src/sed.js | 2 +- src/sort.js | 2 +- src/tail.js | 2 +- src/tempdir.js | 2 +- src/test.js | 2 +- src/to.js | 2 +- src/toEnd.js | 2 +- src/which.js | 2 +- test/cat.js | 4 +-- test/cd.js | 9 +++-- test/cp.js | 90 ++++++++++++++++++++++++------------------------- test/global.js | 6 ++-- test/grep.js | 8 ++--- test/head.js | 4 +-- test/ln.js | 30 ++++++++--------- test/ls.js | 5 +-- test/mkdir.js | 51 ++++++++++++++-------------- test/mv.js | 70 +++++++++++++++++++------------------- test/rm.js | 77 +++++++++++++++++++++--------------------- test/sed.js | 8 ++--- test/sort.js | 4 +-- test/tail.js | 4 +-- test/tempdir.js | 4 +-- test/to.js | 6 ++-- test/toEnd.js | 12 +++---- test/touch.js | 15 +++++---- test/uniq.js | 4 +-- test/which.js | 4 +-- 39 files changed, 254 insertions(+), 241 deletions(-) diff --git a/src/cat.js b/src/cat.js index a74a25c84..a333a0f03 100644 --- a/src/cat.js +++ b/src/cat.js @@ -28,7 +28,7 @@ function _cat(options, files) { files = [].slice.call(arguments, 1); files.forEach(function (file) { - if (!fs.existsSync(file)) { + if (!common.existsSync(file)) { common.error('no such file or directory: ' + file); } diff --git a/src/chmod.js b/src/chmod.js index a1afd90e7..2583cdd66 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -102,7 +102,7 @@ function _chmod(options, mode, filePattern) { files.forEach(function innerChmod(file) { file = path.resolve(file); - if (!fs.existsSync(file)) { + if (!common.existsSync(file)) { common.error('File not found: ' + file); } diff --git a/src/common.js b/src/common.js index 472525c09..9aba7c9f1 100644 --- a/src/common.js +++ b/src/common.js @@ -81,6 +81,16 @@ function error(msg, _code, _continue) { } exports.error = error; +function existsSync(file) { + try { + fs.statSync(file); + return true; + } catch (e) { + return false; + } +} +exports.existsSync = existsSync; + //@ //@ ### ShellString(str) //@ diff --git a/src/cp.js b/src/cp.js index 1f06c1c77..28f312678 100644 --- a/src/cp.js +++ b/src/cp.js @@ -19,7 +19,7 @@ common.register('cp', _cp, { // (Using readFileSync() + writeFileSync() could easily cause a memory overflow // with large files) function copyFileSync(srcFile, destFile, options) { - if (!fs.existsSync(srcFile)) { + if (!common.existsSync(srcFile)) { common.error('copyFileSync: no such file or directory: ' + srcFile); } @@ -135,7 +135,7 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) { } } else { /* At this point, we've hit a file actually worth copying... so copy it on over. */ - if (fs.existsSync(destFile) && opts.no_force) { + if (common.existsSync(destFile) && opts.no_force) { common.log('skipping existing file: ' + files[i]); } else { copyFileSync(srcFile, destFile, opts); @@ -204,7 +204,7 @@ function _cp(options, sources, dest) { dest = arguments[arguments.length - 1]; } - var destExists = fs.existsSync(dest); + var destExists = common.existsSync(dest); var destStat = destExists && fs.statSync(dest); // Dest is not existing dir, but multiple sources given @@ -218,7 +218,7 @@ function _cp(options, sources, dest) { } sources.forEach(function (src) { - if (!fs.existsSync(src)) { + if (!common.existsSync(src)) { common.error('no such file or directory: ' + src, true); return; // skip file } @@ -251,7 +251,7 @@ function _cp(options, sources, dest) { thisDest = path.normalize(dest + '/' + path.basename(src)); } - if (fs.existsSync(thisDest) && options.no_force) { + if (common.existsSync(thisDest) && options.no_force) { return; // skip file } diff --git a/src/exec.js b/src/exec.js index 5608f8d1f..7d8a78d89 100644 --- a/src/exec.js +++ b/src/exec.js @@ -37,7 +37,7 @@ function execSync(cmd, opts, pipe) { var previousStderrContent = ''; // Echoes stdout and stderr changes from running process, if not silent function updateStream(streamFile) { - if (opts.silent || !fs.existsSync(streamFile)) { + if (opts.silent || !common.existsSync(streamFile)) { return; } @@ -61,10 +61,10 @@ function execSync(cmd, opts, pipe) { previousStreamContent = streamContent; } - if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); - if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); - if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); - if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); + if (common.existsSync(scriptFile)) common.unlinkSync(scriptFile); + if (common.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); + if (common.existsSync(stderrFile)) common.unlinkSync(stderrFile); + if (common.existsSync(codeFile)) common.unlinkSync(codeFile); var execCommand = JSON.stringify(process.execPath) + ' ' + JSON.stringify(scriptFile); var script; @@ -134,9 +134,9 @@ function execSync(cmd, opts, pipe) { // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing // CPU usage, though apparently not so much on Windows) - while (!fs.existsSync(codeFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stdoutFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stderrFile)) { updateStream(stderrFile); fs.writeFileSync(sleepFile, 'a'); } + while (!common.existsSync(codeFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } + while (!common.existsSync(stdoutFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } + while (!common.existsSync(stderrFile)) { updateStream(stderrFile); fs.writeFileSync(sleepFile, 'a'); } try { common.unlinkSync(sleepFile); } catch (e) {} } diff --git a/src/grep.js b/src/grep.js index e8eee5970..963e28b96 100644 --- a/src/grep.js +++ b/src/grep.js @@ -41,7 +41,7 @@ function _grep(options, regex, files) { var grep = []; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { + if (!common.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, 2, true); return; } diff --git a/src/head.js b/src/head.js index 3dec07569..27cd1a50a 100644 --- a/src/head.js +++ b/src/head.js @@ -72,7 +72,7 @@ function _head(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { + if (!common.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, true); return; } diff --git a/src/ln.js b/src/ln.js index 22c1d89b4..2c304831a 100644 --- a/src/ln.js +++ b/src/ln.js @@ -34,7 +34,7 @@ function _ln(options, source, dest) { var isAbsolute = (path.resolve(source) === sourcePath); dest = path.resolve(process.cwd(), String(dest)); - if (fs.existsSync(dest)) { + if (common.existsSync(dest)) { if (!options.force) { common.error('Destination file exists', true); } @@ -46,7 +46,7 @@ function _ln(options, source, dest) { var isWindows = common.platform === 'win'; var linkType = isWindows ? 'file' : null; var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source); - if (!fs.existsSync(resolvedSourcePath)) { + if (!common.existsSync(resolvedSourcePath)) { common.error('Source file does not exist', true); } else if (isWindows && fs.statSync(resolvedSourcePath).isDirectory()) { linkType = 'junction'; @@ -58,7 +58,7 @@ function _ln(options, source, dest) { common.error(err.message); } } else { - if (!fs.existsSync(source)) { + if (!common.existsSync(source)) { common.error('Source file does not exist', true); } try { diff --git a/src/mkdir.js b/src/mkdir.js index d75a86bcb..a51c71146 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -20,7 +20,7 @@ function mkdirSyncRecursive(dir) { } // Base dir exists, no recursion necessary - if (fs.existsSync(baseDir)) { + if (common.existsSync(baseDir)) { fs.mkdirSync(dir, parseInt('0777', 8)); return; } @@ -68,7 +68,7 @@ function _mkdir(options, dirs) { // Base dir does not exist, and no -p option given var baseDir = path.dirname(dir); - if (!fs.existsSync(baseDir) && !options.fullpath) { + if (!common.existsSync(baseDir) && !options.fullpath) { common.error('no such file or directory: ' + baseDir, true); return; // skip dir } diff --git a/src/mv.js b/src/mv.js index 5dd32a0af..d713c48c9 100644 --- a/src/mv.js +++ b/src/mv.js @@ -41,7 +41,7 @@ function _mv(options, sources, dest) { common.error('invalid arguments'); } - var exists = fs.existsSync(dest); + var exists = common.existsSync(dest); var stats = exists && fs.statSync(dest); // Dest is not existing dir, but multiple sources given @@ -55,7 +55,7 @@ function _mv(options, sources, dest) { } sources.forEach(function (src) { - if (!fs.existsSync(src)) { + if (!common.existsSync(src)) { common.error('no such file or directory: ' + src, true); return; // skip file } @@ -65,11 +65,11 @@ function _mv(options, sources, dest) { // When copying to '/path/dir': // thisDest = '/path/dir/file1' var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) { + if (common.existsSync(dest) && fs.statSync(dest).isDirectory()) { thisDest = path.normalize(dest + '/' + path.basename(src)); } - if (fs.existsSync(thisDest) && options.no_force) { + if (common.existsSync(thisDest) && options.no_force) { common.error('dest file already exists: ' + thisDest, true); return; // skip file } diff --git a/src/rm.js b/src/rm.js index 0e9d5e4cf..9c1574b3c 100644 --- a/src/rm.js +++ b/src/rm.js @@ -50,7 +50,7 @@ function rmdirSyncRecursive(dir, force) { while (true) { try { result = fs.rmdirSync(dir); - if (fs.existsSync(dir)) throw { code: 'EAGAIN' }; + if (common.existsSync(dir)) throw { code: 'EAGAIN' }; break; } catch (er) { // In addition to error codes, also check if the directory still exists and loop again if true diff --git a/src/sed.js b/src/sed.js index 19a51e715..abcd8d0ba 100644 --- a/src/sed.js +++ b/src/sed.js @@ -54,7 +54,7 @@ function _sed(options, regex, replacement, files) { var sed = []; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { + if (!common.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, 2, true); return; } diff --git a/src/sort.js b/src/sort.js index 041b03772..a78bdd697 100644 --- a/src/sort.js +++ b/src/sort.js @@ -69,7 +69,7 @@ function _sort(options, files) { var lines = []; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { + if (!common.existsSync(file) && file !== '-') { // exit upon any sort of error common.error('no such file or directory: ' + file); } diff --git a/src/tail.js b/src/tail.js index bb4aee2fc..4adbb566d 100644 --- a/src/tail.js +++ b/src/tail.js @@ -46,7 +46,7 @@ function _tail(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { + if (!common.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, true); return; } diff --git a/src/tempdir.js b/src/tempdir.js index cfd56b379..b6bf3767c 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -9,7 +9,7 @@ common.register('tempdir', _tempDir, { // Returns false if 'dir' is not a writeable directory, 'dir' otherwise function writeableDir(dir) { - if (!dir || !fs.existsSync(dir)) return false; + if (!dir || !common.existsSync(dir)) return false; if (!fs.statSync(dir).isDirectory()) return false; diff --git a/src/test.js b/src/test.js index b3926a482..09491313a 100644 --- a/src/test.js +++ b/src/test.js @@ -57,7 +57,7 @@ function _test(options, path) { } } - if (!fs.existsSync(path)) return false; + if (!common.existsSync(path)) return false; if (options.exists) return true; diff --git a/src/to.js b/src/to.js index 31e84a60f..0044b7453 100644 --- a/src/to.js +++ b/src/to.js @@ -22,7 +22,7 @@ common.register('to', _to, { function _to(options, file) { if (!file) common.error('wrong arguments'); - if (!fs.existsSync(path.dirname(file))) { + if (!common.existsSync(path.dirname(file))) { common.error('no such file or directory: ' + path.dirname(file)); } diff --git a/src/toEnd.js b/src/toEnd.js index 5d58f1d10..99d890ceb 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -21,7 +21,7 @@ common.register('toEnd', _toEnd, { function _toEnd(options, file) { if (!file) common.error('wrong arguments'); - if (!fs.existsSync(path.dirname(file))) { + if (!common.existsSync(path.dirname(file))) { common.error('no such file or directory: ' + path.dirname(file)); } diff --git a/src/which.js b/src/which.js index ef5d185eb..cb40587bc 100644 --- a/src/which.js +++ b/src/which.js @@ -22,7 +22,7 @@ function splitPath(p) { } function checkPath(pathName) { - return fs.existsSync(pathName) && !fs.statSync(pathName).isDirectory(); + return common.existsSync(pathName) && !fs.statSync(pathName).isDirectory(); } //@ diff --git a/test/cat.js b/test/cat.js index ea3306a65..4159f5cf0 100644 --- a/test/cat.js +++ b/test/cat.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -17,7 +17,7 @@ assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(result.stderr, 'cat: no paths given'); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.cat('/asdfasdf'); // file does not exist assert.ok(shell.error()); assert.equal(result.code, 1); diff --git a/test/cd.js b/test/cd.js index 482324e76..2860a2504 100644 --- a/test/cd.js +++ b/test/cd.js @@ -2,7 +2,6 @@ var shell = require('..'); var assert = require('assert'); var path = require('path'); -var fs = require('fs'); var common = require('../src/common'); shell.config.silent = true; @@ -17,13 +16,13 @@ shell.mkdir('tmp'); // Invalids // -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check var result = shell.cd('/asdfasdf'); // dir does not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(result.stderr, 'cd: no such file or directory: /asdfasdf'); -assert.equal(fs.existsSync('resources/file1'), true); // sanity check +assert.equal(common.existsSync('resources/file1'), true); // sanity check result = shell.cd('resources/file1'); // file, not dir assert.ok(shell.error()); assert.equal(result.code, 1); @@ -61,7 +60,7 @@ assert.equal(process.cwd(), path.resolve(cur.toString())); result = shell.cd(cur); result = shell.rm('-f', 'tmp/*'); -assert.equal(fs.existsSync('tmp/file1'), false); +assert.equal(common.existsSync('tmp/file1'), false); result = shell.cd('resources'); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -71,7 +70,7 @@ assert.equal(result.code, 0); result = shell.cd('../tmp'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), true); +assert.equal(common.existsSync('file1'), true); // Test tilde expansion diff --git a/test/cp.js b/test/cp.js index 463168e3c..706f4ae12 100644 --- a/test/cp.js +++ b/test/cp.js @@ -49,28 +49,28 @@ shell.rm('-rf', 'tmp/*'); result = shell.cp('-@', 'resources/file1', 'tmp/file1'); // option not supported, files OK assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/file1'), false); +assert.equal(common.existsSync('tmp/file1'), false); assert.equal(result.stderr, 'cp: option not recognized: @'); result = shell.cp('-Z', 'asdfasdf', 'tmp/file2'); // option not supported, files NOT OK assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/file2'), false); +assert.equal(common.existsSync('tmp/file2'), false); assert.equal(result.stderr, 'cp: option not recognized: Z'); result = shell.cp('asdfasdf', 'tmp'); // source does not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(numLines(result.stderr), 1); -assert.equal(fs.existsSync('tmp/asdfasdf'), false); +assert.equal(common.existsSync('tmp/asdfasdf'), false); assert.equal(result.stderr, 'cp: no such file or directory: asdfasdf'); result = shell.cp('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(numLines(result.stderr), 2); -assert.equal(fs.existsSync('tmp/asdfasdf1'), false); -assert.equal(fs.existsSync('tmp/asdfasdf2'), false); +assert.equal(common.existsSync('tmp/asdfasdf1'), false); +assert.equal(common.existsSync('tmp/asdfasdf2'), false); assert.equal(result.stderr, 'cp: no such file or directory: asdfasdf1\ncp: no such file or directory: asdfasdf2'); result = shell.cp('asdfasdf1', 'asdfasdf2', 'resources/file1'); // too many sources (dest is file) @@ -81,7 +81,7 @@ assert.equal(result.stderr, 'cp: dest is not a directory (too many sources)'); result = shell.cp('resources/file1', 'resources/file2', 'tmp/a_file'); // too many sources assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/a_file'), false); +assert.equal(common.existsSync('tmp/a_file'), false); assert.equal(result.stderr, 'cp: dest is not a directory (too many sources)'); // @@ -121,14 +121,14 @@ result = shell.cp('resources/file1', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file1'), true); // simple - to file result = shell.cp('resources/file2', 'tmp/file2'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file2'), true); +assert.equal(common.existsSync('tmp/file2'), true); // simple - file list shell.rm('-rf', 'tmp/*'); @@ -136,8 +136,8 @@ result = shell.cp('resources/file1', 'resources/file2', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); +assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file2'), true); // simple - file list, array syntax shell.rm('-rf', 'tmp/*'); @@ -145,16 +145,16 @@ result = shell.cp(['resources/file1', 'resources/file2'], 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); +assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file2'), true); result = shell.cp('resources/file2', 'tmp/file3'); -assert.equal(fs.existsSync('tmp/file3'), true); +assert.equal(common.existsSync('tmp/file3'), true); result = shell.cp('-f', 'resources/file2', 'tmp/file3'); // file exists, but -f specified assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file3'), true); +assert.equal(common.existsSync('tmp/file3'), true); // glob shell.rm('-rf', 'tmp/*'); @@ -162,12 +162,12 @@ result = shell.cp('resources/file?', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1')); -assert.ok(fs.existsSync('tmp/file2')); -assert.ok(!fs.existsSync('tmp/file1.js')); -assert.ok(!fs.existsSync('tmp/file2.js')); -assert.ok(!fs.existsSync('tmp/file1.txt')); -assert.ok(!fs.existsSync('tmp/file2.txt')); +assert.ok(common.existsSync('tmp/file1')); +assert.ok(common.existsSync('tmp/file2')); +assert.ok(!common.existsSync('tmp/file1.js')); +assert.ok(!common.existsSync('tmp/file2.js')); +assert.ok(!common.existsSync('tmp/file1.txt')); +assert.ok(!common.existsSync('tmp/file2.txt')); // wildcard shell.rm('tmp/file1', 'tmp/file2'); @@ -175,12 +175,12 @@ result = shell.cp('resources/file*', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1')); -assert.ok(fs.existsSync('tmp/file2')); -assert.ok(fs.existsSync('tmp/file1.js')); -assert.ok(fs.existsSync('tmp/file2.js')); -assert.ok(fs.existsSync('tmp/file1.txt')); -assert.ok(fs.existsSync('tmp/file2.txt')); +assert.ok(common.existsSync('tmp/file1')); +assert.ok(common.existsSync('tmp/file2')); +assert.ok(common.existsSync('tmp/file1.js')); +assert.ok(common.existsSync('tmp/file2.js')); +assert.ok(common.existsSync('tmp/file1.txt')); +assert.ok(common.existsSync('tmp/file2.txt')); // recursive, with regular files shell.rm('-rf', 'tmp/*'); @@ -188,8 +188,8 @@ result = shell.cp('-R', 'resources/file1', 'resources/file2', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1')); -assert.ok(fs.existsSync('tmp/file2')); +assert.ok(common.existsSync('tmp/file1')); +assert.ok(common.existsSync('tmp/file2')); // recursive, nothing exists shell.rm('-rf', 'tmp/*'); @@ -213,8 +213,8 @@ result = shell.cp('-R', 'resources/file*.txt', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1.txt')); -assert.ok(fs.existsSync('tmp/file2.txt')); +assert.ok(common.existsSync('tmp/file1.txt')); +assert.ok(common.existsSync('tmp/file2.txt')); // recursive, copying one regular file (also related to Github issue #376) shell.rm('-rf', 'tmp/*'); @@ -222,7 +222,7 @@ result = shell.cp('-R', 'resources/file1.txt', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1.txt')); +assert.ok(common.existsSync('tmp/file1.txt')); assert.ok(!fs.statSync('tmp/file1.txt').isDirectory()); // don't let it be a dir // recursive, everything exists, no force flag @@ -292,7 +292,7 @@ result = shell.cp('-r', 'resources/issue44', 'tmp/dir2/dir3'); assert.ok(shell.error()); assert.equal(result.stderr, 'cp: cannot create directory \'tmp/dir2/dir3\': No such file or directory'); assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/dir2'), false); +assert.equal(common.existsSync('tmp/dir2'), false); // recursive, copies entire directory shell.rm('-rf', 'tmp/*'); @@ -300,13 +300,13 @@ result = shell.cp('-r', 'resources/cp/dir_a', 'tmp/dest'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/dest/z'), true); +assert.equal(common.existsSync('tmp/dest/z'), true); // recursive, with trailing slash, does the exact same shell.rm('-rf', 'tmp/*'); result = shell.cp('-r', 'resources/cp/dir_a/', 'tmp/dest'); assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/dest/z'), true); +assert.equal(common.existsSync('tmp/dest/z'), true); // On Windows, permission bits are quite different so skip those tests for now if (common.platform !== 'win') { @@ -324,16 +324,16 @@ result = shell.cp('-r', 'resources/ls/', 'tmp/'); assert.ok(!shell.error()); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/.hidden_file')); +assert.ok(common.existsSync('tmp/.hidden_file')); // no-recursive will copy regular files only shell.rm('-rf', 'tmp/'); shell.mkdir('tmp/'); result = shell.cp('resources/file1.txt', 'resources/ls/', 'tmp/'); assert.ok(shell.error()); -assert.ok(!fs.existsSync('tmp/.hidden_file')); // doesn't copy dir contents -assert.ok(!fs.existsSync('tmp/ls')); // doesn't copy dir itself -assert.ok(fs.existsSync('tmp/file1.txt')); +assert.ok(!common.existsSync('tmp/.hidden_file')); // doesn't copy dir contents +assert.ok(!common.existsSync('tmp/ls')); // doesn't copy dir itself +assert.ok(common.existsSync('tmp/file1.txt')); // no-recursive will copy regular files only shell.rm('-rf', 'tmp/'); @@ -341,12 +341,12 @@ shell.mkdir('tmp/'); result = shell.cp('resources/file1.txt', 'resources/file2.txt', 'resources/cp', 'resources/ls/', 'tmp/'); assert.ok(shell.error()); -assert.ok(!fs.existsSync('tmp/.hidden_file')); // doesn't copy dir contents -assert.ok(!fs.existsSync('tmp/ls')); // doesn't copy dir itself -assert.ok(!fs.existsSync('tmp/a')); // doesn't copy dir contents -assert.ok(!fs.existsSync('tmp/cp')); // doesn't copy dir itself -assert.ok(fs.existsSync('tmp/file1.txt')); -assert.ok(fs.existsSync('tmp/file2.txt')); +assert.ok(!common.existsSync('tmp/.hidden_file')); // doesn't copy dir contents +assert.ok(!common.existsSync('tmp/ls')); // doesn't copy dir itself +assert.ok(!common.existsSync('tmp/a')); // doesn't copy dir contents +assert.ok(!common.existsSync('tmp/cp')); // doesn't copy dir itself +assert.ok(common.existsSync('tmp/file1.txt')); +assert.ok(common.existsSync('tmp/file2.txt')); if (process.platform !== 'win32') { // -R implies -P @@ -376,7 +376,7 @@ if (process.platform !== 'win32') { assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); - assert.equal(fs.existsSync('tmp/dest/z'), true); + assert.equal(common.existsSync('tmp/dest/z'), true); } // using -R on a link to a folder *does* follow the link diff --git a/test/global.js b/test/global.js index e3c1b2769..85ae1b135 100644 --- a/test/global.js +++ b/test/global.js @@ -1,9 +1,9 @@ /* globals cat, config, cp, env, error, exit, mkdir, rm */ require('../global'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); config.silent = true; @@ -24,11 +24,11 @@ assert.equal(result, 'test1\n'); // rm cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file1'), true); result = rm('tmp/file1'); assert.equal(error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), false); +assert.equal(common.existsSync('tmp/file1'), false); // String.prototype is modified for global require 'foo'.to('tmp/testfile.txt'); diff --git a/test/grep.js b/test/grep.js index fe377d1e4..a2f718cbc 100644 --- a/test/grep.js +++ b/test/grep.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -22,7 +22,7 @@ result = shell.grep(/asdf/g); // too few args assert.ok(shell.error()); assert.equal(result.code, 2); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.grep(/asdf/g, '/asdfasdf'); // no such file assert.ok(shell.error()); assert.equal(result.stderr, 'grep: no such file or directory: /asdfasdf'); @@ -30,8 +30,8 @@ assert.equal(result.code, 2); // if at least one file is missing, this should be an error shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('asdfasdf'), false); // sanity check -assert.equal(fs.existsSync('tmp/file1'), true); // sanity check +assert.equal(common.existsSync('asdfasdf'), false); // sanity check +assert.equal(common.existsSync('tmp/file1'), true); // sanity check result = shell.grep(/asdf/g, 'tmp/file1', 'asdfasdf'); assert.ok(shell.error()); assert.equal(result.stderr, 'grep: no such file or directory: asdfasdf'); diff --git a/test/head.js b/test/head.js index 4692bdad2..67bf96f9e 100644 --- a/test/head.js +++ b/test/head.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -18,7 +18,7 @@ result = shell.head(); assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.head('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.equal(result.code, 1); diff --git a/test/ln.js b/test/ln.js index b2d1ebc80..5259e0159 100644 --- a/test/ln.js +++ b/test/ln.js @@ -68,7 +68,7 @@ assert.equal(result.code, 1); // result = shell.ln('tmp/file1', 'tmp/linkfile1'); -assert(fs.existsSync('tmp/linkfile1')); +assert(common.existsSync('tmp/linkfile1')); assert.equal( fs.readFileSync('tmp/file1').toString(), fs.readFileSync('tmp/linkfile1').toString() @@ -83,7 +83,7 @@ assert.equal(result.code, 0); // With glob shell.rm('tmp/linkfile1'); result = shell.ln('tmp/fi*1', 'tmp/linkfile1'); -assert(fs.existsSync('tmp/linkfile1')); +assert(common.existsSync('tmp/linkfile1')); assert.equal( fs.readFileSync('tmp/file1').toString(), fs.readFileSync('tmp/linkfile1').toString() @@ -96,7 +96,7 @@ assert.equal( assert.equal(result.code, 0); skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'file2', 'tmp/linkfile2'), function () { - assert(fs.existsSync('tmp/linkfile2')); + assert(common.existsSync('tmp/linkfile2')); assert.equal( fs.readFileSync('tmp/file2').toString(), fs.readFileSync('tmp/linkfile2').toString() @@ -112,8 +112,8 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'file2', 'tmp/linkfile2'), function shell.mkdir('tmp/ln'); shell.touch('tmp/ln/hello'); result = shell.ln('-s', 'ln', 'tmp/dir1'); -assert(fs.existsSync('tmp/ln/hello')); -assert(fs.existsSync('tmp/dir1/hello')); +assert(common.existsSync('tmp/ln/hello')); +assert(common.existsSync('tmp/dir1/hello')); assert.equal(result.code, 0); // To current directory @@ -121,8 +121,8 @@ shell.cd('tmp'); result = shell.ln('-s', './', 'dest'); assert.equal(result.code, 0); shell.touch('testfile.txt'); -assert(fs.existsSync('testfile.txt')); -assert(fs.existsSync('dest/testfile.txt')); +assert(common.existsSync('testfile.txt')); +assert(common.existsSync('dest/testfile.txt')); shell.rm('-f', 'dest'); shell.mkdir('dir1'); shell.cd('dir1'); @@ -130,15 +130,15 @@ result = shell.ln('-s', './', '../dest'); assert.equal(result.code, 0); shell.touch('insideDir.txt'); shell.cd('..'); -assert(fs.existsSync('testfile.txt')); -assert(fs.existsSync('dest/testfile.txt')); -assert(fs.existsSync('dir1/insideDir.txt')); -assert(!fs.existsSync('dest/insideDir.txt')); +assert(common.existsSync('testfile.txt')); +assert(common.existsSync('dest/testfile.txt')); +assert(common.existsSync('dir1/insideDir.txt')); +assert(!common.existsSync('dest/insideDir.txt')); shell.cd('..'); result = shell.ln('-f', 'tmp/file1.js', 'tmp/file2.js'); assert.equal(result.code, 0); -assert(fs.existsSync('tmp/file2.js')); +assert(common.existsSync('tmp/file2.js')); assert.equal( fs.readFileSync('tmp/file1.js').toString(), fs.readFileSync('tmp/file2.js').toString() @@ -150,7 +150,7 @@ assert.equal( ); skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), function () { - assert(fs.existsSync('tmp/file2.txt')); + assert(common.existsSync('tmp/file2.txt')); assert.equal( fs.readFileSync('tmp/file1.txt').toString(), fs.readFileSync('tmp/file2.txt').toString() @@ -164,7 +164,7 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), fun // Abspath regression skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1', path.resolve('tmp/abspath')), function () { - assert(fs.existsSync('tmp/abspath')); + assert(common.existsSync('tmp/abspath')); assert.equal( fs.readFileSync('tmp/file1').toString(), fs.readFileSync('tmp/abspath').toString() @@ -182,7 +182,7 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), fun // Move the symlink first, as the reverse confuses `mv`. shell.mv('tmp/file2.txt', 'tmp/new/file2.txt'); shell.mv('tmp/file1.txt', 'tmp/new/file1.txt'); - assert(fs.existsSync('tmp/new/file2.txt')); + assert(common.existsSync('tmp/new/file2.txt')); assert.equal( fs.readFileSync('tmp/new/file1.txt').toString(), fs.readFileSync('tmp/new/file2.txt').toString() diff --git a/test/ls.js b/test/ls.js index e74c4d056..1e832b8f8 100644 --- a/test/ls.js +++ b/test/ls.js @@ -1,4 +1,5 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); var fs = require('fs'); @@ -15,7 +16,7 @@ var k; // Invalids // -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check var result = shell.ls('/asdfasdf'); // no such file or dir assert.ok(shell.error()); assert.equal(result.code, 2); @@ -417,7 +418,7 @@ shell.rm('-r', 'foo'); assert.ok(!shell.error()); // Check stderr field -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.ls('resources/ls/file1', '/asdfasdf'); assert.ok(shell.error()); assert.equal('ls: no such file or directory: /asdfasdf', result.stderr); diff --git a/test/mkdir.js b/test/mkdir.js index 71927d953..e8507b1cb 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -1,4 +1,5 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); var fs = require('fs'); @@ -33,13 +34,13 @@ assert.equal(result.code, 1); assert.equal(result.stderr, 'mkdir: path already exists: resources/badlink'); assert.equal(fs.lstatSync('resources/badlink').mtime.toString(), mtime); // didn't mess with file -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.mkdir('/asdfasdf/foobar'); // root path does not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(result.stderr, 'mkdir: no such file or directory: /asdfasdf'); -assert.equal(fs.existsSync('/asdfasdf'), false); -assert.equal(fs.existsSync('/asdfasdf/foobar'), false); +assert.equal(common.existsSync('/asdfasdf'), false); +assert.equal(common.existsSync('/asdfasdf/foobar'), false); // Check for invalid permissions if (process.platform !== 'win32') { @@ -52,7 +53,7 @@ if (process.platform !== 'win32') { assert.equal(result.code, 1); assert.equal(result.stderr, 'mkdir: cannot create directory nowritedir/foo: Permission denied'); assert.ok(shell.error()); - assert.equal(fs.existsSync(dirName + '/foo'), false); + assert.equal(common.existsSync(dirName + '/foo'), false); shell.rm('-rf', dirName); // clean up } @@ -60,59 +61,59 @@ if (process.platform !== 'win32') { // Valids // -assert.equal(fs.existsSync('tmp/t1'), false); +assert.equal(common.existsSync('tmp/t1'), false); result = shell.mkdir('tmp/t1'); // simple dir assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/t1'), true); +assert.equal(common.existsSync('tmp/t1'), true); -assert.equal(fs.existsSync('tmp/t2'), false); -assert.equal(fs.existsSync('tmp/t3'), false); +assert.equal(common.existsSync('tmp/t2'), false); +assert.equal(common.existsSync('tmp/t3'), false); result = shell.mkdir('tmp/t2', 'tmp/t3'); // multiple dirs assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/t2'), true); -assert.equal(fs.existsSync('tmp/t3'), true); +assert.equal(common.existsSync('tmp/t2'), true); +assert.equal(common.existsSync('tmp/t3'), true); -assert.equal(fs.existsSync('tmp/t1'), true); -assert.equal(fs.existsSync('tmp/t4'), false); +assert.equal(common.existsSync('tmp/t1'), true); +assert.equal(common.existsSync('tmp/t4'), false); result = shell.mkdir('tmp/t1', 'tmp/t4'); // one dir exists, one doesn't assert.equal(numLines(shell.error()), 1); -assert.equal(fs.existsSync('tmp/t1'), true); -assert.equal(fs.existsSync('tmp/t4'), true); +assert.equal(common.existsSync('tmp/t1'), true); +assert.equal(common.existsSync('tmp/t4'), true); -assert.equal(fs.existsSync('tmp/a'), false); +assert.equal(common.existsSync('tmp/a'), false); result = shell.mkdir('-p', 'tmp/a/b/c'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a/b/c'), true); +assert.equal(common.existsSync('tmp/a/b/c'), true); shell.rm('-Rf', 'tmp/a'); // revert // multiple dirs result = shell.mkdir('-p', 'tmp/zzza', 'tmp/zzzb', 'tmp/zzzc'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/zzza'), true); -assert.equal(fs.existsSync('tmp/zzzb'), true); -assert.equal(fs.existsSync('tmp/zzzc'), true); +assert.equal(common.existsSync('tmp/zzza'), true); +assert.equal(common.existsSync('tmp/zzzb'), true); +assert.equal(common.existsSync('tmp/zzzc'), true); // multiple dirs, array syntax result = shell.mkdir('-p', ['tmp/yyya', 'tmp/yyyb', 'tmp/yyyc']); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/yyya'), true); -assert.equal(fs.existsSync('tmp/yyyb'), true); -assert.equal(fs.existsSync('tmp/yyyc'), true); +assert.equal(common.existsSync('tmp/yyya'), true); +assert.equal(common.existsSync('tmp/yyyb'), true); +assert.equal(common.existsSync('tmp/yyyc'), true); // globbed dir result = shell.mkdir('-p', 'tmp/mydir'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/mydir'), true); +assert.equal(common.existsSync('tmp/mydir'), true); result = shell.mkdir('-p', 'tmp/m*ir'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/mydir'), true); -assert.equal(fs.existsSync('tmp/m*ir'), false); // doesn't create literal name +assert.equal(common.existsSync('tmp/mydir'), true); +assert.equal(common.existsSync('tmp/m*ir'), false); // doesn't create literal name shell.exit(123); diff --git a/test/mv.js b/test/mv.js index 2bb62efef..142517ebf 100644 --- a/test/mv.js +++ b/test/mv.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); var numLines = require('./utils/utils').numLines; shell.config.silent = true; @@ -33,22 +33,22 @@ assert.equal(result.stderr, 'mv: missing and/or '); result = shell.mv('-Z', 'tmp/file1', 'tmp/file1'); // option not supported assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file1'), true); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: option not recognized: Z'); result = shell.mv('asdfasdf', 'tmp'); // source does not exist assert.ok(shell.error()); assert.equal(numLines(shell.error()), 1); -assert.equal(fs.existsSync('tmp/asdfasdf'), false); +assert.equal(common.existsSync('tmp/asdfasdf'), false); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: no such file or directory: asdfasdf'); result = shell.mv('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist assert.ok(shell.error()); assert.equal(numLines(shell.error()), 2); -assert.equal(fs.existsSync('tmp/asdfasdf1'), false); -assert.equal(fs.existsSync('tmp/asdfasdf2'), false); +assert.equal(common.existsSync('tmp/asdfasdf1'), false); +assert.equal(common.existsSync('tmp/asdfasdf2'), false); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: no such file or directory: asdfasdf1\nmv: no such file or directory: asdfasdf2'); @@ -78,16 +78,16 @@ assert.equal(result.stderr, 'mv: dest file already exists: tmp/file2'); result = shell.mv('tmp/file1', 'tmp/file2', 'tmp/a_file'); // too many sources (exist, but dest is file) assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/a_file'), false); +assert.equal(common.existsSync('tmp/a_file'), false); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: dest is not a directory (too many sources)'); result = shell.mv('tmp/file*', 'tmp/file1'); // can't use wildcard when dest is file assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); -assert.equal(fs.existsSync('tmp/file1.js'), true); -assert.equal(fs.existsSync('tmp/file2.js'), true); +assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file2'), true); +assert.equal(common.existsSync('tmp/file1.js'), true); +assert.equal(common.existsSync('tmp/file2.js'), true); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: dest is not a directory (too many sources)'); @@ -101,20 +101,20 @@ shell.cd('tmp'); shell.mkdir('tmp2'); result = shell.mv('*', 'tmp2'); // has to handle self (tmp2 --> tmp2) without throwing error assert.ok(shell.error()); // there's an error, but not fatal -assert.equal(fs.existsSync('tmp2/file1'), true); // moved OK +assert.equal(common.existsSync('tmp2/file1'), true); // moved OK assert.equal(result.code, 1); result = shell.mv('tmp2/*', '.'); // revert -assert.equal(fs.existsSync('file1'), true); // moved OK +assert.equal(common.existsSync('file1'), true); // moved OK assert.equal(result.code, 0); result = shell.mv('file1', 'file3'); // one source assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file3'), true); +assert.equal(common.existsSync('file1'), false); +assert.equal(common.existsSync('file3'), true); result = shell.mv('file3', 'file1'); // revert assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), true); +assert.equal(common.existsSync('file1'), true); assert.equal(result.code, 0); // two sources @@ -123,14 +123,14 @@ shell.mkdir('-p', 't'); result = shell.mv('file1', 'file2', 't'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), false); -assert.equal(fs.existsSync('t/file1'), true); -assert.equal(fs.existsSync('t/file2'), true); +assert.equal(common.existsSync('file1'), false); +assert.equal(common.existsSync('file2'), false); +assert.equal(common.existsSync('t/file1'), true); +assert.equal(common.existsSync('t/file2'), true); result = shell.mv('t/*', '.'); // revert assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), true); -assert.equal(fs.existsSync('file2'), true); +assert.equal(common.existsSync('file1'), true); +assert.equal(common.existsSync('file2'), true); // two sources, array style shell.rm('-rf', 't'); @@ -138,29 +138,29 @@ shell.mkdir('-p', 't'); result = shell.mv(['file1', 'file2'], 't'); // two sources assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), false); -assert.equal(fs.existsSync('t/file1'), true); -assert.equal(fs.existsSync('t/file2'), true); +assert.equal(common.existsSync('file1'), false); +assert.equal(common.existsSync('file2'), false); +assert.equal(common.existsSync('t/file1'), true); +assert.equal(common.existsSync('t/file2'), true); result = shell.mv('t/*', '.'); // revert -assert.equal(fs.existsSync('file1'), true); -assert.equal(fs.existsSync('file2'), true); +assert.equal(common.existsSync('file1'), true); +assert.equal(common.existsSync('file2'), true); result = shell.mv('file*.js', 't'); // wildcard assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1.js'), false); -assert.equal(fs.existsSync('file2.js'), false); -assert.equal(fs.existsSync('t/file1.js'), true); -assert.equal(fs.existsSync('t/file2.js'), true); +assert.equal(common.existsSync('file1.js'), false); +assert.equal(common.existsSync('file2.js'), false); +assert.equal(common.existsSync('t/file1.js'), true); +assert.equal(common.existsSync('t/file2.js'), true); result = shell.mv('t/*', '.'); // revert -assert.equal(fs.existsSync('file1.js'), true); -assert.equal(fs.existsSync('file2.js'), true); +assert.equal(common.existsSync('file1.js'), true); +assert.equal(common.existsSync('file2.js'), true); result = shell.mv('-f', 'file1', 'file2'); // dest exists, but -f given assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), true); +assert.equal(common.existsSync('file1'), false); +assert.equal(common.existsSync('file2'), true); shell.exit(123); diff --git a/test/rm.js b/test/rm.js index ab98a72fe..918e9169b 100644 --- a/test/rm.js +++ b/test/rm.js @@ -1,4 +1,5 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); var path = require('path'); @@ -34,7 +35,7 @@ assert.equal(result.stderr, 'rm: no paths given'); result = shell.rm('-@', 'resources/file1'); // invalid option assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(fs.existsSync('resources/file1'), true); +assert.equal(common.existsSync('resources/file1'), true); assert.equal(result.stderr, 'rm: option not recognized: @'); // @@ -68,61 +69,61 @@ assert.equal(result.code, 0); // simple rm shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file1'), true); result = shell.rm('tmp/file1'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), false); +assert.equal(common.existsSync('tmp/file1'), false); // recursive dir removal - small-caps '-r' shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); +assert.equal(common.existsSync('tmp/a/b/c'), true); result = shell.rm('-rf', 'tmp/a'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a'), false); +assert.equal(common.existsSync('tmp/a'), false); // recursive dir removal - capital '-R' shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); +assert.equal(common.existsSync('tmp/a/b/c'), true); result = shell.rm('-Rf', 'tmp/a'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a'), false); +assert.equal(common.existsSync('tmp/a'), false); // recursive dir removal - absolute path shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); +assert.equal(common.existsSync('tmp/a/b/c'), true); result = shell.rm('-Rf', path.resolve('./tmp/a')); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a'), false); +assert.equal(common.existsSync('tmp/a'), false); // wildcard shell.cp('-f', 'resources/file*', 'tmp'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); -assert.equal(fs.existsSync('tmp/file1.js'), true); -assert.equal(fs.existsSync('tmp/file2.js'), true); +assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(common.existsSync('tmp/file2'), true); +assert.equal(common.existsSync('tmp/file1.js'), true); +assert.equal(common.existsSync('tmp/file2.js'), true); result = shell.rm('tmp/file*'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), false); -assert.equal(fs.existsSync('tmp/file2'), false); -assert.equal(fs.existsSync('tmp/file1.js'), false); -assert.equal(fs.existsSync('tmp/file2.js'), false); +assert.equal(common.existsSync('tmp/file1'), false); +assert.equal(common.existsSync('tmp/file2'), false); +assert.equal(common.existsSync('tmp/file1.js'), false); +assert.equal(common.existsSync('tmp/file2.js'), false); // recursive dir removal shell.mkdir('-p', 'tmp/a/b/c'); shell.mkdir('-p', 'tmp/b'); shell.mkdir('-p', 'tmp/c'); shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); +assert.equal(common.existsSync('tmp/a/b/c'), true); +assert.equal(common.existsSync('tmp/b'), true); +assert.equal(common.existsSync('tmp/c'), true); +assert.equal(common.existsSync('tmp/.hidden'), true); result = shell.rm('-rf', 'tmp/*'); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -135,10 +136,10 @@ shell.mkdir('-p', 'tmp/a/b/c'); shell.mkdir('-p', 'tmp/b'); shell.mkdir('-p', 'tmp/c'); shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); +assert.equal(common.existsSync('tmp/a/b/c'), true); +assert.equal(common.existsSync('tmp/b'), true); +assert.equal(common.existsSync('tmp/c'), true); +assert.equal(common.existsSync('tmp/.hidden'), true); result = shell.rm('-rf', 'tmp/*', 'tmp/.*'); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -150,10 +151,10 @@ shell.mkdir('-p', 'tmp/a/b/c'); shell.mkdir('-p', 'tmp/b'); shell.mkdir('-p', 'tmp/c'); shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); +assert.equal(common.existsSync('tmp/a/b/c'), true); +assert.equal(common.existsSync('tmp/b'), true); +assert.equal(common.existsSync('tmp/c'), true); +assert.equal(common.existsSync('tmp/.hidden'), true); result = shell.rm('-rf', ['tmp/*', 'tmp/.*']); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -165,7 +166,7 @@ shell.mkdir('-p', 'tmp/readonly'); shell.ShellString('asdf').to('tmp/readonly/file1'); fs.chmodSync('tmp/readonly/file1', '0444'); // -r--r--r-- result = shell.rm('tmp/readonly/file1'); -assert.equal(fs.existsSync('tmp/readonly/file1'), true); // bash's rm always asks before removing read-only files +assert.equal(common.existsSync('tmp/readonly/file1'), true); // bash's rm always asks before removing read-only files // here we just assume "no" // removal of a read-only file (forced) @@ -173,7 +174,7 @@ shell.mkdir('-p', 'tmp/readonly'); shell.ShellString('asdf').to('tmp/readonly/file2'); fs.chmodSync('tmp/readonly/file2', '0444'); // -r--r--r-- result = shell.rm('-f', 'tmp/readonly/file2'); -assert.equal(fs.existsSync('tmp/readonly/file2'), false); +assert.equal(common.existsSync('tmp/readonly/file2'), false); // removal of a tree containing read-only files (unforced) shell.mkdir('-p', 'tmp/tree2'); @@ -181,8 +182,8 @@ shell.ShellString('asdf').to('tmp/tree2/file1'); shell.ShellString('asdf').to('tmp/tree2/file2'); fs.chmodSync('tmp/tree2/file1', '0444'); // -r--r--r-- result = shell.rm('-r', 'tmp/tree2'); -assert.equal(fs.existsSync('tmp/tree2/file1'), true); -assert.equal(fs.existsSync('tmp/tree2/file2'), false); +assert.equal(common.existsSync('tmp/tree2/file1'), true); +assert.equal(common.existsSync('tmp/tree2/file2'), false); // removal of a tree containing read-only files (forced) shell.mkdir('-p', 'tmp/tree'); @@ -190,7 +191,7 @@ shell.ShellString('asdf').to('tmp/tree/file1'); shell.ShellString('asdf').to('tmp/tree/file2'); fs.chmodSync('tmp/tree/file1', '0444'); // -r--r--r-- result = shell.rm('-rf', 'tmp/tree'); -assert.equal(fs.existsSync('tmp/tree'), false); +assert.equal(common.existsSync('tmp/tree'), false); // removal of a sub-tree containing read-only and hidden files - rm('dir/*') shell.mkdir('-p', 'tmp/tree3'); @@ -216,7 +217,7 @@ fs.chmodSync('tmp/tree4/file', '0444'); // -r--r--r-- fs.chmodSync('tmp/tree4/subtree/file', '0444'); // -r--r--r-- fs.chmodSync('tmp/tree4/.hidden/file', '0444'); // -r--r--r-- result = shell.rm('-rf', 'tmp/tree4'); // erase dir contents -assert.equal(fs.existsSync('tmp/tree4'), false); +assert.equal(common.existsSync('tmp/tree4'), false); // remove symbolic link to a dir result = shell.rm('-rf', 'tmp'); @@ -225,8 +226,8 @@ shell.cp('-R', 'resources/rm', 'tmp'); result = shell.rm('-f', 'tmp/rm/link_to_a_dir'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/rm/link_to_a_dir'), false); -assert.equal(fs.existsSync('tmp/rm/a_dir'), true); +assert.equal(common.existsSync('tmp/rm/link_to_a_dir'), false); +assert.equal(common.existsSync('tmp/rm/a_dir'), true); // remove broken symbolic link if (process.platform !== 'win32') { @@ -238,7 +239,7 @@ if (process.platform !== 'win32') { assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.ok(!shell.test('-L', 'tmp/rm/fake.lnk')); - assert.equal(fs.existsSync('tmp/rm/fake.lnk'), false); + assert.equal(common.existsSync('tmp/rm/fake.lnk'), false); } shell.exit(123); diff --git a/test/sed.js b/test/sed.js index 2105dcc4d..1907519fe 100644 --- a/test/sed.js +++ b/test/sed.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -27,7 +27,7 @@ result = shell.sed(/asdf/g, 'nada'); // too few args assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(fs.existsSync('asdfasdf'), false); // sanity check +assert.equal(common.existsSync('asdfasdf'), false); // sanity check result = shell.sed(/asdf/g, 'nada', 'asdfasdf'); // no such file assert.ok(shell.error()); assert.equal(result.code, 2); @@ -35,8 +35,8 @@ assert.equal(result.stderr, 'sed: no such file or directory: asdfasdf'); // if at least one file is missing, this should be an error shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('asdfasdf'), false); // sanity check -assert.equal(fs.existsSync('tmp/file1'), true); // sanity check +assert.equal(common.existsSync('asdfasdf'), false); // sanity check +assert.equal(common.existsSync('tmp/file1'), true); // sanity check result = shell.sed(/asdf/g, 'nada', 'tmp/file1', 'asdfasdf'); assert.ok(shell.error()); assert.equal(result.code, 2); diff --git a/test/sort.js b/test/sort.js index 4e50fd405..71a7ef88a 100644 --- a/test/sort.js +++ b/test/sort.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -26,7 +26,7 @@ result = shell.sort(); assert.ok(shell.error()); assert.ok(result.code); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.sort('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.ok(result.code); diff --git a/test/tail.js b/test/tail.js index 1aa077e21..e8b496cec 100644 --- a/test/tail.js +++ b/test/tail.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -18,7 +18,7 @@ result = shell.tail(); assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.tail('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.equal(result.code, 1); diff --git a/test/tempdir.js b/test/tempdir.js index beddec289..e4a5905eb 100644 --- a/test/tempdir.js +++ b/test/tempdir.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -14,6 +14,6 @@ shell.mkdir('tmp'); var tmp = shell.tempdir(); assert.equal(shell.error(), null); -assert.equal(fs.existsSync(tmp), true); +assert.equal(common.existsSync(tmp), true); shell.exit(123); diff --git a/test/to.js b/test/to.js index 1b5b86805..178bb24d0 100644 --- a/test/to.js +++ b/test/to.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -19,7 +19,7 @@ assert.ok(typeof str.to === 'undefined'); shell.ShellString('hello world').to(); assert.ok(shell.error()); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check shell.ShellString('hello world').to('/asdfasdf/file'); assert.ok(shell.error()); @@ -39,7 +39,7 @@ assert.equal(result, 'hello world'); // With a glob shell.ShellString('goodbye').to('tmp/t*1'); -assert.equal(fs.existsSync('tmp/t*1'), false, 'globs are not interpreted literally'); +assert.equal(common.existsSync('tmp/t*1'), false, 'globs are not interpreted literally'); result = shell.cat('tmp/to1'); assert.equal(shell.error(), null); assert.equal(result, 'goodbye'); diff --git a/test/toEnd.js b/test/toEnd.js index a2936f613..f30c6f9e2 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -19,17 +19,17 @@ assert.ok(typeof str.toEnd === 'undefined'); shell.ShellString('hello world').toEnd(); assert.ok(shell.error()); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check assert.ok(shell.error()); // // Valids // var result; -assert.equal(fs.existsSync('tmp/toEnd1'), false); // Check file toEnd() creates does not already exist -assert.equal(fs.existsSync('tmp/toEnd2'), false); +assert.equal(common.existsSync('tmp/toEnd1'), false); // Check file toEnd() creates does not already exist +assert.equal(common.existsSync('tmp/toEnd2'), false); shell.ShellString('hello ').toEnd('tmp/toEnd1'); -assert.equal(fs.existsSync('tmp/toEnd1'), true); // Check that file was created +assert.equal(common.existsSync('tmp/toEnd1'), true); // Check that file was created shell.ShellString('world').toEnd('tmp/toEnd1').toEnd('tmp/toEnd2'); // Write some more to the file result = shell.cat('tmp/toEnd1'); assert.equal(shell.error(), null); @@ -41,7 +41,7 @@ assert.equal(result, 'world'); // Check that the result is what we expect // With a glob shell.ShellString('good').to('tmp/toE*1'); shell.ShellString('bye').toEnd('tmp/toE*1'); -assert.equal(fs.existsSync('tmp/toE*1'), false, 'globs are not interpreted literally'); +assert.equal(common.existsSync('tmp/toE*1'), false, 'globs are not interpreted literally'); result = shell.cat('tmp/toEnd1'); assert.equal(shell.error(), null); assert.equal(result, 'goodbye'); diff --git a/test/touch.js b/test/touch.js index 3b8d5d919..cbd7744df 100644 --- a/test/touch.js +++ b/test/touch.js @@ -1,4 +1,5 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); var fs = require('fs'); var crypto = require('crypto'); @@ -30,13 +31,13 @@ assert.equal(result.code, 0); // creates new files testFile = tmpFile(); result = shell.touch(testFile); -assert(fs.existsSync(testFile)); +assert(common.existsSync(testFile)); // does not create a file if told not to testFile = tmpFile(true); result = shell.touch('-c', testFile); assert.equal(result.code, 0); -assert.ok(!fs.existsSync(testFile)); +assert.ok(!common.existsSync(testFile)); // handles globs correctly result = shell.touch('tmp/file.txt'); @@ -100,8 +101,8 @@ testFile2 = tmpFile(true); shell.rm('-f', testFile, testFile2); result = shell.touch(testFile, testFile2); assert.equal(result.code, 0); -assert(fs.existsSync(testFile)); -assert(fs.existsSync(testFile2)); +assert(common.existsSync(testFile)); +assert(common.existsSync(testFile2)); // file array testFile = tmpFile(true); @@ -109,15 +110,15 @@ testFile2 = tmpFile(true); shell.rm('-f', testFile, testFile2); result = shell.touch([testFile, testFile2]); assert.equal(result.code, 0); -assert(fs.existsSync(testFile)); -assert(fs.existsSync(testFile2)); +assert(common.existsSync(testFile)); +assert(common.existsSync(testFile2)); // touching broken link creates a new file if (process.platform !== 'win32') { result = shell.touch('resources/badlink'); assert.equal(result.code, 0); assert.ok(!shell.error()); - assert.ok(fs.existsSync('resources/not_existed_file')); + assert.ok(common.existsSync('resources/not_existed_file')); shell.rm('resources/not_existed_file'); } diff --git a/test/uniq.js b/test/uniq.js index 82a8d5672..17f3207b9 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -18,7 +18,7 @@ result = shell.uniq(); assert.ok(shell.error()); assert.ok(result.code); -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check +assert.equal(common.existsSync('/asdfasdf'), false); // sanity check result = shell.sort('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.ok(result.code); diff --git a/test/which.js b/test/which.js index fdf96c2cc..0367ad9d9 100644 --- a/test/which.js +++ b/test/which.js @@ -1,7 +1,7 @@ var shell = require('..'); +var common = require('../src/common'); var assert = require('assert'); -var fs = require('fs'); shell.config.silent = true; @@ -27,7 +27,7 @@ var node = shell.which('node'); assert.equal(node.code, 0); assert.ok(!node.stderr); assert.ok(!shell.error()); -assert.ok(fs.existsSync(node + '')); +assert.ok(common.existsSync(node + '')); if (process.platform === 'win32') { // This should be equivalent on Windows From 45f719de7532357e31e1160fb8136ef1598597f0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 23 Aug 2016 19:36:05 -0700 Subject: [PATCH 026/338] fix: echo supports -e option properly (#511) --- README.md | 5 ++++- src/echo.js | 11 ++++++++++- test/echo.js | 12 +++++++++--- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 24ae06584..74d1452d1 100644 --- a/README.md +++ b/README.md @@ -459,7 +459,10 @@ Searches for `command` in the system's PATH. On Windows, this uses the Returns string containing the absolute path to the command. -### echo(string [, string ...]) +### echo([options,] string [, string ...]) +Available options: + ++ `-e`: interpret backslash escapes (default) Examples: diff --git a/src/echo.js b/src/echo.js index 2871003a4..2b0e7d919 100644 --- a/src/echo.js +++ b/src/echo.js @@ -5,7 +5,10 @@ common.register('echo', _echo, { }); //@ -//@ ### echo(string [, string ...]) +//@ ### echo([options,] string [, string ...]) +//@ Available options: +//@ +//@ + `-e`: interpret backslash escapes (default) //@ //@ Examples: //@ @@ -19,6 +22,12 @@ common.register('echo', _echo, { function _echo(opts, messages) { // allow strings starting with '-', see issue #20 messages = [].slice.call(arguments, opts ? 0 : 1); + + if (messages[0] === '-e') { + // ignore -e + messages.shift(); + } + console.log.apply(console, messages); return messages.join(' '); } diff --git a/test/echo.js b/test/echo.js index 08cce4272..ec83413ca 100644 --- a/test/echo.js +++ b/test/echo.js @@ -33,15 +33,21 @@ child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err, stdout) assert.equal(stderr2, ''); // simple test with silent(true) - shell.mkdir('-p', 'tmp'); - file = 'tmp/tempscript' + Math.random() + '.js'; script = 'require(\'../../global.js\'); config.silent=true; echo(555);'; shell.ShellString(script).to(file); child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err3, stdout3) { assert.equal(stdout3, '555\n'); - theEnd(); + script = "require('../../global.js'); echo('-e', '\\tmessage');"; + shell.ShellString(script).to(file); + child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err4, stdout4) { + assert.equal(stdout4, '\tmessage\n'); + + theEnd(); + }); }); + + // simple test with silent(true) }); }); From 9eb9bf9773bc2bd3e5a7e4094e87a1e2386b45ef Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 25 Aug 2016 18:27:14 -0700 Subject: [PATCH 027/338] 0.7.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2be9bd257..d3187f16d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.3", + "version": "0.7.4", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 3986d61346b317fafdea2732fede2a1c134ced90 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 25 Aug 2016 18:28:01 -0700 Subject: [PATCH 028/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f3decf21..c9d490e65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Change Log +## [v0.7.4](https://github.com/shelljs/shelljs/tree/v0.7.4) (2016-08-26) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.3...v0.7.4) + +**Closed issues:** + +- fix: echo -e should not print "-e" [\#510](https://github.com/shelljs/shelljs/issues/510) +- Wrong method signature in doc [\#498](https://github.com/shelljs/shelljs/issues/498) +- readFromPipe should be a function with no arguments [\#485](https://github.com/shelljs/shelljs/issues/485) +- TypeError: Cannot read property 'toString' of undefined [\#471](https://github.com/shelljs/shelljs/issues/471) + +**Merged pull requests:** + +- fix: echo supports -e option properly [\#511](https://github.com/shelljs/shelljs/pull/511) ([nfischer](https://github.com/nfischer)) +- refactor: replace fs.existsSync [\#509](https://github.com/shelljs/shelljs/pull/509) ([nfischer](https://github.com/nfischer)) +- refactor: readFromPipe\(\) requires no arguments [\#506](https://github.com/shelljs/shelljs/pull/506) ([nfischer](https://github.com/nfischer)) +- chore: switch to eslint [\#504](https://github.com/shelljs/shelljs/pull/504) ([nfischer](https://github.com/nfischer)) +- feat: add overWrite option for commands [\#503](https://github.com/shelljs/shelljs/pull/503) ([nfischer](https://github.com/nfischer)) +- chore: update issue template [\#502](https://github.com/shelljs/shelljs/pull/502) ([nfischer](https://github.com/nfischer)) +- fixed head/tail readme [\#499](https://github.com/shelljs/shelljs/pull/499) ([charlesread](https://github.com/charlesread)) + ## [v0.7.3](https://github.com/shelljs/shelljs/tree/v0.7.3) (2016-07-27) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.2...v0.7.3) From 35cef9a4ae2b7321bd8cc341a7528ef015bca304 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 27 Aug 2016 14:32:35 -0700 Subject: [PATCH 029/338] chore: add downloads per month on README (#513) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 74d1452d1..eafb5b7c8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ [![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/shelljs/shelljs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Travis](https://img.shields.io/travis/shelljs/shelljs/master.svg?style=flat-square&label=unix)](https://travis-ci.org/shelljs/shelljs) [![AppVeyor](https://img.shields.io/appveyor/ci/shelljs/shelljs/master.svg?style=flat-square&label=windows)](https://ci.appveyor.com/project/shelljs/shelljs/branch/master) -[![npm (scoped)](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) +[![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) +[![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping From d057e075a7d6154928497a4a5ea133b27852cbfa Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 14 Oct 2016 15:39:59 -0700 Subject: [PATCH 030/338] feat: cp -u option (#527) Only update when the source file is older than the destination, or the destination file is missing. Fixes #526 --- README.md | 1 + src/cp.js | 11 +++++++++++ test/cp.js | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/README.md b/README.md index eafb5b7c8..f18c41c23 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,7 @@ Available options: + `-f`: force (default behavior) + `-n`: no-clobber ++ `-u`: only copy if source is newer than dest + `-r`, `-R`: recursive + `-L`: follow symlinks + `-P`: don't follow symlinks diff --git a/src/cp.js b/src/cp.js index 28f312678..7f8763ee1 100644 --- a/src/cp.js +++ b/src/cp.js @@ -7,6 +7,7 @@ common.register('cp', _cp, { cmdOptions: { 'f': '!no_force', 'n': 'no_force', + 'u': 'update', 'R': 'recursive', 'r': 'recursive', 'L': 'followsymlink', @@ -23,6 +24,15 @@ function copyFileSync(srcFile, destFile, options) { common.error('copyFileSync: no such file or directory: ' + srcFile); } + // Check the mtimes of the files if the '-u' flag is provided + try { + if (options.update && fs.statSync(srcFile).mtime < fs.statSync(destFile).mtime) { + return; + } + } catch (e) { + // If we're here, destFile probably doesn't exist, so just do a normal copy + } + if (fs.lstatSync(srcFile).isSymbolicLink() && !options.followsymlink) { try { fs.lstatSync(destFile); @@ -173,6 +183,7 @@ function cpcheckcycle(sourceDir, srcFile) { //@ //@ + `-f`: force (default behavior) //@ + `-n`: no-clobber +//@ + `-u`: only copy if source is newer than dest //@ + `-r`, `-R`: recursive //@ + `-L`: follow symlinks //@ + `-P`: don't follow symlinks diff --git a/test/cp.js b/test/cp.js index 706f4ae12..b78f8f2a6 100644 --- a/test/cp.js +++ b/test/cp.js @@ -379,6 +379,45 @@ if (process.platform !== 'win32') { assert.equal(common.existsSync('tmp/dest/z'), true); } +// -u flag won't overwrite newer files +shell.rm('-rf', 'tmp/*'); +shell.touch('tmp/file1.js'); +shell.cp('-u', 'resources/file1.js', 'tmp'); +assert.ok(!shell.error()); +assert.notEqual(shell.cat('resources/file1.js').toString(), shell.cat('tmp/file1.js').toString()); + +// -u flag does overwrite older files +shell.rm('-rf', 'tmp/*'); +shell.touch({ '-d': new Date(10) }, 'tmp/file1.js'); // really old file +shell.cp('-u', 'resources/file1.js', 'tmp'); +assert.ok(!shell.error()); +assert.equal(shell.cat('resources/file1.js').toString(), shell.cat('tmp/file1.js').toString()); + +// -u flag works even if it's not overwriting a file +shell.rm('-rf', 'tmp/*'); +shell.cp('-u', 'resources/file1.js', 'tmp'); +assert.ok(!shell.error()); +assert.equal(shell.cat('resources/file1.js').toString(), shell.cat('tmp/file1.js').toString()); + +// -u flag works correctly recursively +shell.rm('-rf', 'tmp/*'); +shell.mkdir('tmp/foo'); +[1, 2, 3].forEach(function (num) { + new shell.ShellString('old\n').to('tmp/foo/file' + num); + shell.touch({ '-d': new Date(10) }, 'tmp/foo/file' + num); +}); +shell.mkdir('tmp/bar'); +[1, 2, 3].forEach(function (num) { + new shell.ShellString('new\n').to('tmp/bar/file' + num); + shell.touch({ '-d': new Date(1000) }, 'tmp/bar/file' + num); +}); +// put one new one in the foo directory +new shell.ShellString('newest\n').to('tmp/foo/file3'); +shell.touch({ '-d': new Date(10000) }, 'tmp/foo/file3'); +shell.cp('-u', 'tmp/foo/*', 'tmp/bar'); +assert.ok(!shell.error()); +assert.equal(shell.cat('tmp/bar/*').toString(), 'new\nnew\nnewest\n'); + // using -R on a link to a folder *does* follow the link shell.rm('-rf', 'tmp/*'); shell.cp('-R', 'resources/cp/symFolder', 'tmp'); From 9bf98dece9a71ceb4f98dbb8e0575041dd2dd0cc Mon Sep 17 00:00:00 2001 From: Gyandeep Singh Date: Mon, 17 Oct 2016 13:00:04 -0500 Subject: [PATCH 031/338] Fix: Remove default glob from shell.test (fixes #529) (#530) --- src/test.js | 1 + test/test.js | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/test.js b/src/test.js index 09491313a..70f5d0aa9 100644 --- a/src/test.js +++ b/src/test.js @@ -13,6 +13,7 @@ common.register('test', _test, { 'S': 'socket', }, wrapOutput: false, + allowGlobbing: false, }); diff --git a/test/test.js b/test/test.js index 1dc470482..5486970ca 100644 --- a/test/test.js +++ b/test/test.js @@ -65,6 +65,12 @@ result = shell.test('-L', 'resources/file1'); assert.equal(shell.error(), null); assert.equal(result, false); +// regression #529 +result = shell.test('-f', 'resources/**/*.js'); +assert.equal(shell.error(), null); +assert.equal(result, false); + + // link // Windows is weird with links so skip these tests if (common.platform !== 'win') { From 93ea025755922dae6b08b0813aff2ebde5345e11 Mon Sep 17 00:00:00 2001 From: Gyandeep Singh Date: Mon, 17 Oct 2016 22:14:43 -0500 Subject: [PATCH 032/338] Revert "refactor: replace fs.existsSync" (fixes #531) (#532) This reverts commit ab8cf5a8e027b28fc7b784587e4339d2b6d0f08f. --- src/cat.js | 2 +- src/chmod.js | 2 +- src/common.js | 10 ------ src/cp.js | 10 +++--- src/exec.js | 16 ++++----- src/grep.js | 2 +- src/head.js | 2 +- src/ln.js | 6 ++-- src/mkdir.js | 4 +-- src/mv.js | 8 ++--- src/rm.js | 2 +- src/sed.js | 2 +- src/sort.js | 2 +- src/tail.js | 2 +- src/tempdir.js | 2 +- src/test.js | 2 +- src/to.js | 2 +- src/toEnd.js | 2 +- src/which.js | 2 +- test/cat.js | 4 +-- test/cd.js | 9 ++--- test/cp.js | 90 ++++++++++++++++++++++++------------------------- test/global.js | 6 ++-- test/grep.js | 8 ++--- test/head.js | 4 +-- test/ln.js | 30 ++++++++--------- test/ls.js | 5 ++- test/mkdir.js | 51 ++++++++++++++-------------- test/mv.js | 70 +++++++++++++++++++------------------- test/rm.js | 77 +++++++++++++++++++++--------------------- test/sed.js | 8 ++--- test/sort.js | 4 +-- test/tail.js | 4 +-- test/tempdir.js | 4 +-- test/to.js | 6 ++-- test/toEnd.js | 12 +++---- test/touch.js | 15 ++++----- test/uniq.js | 4 +-- test/which.js | 4 +-- 39 files changed, 241 insertions(+), 254 deletions(-) diff --git a/src/cat.js b/src/cat.js index a333a0f03..a74a25c84 100644 --- a/src/cat.js +++ b/src/cat.js @@ -28,7 +28,7 @@ function _cat(options, files) { files = [].slice.call(arguments, 1); files.forEach(function (file) { - if (!common.existsSync(file)) { + if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file); } diff --git a/src/chmod.js b/src/chmod.js index 2583cdd66..a1afd90e7 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -102,7 +102,7 @@ function _chmod(options, mode, filePattern) { files.forEach(function innerChmod(file) { file = path.resolve(file); - if (!common.existsSync(file)) { + if (!fs.existsSync(file)) { common.error('File not found: ' + file); } diff --git a/src/common.js b/src/common.js index 9aba7c9f1..472525c09 100644 --- a/src/common.js +++ b/src/common.js @@ -81,16 +81,6 @@ function error(msg, _code, _continue) { } exports.error = error; -function existsSync(file) { - try { - fs.statSync(file); - return true; - } catch (e) { - return false; - } -} -exports.existsSync = existsSync; - //@ //@ ### ShellString(str) //@ diff --git a/src/cp.js b/src/cp.js index 7f8763ee1..25e386c2d 100644 --- a/src/cp.js +++ b/src/cp.js @@ -20,7 +20,7 @@ common.register('cp', _cp, { // (Using readFileSync() + writeFileSync() could easily cause a memory overflow // with large files) function copyFileSync(srcFile, destFile, options) { - if (!common.existsSync(srcFile)) { + if (!fs.existsSync(srcFile)) { common.error('copyFileSync: no such file or directory: ' + srcFile); } @@ -145,7 +145,7 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) { } } else { /* At this point, we've hit a file actually worth copying... so copy it on over. */ - if (common.existsSync(destFile) && opts.no_force) { + if (fs.existsSync(destFile) && opts.no_force) { common.log('skipping existing file: ' + files[i]); } else { copyFileSync(srcFile, destFile, opts); @@ -215,7 +215,7 @@ function _cp(options, sources, dest) { dest = arguments[arguments.length - 1]; } - var destExists = common.existsSync(dest); + var destExists = fs.existsSync(dest); var destStat = destExists && fs.statSync(dest); // Dest is not existing dir, but multiple sources given @@ -229,7 +229,7 @@ function _cp(options, sources, dest) { } sources.forEach(function (src) { - if (!common.existsSync(src)) { + if (!fs.existsSync(src)) { common.error('no such file or directory: ' + src, true); return; // skip file } @@ -262,7 +262,7 @@ function _cp(options, sources, dest) { thisDest = path.normalize(dest + '/' + path.basename(src)); } - if (common.existsSync(thisDest) && options.no_force) { + if (fs.existsSync(thisDest) && options.no_force) { return; // skip file } diff --git a/src/exec.js b/src/exec.js index 7d8a78d89..5608f8d1f 100644 --- a/src/exec.js +++ b/src/exec.js @@ -37,7 +37,7 @@ function execSync(cmd, opts, pipe) { var previousStderrContent = ''; // Echoes stdout and stderr changes from running process, if not silent function updateStream(streamFile) { - if (opts.silent || !common.existsSync(streamFile)) { + if (opts.silent || !fs.existsSync(streamFile)) { return; } @@ -61,10 +61,10 @@ function execSync(cmd, opts, pipe) { previousStreamContent = streamContent; } - if (common.existsSync(scriptFile)) common.unlinkSync(scriptFile); - if (common.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); - if (common.existsSync(stderrFile)) common.unlinkSync(stderrFile); - if (common.existsSync(codeFile)) common.unlinkSync(codeFile); + if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); + if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); + if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); + if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); var execCommand = JSON.stringify(process.execPath) + ' ' + JSON.stringify(scriptFile); var script; @@ -134,9 +134,9 @@ function execSync(cmd, opts, pipe) { // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing // CPU usage, though apparently not so much on Windows) - while (!common.existsSync(codeFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!common.existsSync(stdoutFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!common.existsSync(stderrFile)) { updateStream(stderrFile); fs.writeFileSync(sleepFile, 'a'); } + while (!fs.existsSync(codeFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } + while (!fs.existsSync(stdoutFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } + while (!fs.existsSync(stderrFile)) { updateStream(stderrFile); fs.writeFileSync(sleepFile, 'a'); } try { common.unlinkSync(sleepFile); } catch (e) {} } diff --git a/src/grep.js b/src/grep.js index 963e28b96..e8eee5970 100644 --- a/src/grep.js +++ b/src/grep.js @@ -41,7 +41,7 @@ function _grep(options, regex, files) { var grep = []; files.forEach(function (file) { - if (!common.existsSync(file) && file !== '-') { + if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, 2, true); return; } diff --git a/src/head.js b/src/head.js index 27cd1a50a..3dec07569 100644 --- a/src/head.js +++ b/src/head.js @@ -72,7 +72,7 @@ function _head(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!common.existsSync(file) && file !== '-') { + if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, true); return; } diff --git a/src/ln.js b/src/ln.js index 2c304831a..22c1d89b4 100644 --- a/src/ln.js +++ b/src/ln.js @@ -34,7 +34,7 @@ function _ln(options, source, dest) { var isAbsolute = (path.resolve(source) === sourcePath); dest = path.resolve(process.cwd(), String(dest)); - if (common.existsSync(dest)) { + if (fs.existsSync(dest)) { if (!options.force) { common.error('Destination file exists', true); } @@ -46,7 +46,7 @@ function _ln(options, source, dest) { var isWindows = common.platform === 'win'; var linkType = isWindows ? 'file' : null; var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source); - if (!common.existsSync(resolvedSourcePath)) { + if (!fs.existsSync(resolvedSourcePath)) { common.error('Source file does not exist', true); } else if (isWindows && fs.statSync(resolvedSourcePath).isDirectory()) { linkType = 'junction'; @@ -58,7 +58,7 @@ function _ln(options, source, dest) { common.error(err.message); } } else { - if (!common.existsSync(source)) { + if (!fs.existsSync(source)) { common.error('Source file does not exist', true); } try { diff --git a/src/mkdir.js b/src/mkdir.js index a51c71146..d75a86bcb 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -20,7 +20,7 @@ function mkdirSyncRecursive(dir) { } // Base dir exists, no recursion necessary - if (common.existsSync(baseDir)) { + if (fs.existsSync(baseDir)) { fs.mkdirSync(dir, parseInt('0777', 8)); return; } @@ -68,7 +68,7 @@ function _mkdir(options, dirs) { // Base dir does not exist, and no -p option given var baseDir = path.dirname(dir); - if (!common.existsSync(baseDir) && !options.fullpath) { + if (!fs.existsSync(baseDir) && !options.fullpath) { common.error('no such file or directory: ' + baseDir, true); return; // skip dir } diff --git a/src/mv.js b/src/mv.js index d713c48c9..5dd32a0af 100644 --- a/src/mv.js +++ b/src/mv.js @@ -41,7 +41,7 @@ function _mv(options, sources, dest) { common.error('invalid arguments'); } - var exists = common.existsSync(dest); + var exists = fs.existsSync(dest); var stats = exists && fs.statSync(dest); // Dest is not existing dir, but multiple sources given @@ -55,7 +55,7 @@ function _mv(options, sources, dest) { } sources.forEach(function (src) { - if (!common.existsSync(src)) { + if (!fs.existsSync(src)) { common.error('no such file or directory: ' + src, true); return; // skip file } @@ -65,11 +65,11 @@ function _mv(options, sources, dest) { // When copying to '/path/dir': // thisDest = '/path/dir/file1' var thisDest = dest; - if (common.existsSync(dest) && fs.statSync(dest).isDirectory()) { + if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) { thisDest = path.normalize(dest + '/' + path.basename(src)); } - if (common.existsSync(thisDest) && options.no_force) { + if (fs.existsSync(thisDest) && options.no_force) { common.error('dest file already exists: ' + thisDest, true); return; // skip file } diff --git a/src/rm.js b/src/rm.js index 9c1574b3c..0e9d5e4cf 100644 --- a/src/rm.js +++ b/src/rm.js @@ -50,7 +50,7 @@ function rmdirSyncRecursive(dir, force) { while (true) { try { result = fs.rmdirSync(dir); - if (common.existsSync(dir)) throw { code: 'EAGAIN' }; + if (fs.existsSync(dir)) throw { code: 'EAGAIN' }; break; } catch (er) { // In addition to error codes, also check if the directory still exists and loop again if true diff --git a/src/sed.js b/src/sed.js index abcd8d0ba..19a51e715 100644 --- a/src/sed.js +++ b/src/sed.js @@ -54,7 +54,7 @@ function _sed(options, regex, replacement, files) { var sed = []; files.forEach(function (file) { - if (!common.existsSync(file) && file !== '-') { + if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, 2, true); return; } diff --git a/src/sort.js b/src/sort.js index a78bdd697..041b03772 100644 --- a/src/sort.js +++ b/src/sort.js @@ -69,7 +69,7 @@ function _sort(options, files) { var lines = []; files.forEach(function (file) { - if (!common.existsSync(file) && file !== '-') { + if (!fs.existsSync(file) && file !== '-') { // exit upon any sort of error common.error('no such file or directory: ' + file); } diff --git a/src/tail.js b/src/tail.js index 4adbb566d..bb4aee2fc 100644 --- a/src/tail.js +++ b/src/tail.js @@ -46,7 +46,7 @@ function _tail(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!common.existsSync(file) && file !== '-') { + if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, true); return; } diff --git a/src/tempdir.js b/src/tempdir.js index b6bf3767c..cfd56b379 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -9,7 +9,7 @@ common.register('tempdir', _tempDir, { // Returns false if 'dir' is not a writeable directory, 'dir' otherwise function writeableDir(dir) { - if (!dir || !common.existsSync(dir)) return false; + if (!dir || !fs.existsSync(dir)) return false; if (!fs.statSync(dir).isDirectory()) return false; diff --git a/src/test.js b/src/test.js index 70f5d0aa9..3fb38aec4 100644 --- a/src/test.js +++ b/src/test.js @@ -58,7 +58,7 @@ function _test(options, path) { } } - if (!common.existsSync(path)) return false; + if (!fs.existsSync(path)) return false; if (options.exists) return true; diff --git a/src/to.js b/src/to.js index 0044b7453..31e84a60f 100644 --- a/src/to.js +++ b/src/to.js @@ -22,7 +22,7 @@ common.register('to', _to, { function _to(options, file) { if (!file) common.error('wrong arguments'); - if (!common.existsSync(path.dirname(file))) { + if (!fs.existsSync(path.dirname(file))) { common.error('no such file or directory: ' + path.dirname(file)); } diff --git a/src/toEnd.js b/src/toEnd.js index 99d890ceb..5d58f1d10 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -21,7 +21,7 @@ common.register('toEnd', _toEnd, { function _toEnd(options, file) { if (!file) common.error('wrong arguments'); - if (!common.existsSync(path.dirname(file))) { + if (!fs.existsSync(path.dirname(file))) { common.error('no such file or directory: ' + path.dirname(file)); } diff --git a/src/which.js b/src/which.js index cb40587bc..ef5d185eb 100644 --- a/src/which.js +++ b/src/which.js @@ -22,7 +22,7 @@ function splitPath(p) { } function checkPath(pathName) { - return common.existsSync(pathName) && !fs.statSync(pathName).isDirectory(); + return fs.existsSync(pathName) && !fs.statSync(pathName).isDirectory(); } //@ diff --git a/test/cat.js b/test/cat.js index 4159f5cf0..ea3306a65 100644 --- a/test/cat.js +++ b/test/cat.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -17,7 +17,7 @@ assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(result.stderr, 'cat: no paths given'); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.cat('/asdfasdf'); // file does not exist assert.ok(shell.error()); assert.equal(result.code, 1); diff --git a/test/cd.js b/test/cd.js index 2860a2504..482324e76 100644 --- a/test/cd.js +++ b/test/cd.js @@ -2,6 +2,7 @@ var shell = require('..'); var assert = require('assert'); var path = require('path'); +var fs = require('fs'); var common = require('../src/common'); shell.config.silent = true; @@ -16,13 +17,13 @@ shell.mkdir('tmp'); // Invalids // -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check var result = shell.cd('/asdfasdf'); // dir does not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(result.stderr, 'cd: no such file or directory: /asdfasdf'); -assert.equal(common.existsSync('resources/file1'), true); // sanity check +assert.equal(fs.existsSync('resources/file1'), true); // sanity check result = shell.cd('resources/file1'); // file, not dir assert.ok(shell.error()); assert.equal(result.code, 1); @@ -60,7 +61,7 @@ assert.equal(process.cwd(), path.resolve(cur.toString())); result = shell.cd(cur); result = shell.rm('-f', 'tmp/*'); -assert.equal(common.existsSync('tmp/file1'), false); +assert.equal(fs.existsSync('tmp/file1'), false); result = shell.cd('resources'); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -70,7 +71,7 @@ assert.equal(result.code, 0); result = shell.cd('../tmp'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('file1'), true); +assert.equal(fs.existsSync('file1'), true); // Test tilde expansion diff --git a/test/cp.js b/test/cp.js index b78f8f2a6..c54c3d24d 100644 --- a/test/cp.js +++ b/test/cp.js @@ -49,28 +49,28 @@ shell.rm('-rf', 'tmp/*'); result = shell.cp('-@', 'resources/file1', 'tmp/file1'); // option not supported, files OK assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(common.existsSync('tmp/file1'), false); +assert.equal(fs.existsSync('tmp/file1'), false); assert.equal(result.stderr, 'cp: option not recognized: @'); result = shell.cp('-Z', 'asdfasdf', 'tmp/file2'); // option not supported, files NOT OK assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(common.existsSync('tmp/file2'), false); +assert.equal(fs.existsSync('tmp/file2'), false); assert.equal(result.stderr, 'cp: option not recognized: Z'); result = shell.cp('asdfasdf', 'tmp'); // source does not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(numLines(result.stderr), 1); -assert.equal(common.existsSync('tmp/asdfasdf'), false); +assert.equal(fs.existsSync('tmp/asdfasdf'), false); assert.equal(result.stderr, 'cp: no such file or directory: asdfasdf'); result = shell.cp('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(numLines(result.stderr), 2); -assert.equal(common.existsSync('tmp/asdfasdf1'), false); -assert.equal(common.existsSync('tmp/asdfasdf2'), false); +assert.equal(fs.existsSync('tmp/asdfasdf1'), false); +assert.equal(fs.existsSync('tmp/asdfasdf2'), false); assert.equal(result.stderr, 'cp: no such file or directory: asdfasdf1\ncp: no such file or directory: asdfasdf2'); result = shell.cp('asdfasdf1', 'asdfasdf2', 'resources/file1'); // too many sources (dest is file) @@ -81,7 +81,7 @@ assert.equal(result.stderr, 'cp: dest is not a directory (too many sources)'); result = shell.cp('resources/file1', 'resources/file2', 'tmp/a_file'); // too many sources assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(common.existsSync('tmp/a_file'), false); +assert.equal(fs.existsSync('tmp/a_file'), false); assert.equal(result.stderr, 'cp: dest is not a directory (too many sources)'); // @@ -121,14 +121,14 @@ result = shell.cp('resources/file1', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file1'), true); // simple - to file result = shell.cp('resources/file2', 'tmp/file2'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file2'), true); +assert.equal(fs.existsSync('tmp/file2'), true); // simple - file list shell.rm('-rf', 'tmp/*'); @@ -136,8 +136,8 @@ result = shell.cp('resources/file1', 'resources/file2', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file1'), true); -assert.equal(common.existsSync('tmp/file2'), true); +assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file2'), true); // simple - file list, array syntax shell.rm('-rf', 'tmp/*'); @@ -145,16 +145,16 @@ result = shell.cp(['resources/file1', 'resources/file2'], 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file1'), true); -assert.equal(common.existsSync('tmp/file2'), true); +assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file2'), true); result = shell.cp('resources/file2', 'tmp/file3'); -assert.equal(common.existsSync('tmp/file3'), true); +assert.equal(fs.existsSync('tmp/file3'), true); result = shell.cp('-f', 'resources/file2', 'tmp/file3'); // file exists, but -f specified assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file3'), true); +assert.equal(fs.existsSync('tmp/file3'), true); // glob shell.rm('-rf', 'tmp/*'); @@ -162,12 +162,12 @@ result = shell.cp('resources/file?', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(common.existsSync('tmp/file1')); -assert.ok(common.existsSync('tmp/file2')); -assert.ok(!common.existsSync('tmp/file1.js')); -assert.ok(!common.existsSync('tmp/file2.js')); -assert.ok(!common.existsSync('tmp/file1.txt')); -assert.ok(!common.existsSync('tmp/file2.txt')); +assert.ok(fs.existsSync('tmp/file1')); +assert.ok(fs.existsSync('tmp/file2')); +assert.ok(!fs.existsSync('tmp/file1.js')); +assert.ok(!fs.existsSync('tmp/file2.js')); +assert.ok(!fs.existsSync('tmp/file1.txt')); +assert.ok(!fs.existsSync('tmp/file2.txt')); // wildcard shell.rm('tmp/file1', 'tmp/file2'); @@ -175,12 +175,12 @@ result = shell.cp('resources/file*', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(common.existsSync('tmp/file1')); -assert.ok(common.existsSync('tmp/file2')); -assert.ok(common.existsSync('tmp/file1.js')); -assert.ok(common.existsSync('tmp/file2.js')); -assert.ok(common.existsSync('tmp/file1.txt')); -assert.ok(common.existsSync('tmp/file2.txt')); +assert.ok(fs.existsSync('tmp/file1')); +assert.ok(fs.existsSync('tmp/file2')); +assert.ok(fs.existsSync('tmp/file1.js')); +assert.ok(fs.existsSync('tmp/file2.js')); +assert.ok(fs.existsSync('tmp/file1.txt')); +assert.ok(fs.existsSync('tmp/file2.txt')); // recursive, with regular files shell.rm('-rf', 'tmp/*'); @@ -188,8 +188,8 @@ result = shell.cp('-R', 'resources/file1', 'resources/file2', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(common.existsSync('tmp/file1')); -assert.ok(common.existsSync('tmp/file2')); +assert.ok(fs.existsSync('tmp/file1')); +assert.ok(fs.existsSync('tmp/file2')); // recursive, nothing exists shell.rm('-rf', 'tmp/*'); @@ -213,8 +213,8 @@ result = shell.cp('-R', 'resources/file*.txt', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(common.existsSync('tmp/file1.txt')); -assert.ok(common.existsSync('tmp/file2.txt')); +assert.ok(fs.existsSync('tmp/file1.txt')); +assert.ok(fs.existsSync('tmp/file2.txt')); // recursive, copying one regular file (also related to Github issue #376) shell.rm('-rf', 'tmp/*'); @@ -222,7 +222,7 @@ result = shell.cp('-R', 'resources/file1.txt', 'tmp'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(common.existsSync('tmp/file1.txt')); +assert.ok(fs.existsSync('tmp/file1.txt')); assert.ok(!fs.statSync('tmp/file1.txt').isDirectory()); // don't let it be a dir // recursive, everything exists, no force flag @@ -292,7 +292,7 @@ result = shell.cp('-r', 'resources/issue44', 'tmp/dir2/dir3'); assert.ok(shell.error()); assert.equal(result.stderr, 'cp: cannot create directory \'tmp/dir2/dir3\': No such file or directory'); assert.equal(result.code, 1); -assert.equal(common.existsSync('tmp/dir2'), false); +assert.equal(fs.existsSync('tmp/dir2'), false); // recursive, copies entire directory shell.rm('-rf', 'tmp/*'); @@ -300,13 +300,13 @@ result = shell.cp('-r', 'resources/cp/dir_a', 'tmp/dest'); assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/dest/z'), true); +assert.equal(fs.existsSync('tmp/dest/z'), true); // recursive, with trailing slash, does the exact same shell.rm('-rf', 'tmp/*'); result = shell.cp('-r', 'resources/cp/dir_a/', 'tmp/dest'); assert.equal(shell.error(), null); -assert.equal(common.existsSync('tmp/dest/z'), true); +assert.equal(fs.existsSync('tmp/dest/z'), true); // On Windows, permission bits are quite different so skip those tests for now if (common.platform !== 'win') { @@ -324,16 +324,16 @@ result = shell.cp('-r', 'resources/ls/', 'tmp/'); assert.ok(!shell.error()); assert.ok(!result.stderr); assert.equal(result.code, 0); -assert.ok(common.existsSync('tmp/.hidden_file')); +assert.ok(fs.existsSync('tmp/.hidden_file')); // no-recursive will copy regular files only shell.rm('-rf', 'tmp/'); shell.mkdir('tmp/'); result = shell.cp('resources/file1.txt', 'resources/ls/', 'tmp/'); assert.ok(shell.error()); -assert.ok(!common.existsSync('tmp/.hidden_file')); // doesn't copy dir contents -assert.ok(!common.existsSync('tmp/ls')); // doesn't copy dir itself -assert.ok(common.existsSync('tmp/file1.txt')); +assert.ok(!fs.existsSync('tmp/.hidden_file')); // doesn't copy dir contents +assert.ok(!fs.existsSync('tmp/ls')); // doesn't copy dir itself +assert.ok(fs.existsSync('tmp/file1.txt')); // no-recursive will copy regular files only shell.rm('-rf', 'tmp/'); @@ -341,12 +341,12 @@ shell.mkdir('tmp/'); result = shell.cp('resources/file1.txt', 'resources/file2.txt', 'resources/cp', 'resources/ls/', 'tmp/'); assert.ok(shell.error()); -assert.ok(!common.existsSync('tmp/.hidden_file')); // doesn't copy dir contents -assert.ok(!common.existsSync('tmp/ls')); // doesn't copy dir itself -assert.ok(!common.existsSync('tmp/a')); // doesn't copy dir contents -assert.ok(!common.existsSync('tmp/cp')); // doesn't copy dir itself -assert.ok(common.existsSync('tmp/file1.txt')); -assert.ok(common.existsSync('tmp/file2.txt')); +assert.ok(!fs.existsSync('tmp/.hidden_file')); // doesn't copy dir contents +assert.ok(!fs.existsSync('tmp/ls')); // doesn't copy dir itself +assert.ok(!fs.existsSync('tmp/a')); // doesn't copy dir contents +assert.ok(!fs.existsSync('tmp/cp')); // doesn't copy dir itself +assert.ok(fs.existsSync('tmp/file1.txt')); +assert.ok(fs.existsSync('tmp/file2.txt')); if (process.platform !== 'win32') { // -R implies -P @@ -376,7 +376,7 @@ if (process.platform !== 'win32') { assert.equal(shell.error(), null); assert.ok(!result.stderr); assert.equal(result.code, 0); - assert.equal(common.existsSync('tmp/dest/z'), true); + assert.equal(fs.existsSync('tmp/dest/z'), true); } // -u flag won't overwrite newer files diff --git a/test/global.js b/test/global.js index 85ae1b135..e3c1b2769 100644 --- a/test/global.js +++ b/test/global.js @@ -1,9 +1,9 @@ /* globals cat, config, cp, env, error, exit, mkdir, rm */ require('../global'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); config.silent = true; @@ -24,11 +24,11 @@ assert.equal(result, 'test1\n'); // rm cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file1'), true); result = rm('tmp/file1'); assert.equal(error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file1'), false); +assert.equal(fs.existsSync('tmp/file1'), false); // String.prototype is modified for global require 'foo'.to('tmp/testfile.txt'); diff --git a/test/grep.js b/test/grep.js index a2f718cbc..fe377d1e4 100644 --- a/test/grep.js +++ b/test/grep.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -22,7 +22,7 @@ result = shell.grep(/asdf/g); // too few args assert.ok(shell.error()); assert.equal(result.code, 2); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.grep(/asdf/g, '/asdfasdf'); // no such file assert.ok(shell.error()); assert.equal(result.stderr, 'grep: no such file or directory: /asdfasdf'); @@ -30,8 +30,8 @@ assert.equal(result.code, 2); // if at least one file is missing, this should be an error shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(common.existsSync('asdfasdf'), false); // sanity check -assert.equal(common.existsSync('tmp/file1'), true); // sanity check +assert.equal(fs.existsSync('asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('tmp/file1'), true); // sanity check result = shell.grep(/asdf/g, 'tmp/file1', 'asdfasdf'); assert.ok(shell.error()); assert.equal(result.stderr, 'grep: no such file or directory: asdfasdf'); diff --git a/test/head.js b/test/head.js index 67bf96f9e..4692bdad2 100644 --- a/test/head.js +++ b/test/head.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -18,7 +18,7 @@ result = shell.head(); assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.head('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.equal(result.code, 1); diff --git a/test/ln.js b/test/ln.js index 5259e0159..b2d1ebc80 100644 --- a/test/ln.js +++ b/test/ln.js @@ -68,7 +68,7 @@ assert.equal(result.code, 1); // result = shell.ln('tmp/file1', 'tmp/linkfile1'); -assert(common.existsSync('tmp/linkfile1')); +assert(fs.existsSync('tmp/linkfile1')); assert.equal( fs.readFileSync('tmp/file1').toString(), fs.readFileSync('tmp/linkfile1').toString() @@ -83,7 +83,7 @@ assert.equal(result.code, 0); // With glob shell.rm('tmp/linkfile1'); result = shell.ln('tmp/fi*1', 'tmp/linkfile1'); -assert(common.existsSync('tmp/linkfile1')); +assert(fs.existsSync('tmp/linkfile1')); assert.equal( fs.readFileSync('tmp/file1').toString(), fs.readFileSync('tmp/linkfile1').toString() @@ -96,7 +96,7 @@ assert.equal( assert.equal(result.code, 0); skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'file2', 'tmp/linkfile2'), function () { - assert(common.existsSync('tmp/linkfile2')); + assert(fs.existsSync('tmp/linkfile2')); assert.equal( fs.readFileSync('tmp/file2').toString(), fs.readFileSync('tmp/linkfile2').toString() @@ -112,8 +112,8 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'file2', 'tmp/linkfile2'), function shell.mkdir('tmp/ln'); shell.touch('tmp/ln/hello'); result = shell.ln('-s', 'ln', 'tmp/dir1'); -assert(common.existsSync('tmp/ln/hello')); -assert(common.existsSync('tmp/dir1/hello')); +assert(fs.existsSync('tmp/ln/hello')); +assert(fs.existsSync('tmp/dir1/hello')); assert.equal(result.code, 0); // To current directory @@ -121,8 +121,8 @@ shell.cd('tmp'); result = shell.ln('-s', './', 'dest'); assert.equal(result.code, 0); shell.touch('testfile.txt'); -assert(common.existsSync('testfile.txt')); -assert(common.existsSync('dest/testfile.txt')); +assert(fs.existsSync('testfile.txt')); +assert(fs.existsSync('dest/testfile.txt')); shell.rm('-f', 'dest'); shell.mkdir('dir1'); shell.cd('dir1'); @@ -130,15 +130,15 @@ result = shell.ln('-s', './', '../dest'); assert.equal(result.code, 0); shell.touch('insideDir.txt'); shell.cd('..'); -assert(common.existsSync('testfile.txt')); -assert(common.existsSync('dest/testfile.txt')); -assert(common.existsSync('dir1/insideDir.txt')); -assert(!common.existsSync('dest/insideDir.txt')); +assert(fs.existsSync('testfile.txt')); +assert(fs.existsSync('dest/testfile.txt')); +assert(fs.existsSync('dir1/insideDir.txt')); +assert(!fs.existsSync('dest/insideDir.txt')); shell.cd('..'); result = shell.ln('-f', 'tmp/file1.js', 'tmp/file2.js'); assert.equal(result.code, 0); -assert(common.existsSync('tmp/file2.js')); +assert(fs.existsSync('tmp/file2.js')); assert.equal( fs.readFileSync('tmp/file1.js').toString(), fs.readFileSync('tmp/file2.js').toString() @@ -150,7 +150,7 @@ assert.equal( ); skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), function () { - assert(common.existsSync('tmp/file2.txt')); + assert(fs.existsSync('tmp/file2.txt')); assert.equal( fs.readFileSync('tmp/file1.txt').toString(), fs.readFileSync('tmp/file2.txt').toString() @@ -164,7 +164,7 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), fun // Abspath regression skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1', path.resolve('tmp/abspath')), function () { - assert(common.existsSync('tmp/abspath')); + assert(fs.existsSync('tmp/abspath')); assert.equal( fs.readFileSync('tmp/file1').toString(), fs.readFileSync('tmp/abspath').toString() @@ -182,7 +182,7 @@ skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), fun // Move the symlink first, as the reverse confuses `mv`. shell.mv('tmp/file2.txt', 'tmp/new/file2.txt'); shell.mv('tmp/file1.txt', 'tmp/new/file1.txt'); - assert(common.existsSync('tmp/new/file2.txt')); + assert(fs.existsSync('tmp/new/file2.txt')); assert.equal( fs.readFileSync('tmp/new/file1.txt').toString(), fs.readFileSync('tmp/new/file2.txt').toString() diff --git a/test/ls.js b/test/ls.js index 1e832b8f8..e74c4d056 100644 --- a/test/ls.js +++ b/test/ls.js @@ -1,5 +1,4 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); var fs = require('fs'); @@ -16,7 +15,7 @@ var k; // Invalids // -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check var result = shell.ls('/asdfasdf'); // no such file or dir assert.ok(shell.error()); assert.equal(result.code, 2); @@ -418,7 +417,7 @@ shell.rm('-r', 'foo'); assert.ok(!shell.error()); // Check stderr field -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.ls('resources/ls/file1', '/asdfasdf'); assert.ok(shell.error()); assert.equal('ls: no such file or directory: /asdfasdf', result.stderr); diff --git a/test/mkdir.js b/test/mkdir.js index e8507b1cb..71927d953 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -1,5 +1,4 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); var fs = require('fs'); @@ -34,13 +33,13 @@ assert.equal(result.code, 1); assert.equal(result.stderr, 'mkdir: path already exists: resources/badlink'); assert.equal(fs.lstatSync('resources/badlink').mtime.toString(), mtime); // didn't mess with file -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.mkdir('/asdfasdf/foobar'); // root path does not exist assert.ok(shell.error()); assert.equal(result.code, 1); assert.equal(result.stderr, 'mkdir: no such file or directory: /asdfasdf'); -assert.equal(common.existsSync('/asdfasdf'), false); -assert.equal(common.existsSync('/asdfasdf/foobar'), false); +assert.equal(fs.existsSync('/asdfasdf'), false); +assert.equal(fs.existsSync('/asdfasdf/foobar'), false); // Check for invalid permissions if (process.platform !== 'win32') { @@ -53,7 +52,7 @@ if (process.platform !== 'win32') { assert.equal(result.code, 1); assert.equal(result.stderr, 'mkdir: cannot create directory nowritedir/foo: Permission denied'); assert.ok(shell.error()); - assert.equal(common.existsSync(dirName + '/foo'), false); + assert.equal(fs.existsSync(dirName + '/foo'), false); shell.rm('-rf', dirName); // clean up } @@ -61,59 +60,59 @@ if (process.platform !== 'win32') { // Valids // -assert.equal(common.existsSync('tmp/t1'), false); +assert.equal(fs.existsSync('tmp/t1'), false); result = shell.mkdir('tmp/t1'); // simple dir assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/t1'), true); +assert.equal(fs.existsSync('tmp/t1'), true); -assert.equal(common.existsSync('tmp/t2'), false); -assert.equal(common.existsSync('tmp/t3'), false); +assert.equal(fs.existsSync('tmp/t2'), false); +assert.equal(fs.existsSync('tmp/t3'), false); result = shell.mkdir('tmp/t2', 'tmp/t3'); // multiple dirs assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/t2'), true); -assert.equal(common.existsSync('tmp/t3'), true); +assert.equal(fs.existsSync('tmp/t2'), true); +assert.equal(fs.existsSync('tmp/t3'), true); -assert.equal(common.existsSync('tmp/t1'), true); -assert.equal(common.existsSync('tmp/t4'), false); +assert.equal(fs.existsSync('tmp/t1'), true); +assert.equal(fs.existsSync('tmp/t4'), false); result = shell.mkdir('tmp/t1', 'tmp/t4'); // one dir exists, one doesn't assert.equal(numLines(shell.error()), 1); -assert.equal(common.existsSync('tmp/t1'), true); -assert.equal(common.existsSync('tmp/t4'), true); +assert.equal(fs.existsSync('tmp/t1'), true); +assert.equal(fs.existsSync('tmp/t4'), true); -assert.equal(common.existsSync('tmp/a'), false); +assert.equal(fs.existsSync('tmp/a'), false); result = shell.mkdir('-p', 'tmp/a/b/c'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/a/b/c'), true); +assert.equal(fs.existsSync('tmp/a/b/c'), true); shell.rm('-Rf', 'tmp/a'); // revert // multiple dirs result = shell.mkdir('-p', 'tmp/zzza', 'tmp/zzzb', 'tmp/zzzc'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/zzza'), true); -assert.equal(common.existsSync('tmp/zzzb'), true); -assert.equal(common.existsSync('tmp/zzzc'), true); +assert.equal(fs.existsSync('tmp/zzza'), true); +assert.equal(fs.existsSync('tmp/zzzb'), true); +assert.equal(fs.existsSync('tmp/zzzc'), true); // multiple dirs, array syntax result = shell.mkdir('-p', ['tmp/yyya', 'tmp/yyyb', 'tmp/yyyc']); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/yyya'), true); -assert.equal(common.existsSync('tmp/yyyb'), true); -assert.equal(common.existsSync('tmp/yyyc'), true); +assert.equal(fs.existsSync('tmp/yyya'), true); +assert.equal(fs.existsSync('tmp/yyyb'), true); +assert.equal(fs.existsSync('tmp/yyyc'), true); // globbed dir result = shell.mkdir('-p', 'tmp/mydir'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/mydir'), true); +assert.equal(fs.existsSync('tmp/mydir'), true); result = shell.mkdir('-p', 'tmp/m*ir'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/mydir'), true); -assert.equal(common.existsSync('tmp/m*ir'), false); // doesn't create literal name +assert.equal(fs.existsSync('tmp/mydir'), true); +assert.equal(fs.existsSync('tmp/m*ir'), false); // doesn't create literal name shell.exit(123); diff --git a/test/mv.js b/test/mv.js index 142517ebf..2bb62efef 100644 --- a/test/mv.js +++ b/test/mv.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); var numLines = require('./utils/utils').numLines; shell.config.silent = true; @@ -33,22 +33,22 @@ assert.equal(result.stderr, 'mv: missing and/or '); result = shell.mv('-Z', 'tmp/file1', 'tmp/file1'); // option not supported assert.ok(shell.error()); -assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file1'), true); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: option not recognized: Z'); result = shell.mv('asdfasdf', 'tmp'); // source does not exist assert.ok(shell.error()); assert.equal(numLines(shell.error()), 1); -assert.equal(common.existsSync('tmp/asdfasdf'), false); +assert.equal(fs.existsSync('tmp/asdfasdf'), false); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: no such file or directory: asdfasdf'); result = shell.mv('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist assert.ok(shell.error()); assert.equal(numLines(shell.error()), 2); -assert.equal(common.existsSync('tmp/asdfasdf1'), false); -assert.equal(common.existsSync('tmp/asdfasdf2'), false); +assert.equal(fs.existsSync('tmp/asdfasdf1'), false); +assert.equal(fs.existsSync('tmp/asdfasdf2'), false); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: no such file or directory: asdfasdf1\nmv: no such file or directory: asdfasdf2'); @@ -78,16 +78,16 @@ assert.equal(result.stderr, 'mv: dest file already exists: tmp/file2'); result = shell.mv('tmp/file1', 'tmp/file2', 'tmp/a_file'); // too many sources (exist, but dest is file) assert.ok(shell.error()); -assert.equal(common.existsSync('tmp/a_file'), false); +assert.equal(fs.existsSync('tmp/a_file'), false); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: dest is not a directory (too many sources)'); result = shell.mv('tmp/file*', 'tmp/file1'); // can't use wildcard when dest is file assert.ok(shell.error()); -assert.equal(common.existsSync('tmp/file1'), true); -assert.equal(common.existsSync('tmp/file2'), true); -assert.equal(common.existsSync('tmp/file1.js'), true); -assert.equal(common.existsSync('tmp/file2.js'), true); +assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file2'), true); +assert.equal(fs.existsSync('tmp/file1.js'), true); +assert.equal(fs.existsSync('tmp/file2.js'), true); assert.equal(result.code, 1); assert.equal(result.stderr, 'mv: dest is not a directory (too many sources)'); @@ -101,20 +101,20 @@ shell.cd('tmp'); shell.mkdir('tmp2'); result = shell.mv('*', 'tmp2'); // has to handle self (tmp2 --> tmp2) without throwing error assert.ok(shell.error()); // there's an error, but not fatal -assert.equal(common.existsSync('tmp2/file1'), true); // moved OK +assert.equal(fs.existsSync('tmp2/file1'), true); // moved OK assert.equal(result.code, 1); result = shell.mv('tmp2/*', '.'); // revert -assert.equal(common.existsSync('file1'), true); // moved OK +assert.equal(fs.existsSync('file1'), true); // moved OK assert.equal(result.code, 0); result = shell.mv('file1', 'file3'); // one source assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('file1'), false); -assert.equal(common.existsSync('file3'), true); +assert.equal(fs.existsSync('file1'), false); +assert.equal(fs.existsSync('file3'), true); result = shell.mv('file3', 'file1'); // revert assert.equal(shell.error(), null); -assert.equal(common.existsSync('file1'), true); +assert.equal(fs.existsSync('file1'), true); assert.equal(result.code, 0); // two sources @@ -123,14 +123,14 @@ shell.mkdir('-p', 't'); result = shell.mv('file1', 'file2', 't'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('file1'), false); -assert.equal(common.existsSync('file2'), false); -assert.equal(common.existsSync('t/file1'), true); -assert.equal(common.existsSync('t/file2'), true); +assert.equal(fs.existsSync('file1'), false); +assert.equal(fs.existsSync('file2'), false); +assert.equal(fs.existsSync('t/file1'), true); +assert.equal(fs.existsSync('t/file2'), true); result = shell.mv('t/*', '.'); // revert assert.equal(result.code, 0); -assert.equal(common.existsSync('file1'), true); -assert.equal(common.existsSync('file2'), true); +assert.equal(fs.existsSync('file1'), true); +assert.equal(fs.existsSync('file2'), true); // two sources, array style shell.rm('-rf', 't'); @@ -138,29 +138,29 @@ shell.mkdir('-p', 't'); result = shell.mv(['file1', 'file2'], 't'); // two sources assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('file1'), false); -assert.equal(common.existsSync('file2'), false); -assert.equal(common.existsSync('t/file1'), true); -assert.equal(common.existsSync('t/file2'), true); +assert.equal(fs.existsSync('file1'), false); +assert.equal(fs.existsSync('file2'), false); +assert.equal(fs.existsSync('t/file1'), true); +assert.equal(fs.existsSync('t/file2'), true); result = shell.mv('t/*', '.'); // revert -assert.equal(common.existsSync('file1'), true); -assert.equal(common.existsSync('file2'), true); +assert.equal(fs.existsSync('file1'), true); +assert.equal(fs.existsSync('file2'), true); result = shell.mv('file*.js', 't'); // wildcard assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('file1.js'), false); -assert.equal(common.existsSync('file2.js'), false); -assert.equal(common.existsSync('t/file1.js'), true); -assert.equal(common.existsSync('t/file2.js'), true); +assert.equal(fs.existsSync('file1.js'), false); +assert.equal(fs.existsSync('file2.js'), false); +assert.equal(fs.existsSync('t/file1.js'), true); +assert.equal(fs.existsSync('t/file2.js'), true); result = shell.mv('t/*', '.'); // revert -assert.equal(common.existsSync('file1.js'), true); -assert.equal(common.existsSync('file2.js'), true); +assert.equal(fs.existsSync('file1.js'), true); +assert.equal(fs.existsSync('file2.js'), true); result = shell.mv('-f', 'file1', 'file2'); // dest exists, but -f given assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('file1'), false); -assert.equal(common.existsSync('file2'), true); +assert.equal(fs.existsSync('file1'), false); +assert.equal(fs.existsSync('file2'), true); shell.exit(123); diff --git a/test/rm.js b/test/rm.js index 918e9169b..ab98a72fe 100644 --- a/test/rm.js +++ b/test/rm.js @@ -1,5 +1,4 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); var path = require('path'); @@ -35,7 +34,7 @@ assert.equal(result.stderr, 'rm: no paths given'); result = shell.rm('-@', 'resources/file1'); // invalid option assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(common.existsSync('resources/file1'), true); +assert.equal(fs.existsSync('resources/file1'), true); assert.equal(result.stderr, 'rm: option not recognized: @'); // @@ -69,61 +68,61 @@ assert.equal(result.code, 0); // simple rm shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(common.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file1'), true); result = shell.rm('tmp/file1'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file1'), false); +assert.equal(fs.existsSync('tmp/file1'), false); // recursive dir removal - small-caps '-r' shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(common.existsSync('tmp/a/b/c'), true); +assert.equal(fs.existsSync('tmp/a/b/c'), true); result = shell.rm('-rf', 'tmp/a'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/a'), false); +assert.equal(fs.existsSync('tmp/a'), false); // recursive dir removal - capital '-R' shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(common.existsSync('tmp/a/b/c'), true); +assert.equal(fs.existsSync('tmp/a/b/c'), true); result = shell.rm('-Rf', 'tmp/a'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/a'), false); +assert.equal(fs.existsSync('tmp/a'), false); // recursive dir removal - absolute path shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(common.existsSync('tmp/a/b/c'), true); +assert.equal(fs.existsSync('tmp/a/b/c'), true); result = shell.rm('-Rf', path.resolve('./tmp/a')); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/a'), false); +assert.equal(fs.existsSync('tmp/a'), false); // wildcard shell.cp('-f', 'resources/file*', 'tmp'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file1'), true); -assert.equal(common.existsSync('tmp/file2'), true); -assert.equal(common.existsSync('tmp/file1.js'), true); -assert.equal(common.existsSync('tmp/file2.js'), true); +assert.equal(fs.existsSync('tmp/file1'), true); +assert.equal(fs.existsSync('tmp/file2'), true); +assert.equal(fs.existsSync('tmp/file1.js'), true); +assert.equal(fs.existsSync('tmp/file2.js'), true); result = shell.rm('tmp/file*'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/file1'), false); -assert.equal(common.existsSync('tmp/file2'), false); -assert.equal(common.existsSync('tmp/file1.js'), false); -assert.equal(common.existsSync('tmp/file2.js'), false); +assert.equal(fs.existsSync('tmp/file1'), false); +assert.equal(fs.existsSync('tmp/file2'), false); +assert.equal(fs.existsSync('tmp/file1.js'), false); +assert.equal(fs.existsSync('tmp/file2.js'), false); // recursive dir removal shell.mkdir('-p', 'tmp/a/b/c'); shell.mkdir('-p', 'tmp/b'); shell.mkdir('-p', 'tmp/c'); shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(common.existsSync('tmp/a/b/c'), true); -assert.equal(common.existsSync('tmp/b'), true); -assert.equal(common.existsSync('tmp/c'), true); -assert.equal(common.existsSync('tmp/.hidden'), true); +assert.equal(fs.existsSync('tmp/a/b/c'), true); +assert.equal(fs.existsSync('tmp/b'), true); +assert.equal(fs.existsSync('tmp/c'), true); +assert.equal(fs.existsSync('tmp/.hidden'), true); result = shell.rm('-rf', 'tmp/*'); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -136,10 +135,10 @@ shell.mkdir('-p', 'tmp/a/b/c'); shell.mkdir('-p', 'tmp/b'); shell.mkdir('-p', 'tmp/c'); shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(common.existsSync('tmp/a/b/c'), true); -assert.equal(common.existsSync('tmp/b'), true); -assert.equal(common.existsSync('tmp/c'), true); -assert.equal(common.existsSync('tmp/.hidden'), true); +assert.equal(fs.existsSync('tmp/a/b/c'), true); +assert.equal(fs.existsSync('tmp/b'), true); +assert.equal(fs.existsSync('tmp/c'), true); +assert.equal(fs.existsSync('tmp/.hidden'), true); result = shell.rm('-rf', 'tmp/*', 'tmp/.*'); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -151,10 +150,10 @@ shell.mkdir('-p', 'tmp/a/b/c'); shell.mkdir('-p', 'tmp/b'); shell.mkdir('-p', 'tmp/c'); shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(common.existsSync('tmp/a/b/c'), true); -assert.equal(common.existsSync('tmp/b'), true); -assert.equal(common.existsSync('tmp/c'), true); -assert.equal(common.existsSync('tmp/.hidden'), true); +assert.equal(fs.existsSync('tmp/a/b/c'), true); +assert.equal(fs.existsSync('tmp/b'), true); +assert.equal(fs.existsSync('tmp/c'), true); +assert.equal(fs.existsSync('tmp/.hidden'), true); result = shell.rm('-rf', ['tmp/*', 'tmp/.*']); assert.equal(shell.error(), null); assert.equal(result.code, 0); @@ -166,7 +165,7 @@ shell.mkdir('-p', 'tmp/readonly'); shell.ShellString('asdf').to('tmp/readonly/file1'); fs.chmodSync('tmp/readonly/file1', '0444'); // -r--r--r-- result = shell.rm('tmp/readonly/file1'); -assert.equal(common.existsSync('tmp/readonly/file1'), true); // bash's rm always asks before removing read-only files +assert.equal(fs.existsSync('tmp/readonly/file1'), true); // bash's rm always asks before removing read-only files // here we just assume "no" // removal of a read-only file (forced) @@ -174,7 +173,7 @@ shell.mkdir('-p', 'tmp/readonly'); shell.ShellString('asdf').to('tmp/readonly/file2'); fs.chmodSync('tmp/readonly/file2', '0444'); // -r--r--r-- result = shell.rm('-f', 'tmp/readonly/file2'); -assert.equal(common.existsSync('tmp/readonly/file2'), false); +assert.equal(fs.existsSync('tmp/readonly/file2'), false); // removal of a tree containing read-only files (unforced) shell.mkdir('-p', 'tmp/tree2'); @@ -182,8 +181,8 @@ shell.ShellString('asdf').to('tmp/tree2/file1'); shell.ShellString('asdf').to('tmp/tree2/file2'); fs.chmodSync('tmp/tree2/file1', '0444'); // -r--r--r-- result = shell.rm('-r', 'tmp/tree2'); -assert.equal(common.existsSync('tmp/tree2/file1'), true); -assert.equal(common.existsSync('tmp/tree2/file2'), false); +assert.equal(fs.existsSync('tmp/tree2/file1'), true); +assert.equal(fs.existsSync('tmp/tree2/file2'), false); // removal of a tree containing read-only files (forced) shell.mkdir('-p', 'tmp/tree'); @@ -191,7 +190,7 @@ shell.ShellString('asdf').to('tmp/tree/file1'); shell.ShellString('asdf').to('tmp/tree/file2'); fs.chmodSync('tmp/tree/file1', '0444'); // -r--r--r-- result = shell.rm('-rf', 'tmp/tree'); -assert.equal(common.existsSync('tmp/tree'), false); +assert.equal(fs.existsSync('tmp/tree'), false); // removal of a sub-tree containing read-only and hidden files - rm('dir/*') shell.mkdir('-p', 'tmp/tree3'); @@ -217,7 +216,7 @@ fs.chmodSync('tmp/tree4/file', '0444'); // -r--r--r-- fs.chmodSync('tmp/tree4/subtree/file', '0444'); // -r--r--r-- fs.chmodSync('tmp/tree4/.hidden/file', '0444'); // -r--r--r-- result = shell.rm('-rf', 'tmp/tree4'); // erase dir contents -assert.equal(common.existsSync('tmp/tree4'), false); +assert.equal(fs.existsSync('tmp/tree4'), false); // remove symbolic link to a dir result = shell.rm('-rf', 'tmp'); @@ -226,8 +225,8 @@ shell.cp('-R', 'resources/rm', 'tmp'); result = shell.rm('-f', 'tmp/rm/link_to_a_dir'); assert.equal(shell.error(), null); assert.equal(result.code, 0); -assert.equal(common.existsSync('tmp/rm/link_to_a_dir'), false); -assert.equal(common.existsSync('tmp/rm/a_dir'), true); +assert.equal(fs.existsSync('tmp/rm/link_to_a_dir'), false); +assert.equal(fs.existsSync('tmp/rm/a_dir'), true); // remove broken symbolic link if (process.platform !== 'win32') { @@ -239,7 +238,7 @@ if (process.platform !== 'win32') { assert.equal(shell.error(), null); assert.equal(result.code, 0); assert.ok(!shell.test('-L', 'tmp/rm/fake.lnk')); - assert.equal(common.existsSync('tmp/rm/fake.lnk'), false); + assert.equal(fs.existsSync('tmp/rm/fake.lnk'), false); } shell.exit(123); diff --git a/test/sed.js b/test/sed.js index 1907519fe..2105dcc4d 100644 --- a/test/sed.js +++ b/test/sed.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -27,7 +27,7 @@ result = shell.sed(/asdf/g, 'nada'); // too few args assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(common.existsSync('asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('asdfasdf'), false); // sanity check result = shell.sed(/asdf/g, 'nada', 'asdfasdf'); // no such file assert.ok(shell.error()); assert.equal(result.code, 2); @@ -35,8 +35,8 @@ assert.equal(result.stderr, 'sed: no such file or directory: asdfasdf'); // if at least one file is missing, this should be an error shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(common.existsSync('asdfasdf'), false); // sanity check -assert.equal(common.existsSync('tmp/file1'), true); // sanity check +assert.equal(fs.existsSync('asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('tmp/file1'), true); // sanity check result = shell.sed(/asdf/g, 'nada', 'tmp/file1', 'asdfasdf'); assert.ok(shell.error()); assert.equal(result.code, 2); diff --git a/test/sort.js b/test/sort.js index 71a7ef88a..4e50fd405 100644 --- a/test/sort.js +++ b/test/sort.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -26,7 +26,7 @@ result = shell.sort(); assert.ok(shell.error()); assert.ok(result.code); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.sort('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.ok(result.code); diff --git a/test/tail.js b/test/tail.js index e8b496cec..1aa077e21 100644 --- a/test/tail.js +++ b/test/tail.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -18,7 +18,7 @@ result = shell.tail(); assert.ok(shell.error()); assert.equal(result.code, 1); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.tail('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.equal(result.code, 1); diff --git a/test/tempdir.js b/test/tempdir.js index e4a5905eb..beddec289 100644 --- a/test/tempdir.js +++ b/test/tempdir.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -14,6 +14,6 @@ shell.mkdir('tmp'); var tmp = shell.tempdir(); assert.equal(shell.error(), null); -assert.equal(common.existsSync(tmp), true); +assert.equal(fs.existsSync(tmp), true); shell.exit(123); diff --git a/test/to.js b/test/to.js index 178bb24d0..1b5b86805 100644 --- a/test/to.js +++ b/test/to.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -19,7 +19,7 @@ assert.ok(typeof str.to === 'undefined'); shell.ShellString('hello world').to(); assert.ok(shell.error()); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check shell.ShellString('hello world').to('/asdfasdf/file'); assert.ok(shell.error()); @@ -39,7 +39,7 @@ assert.equal(result, 'hello world'); // With a glob shell.ShellString('goodbye').to('tmp/t*1'); -assert.equal(common.existsSync('tmp/t*1'), false, 'globs are not interpreted literally'); +assert.equal(fs.existsSync('tmp/t*1'), false, 'globs are not interpreted literally'); result = shell.cat('tmp/to1'); assert.equal(shell.error(), null); assert.equal(result, 'goodbye'); diff --git a/test/toEnd.js b/test/toEnd.js index f30c6f9e2..a2936f613 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -19,17 +19,17 @@ assert.ok(typeof str.toEnd === 'undefined'); shell.ShellString('hello world').toEnd(); assert.ok(shell.error()); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check assert.ok(shell.error()); // // Valids // var result; -assert.equal(common.existsSync('tmp/toEnd1'), false); // Check file toEnd() creates does not already exist -assert.equal(common.existsSync('tmp/toEnd2'), false); +assert.equal(fs.existsSync('tmp/toEnd1'), false); // Check file toEnd() creates does not already exist +assert.equal(fs.existsSync('tmp/toEnd2'), false); shell.ShellString('hello ').toEnd('tmp/toEnd1'); -assert.equal(common.existsSync('tmp/toEnd1'), true); // Check that file was created +assert.equal(fs.existsSync('tmp/toEnd1'), true); // Check that file was created shell.ShellString('world').toEnd('tmp/toEnd1').toEnd('tmp/toEnd2'); // Write some more to the file result = shell.cat('tmp/toEnd1'); assert.equal(shell.error(), null); @@ -41,7 +41,7 @@ assert.equal(result, 'world'); // Check that the result is what we expect // With a glob shell.ShellString('good').to('tmp/toE*1'); shell.ShellString('bye').toEnd('tmp/toE*1'); -assert.equal(common.existsSync('tmp/toE*1'), false, 'globs are not interpreted literally'); +assert.equal(fs.existsSync('tmp/toE*1'), false, 'globs are not interpreted literally'); result = shell.cat('tmp/toEnd1'); assert.equal(shell.error(), null); assert.equal(result, 'goodbye'); diff --git a/test/touch.js b/test/touch.js index cbd7744df..3b8d5d919 100644 --- a/test/touch.js +++ b/test/touch.js @@ -1,5 +1,4 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); var fs = require('fs'); var crypto = require('crypto'); @@ -31,13 +30,13 @@ assert.equal(result.code, 0); // creates new files testFile = tmpFile(); result = shell.touch(testFile); -assert(common.existsSync(testFile)); +assert(fs.existsSync(testFile)); // does not create a file if told not to testFile = tmpFile(true); result = shell.touch('-c', testFile); assert.equal(result.code, 0); -assert.ok(!common.existsSync(testFile)); +assert.ok(!fs.existsSync(testFile)); // handles globs correctly result = shell.touch('tmp/file.txt'); @@ -101,8 +100,8 @@ testFile2 = tmpFile(true); shell.rm('-f', testFile, testFile2); result = shell.touch(testFile, testFile2); assert.equal(result.code, 0); -assert(common.existsSync(testFile)); -assert(common.existsSync(testFile2)); +assert(fs.existsSync(testFile)); +assert(fs.existsSync(testFile2)); // file array testFile = tmpFile(true); @@ -110,15 +109,15 @@ testFile2 = tmpFile(true); shell.rm('-f', testFile, testFile2); result = shell.touch([testFile, testFile2]); assert.equal(result.code, 0); -assert(common.existsSync(testFile)); -assert(common.existsSync(testFile2)); +assert(fs.existsSync(testFile)); +assert(fs.existsSync(testFile2)); // touching broken link creates a new file if (process.platform !== 'win32') { result = shell.touch('resources/badlink'); assert.equal(result.code, 0); assert.ok(!shell.error()); - assert.ok(common.existsSync('resources/not_existed_file')); + assert.ok(fs.existsSync('resources/not_existed_file')); shell.rm('resources/not_existed_file'); } diff --git a/test/uniq.js b/test/uniq.js index 17f3207b9..82a8d5672 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -18,7 +18,7 @@ result = shell.uniq(); assert.ok(shell.error()); assert.ok(result.code); -assert.equal(common.existsSync('/asdfasdf'), false); // sanity check +assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check result = shell.sort('/adsfasdf'); // file does not exist assert.ok(shell.error()); assert.ok(result.code); diff --git a/test/which.js b/test/which.js index 0367ad9d9..fdf96c2cc 100644 --- a/test/which.js +++ b/test/which.js @@ -1,7 +1,7 @@ var shell = require('..'); -var common = require('../src/common'); var assert = require('assert'); +var fs = require('fs'); shell.config.silent = true; @@ -27,7 +27,7 @@ var node = shell.which('node'); assert.equal(node.code, 0); assert.ok(!node.stderr); assert.ok(!shell.error()); -assert.ok(common.existsSync(node + '')); +assert.ok(fs.existsSync(node + '')); if (process.platform === 'win32') { // This should be equivalent on Windows From 4975b54a4fa716d800d32ccc6abf1a417474787e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 23 Oct 2016 23:17:42 -0700 Subject: [PATCH 033/338] feat: plugin.error() takes an options parameter (#535) This implements the following options: `continue`, `code`, `prefix`, & `silent`. Fixes #522, #523 --- src/common.js | 50 +++++++++++++++++++++++++++----------------------- src/cp.js | 4 ++-- src/exec.js | 2 +- src/grep.js | 2 +- src/head.js | 2 +- src/ln.js | 6 +++--- src/ls.js | 2 +- src/mkdir.js | 4 ++-- src/mv.js | 6 +++--- src/rm.js | 10 +++++----- src/sed.js | 2 +- src/tail.js | 2 +- src/to.js | 2 +- src/toEnd.js | 2 +- test/plugin.js | 22 ++++++++++++++++++++++ 15 files changed, 72 insertions(+), 46 deletions(-) diff --git a/src/common.js b/src/common.js index 472525c09..8211feff4 100644 --- a/src/common.js +++ b/src/common.js @@ -7,7 +7,6 @@ var fs = require('fs'); var glob = require('glob'); var shell = require('..'); -var DEFAULT_ERROR_CODE = 1; var shellMethods = Object.create(shell); // Module globals @@ -45,34 +44,39 @@ function log() { exports.log = log; // Shows error message. Throws if config.fatal is true -function error(msg, _code, _continue) { - if (typeof _code === 'boolean') { - _continue = _code; - _code = DEFAULT_ERROR_CODE; - } - if (typeof _code !== 'number') { - _code = DEFAULT_ERROR_CODE; - } +function error(msg, _code, options) { + // Validate input + if (typeof msg !== 'string') throw new Error('msg must be a string'); + + var DEFAULT_OPTIONS = { + continue: false, + code: 1, + prefix: state.currentCmd + ': ', + silent: false, + }; - if (state.errorCode === 0) { - state.errorCode = _code; + if (typeof _code === 'number' && typeof options === 'object') { + options.code = _code; + } else if (typeof _code === 'object') { // no 'code' + options = _code; + } else if (typeof _code === 'number') { // no 'options' + options = { code: _code }; + } else if (typeof _code !== 'number') { // only 'msg' + options = {}; } + options = objectAssign({}, DEFAULT_OPTIONS, options); - if (state.error === null) { - state.error = ''; - } - var logEntry = state.currentCmd + ': ' + msg; - if (state.error === '') { - state.error = logEntry; - } else { - state.error += '\n' + logEntry; - } + if (!state.errorCode) state.errorCode = options.code; - if (config.fatal) throw new Error(logEntry); + var logEntry = options.prefix + msg; + state.error = state.error ? state.error + '\n' : ''; + state.error += logEntry; - if (msg.length > 0) log(logEntry); + // Throw an error, or log the entry + if (config.fatal) throw new Error(logEntry); + if (msg.length > 0 && !options.silent) log(logEntry); - if (!_continue) { + if (!options.continue) { throw { msg: 'earlyExit', retValue: (new ShellString('', state.error, state.errorCode)) diff --git a/src/cp.js b/src/cp.js index 25e386c2d..487c4f717 100644 --- a/src/cp.js +++ b/src/cp.js @@ -230,14 +230,14 @@ function _cp(options, sources, dest) { sources.forEach(function (src) { if (!fs.existsSync(src)) { - common.error('no such file or directory: ' + src, true); + common.error('no such file or directory: ' + src, { continue: true }); return; // skip file } var srcStat = fs.statSync(src); if (!options.noFollowsymlink && srcStat.isDirectory()) { if (!options.recursive) { // Non-Recursive - common.error("omitting directory '" + src + "'", true); + common.error("omitting directory '" + src + "'", { continue: true }); } else { // Recursive // 'cp /a/source dest' should create 'source' in 'dest' diff --git a/src/exec.js b/src/exec.js index 5608f8d1f..f6875b1e5 100644 --- a/src/exec.js +++ b/src/exec.js @@ -157,7 +157,7 @@ function execSync(cmd, opts, pipe) { try { common.unlinkSync(codeFile); } catch (e) {} if (code !== 0) { - common.error('', code, true); + common.error('', code, { continue: true }); } var obj = common.ShellString(stdout, stderr, code); return obj; diff --git a/src/grep.js b/src/grep.js index e8eee5970..30842bcb8 100644 --- a/src/grep.js +++ b/src/grep.js @@ -42,7 +42,7 @@ function _grep(options, regex, files) { var grep = []; files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, 2, true); + common.error('no such file or directory: ' + file, 2, { continue: true }); return; } diff --git a/src/head.js b/src/head.js index 3dec07569..13d582977 100644 --- a/src/head.js +++ b/src/head.js @@ -73,7 +73,7 @@ function _head(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, true); + common.error('no such file or directory: ' + file, { continue: true }); return; } diff --git a/src/ln.js b/src/ln.js index 22c1d89b4..7393d9fcd 100644 --- a/src/ln.js +++ b/src/ln.js @@ -36,7 +36,7 @@ function _ln(options, source, dest) { if (fs.existsSync(dest)) { if (!options.force) { - common.error('Destination file exists', true); + common.error('Destination file exists', { continue: true }); } fs.unlinkSync(dest); @@ -47,7 +47,7 @@ function _ln(options, source, dest) { var linkType = isWindows ? 'file' : null; var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source); if (!fs.existsSync(resolvedSourcePath)) { - common.error('Source file does not exist', true); + common.error('Source file does not exist', { continue: true }); } else if (isWindows && fs.statSync(resolvedSourcePath).isDirectory()) { linkType = 'junction'; } @@ -59,7 +59,7 @@ function _ln(options, source, dest) { } } else { if (!fs.existsSync(source)) { - common.error('Source file does not exist', true); + common.error('Source file does not exist', { continue: true }); } try { fs.linkSync(source, dest); diff --git a/src/ls.js b/src/ls.js index b1cd30eeb..7f25056cd 100644 --- a/src/ls.js +++ b/src/ls.js @@ -74,7 +74,7 @@ function _ls(options, paths) { try { stat = fs.lstatSync(p); } catch (e) { - common.error('no such file or directory: ' + p, 2, true); + common.error('no such file or directory: ' + p, 2, { continue: true }); return; } diff --git a/src/mkdir.js b/src/mkdir.js index d75a86bcb..f211bc89b 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -59,7 +59,7 @@ function _mkdir(options, dirs) { try { fs.lstatSync(dir); if (!options.fullpath) { - common.error('path already exists: ' + dir, true); + common.error('path already exists: ' + dir, { continue: true }); } return; // skip dir } catch (e) { @@ -69,7 +69,7 @@ function _mkdir(options, dirs) { // Base dir does not exist, and no -p option given var baseDir = path.dirname(dir); if (!fs.existsSync(baseDir) && !options.fullpath) { - common.error('no such file or directory: ' + baseDir, true); + common.error('no such file or directory: ' + baseDir, { continue: true }); return; // skip dir } diff --git a/src/mv.js b/src/mv.js index 5dd32a0af..c09bbbc76 100644 --- a/src/mv.js +++ b/src/mv.js @@ -56,7 +56,7 @@ function _mv(options, sources, dest) { sources.forEach(function (src) { if (!fs.existsSync(src)) { - common.error('no such file or directory: ' + src, true); + common.error('no such file or directory: ' + src, { continue: true }); return; // skip file } @@ -70,12 +70,12 @@ function _mv(options, sources, dest) { } if (fs.existsSync(thisDest) && options.no_force) { - common.error('dest file already exists: ' + thisDest, true); + common.error('dest file already exists: ' + thisDest, { continue: true }); return; // skip file } if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { - common.error('cannot move to self: ' + src, true); + common.error('cannot move to self: ' + src, { continue: true }); return; // skip file } diff --git a/src/rm.js b/src/rm.js index 0e9d5e4cf..d6e484a08 100644 --- a/src/rm.js +++ b/src/rm.js @@ -34,7 +34,7 @@ function rmdirSyncRecursive(dir, force) { try { common.unlinkSync(file); } catch (e) { - common.error('could not remove file (code ' + e.code + '): ' + file, true); + common.error('could not remove file (code ' + e.code + '): ' + file, { continue: true }); } } } @@ -65,7 +65,7 @@ function rmdirSyncRecursive(dir, force) { } } } catch (e) { - common.error('could not remove directory (code ' + e.code + '): ' + dir, true); + common.error('could not remove directory (code ' + e.code + '): ' + dir, { continue: true }); } return result; @@ -115,7 +115,7 @@ function _rm(options, files) { } catch (e) { // Path does not exist, no force flag given if (!options.force) { - common.error('no such file or directory: ' + file, true); + common.error('no such file or directory: ' + file, { continue: true }); } return; // skip file } @@ -131,7 +131,7 @@ function _rm(options, files) { if (isWriteable(file)) { common.unlinkSync(file); } else { - common.error('permission denied: ' + file, true); + common.error('permission denied: ' + file, { continue: true }); } return; @@ -139,7 +139,7 @@ function _rm(options, files) { // Path is an existing directory, but no -r flag given if (stats.isDirectory() && !options.recursive) { - common.error('path is a directory', true); + common.error('path is a directory', { continue: true }); return; // skip path } diff --git a/src/sed.js b/src/sed.js index 19a51e715..590ba74ff 100644 --- a/src/sed.js +++ b/src/sed.js @@ -55,7 +55,7 @@ function _sed(options, regex, replacement, files) { var sed = []; files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, 2, true); + common.error('no such file or directory: ' + file, 2, { continue: true }); return; } diff --git a/src/tail.js b/src/tail.js index bb4aee2fc..7ece654b1 100644 --- a/src/tail.js +++ b/src/tail.js @@ -47,7 +47,7 @@ function _tail(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, true); + common.error('no such file or directory: ' + file, { continue: true }); return; } diff --git a/src/to.js b/src/to.js index 31e84a60f..99f194e68 100644 --- a/src/to.js +++ b/src/to.js @@ -30,7 +30,7 @@ function _to(options, file) { fs.writeFileSync(file, this.stdout || this.toString(), 'utf8'); return this; } catch (e) { - common.error('could not write to file (code ' + e.code + '): ' + file, true); + common.error('could not write to file (code ' + e.code + '): ' + file, { continue: true }); } } module.exports = _to; diff --git a/src/toEnd.js b/src/toEnd.js index 5d58f1d10..cf91c9401 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -29,7 +29,7 @@ function _toEnd(options, file) { fs.appendFileSync(file, this.stdout || this.toString(), 'utf8'); return this; } catch (e) { - common.error('could not append to file (code ' + e.code + '): ' + file, true); + common.error('could not append to file (code ' + e.code + '): ' + file, { continue: true }); } } module.exports = _toEnd; diff --git a/test/plugin.js b/test/plugin.js index 9a1591c85..681f1f6aa 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -19,6 +19,14 @@ function fooImplementation(options, arg) { if (arg === 'exitWithCode5') { plugin.error('Exited with code 5', 5); + } else if (arg === 'changePrefix') { + plugin.error('prefix was changed', { + prefix: 'prefix: ', + }); + } else if (arg === 'continue') { + plugin.error('Error, but continuing', { + continue: true, + }); } if (options.flag) { @@ -96,6 +104,20 @@ assert.equal(ret.stdout, ''); assert.equal(ret.stderr, 'foo: Exited with code 5'); assert.equal(shell.error(), 'foo: Exited with code 5'); +// Plugins can change the prefix +ret = shell.foo('changePrefix'); +assert.equal(ret.code, 1); +assert.equal(ret.stdout, ''); +assert.equal(ret.stderr, 'prefix: prefix was changed'); +assert.equal(shell.error(), 'prefix: prefix was changed'); + +// Plugins can continue from errors +ret = shell.foo('continue'); +assert.equal(ret.code, 1); +assert.equal(ret.stdout, 'hello world'); +assert.equal(ret.stderr, 'foo: Error, but continuing'); +assert.equal(shell.error(), 'foo: Error, but continuing'); + // Cannot overwrite an existing command by default var oldCat = shell.cat; assert.throws(function () { From 280c7fc7bbed2f307f32b52c45954454bc034017 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 26 Oct 2016 22:41:07 -0700 Subject: [PATCH 034/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9d490e65..e37880fb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Change Log +## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) + +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.4...HEAD) + +**Closed issues:** + +- Project objectives: there is some higher goal to achieve? [\#533](https://github.com/shelljs/shelljs/issues/533) +- fs.existsSync is un-deprecated [\#531](https://github.com/shelljs/shelljs/issues/531) +- Inadvertent breaking change to shell.test\(\) [\#529](https://github.com/shelljs/shelljs/issues/529) +- Add -u flag support for cp [\#526](https://github.com/shelljs/shelljs/issues/526) +- API request: allow `plugin.error\(\)` to take an options parameter [\#522](https://github.com/shelljs/shelljs/issues/522) +- FS Real Path error thrown when requiring shelljs [\#521](https://github.com/shelljs/shelljs/issues/521) +- Question: passing code via pipe? [\#520](https://github.com/shelljs/shelljs/issues/520) +- The performance in `cp` is different between `0.6.0` and `0.7.4` [\#517](https://github.com/shelljs/shelljs/issues/517) +- ShellJS in Electron package don't find ffmpeg anymore [\#516](https://github.com/shelljs/shelljs/issues/516) +- Exec issues with string option introduced in 0.7.4 [\#515](https://github.com/shelljs/shelljs/issues/515) +- \[ Feature \] SSH command [\#435](https://github.com/shelljs/shelljs/issues/435) +- Synchronous exec stalls permenantly when there is an error/w the shell [\#7](https://github.com/shelljs/shelljs/issues/7) + +**Merged pull requests:** + +- feat: plugin.error\(\) takes an options parameter [\#535](https://github.com/shelljs/shelljs/pull/535) ([nfischer](https://github.com/nfischer)) +- Revert "refactor: replace fs.existsSync" fixes\(\#531\) [\#532](https://github.com/shelljs/shelljs/pull/532) ([gyandeeps](https://github.com/gyandeeps)) +- Fix: Remove default glob from shell.test \(fixes \#529\) [\#530](https://github.com/shelljs/shelljs/pull/530) ([gyandeeps](https://github.com/gyandeeps)) +- feat: cp -u option [\#527](https://github.com/shelljs/shelljs/pull/527) ([nfischer](https://github.com/nfischer)) +- chore: add downloads per month on README [\#513](https://github.com/shelljs/shelljs/pull/513) ([nfischer](https://github.com/nfischer)) + ## [v0.7.4](https://github.com/shelljs/shelljs/tree/v0.7.4) (2016-08-26) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.3...v0.7.4) @@ -219,6 +246,7 @@ - why not support set 'cwd' when invoke execAsync ? [\#250](https://github.com/shelljs/shelljs/issues/250) - Not possible to check the failure of cd? [\#247](https://github.com/shelljs/shelljs/issues/247) - By default shelljs runs command in root [\#246](https://github.com/shelljs/shelljs/issues/246) +- /usr/bin/env: node: No such file or directory [\#243](https://github.com/shelljs/shelljs/issues/243) - "Which" command not working properly on Windows Platform. [\#238](https://github.com/shelljs/shelljs/issues/238) - Arguments [\#237](https://github.com/shelljs/shelljs/issues/237) - sed\(\) should accept multiple file arguments [\#231](https://github.com/shelljs/shelljs/issues/231) From 1a15022f2747d322d771dd7ae0c00840e469a52a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 26 Oct 2016 22:50:10 -0700 Subject: [PATCH 035/338] 0.7.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3187f16d..f4d403730 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.4", + "version": "0.7.5", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 1dbca24444189f68f6707dbb5fd49321349214d9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 28 Oct 2016 03:36:04 -0700 Subject: [PATCH 036/338] chore: add Node v7 for CI (#539) --- .travis.yml | 1 + README.md | 2 +- appveyor.yml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 811b09cdc..258ae14b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,7 @@ env: - NODE_VERSION="4" - NODE_VERSION="5" - NODE_VERSION="6" + - NODE_VERSION="7" matrix: allow_failures: diff --git a/README.md b/README.md index f18c41c23..3faa542a9 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Node.js API. You can use it to eliminate your shell script's dependency on Unix its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! -ShellJS supports node `v0.11`, `v0.12`, `v4`, `v5`, `v6`, and all releases of iojs. +ShellJS is proudly tested on every node release since `v0.11`! The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battled-tested in projects like: diff --git a/appveyor.yml b/appveyor.yml index 4ca277e03..bbde9e705 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,6 @@ environment: matrix: + - nodejs_version: '7' - nodejs_version: '6' - nodejs_version: '5' - nodejs_version: '4' From 459d54b1da445619cd24d84e35e52ec9bc28f12a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 1 Nov 2016 00:36:07 -0700 Subject: [PATCH 037/338] chore: remove v0.10 from Travis CI (#540) This version of Node was already unsupported as of ShellJS v0.7 --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 258ae14b5..49666f084 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: c++ sudo: false env: - - NODE_VERSION="0.10" - NODE_VERSION="0.11" - NODE_VERSION="0.12" - NODE_VERSION="iojs-v1" @@ -12,10 +11,6 @@ env: - NODE_VERSION="6" - NODE_VERSION="7" -matrix: - allow_failures: - - NODE_VERSION="0.10" - # keep this blank to make sure there are no before_install steps before_install: From 9bc498e51257c8f8ff2d1a551c2800ad9204e8da Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 1 Nov 2016 21:38:00 -0700 Subject: [PATCH 038/338] Fix lint warning (#543) * Fix lint warning * Add a TODO to refactor loop --- src/rm.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rm.js b/src/rm.js index d6e484a08..c039a3b5f 100644 --- a/src/rm.js +++ b/src/rm.js @@ -47,7 +47,9 @@ function rmdirSyncRecursive(dir, force) { try { // Retry on windows, sometimes it takes a little time before all the files in the directory are gone var start = Date.now(); - while (true) { + + // TODO: replace this with a finite loop + for (;;) { try { result = fs.rmdirSync(dir); if (fs.existsSync(dir)) throw { code: 'EAGAIN' }; From 3bc0852702f45b7f1bddce43805d41c1f4973533 Mon Sep 17 00:00:00 2001 From: Nathan Phillip Brink Date: Wed, 9 Nov 2016 04:51:06 +0000 Subject: [PATCH 039/338] Get pipe tests running on Windows. (#550) * Get pipe tests running on Windows. I used the FIND command which ships with Windows as something to pass data through. The test checks that a POSIX-like find(1) exists and skips the tests if this condition is true because Windows-provided FIND is incompatible with find(1). * Remove obvious comments. Requested by @nfischer. I removed both the unix-specific and Windows specific comments because I figure they both fall under being too obvious based on being in the process.platform conditional. * Make FIND usage cleaner and document it. * Use shx grep to make pipe tests portable. Discussed in #550. To test piping and its interaction with real processes, a shellout is necessary. But on Windows, you cannot rely on utilities like grep(1) being around. Using shx, we can write portable code. Otherwise, the tests have to be conditional on the platform and be way more complicated. --- package.json | 1 + test/pipe.js | 39 ++++++++++----------------------------- 2 files changed, 11 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index f4d403730..d221c52fa 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "coffee-script": "^1.10.0", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.2.0", + "shx": "^0.2.0", "travis-check-changes": "^0.2.0" }, "optionalDependencies": {}, diff --git a/test/pipe.js b/test/pipe.js index 41045732a..9a0560e1b 100644 --- a/test/pipe.js +++ b/test/pipe.js @@ -49,35 +49,16 @@ result = shell.sort('resources/uniq/pipe').uniq('-c').sort('-n'); assert.equal(shell.error(), null); assert.equal(result.toString(), shell.cat('resources/uniq/pipeSorted').toString()); -// Synchronous exec -// TODO: add windows tests -if (process.platform !== 'win32') { - // unix-specific - if (shell.which('grep').stdout) { - result = shell.cat('resources/grep/file').exec("grep 'alpha*beta'"); - assert.equal(shell.error(), null); - assert.equal(result, 'alphaaaaaaabeta\nalphbeta\n'); - } else { - console.error('Warning: Cannot verify piped exec'); - } -} else { - console.error('Warning: Cannot verify piped exec'); -} +// Synchronous exec. To support Windows, the arguments must be passed +// using double quotes because node, following win32 convention, +// passes single quotes through to process.argv verbatim. +result = shell.cat('resources/grep/file').exec('shx grep "alpha*beta"'); +assert.ok(!shell.error()); +assert.equal(result, 'alphaaaaaaabeta\nalphbeta\n'); // Async exec -// TODO: add windows tests -if (process.platform !== 'win32') { - // unix-specific - if (shell.which('grep').stdout) { - shell.cat('resources/grep/file').exec("grep 'alpha*beta'", function (code, stdout) { - assert.equal(code, 0); - assert.equal(stdout, 'alphaaaaaaabeta\nalphbeta\n'); - shell.exit(123); - }); - } else { - console.error('Warning: Cannot verify piped exec'); - } -} else { - console.error('Warning: Cannot verify piped exec'); +shell.cat('resources/grep/file').exec('shx grep "alpha*beta"', function (code, stdout) { + assert.equal(code, 0); + assert.equal(stdout, 'alphaaaaaaabeta\nalphbeta\n'); shell.exit(123); -} +}); From 7a82946a8dd16c8c9c522dbb9144b047d46ae0b6 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 10 Nov 2016 00:18:04 -0800 Subject: [PATCH 040/338] fix: maxdepth doesn't limit total number of copies (#549) * fix: maxdepth doesn't limit total number of copies Prevent maxdepth from limiting the total number of copies, only allow it to limit the maximum depth Fixes #547 * refactor: make `depth` be its own argument --- src/cp.js | 20 +++++++------------- test/cp.js | 13 +++++++++++++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/cp.js b/src/cp.js index 487c4f717..111e031c9 100644 --- a/src/cp.js +++ b/src/cp.js @@ -84,18 +84,12 @@ function copyFileSync(srcFile, destFile, options) { // // Licensed under the MIT License // http://www.opensource.org/licenses/mit-license.php -function cpdirSyncRecursive(sourceDir, destDir, opts) { +function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { if (!opts) opts = {}; - /* Ensure there is not a run away recursive copy. */ - if (typeof opts.depth === 'undefined') { - opts.depth = 0; - } - if (opts.depth >= common.config.maxdepth) { - // Max depth has been reached, end copy. - return; - } - opts.depth++; + // Ensure there is not a run away recursive copy + if (currentDepth >= common.config.maxdepth) return; + currentDepth++; // Create the directory where all our junk is moving to; read the mode of the // source directory and mirror it @@ -126,7 +120,7 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) { } if (srcFileStat.isDirectory()) { /* recursion this thing right on back. */ - cpdirSyncRecursive(srcFile, destFile, opts); + cpdirSyncRecursive(srcFile, destFile, currentDepth, opts); } else if (srcFileStat.isSymbolicLink() && !opts.followsymlink) { symlinkFull = fs.readlinkSync(srcFile); try { @@ -139,7 +133,7 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) { } else if (srcFileStat.isSymbolicLink() && opts.followsymlink) { srcFileStat = fs.statSync(srcFile); if (srcFileStat.isDirectory()) { - cpdirSyncRecursive(srcFile, destFile, opts); + cpdirSyncRecursive(srcFile, destFile, currentDepth, opts); } else { copyFileSync(srcFile, destFile, opts); } @@ -247,7 +241,7 @@ function _cp(options, sources, dest) { try { fs.statSync(path.dirname(dest)); - cpdirSyncRecursive(src, newDest, { no_force: options.no_force, followsymlink: options.followsymlink }); + cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink }); } catch (e) { common.error("cannot create directory '" + dest + "': No such file or directory"); } diff --git a/test/cp.js b/test/cp.js index c54c3d24d..9adf3895d 100644 --- a/test/cp.js +++ b/test/cp.js @@ -451,6 +451,19 @@ shell.rm('-rf', 'tmp/*'); shell.cp('-LPR', 'resources/cp/links/sym.lnk', 'tmp'); assert.ok(!fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); +// Make sure max depth doesn't limit shallow directory structures +shell.rm('-rf', 'tmp/'); +shell.mkdir('tmp/'); +var oldMaxDepth = shell.config.maxdepth; +shell.config.maxdepth = 3; +shell.mkdir('tmp/foo'); +for (var k = 0; k < 5; k++) { + shell.mkdir('tmp/foo/tmp' + k); +} +shell.cp('-r', 'tmp/foo', 'tmp/bar'); +assert.equal(shell.ls('tmp/foo').stdout, shell.ls('tmp/bar').stdout); +shell.config.maxdepth = oldMaxDepth; + // Test max depth. shell.rm('-rf', 'tmp/'); shell.mkdir('tmp/'); From c6e4c40b5a56f631e00e3e137fe2e32bc7ee5e78 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Thu, 10 Nov 2016 00:36:47 -0800 Subject: [PATCH 041/338] Add Brandon Freitag to maintainers/contributors (#553) --- MAINTAINERS | 3 +-- package.json | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 3f9476150..f6e5d47ae 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1,3 +1,2 @@ -Ari Porad (@ariporad) Nate Fischer (@nfischer) -Artur Adib (@arturadib) +Brandon Freitag (@freitagbr) diff --git a/package.json b/package.json index d221c52fa..14dedcc05 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "synchronous" ], "contributors": [ - "Ari Porad (http://ariporad.com/)", - "Nate Fischer (https://github.com/nfischer)" + "Nate Fischer (https://github.com/nfischer)", + "Brandon Freitag (https://github.com/freitagbr)" ], "repository": { "type": "git", From 4a1bce8815752b4f70fdae5494c467c18556c8d9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 16 Nov 2016 21:51:08 -0800 Subject: [PATCH 042/338] fix: handle code-less errors more carefully in exec (#554) If an error exists, but has no error code, it defaults to 1 (a common code for most Unix commands). Tests have been omitted since this is an edge case that is difficult to reproduce. Fixes #536 --- src/exec.js | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/exec.js b/src/exec.js index f6875b1e5..37ee59374 100644 --- a/src/exec.js +++ b/src/exec.js @@ -77,14 +77,21 @@ function execSync(cmd, opts, pipe) { "var child = require('child_process')", " , fs = require('fs');", 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', - ' fs.writeFileSync(' + JSON.stringify(codeFile) + ", err ? err.code.toString() : '0');", + ' var fname = ' + JSON.stringify(codeFile) + ';', + ' if (!err) {', + ' fs.writeFileSync(fname, "0");', + ' } else if (err.code === undefined) {', + ' fs.writeFileSync(fname, "1");', + ' } else {', + ' fs.writeFileSync(fname, err.code.toString());', + ' }', '});', 'var stdoutStream = fs.createWriteStream(' + JSON.stringify(stdoutFile) + ');', 'var stderrStream = fs.createWriteStream(' + JSON.stringify(stderrFile) + ');', 'childProcess.stdout.pipe(stdoutStream, {end: false});', 'childProcess.stderr.pipe(stderrStream, {end: false});', 'childProcess.stdout.pipe(process.stdout);', - 'childProcess.stderr.pipe(process.stderr);' + 'childProcess.stderr.pipe(process.stderr);', ].join('\n') + (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n') + [ @@ -92,7 +99,7 @@ function execSync(cmd, opts, pipe) { 'function tryClosingStdout(){ if(stdoutEnded){ stdoutStream.end(); } }', 'function tryClosingStderr(){ if(stderrEnded){ stderrStream.end(); } }', "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosingStdout(); });", - "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosingStderr(); });" + "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosingStderr(); });", ].join('\n'); fs.writeFileSync(scriptFile, script); @@ -121,8 +128,15 @@ function execSync(cmd, opts, pipe) { "var child = require('child_process')", " , fs = require('fs');", 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', - ' fs.writeFileSync(' + JSON.stringify(codeFile) + ", err ? err.code.toString() : '0');", - '});' + ' var fname = ' + JSON.stringify(codeFile) + ';', + ' if (!err) {', + ' fs.writeFileSync(fname, "0");', + ' } else if (err.code === undefined) {', + ' fs.writeFileSync(fname, "1");', + ' } else {', + ' fs.writeFileSync(fname, err.code.toString());', + ' }', + '});', ].join('\n') + (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n'); @@ -177,7 +191,14 @@ function execAsync(cmd, opts, pipe, callback) { var c = child.exec(cmd, opts, function (err) { if (callback) { - callback(err ? err.code : 0, stdout, stderr); + if (!err) { + callback(0, stdout, stderr); + } else if (err.code === undefined) { + // See issue #536 + callback(1, stdout, stderr); + } else { + callback(err.code, stdout, stderr); + } } }); From 12c103fc4357609fe4f520c511072ea5bfe044a6 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Thu, 17 Nov 2016 21:37:42 -0800 Subject: [PATCH 043/338] Update sed documentation regarding capture groups (#558) * Update sed documentation regarding capture groups * Remove unix sed example for brevity * Regen README --- README.md | 9 +++++++++ src/sed.js | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/README.md b/README.md index 3faa542a9..dd811e359 100644 --- a/README.md +++ b/README.md @@ -393,6 +393,15 @@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); Reads an input string from `files` and performs a JavaScript `replace()` on the input using the given search regex and replacement string or function. Returns the new string after replacement. +Note: + +Like unix `sed`, ShellJS `sed` supports capture groups. Capture groups are specified +using the `$n` syntax: + +```javascript +sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); +``` + ### sort([options,] file [, file ...]) ### sort([options,] file_array) diff --git a/src/sed.js b/src/sed.js index 590ba74ff..dfdc0a747 100644 --- a/src/sed.js +++ b/src/sed.js @@ -25,6 +25,15 @@ common.register('sed', _sed, { //@ //@ Reads an input string from `files` and performs a JavaScript `replace()` on the input //@ using the given search regex and replacement string or function. Returns the new string after replacement. +//@ +//@ Note: +//@ +//@ Like unix `sed`, ShellJS `sed` supports capture groups. Capture groups are specified +//@ using the `$n` syntax: +//@ +//@ ```javascript +//@ sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); +//@ ``` function _sed(options, regex, replacement, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); From 81e2803c453ee32f5f94b106976a637d8258fd52 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 18 Nov 2016 19:50:36 -0800 Subject: [PATCH 044/338] test: set up ava and move cd.js (#561) * test: set up ava and move cd.js Set up ava as the new test framework. Migrate the tests for the cd command to use the ava framework. * refactor: reorder imports, remove useless dep --- .eslintignore | 1 + ava-test/.eslintrc.json | 26 +++++ ava-test/cd.js | 105 ++++++++++++++++++ ava-test/resources/a.txt | 11 ++ ava-test/resources/badlink | 1 + ava-test/resources/cat/file1 | 1 + ava-test/resources/cat/file2 | 1 + ava-test/resources/chmod/a/b/c/.gitignore | 0 ava-test/resources/chmod/b/a/b/.gitignore | 0 ava-test/resources/chmod/c/a/b/.gitignore | 0 ava-test/resources/chmod/file1 | 2 + ava-test/resources/chmod/xdir/deep/file | 1 + ava-test/resources/chmod/xdir/file | 1 + ava-test/resources/cp-mode-bits/executable | 1 + ava-test/resources/cp/a | 1 + ava-test/resources/cp/b | 1 + ava-test/resources/cp/dir_a/z | 1 + .../resources/cp/dir_b/dir_b_a/dir_b_a_a/z | 1 + ava-test/resources/cp/fakeLinks/file.txt | 1 + ava-test/resources/cp/fakeLinks/sym.lnk | 1 + ava-test/resources/cp/links/file.txt | 1 + ava-test/resources/cp/links/sym.lnk | 1 + ava-test/resources/cp/symFolder | 1 + ava-test/resources/exec/slow.js | 4 + ava-test/resources/external/node_script.js | 2 + ava-test/resources/file1 | 1 + ava-test/resources/file1.js | 1 + ava-test/resources/file1.txt | 1 + ava-test/resources/file2 | 1 + ava-test/resources/file2.js | 1 + ava-test/resources/file2.txt | 1 + ava-test/resources/find/.hidden | 1 + ava-test/resources/find/a | 1 + ava-test/resources/find/b | 1 + ava-test/resources/find/broken_link | 1 + ava-test/resources/find/dir1/a_dir1 | 1 + ava-test/resources/find/dir1/dir11/a_dir11 | 1 + ava-test/resources/find/dir2/a_dir1 | 1 + ava-test/resources/grep/file | 5 + ava-test/resources/head/file1.txt | 50 +++++++++ ava-test/resources/head/file2.txt | 50 +++++++++ ava-test/resources/head/shortfile1 | 1 + ava-test/resources/head/shortfile2 | 1 + ava-test/resources/issue44/main.js | 1 + ava-test/resources/link | 1 + ava-test/resources/ls/.hidden_dir/nada | 1 + ava-test/resources/ls/.hidden_file | 1 + ava-test/resources/ls/a_dir/.hidden_dir/nada | 1 + ava-test/resources/ls/a_dir/b_dir/z | 1 + ava-test/resources/ls/a_dir/nada | 1 + ava-test/resources/ls/file1 | 1 + ava-test/resources/ls/file1.js | 1 + ava-test/resources/ls/file2 | 1 + ava-test/resources/ls/file2.js | 1 + ...ilename(with)[chars$]^that.must+be-escaped | 1 + ava-test/resources/pushd/a/dummy | 1 + ava-test/resources/pushd/b/c/dummy | 1 + ava-test/resources/rm/a_dir/a_file | 1 + ava-test/resources/rm/fake.lnk | 1 + ava-test/resources/rm/link_to_a_dir | 1 + ava-test/resources/shjs/a-file.js | 2 + ava-test/resources/shjs/coffeescript.coffee | 2 + ava-test/resources/shjs/exit-0.js | 1 + ava-test/resources/shjs/exit-codes.js | 1 + ava-test/resources/shjs/stdout-stderr.js | 2 + ava-test/resources/sort/file1 | 12 ++ ava-test/resources/sort/file2 | 12 ++ ava-test/resources/sort/sorted | 12 ++ ava-test/resources/sort/sortedDashN | 12 ++ ava-test/resources/uniq/file1 | 4 + ava-test/resources/uniq/file1c | 3 + ava-test/resources/uniq/file1d | 1 + ava-test/resources/uniq/file1t | 3 + ava-test/resources/uniq/file1u | 3 + ava-test/resources/uniq/file2 | 4 + ava-test/resources/uniq/file2u | 3 + ava-test/resources/uniq/file3 | 3 + ava-test/resources/uniq/pipe | 50 +++++++++ ava-test/resources/uniq/pipeSorted | 3 + ava-test/utils/utils.js | 36 ++++++ package.json | 5 +- test/cd.js | 92 --------------- 82 files changed, 475 insertions(+), 94 deletions(-) create mode 100644 ava-test/.eslintrc.json create mode 100644 ava-test/cd.js create mode 100644 ava-test/resources/a.txt create mode 120000 ava-test/resources/badlink create mode 100644 ava-test/resources/cat/file1 create mode 100644 ava-test/resources/cat/file2 create mode 100644 ava-test/resources/chmod/a/b/c/.gitignore create mode 100755 ava-test/resources/chmod/b/a/b/.gitignore create mode 100644 ava-test/resources/chmod/c/a/b/.gitignore create mode 100644 ava-test/resources/chmod/file1 create mode 100644 ava-test/resources/chmod/xdir/deep/file create mode 100644 ava-test/resources/chmod/xdir/file create mode 100755 ava-test/resources/cp-mode-bits/executable create mode 100644 ava-test/resources/cp/a create mode 100644 ava-test/resources/cp/b create mode 100644 ava-test/resources/cp/dir_a/z create mode 100644 ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z create mode 100644 ava-test/resources/cp/fakeLinks/file.txt create mode 100644 ava-test/resources/cp/fakeLinks/sym.lnk create mode 100644 ava-test/resources/cp/links/file.txt create mode 120000 ava-test/resources/cp/links/sym.lnk create mode 120000 ava-test/resources/cp/symFolder create mode 100644 ava-test/resources/exec/slow.js create mode 100755 ava-test/resources/external/node_script.js create mode 100644 ava-test/resources/file1 create mode 100644 ava-test/resources/file1.js create mode 100644 ava-test/resources/file1.txt create mode 100644 ava-test/resources/file2 create mode 100644 ava-test/resources/file2.js create mode 100644 ava-test/resources/file2.txt create mode 100644 ava-test/resources/find/.hidden create mode 100644 ava-test/resources/find/a create mode 100644 ava-test/resources/find/b create mode 120000 ava-test/resources/find/broken_link create mode 100644 ava-test/resources/find/dir1/a_dir1 create mode 100644 ava-test/resources/find/dir1/dir11/a_dir11 create mode 100644 ava-test/resources/find/dir2/a_dir1 create mode 100644 ava-test/resources/grep/file create mode 100644 ava-test/resources/head/file1.txt create mode 100644 ava-test/resources/head/file2.txt create mode 100644 ava-test/resources/head/shortfile1 create mode 100644 ava-test/resources/head/shortfile2 create mode 100644 ava-test/resources/issue44/main.js create mode 120000 ava-test/resources/link create mode 100644 ava-test/resources/ls/.hidden_dir/nada create mode 100644 ava-test/resources/ls/.hidden_file create mode 100644 ava-test/resources/ls/a_dir/.hidden_dir/nada create mode 100644 ava-test/resources/ls/a_dir/b_dir/z create mode 100644 ava-test/resources/ls/a_dir/nada create mode 100644 ava-test/resources/ls/file1 create mode 100644 ava-test/resources/ls/file1.js create mode 100644 ava-test/resources/ls/file2 create mode 100644 ava-test/resources/ls/file2.js create mode 100644 ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped create mode 100644 ava-test/resources/pushd/a/dummy create mode 100644 ava-test/resources/pushd/b/c/dummy create mode 100644 ava-test/resources/rm/a_dir/a_file create mode 120000 ava-test/resources/rm/fake.lnk create mode 120000 ava-test/resources/rm/link_to_a_dir create mode 100644 ava-test/resources/shjs/a-file.js create mode 100644 ava-test/resources/shjs/coffeescript.coffee create mode 100644 ava-test/resources/shjs/exit-0.js create mode 100644 ava-test/resources/shjs/exit-codes.js create mode 100644 ava-test/resources/shjs/stdout-stderr.js create mode 100644 ava-test/resources/sort/file1 create mode 100644 ava-test/resources/sort/file2 create mode 100644 ava-test/resources/sort/sorted create mode 100644 ava-test/resources/sort/sortedDashN create mode 100644 ava-test/resources/uniq/file1 create mode 100644 ava-test/resources/uniq/file1c create mode 100644 ava-test/resources/uniq/file1d create mode 100644 ava-test/resources/uniq/file1t create mode 100644 ava-test/resources/uniq/file1u create mode 100644 ava-test/resources/uniq/file2 create mode 100644 ava-test/resources/uniq/file2u create mode 100644 ava-test/resources/uniq/file3 create mode 100644 ava-test/resources/uniq/pipe create mode 100644 ava-test/resources/uniq/pipeSorted create mode 100644 ava-test/utils/utils.js delete mode 100644 test/cd.js diff --git a/.eslintignore b/.eslintignore index eff48079d..80bd0e81e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ +ava-test/resources/ test/resources/ node_modules/ make.js diff --git a/ava-test/.eslintrc.json b/ava-test/.eslintrc.json new file mode 100644 index 000000000..fd8099cb3 --- /dev/null +++ b/ava-test/.eslintrc.json @@ -0,0 +1,26 @@ +{ + "env": { + "node": true + }, + "extends": "airbnb-base", + "rules": { + "import/no-mutable-exports": 0, + "global-require": 0, + "vars-on-top": 0, + "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], + "no-param-reassign": 0, + "no-console": 0, + "curly": 0, + "no-var": 2, + "prefer-const": 2, + "prefer-template": 0, + "prefer-arrow-callback": 0, + "no-underscore-dangle": 0, + "max-len": 0, + "new-cap": [2, { + "capIsNewExceptions": [ + "ShellString" + ]} + ] + } +} diff --git a/ava-test/cd.js b/ava-test/cd.js new file mode 100644 index 000000000..760c9b4a9 --- /dev/null +++ b/ava-test/cd.js @@ -0,0 +1,105 @@ +import fs from 'fs'; +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; +import common from '../src/common'; +import utils from './utils/utils'; + +const cur = shell.pwd().toString(); + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + process.chdir(cur); + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + process.chdir(cur); + shell.rm('-rf', t.context.tmp); +}); + +// +// Invalids +// + +test('nonexistent directory', t => { + t.falsy(fs.existsSync('/asdfasdf')); + const result = shell.cd('/asdfasdf'); // dir does not exist + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cd: no such file or directory: /asdfasdf'); +}); + +test('file not dir', t => { + t.truthy(fs.existsSync('resources/file1')); // sanity check + const result = shell.cd('resources/file1'); // file, not dir + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cd: not a directory: resources/file1'); +}); + +test('no previous dir', t => { + const result = shell.cd('-'); // Haven't changed yet, so there is no previous directory + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cd: could not find previous directory'); +}); + +// +// Valids +// + +test('relative path', t => { + const result = shell.cd(t.context.tmp); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(path.basename(process.cwd()), t.context.tmp); +}); + +test('absolute path', t => { + const result = shell.cd('/'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(process.cwd(), path.resolve('/')); +}); + +test('previous directory (-)', t => { + shell.cd('/'); + const result = shell.cd('-'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(process.cwd(), path.resolve(cur.toString())); +}); + +test('cd + other commands', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); + let result = shell.cd('resources'); + t.falsy(shell.error()); + t.is(result.code, 0); + result = shell.cp('file1', `../${t.context.tmp}`); + t.falsy(shell.error()); + t.is(result.code, 0); + result = shell.cd(`../${t.context.tmp}`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync('file1')); +}); + +test('Tilde expansion', t => { + shell.cd('~'); + t.is(process.cwd(), common.getUserHome()); + shell.cd('..'); + t.not(process.cwd(), common.getUserHome()); + shell.cd('~'); // Change back to home + t.is(process.cwd(), common.getUserHome()); +}); + +test('Goes to home directory if no arguments are passed', t => { + const result = shell.cd(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(process.cwd(), common.getUserHome()); +}); diff --git a/ava-test/resources/a.txt b/ava-test/resources/a.txt new file mode 100644 index 000000000..356ce4912 --- /dev/null +++ b/ava-test/resources/a.txt @@ -0,0 +1,11 @@ +This is line one +This is line two + +This is line four +. +. +More content here +. +. + +This is line eleven diff --git a/ava-test/resources/badlink b/ava-test/resources/badlink new file mode 120000 index 000000000..e3404fe47 --- /dev/null +++ b/ava-test/resources/badlink @@ -0,0 +1 @@ +not_existed_file \ No newline at end of file diff --git a/ava-test/resources/cat/file1 b/ava-test/resources/cat/file1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/ava-test/resources/cat/file1 @@ -0,0 +1 @@ +test1 diff --git a/ava-test/resources/cat/file2 b/ava-test/resources/cat/file2 new file mode 100644 index 000000000..180cf8328 --- /dev/null +++ b/ava-test/resources/cat/file2 @@ -0,0 +1 @@ +test2 diff --git a/ava-test/resources/chmod/a/b/c/.gitignore b/ava-test/resources/chmod/a/b/c/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/ava-test/resources/chmod/b/a/b/.gitignore b/ava-test/resources/chmod/b/a/b/.gitignore new file mode 100755 index 000000000..e69de29bb diff --git a/ava-test/resources/chmod/c/a/b/.gitignore b/ava-test/resources/chmod/c/a/b/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/ava-test/resources/chmod/file1 b/ava-test/resources/chmod/file1 new file mode 100644 index 000000000..db3f9ca6e --- /dev/null +++ b/ava-test/resources/chmod/file1 @@ -0,0 +1,2 @@ +this is test file 1 +default state should be 0644 (rw-r--r--) diff --git a/ava-test/resources/chmod/xdir/deep/file b/ava-test/resources/chmod/xdir/deep/file new file mode 100644 index 000000000..02f6335fc --- /dev/null +++ b/ava-test/resources/chmod/xdir/deep/file @@ -0,0 +1 @@ +a file diff --git a/ava-test/resources/chmod/xdir/file b/ava-test/resources/chmod/xdir/file new file mode 100644 index 000000000..02f6335fc --- /dev/null +++ b/ava-test/resources/chmod/xdir/file @@ -0,0 +1 @@ +a file diff --git a/ava-test/resources/cp-mode-bits/executable b/ava-test/resources/cp-mode-bits/executable new file mode 100755 index 000000000..5e40c0877 --- /dev/null +++ b/ava-test/resources/cp-mode-bits/executable @@ -0,0 +1 @@ +asdf \ No newline at end of file diff --git a/ava-test/resources/cp/a b/ava-test/resources/cp/a new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/cp/a @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/cp/b b/ava-test/resources/cp/b new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/cp/b @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/cp/dir_a/z b/ava-test/resources/cp/dir_a/z new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/cp/dir_a/z @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z b/ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/cp/fakeLinks/file.txt b/ava-test/resources/cp/fakeLinks/file.txt new file mode 100644 index 000000000..0637880d7 --- /dev/null +++ b/ava-test/resources/cp/fakeLinks/file.txt @@ -0,0 +1 @@ +This is a file diff --git a/ava-test/resources/cp/fakeLinks/sym.lnk b/ava-test/resources/cp/fakeLinks/sym.lnk new file mode 100644 index 000000000..de8e66c01 --- /dev/null +++ b/ava-test/resources/cp/fakeLinks/sym.lnk @@ -0,0 +1 @@ +This is not a link diff --git a/ava-test/resources/cp/links/file.txt b/ava-test/resources/cp/links/file.txt new file mode 100644 index 000000000..0637880d7 --- /dev/null +++ b/ava-test/resources/cp/links/file.txt @@ -0,0 +1 @@ +This is a file diff --git a/ava-test/resources/cp/links/sym.lnk b/ava-test/resources/cp/links/sym.lnk new file mode 120000 index 000000000..4c330738c --- /dev/null +++ b/ava-test/resources/cp/links/sym.lnk @@ -0,0 +1 @@ +file.txt \ No newline at end of file diff --git a/ava-test/resources/cp/symFolder b/ava-test/resources/cp/symFolder new file mode 120000 index 000000000..ce866dd8e --- /dev/null +++ b/ava-test/resources/cp/symFolder @@ -0,0 +1 @@ +links/ \ No newline at end of file diff --git a/ava-test/resources/exec/slow.js b/ava-test/resources/exec/slow.js new file mode 100644 index 000000000..cffff43f5 --- /dev/null +++ b/ava-test/resources/exec/slow.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +setTimeout(function() { + console.log('slow'); +}, parseInt(process.argv[2], 10)); diff --git a/ava-test/resources/external/node_script.js b/ava-test/resources/external/node_script.js new file mode 100755 index 000000000..3b2d24a06 --- /dev/null +++ b/ava-test/resources/external/node_script.js @@ -0,0 +1,2 @@ +console.log('node_script_1234'); + diff --git a/ava-test/resources/file1 b/ava-test/resources/file1 new file mode 100644 index 000000000..f079749c4 --- /dev/null +++ b/ava-test/resources/file1 @@ -0,0 +1 @@ +test1 \ No newline at end of file diff --git a/ava-test/resources/file1.js b/ava-test/resources/file1.js new file mode 100644 index 000000000..9daeafb98 --- /dev/null +++ b/ava-test/resources/file1.js @@ -0,0 +1 @@ +test diff --git a/ava-test/resources/file1.txt b/ava-test/resources/file1.txt new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/ava-test/resources/file1.txt @@ -0,0 +1 @@ +test1 diff --git a/ava-test/resources/file2 b/ava-test/resources/file2 new file mode 100644 index 000000000..d606037cb --- /dev/null +++ b/ava-test/resources/file2 @@ -0,0 +1 @@ +test2 \ No newline at end of file diff --git a/ava-test/resources/file2.js b/ava-test/resources/file2.js new file mode 100644 index 000000000..9daeafb98 --- /dev/null +++ b/ava-test/resources/file2.js @@ -0,0 +1 @@ +test diff --git a/ava-test/resources/file2.txt b/ava-test/resources/file2.txt new file mode 100644 index 000000000..180cf8328 --- /dev/null +++ b/ava-test/resources/file2.txt @@ -0,0 +1 @@ +test2 diff --git a/ava-test/resources/find/.hidden b/ava-test/resources/find/.hidden new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/find/.hidden @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/find/a b/ava-test/resources/find/a new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/find/a @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/find/b b/ava-test/resources/find/b new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/find/b @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/find/broken_link b/ava-test/resources/find/broken_link new file mode 120000 index 000000000..5b9521524 --- /dev/null +++ b/ava-test/resources/find/broken_link @@ -0,0 +1 @@ +non_existent \ No newline at end of file diff --git a/ava-test/resources/find/dir1/a_dir1 b/ava-test/resources/find/dir1/a_dir1 new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/find/dir1/a_dir1 @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/find/dir1/dir11/a_dir11 b/ava-test/resources/find/dir1/dir11/a_dir11 new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/find/dir1/dir11/a_dir11 @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/find/dir2/a_dir1 b/ava-test/resources/find/dir2/a_dir1 new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/find/dir2/a_dir1 @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/grep/file b/ava-test/resources/grep/file new file mode 100644 index 000000000..dbb55d26c --- /dev/null +++ b/ava-test/resources/grep/file @@ -0,0 +1,5 @@ +alphaaaaaaabeta +howareyou +alphbeta +this line ends in.js +lllllllllllllllll.js diff --git a/ava-test/resources/head/file1.txt b/ava-test/resources/head/file1.txt new file mode 100644 index 000000000..f818b0dfa --- /dev/null +++ b/ava-test/resources/head/file1.txt @@ -0,0 +1,50 @@ +file1 1 +file1 2 +file1 3 +file1 4 +file1 5 +file1 6 +file1 7 +file1 8 +file1 9 +file1 10 +file1 11 +file1 12 +file1 13 +file1 14 +file1 15 +file1 16 +file1 17 +file1 18 +file1 19 +file1 20 +file1 21 +file1 22 +file1 23 +file1 24 +file1 25 +file1 26 +file1 27 +file1 28 +file1 29 +file1 30 +file1 31 +file1 32 +file1 33 +file1 34 +file1 35 +file1 36 +file1 37 +file1 38 +file1 39 +file1 40 +file1 41 +file1 42 +file1 43 +file1 44 +file1 45 +file1 46 +file1 47 +file1 48 +file1 49 +file1 50 diff --git a/ava-test/resources/head/file2.txt b/ava-test/resources/head/file2.txt new file mode 100644 index 000000000..37cf79b5e --- /dev/null +++ b/ava-test/resources/head/file2.txt @@ -0,0 +1,50 @@ +file2 1 +file2 2 +file2 3 +file2 4 +file2 5 +file2 6 +file2 7 +file2 8 +file2 9 +file2 10 +file2 11 +file2 12 +file2 13 +file2 14 +file2 15 +file2 16 +file2 17 +file2 18 +file2 19 +file2 20 +file2 21 +file2 22 +file2 23 +file2 24 +file2 25 +file2 26 +file2 27 +file2 28 +file2 29 +file2 30 +file2 31 +file2 32 +file2 33 +file2 34 +file2 35 +file2 36 +file2 37 +file2 38 +file2 39 +file2 40 +file2 41 +file2 42 +file2 43 +file2 44 +file2 45 +file2 46 +file2 47 +file2 48 +file2 49 +file2 50 diff --git a/ava-test/resources/head/shortfile1 b/ava-test/resources/head/shortfile1 new file mode 100644 index 000000000..180ffe1b4 --- /dev/null +++ b/ava-test/resources/head/shortfile1 @@ -0,0 +1 @@ +short1 diff --git a/ava-test/resources/head/shortfile2 b/ava-test/resources/head/shortfile2 new file mode 100644 index 000000000..b0595c768 --- /dev/null +++ b/ava-test/resources/head/shortfile2 @@ -0,0 +1 @@ +short2 diff --git a/ava-test/resources/issue44/main.js b/ava-test/resources/issue44/main.js new file mode 100644 index 000000000..d800886d9 --- /dev/null +++ b/ava-test/resources/issue44/main.js @@ -0,0 +1 @@ +123 \ No newline at end of file diff --git a/ava-test/resources/link b/ava-test/resources/link new file mode 120000 index 000000000..08219db9b --- /dev/null +++ b/ava-test/resources/link @@ -0,0 +1 @@ +file1 \ No newline at end of file diff --git a/ava-test/resources/ls/.hidden_dir/nada b/ava-test/resources/ls/.hidden_dir/nada new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/ls/.hidden_dir/nada @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/ls/.hidden_file b/ava-test/resources/ls/.hidden_file new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/ls/.hidden_file @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/ls/a_dir/.hidden_dir/nada b/ava-test/resources/ls/a_dir/.hidden_dir/nada new file mode 100644 index 000000000..5fedf5729 --- /dev/null +++ b/ava-test/resources/ls/a_dir/.hidden_dir/nada @@ -0,0 +1 @@ +nada \ No newline at end of file diff --git a/ava-test/resources/ls/a_dir/b_dir/z b/ava-test/resources/ls/a_dir/b_dir/z new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/ls/a_dir/b_dir/z @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/ls/a_dir/nada b/ava-test/resources/ls/a_dir/nada new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/ls/a_dir/nada @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/ls/file1 b/ava-test/resources/ls/file1 new file mode 100644 index 000000000..9daeafb98 --- /dev/null +++ b/ava-test/resources/ls/file1 @@ -0,0 +1 @@ +test diff --git a/ava-test/resources/ls/file1.js b/ava-test/resources/ls/file1.js new file mode 100644 index 000000000..9daeafb98 --- /dev/null +++ b/ava-test/resources/ls/file1.js @@ -0,0 +1 @@ +test diff --git a/ava-test/resources/ls/file2 b/ava-test/resources/ls/file2 new file mode 100644 index 000000000..9daeafb98 --- /dev/null +++ b/ava-test/resources/ls/file2 @@ -0,0 +1 @@ +test diff --git a/ava-test/resources/ls/file2.js b/ava-test/resources/ls/file2.js new file mode 100644 index 000000000..9daeafb98 --- /dev/null +++ b/ava-test/resources/ls/file2.js @@ -0,0 +1 @@ +test diff --git a/ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped b/ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/pushd/a/dummy b/ava-test/resources/pushd/a/dummy new file mode 100644 index 000000000..72e12a968 --- /dev/null +++ b/ava-test/resources/pushd/a/dummy @@ -0,0 +1 @@ +meh \ No newline at end of file diff --git a/ava-test/resources/pushd/b/c/dummy b/ava-test/resources/pushd/b/c/dummy new file mode 100644 index 000000000..72e12a968 --- /dev/null +++ b/ava-test/resources/pushd/b/c/dummy @@ -0,0 +1 @@ +meh \ No newline at end of file diff --git a/ava-test/resources/rm/a_dir/a_file b/ava-test/resources/rm/a_dir/a_file new file mode 100644 index 000000000..8bd6648ed --- /dev/null +++ b/ava-test/resources/rm/a_dir/a_file @@ -0,0 +1 @@ +asdf diff --git a/ava-test/resources/rm/fake.lnk b/ava-test/resources/rm/fake.lnk new file mode 120000 index 000000000..6eab79a6c --- /dev/null +++ b/ava-test/resources/rm/fake.lnk @@ -0,0 +1 @@ +missing \ No newline at end of file diff --git a/ava-test/resources/rm/link_to_a_dir b/ava-test/resources/rm/link_to_a_dir new file mode 120000 index 000000000..cad027a2e --- /dev/null +++ b/ava-test/resources/rm/link_to_a_dir @@ -0,0 +1 @@ +a_dir \ No newline at end of file diff --git a/ava-test/resources/shjs/a-file.js b/ava-test/resources/shjs/a-file.js new file mode 100644 index 000000000..3050cd9a6 --- /dev/null +++ b/ava-test/resources/shjs/a-file.js @@ -0,0 +1,2 @@ +console.log('OK!'); +process.exit(0); diff --git a/ava-test/resources/shjs/coffeescript.coffee b/ava-test/resources/shjs/coffeescript.coffee new file mode 100644 index 000000000..5b2766405 --- /dev/null +++ b/ava-test/resources/shjs/coffeescript.coffee @@ -0,0 +1,2 @@ +msg = 'CoffeeScript: OK!' +console.log msg diff --git a/ava-test/resources/shjs/exit-0.js b/ava-test/resources/shjs/exit-0.js new file mode 100644 index 000000000..dcbbff6c9 --- /dev/null +++ b/ava-test/resources/shjs/exit-0.js @@ -0,0 +1 @@ +process.exit(0); diff --git a/ava-test/resources/shjs/exit-codes.js b/ava-test/resources/shjs/exit-codes.js new file mode 100644 index 000000000..6427ca060 --- /dev/null +++ b/ava-test/resources/shjs/exit-codes.js @@ -0,0 +1 @@ +process.exit(42); diff --git a/ava-test/resources/shjs/stdout-stderr.js b/ava-test/resources/shjs/stdout-stderr.js new file mode 100644 index 000000000..220cb58f8 --- /dev/null +++ b/ava-test/resources/shjs/stdout-stderr.js @@ -0,0 +1,2 @@ +console.log('stdout: OK!'); +console.error('stderr: OK!'); diff --git a/ava-test/resources/sort/file1 b/ava-test/resources/sort/file1 new file mode 100644 index 000000000..08c355283 --- /dev/null +++ b/ava-test/resources/sort/file1 @@ -0,0 +1,12 @@ +22 +symbolic +46 integers +melt +admiral +aardvark +scanner +Dynamite +Witness +12345 +blackwater +5 numbers diff --git a/ava-test/resources/sort/file2 b/ava-test/resources/sort/file2 new file mode 100644 index 000000000..e93f1c23e --- /dev/null +++ b/ava-test/resources/sort/file2 @@ -0,0 +1,12 @@ +admiral +scanner +5 numbers +Witness +46 integers +12345 +Dynamite +blackwater +aardvark +22 +symbolic +melt diff --git a/ava-test/resources/sort/sorted b/ava-test/resources/sort/sorted new file mode 100644 index 000000000..47c17061e --- /dev/null +++ b/ava-test/resources/sort/sorted @@ -0,0 +1,12 @@ +12345 +22 +46 integers +5 numbers +aardvark +admiral +blackwater +Dynamite +melt +scanner +symbolic +Witness diff --git a/ava-test/resources/sort/sortedDashN b/ava-test/resources/sort/sortedDashN new file mode 100644 index 000000000..9892c3474 --- /dev/null +++ b/ava-test/resources/sort/sortedDashN @@ -0,0 +1,12 @@ +aardvark +admiral +blackwater +Dynamite +melt +scanner +symbolic +Witness +5 numbers +22 +46 integers +12345 diff --git a/ava-test/resources/uniq/file1 b/ava-test/resources/uniq/file1 new file mode 100644 index 000000000..8687fd613 --- /dev/null +++ b/ava-test/resources/uniq/file1 @@ -0,0 +1,4 @@ +foo +bar +bar +baz diff --git a/ava-test/resources/uniq/file1c b/ava-test/resources/uniq/file1c new file mode 100644 index 000000000..7162bb424 --- /dev/null +++ b/ava-test/resources/uniq/file1c @@ -0,0 +1,3 @@ + 1 foo + 2 bar + 1 baz diff --git a/ava-test/resources/uniq/file1d b/ava-test/resources/uniq/file1d new file mode 100644 index 000000000..5716ca598 --- /dev/null +++ b/ava-test/resources/uniq/file1d @@ -0,0 +1 @@ +bar diff --git a/ava-test/resources/uniq/file1t b/ava-test/resources/uniq/file1t new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/ava-test/resources/uniq/file1t @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/ava-test/resources/uniq/file1u b/ava-test/resources/uniq/file1u new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/ava-test/resources/uniq/file1u @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/ava-test/resources/uniq/file2 b/ava-test/resources/uniq/file2 new file mode 100644 index 000000000..2bf57bbeb --- /dev/null +++ b/ava-test/resources/uniq/file2 @@ -0,0 +1,4 @@ +foo +bar +Bar +baz diff --git a/ava-test/resources/uniq/file2u b/ava-test/resources/uniq/file2u new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/ava-test/resources/uniq/file2u @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/ava-test/resources/uniq/file3 b/ava-test/resources/uniq/file3 new file mode 100644 index 000000000..86e041dad --- /dev/null +++ b/ava-test/resources/uniq/file3 @@ -0,0 +1,3 @@ +foo +bar +baz diff --git a/ava-test/resources/uniq/pipe b/ava-test/resources/uniq/pipe new file mode 100644 index 000000000..b7eb19584 --- /dev/null +++ b/ava-test/resources/uniq/pipe @@ -0,0 +1,50 @@ +bar +foo +foo +baz +foo +foo +bar +foo +baz +baz +foo +baz +baz +baz +bar +baz +bar +bar +baz +bar +baz +foo +baz +foo +baz +foo +bar +baz +bar +bar +bar +foo +foo +foo +foo +baz +foo +baz +foo +foo +bar +foo +foo +bar +foo +foo +baz +foo +foo +foo diff --git a/ava-test/resources/uniq/pipeSorted b/ava-test/resources/uniq/pipeSorted new file mode 100644 index 000000000..0e1845d37 --- /dev/null +++ b/ava-test/resources/uniq/pipeSorted @@ -0,0 +1,3 @@ + 12 bar + 15 baz + 23 foo diff --git a/ava-test/utils/utils.js b/ava-test/utils/utils.js new file mode 100644 index 000000000..1f9bf94ab --- /dev/null +++ b/ava-test/utils/utils.js @@ -0,0 +1,36 @@ +const child = require('child_process'); + +function numLines(str) { + return typeof str === 'string' ? (str.match(/\n/g) || []).length + 1 : 0; +} +exports.numLines = numLines; + +function getTempDir() { + // a very random directory + return ('tmp' + Math.random() + Math.random()).replace(/\./g, ''); +} +exports.getTempDir = getTempDir; + +// On Windows, symlinks for files need admin permissions. This helper +// skips certain tests if we are on Windows and got an EPERM error +function skipOnWinForEPERM(action, testCase) { + const ret = action(); + const error = ret.code; + const isWindows = process.platform === 'win32'; + if (isWindows && error && /EPERM:/.test(error)) { + console.warn('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); + } else { + testCase(); + } +} +exports.skipOnWinForEPERM = skipOnWinForEPERM; + +function runScript(script, cb) { + child.execFile(process.execPath, ['-e', script], cb); +} +exports.runScript = runScript; + +function sleep(time) { + child.execFileSync(process.execPath, ['resources/exec/slow.js', time.toString()]); +} +exports.sleep = sleep; diff --git a/package.json b/package.json index 14dedcc05..cbb635764 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "main": "./shell.js", "scripts": { "posttest": "npm run lint", - "test": "node scripts/run-tests", + "test": "node scripts/run-tests && ava --serial ava-test/*.js", "gendocs": "node scripts/generate-docs", "lint": "eslint .", "after-travis": "travis-check-changes", @@ -43,10 +43,11 @@ "rechoir": "^0.6.2" }, "devDependencies": { + "ava": "^0.16.0", + "coffee-script": "^1.10.0", "eslint": "^2.0.0", "eslint-config-airbnb-base": "^3.0.0", "eslint-plugin-import": "^1.11.1", - "coffee-script": "^1.10.0", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.2.0", "shx": "^0.2.0", diff --git a/test/cd.js b/test/cd.js deleted file mode 100644 index 482324e76..000000000 --- a/test/cd.js +++ /dev/null @@ -1,92 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var path = require('path'); -var fs = require('fs'); -var common = require('../src/common'); - -shell.config.silent = true; - -// save current dir -var cur = shell.pwd(); - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -var result = shell.cd('/asdfasdf'); // dir does not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cd: no such file or directory: /asdfasdf'); - -assert.equal(fs.existsSync('resources/file1'), true); // sanity check -result = shell.cd('resources/file1'); // file, not dir -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cd: not a directory: resources/file1'); - -result = shell.cd('-'); // Haven't changed yet, so there is no previous directory -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cd: could not find previous directory'); - -// -// Valids -// - -result = shell.cd(cur); -result = shell.cd('tmp'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(path.basename(process.cwd()), 'tmp'); - -result = shell.cd(cur); -result = shell.cd('/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(process.cwd(), path.resolve('/')); - -result = shell.cd(cur); -result = shell.cd('/'); -result = shell.cd('-'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(process.cwd(), path.resolve(cur.toString())); - -// cd + other commands - -result = shell.cd(cur); -result = shell.rm('-f', 'tmp/*'); -assert.equal(fs.existsSync('tmp/file1'), false); -result = shell.cd('resources'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -result = shell.cp('file1', '../tmp'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -result = shell.cd('../tmp'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), true); - -// Test tilde expansion - -result = shell.cd('~'); -assert.equal(process.cwd(), common.getUserHome()); -result = shell.cd('..'); -assert.notEqual(process.cwd(), common.getUserHome()); -result = shell.cd('~'); // Change back to home -assert.equal(process.cwd(), common.getUserHome()); - -// Goes to home directory if no arguments are passed -result = shell.cd(cur); -result = shell.cd(); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.equal(process.cwd(), common.getUserHome()); - -shell.exit(123); From 07430047170dd70bd237216bfe65d95e1e1c65d5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 20 Nov 2016 13:10:58 -0800 Subject: [PATCH 045/338] test: refactor cat tests to ava (#564) * test: refactor cat tests to ava * refactor: only set config.silent once --- ava-test/cat.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ test/cat.js | 54 -------------------------------------------- 2 files changed, 59 insertions(+), 54 deletions(-) create mode 100644 ava-test/cat.js delete mode 100644 test/cat.js diff --git a/ava-test/cat.js b/ava-test/cat.js new file mode 100644 index 000000000..654b304cd --- /dev/null +++ b/ava-test/cat.js @@ -0,0 +1,59 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +// +// Invalids +// + +test('no paths given', t => { + const result = shell.cat(); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cat: no paths given'); +}); + +test('nonexistent file', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.cat('/asdfasdf'); // file does not exist + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cat: no such file or directory: /asdfasdf'); +}); + +// +// Valids +// + +test('simple', t => { + const result = shell.cat('resources/cat/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'test1\n'); +}); + +test('multiple files', t => { + const result = shell.cat('resources/cat/file2', 'resources/cat/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'test2\ntest1\n'); +}); + +test('multiple files, array syntax', t => { + const result = shell.cat(['resources/cat/file2', 'resources/cat/file1']); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'test2\ntest1\n'); +}); + +test('glob', t => { + const result = shell.cat('resources/file*.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.search('test1') > -1); // file order might be random + t.truthy(result.search('test2') > -1); +}); diff --git a/test/cat.js b/test/cat.js deleted file mode 100644 index ea3306a65..000000000 --- a/test/cat.js +++ /dev/null @@ -1,54 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result = shell.cat(); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cat: no paths given'); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.cat('/asdfasdf'); // file does not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cat: no such file or directory: /asdfasdf'); - -// -// Valids -// - -// simple -result = shell.cat('resources/cat/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'test1\n'); - -// multiple files -result = shell.cat('resources/cat/file2', 'resources/cat/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'test2\ntest1\n'); - -// multiple files, array syntax -result = shell.cat(['resources/cat/file2', 'resources/cat/file1']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'test2\ntest1\n'); - -result = shell.cat('resources/file*.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.search('test1') > -1); // file order might be random -assert.ok(result.search('test2') > -1); - -shell.exit(123); From d9e3008c858789113064b4a314bca0036abfa3b5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 20 Nov 2016 13:11:32 -0800 Subject: [PATCH 046/338] test: refactor cp tests to ava (#565) * test: refactor cp tests to ava * refactor: use `utils.` syntax for utilities --- ava-test/cp.js | 649 +++++++++++++++++++++++++++++++++++++++++++++++++ test/cp.js | 577 ------------------------------------------- 2 files changed, 649 insertions(+), 577 deletions(-) create mode 100644 ava-test/cp.js delete mode 100644 test/cp.js diff --git a/ava-test/cp.js b/ava-test/cp.js new file mode 100644 index 000000000..a7faec988 --- /dev/null +++ b/ava-test/cp.js @@ -0,0 +1,649 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import common from '../src/common'; +import utils from './utils/utils'; + +const oldMaxDepth = shell.config.maxdepth; +const CWD = process.cwd(); + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + process.chdir(CWD); + shell.rm('-rf', t.context.tmp); + shell.config.maxdepth = oldMaxDepth; +}); + +// +// Invalids +// + +test('no args', t => { + const result = shell.cp(); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cp: missing and/or '); +}); + +test('no destination', t => { + const result = shell.cp('file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cp: missing and/or '); +}); + +test('only an option', t => { + const result = shell.cp('-f'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cp: missing and/or '); +}); + +test('invalid option', t => { + const result = shell.cp('-@', 'resources/file1', `${t.context.tmp}/file1`); + t.truthy(shell.error()); + t.is(result.code, 1); + t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); + t.is(result.stderr, 'cp: option not recognized: @'); +}); + +test('invalid option', t => { + const result = shell.cp('-Z', 'asdfasdf', `${t.context.tmp}/file2`); + t.truthy(shell.error()); + t.is(result.code, 1); + t.falsy(fs.existsSync(`${t.context.tmp}/file2`)); + t.is(result.stderr, 'cp: option not recognized: Z'); +}); + +test('source does not exist', t => { + const result = shell.cp('asdfasdf', t.context.tmp); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(utils.numLines(result.stderr), 1); + t.falsy(fs.existsSync(`${t.context.tmp}/asdfasdf`)); + t.is(result.stderr, 'cp: no such file or directory: asdfasdf'); +}); + +test('sources does not exist', t => { + const result = shell.cp('asdfasdf1', 'asdfasdf2', t.context.tmp); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(utils.numLines(result.stderr), 2); + t.falsy(fs.existsSync(`${t.context.tmp}/asdfasdf1`)); + t.falsy(fs.existsSync(`${t.context.tmp}/asdfasdf2`)); + t.is( + result.stderr, + 'cp: no such file or directory: asdfasdf1\ncp: no such file or directory: asdfasdf2' + ); +}); + +test('too many sources', t => { + const result = shell.cp('asdfasdf1', 'asdfasdf2', 'resources/file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cp: dest is not a directory (too many sources)'); +}); + +test('too many sources #2', t => { + const result = shell.cp('resources/file1', 'resources/file2', `${t.context.tmp}/a_file`); + t.truthy(shell.error()); + t.is(result.code, 1); + t.falsy(fs.existsSync(`${t.context.tmp}/a_file`)); + t.is(result.stderr, 'cp: dest is not a directory (too many sources)'); +}); + +// +// Valids +// + +test('dest already exists', t => { + const oldContents = shell.cat('resources/file2').toString(); + const result = shell.cp('-n', 'resources/file1', 'resources/file2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stderr, ''); + t.is(shell.cat('resources/file2').toString(), oldContents); +}); + +test('-f by default', t => { + shell.cp('resources/file2', 'resources/copyfile2'); + const result = shell.cp('resources/file1', 'resources/file2'); // dest already exists + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(result.stderr); + t.is(shell.cat('resources/file1').toString(), shell.cat('resources/file2').toString()); // after cp + shell.mv('resources/copyfile2', 'resources/file2'); // restore + t.falsy(shell.error()); +}); + +test('-f (explicitly)', t => { + shell.cp('resources/file2', 'resources/copyfile2'); + const result = shell.cp('-f', 'resources/file1', 'resources/file2'); // dest already exists + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.is(shell.cat('resources/file1').toString(), shell.cat('resources/file2').toString()); // after cp + shell.mv('resources/copyfile2', 'resources/file2'); // restore + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('simple - to dir', t => { + const result = shell.cp('resources/file1', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); +}); + +test('simple - to file', t => { + const result = shell.cp('resources/file2', `${t.context.tmp}/file2`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file2`)); +}); + +test('simple - file list', t => { + const result = shell.cp('resources/file1', 'resources/file2', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2`)); +}); + +test('simple - file list, array syntax', t => { + const result = shell.cp(['resources/file1', 'resources/file2'], t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2`)); +}); + +test('-f option', t => { + shell.cp('resources/file2', `${t.context.tmp}/file3`); + t.truthy(fs.existsSync(`${t.context.tmp}/file3`)); + const result = shell.cp('-f', 'resources/file2', `${t.context.tmp}/file3`); // file exists, but -f specified + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file3`)); +}); + +test('glob', t => { + const result = shell.cp('resources/file?', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file1.js`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file2.js`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file1.txt`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file2.txt`)); +}); + +test('wildcard', t => { + shell.rm(`${t.context.tmp}/file1`, `${t.context.tmp}/file2`); + const result = shell.cp('resources/file*', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file1.js`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2.js`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2.txt`)); +}); + +test('recursive, with regular files', t => { + const result = shell.cp('-R', 'resources/file1', 'resources/file2', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2`)); +}); + +test('recursive, nothing exists', t => { + const result = shell.cp('-R', 'resources/cp', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.is(shell.ls('-R', 'resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); +}); + +test( + 'recursive, nothing exists, source ends in \'/\' (see Github issue #15)', + t => { + const result = shell.cp('-R', 'resources/cp/', `${t.context.tmp}/`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.is(shell.ls('-R', 'resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); + } +); + +test( + 'recursive, globbing regular files with extension (see Github issue #376)', + t => { + const result = shell.cp('-R', 'resources/file*.txt', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2.txt`)); + } +); + +test( + 'recursive, copying one regular file (also related to Github issue #376)', + t => { + const result = shell.cp('-R', 'resources/file1.txt', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); + t.falsy(fs.statSync(`${t.context.tmp}/file1.txt`).isDirectory()); // don't let it be a dir + } +); + +test('recursive, everything exists, no force flag', t => { + shell.cp('-R', 'resources/cp', t.context.tmp); + const result = shell.cp('-R', 'resources/cp', t.context.tmp); + t.falsy(shell.error()); // crash test only + t.falsy(result.stderr); + t.is(result.code, 0); +}); + +test('-R implies to not follow links', t => { + if (process.platform !== 'win32') { + shell.cp('-R', 'resources/cp/*', t.context.tmp); + t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.falsy((fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't + t.not( + shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), + shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() + ); + const result = shell.cp('-R', `${t.context.tmp}/links/*`, `${t.context.tmp}/fakeLinks`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.truthy(fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink()); // this one is now a link + t.is( + shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), + shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() + ); + } +}); + +test('Missing -R implies -L', t => { + if (process.platform !== 'win32') { + // Recursive, everything exists, overwrite a real file *by following a link* + // Because missing the -R implies -L. + shell.cp('-R', 'resources/cp/*', t.context.tmp); + t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.falsy((fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't + t.not( + shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), + shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() + ); + const result = shell.cp(`${t.context.tmp}/links/*`, `${t.context.tmp}/fakeLinks`); // don't use -R + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.falsy(fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink()); // this one is still not a link + // But it still follows the link + t.is( + shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), + shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() + ); + } +}); + +test('recursive, everything exists, with force flag', t => { + let result = shell.cp('-R', 'resources/cp', t.context.tmp); + shell.ShellString('changing things around').to(`${t.context.tmp}/cp/dir_a/z`); + t.not(shell.cat('resources/cp/dir_a/z').toString(), shell.cat(`${t.context.tmp}/cp/dir_a/z`).toString()); // before cp + result = shell.cp('-Rf', 'resources/cp', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.is(shell.cat('resources/cp/dir_a/z').toString(), shell.cat(`${t.context.tmp}/cp/dir_a/z`).toString()); // after cp +}); + +test( + 'recursive, creates dest dir since it\'s only one level deep (see Github issue #44)', + t => { + const result = shell.cp('-r', 'resources/issue44', `${t.context.tmp}/dir2`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.is(shell.ls('-R', 'resources/issue44').toString(), shell.ls('-R', `${t.context.tmp}/dir2`).toString()); + t.is( + shell.cat('resources/issue44/main.js').toString(), + shell.cat(`${t.context.tmp}/dir2/main.js`).toString() + ); + } +); + +test( + 'recursive, does *not* create dest dir since it\'s too deep (see Github issue #44)', + t => { + const result = shell.cp('-r', 'resources/issue44', `${t.context.tmp}/dir2/dir3`); + t.truthy(shell.error()); + t.is( + result.stderr, + `cp: cannot create directory '${t.context.tmp}/dir2/dir3': No such file or directory` + ); + t.is(result.code, 1); + t.falsy(fs.existsSync(`${t.context.tmp}/dir2`)); + } +); + +test('recursive, copies entire directory', t => { + const result = shell.cp('-r', 'resources/cp/dir_a', `${t.context.tmp}/dest`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/dest/z`)); +}); + +test('recursive, with trailing slash, does the exact same', t => { + const result = shell.cp('-r', 'resources/cp/dir_a/', `${t.context.tmp}/dest`); + t.is(result.code, 0); + t.falsy(shell.error()); + t.truthy(fs.existsSync(`${t.context.tmp}/dest/z`)); +}); + +test( + 'On Windows, permission bits are quite different so skip those tests for now', + t => { + if (common.platform !== 'win') { + // preserve mode bits + const execBit = parseInt('001', 8); + t.is(fs.statSync('resources/cp-mode-bits/executable').mode & execBit, execBit); + shell.cp('resources/cp-mode-bits/executable', `${t.context.tmp}/executable`); + t.is( + fs.statSync('resources/cp-mode-bits/executable').mode, + fs.statSync(`${t.context.tmp}/executable`).mode + ); + } + } +); + +test('Make sure hidden files are copied recursively', t => { + shell.rm('-rf', t.context.tmp); + const result = shell.cp('-r', 'resources/ls/', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/.hidden_file`)); +}); + +test('no-recursive will copy regular files only', t => { + const result = shell.cp('resources/file1.txt', 'resources/ls/', t.context.tmp); + t.is(result.code, 1); + t.truthy(shell.error()); + t.falsy(fs.existsSync(`${t.context.tmp}/.hidden_file`)); // doesn't copy dir contents + t.falsy(fs.existsSync(`${t.context.tmp}/ls`)); // doesn't copy dir itself + t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); +}); + +test('no-recursive will copy regular files only', t => { + const result = shell.cp('resources/file1.txt', 'resources/file2.txt', 'resources/cp', + 'resources/ls/', t.context.tmp); + + t.is(result.code, 1); + t.truthy(shell.error()); + t.falsy(fs.existsSync(`${t.context.tmp}/.hidden_file`)); // doesn't copy dir contents + t.falsy(fs.existsSync(`${t.context.tmp}/ls`)); // doesn't copy dir itself + t.falsy(fs.existsSync(`${t.context.tmp}/a`)); // doesn't copy dir contents + t.falsy(fs.existsSync(`${t.context.tmp}/cp`)); // doesn't copy dir itself + t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2.txt`)); +}); + +test('-R implies -P', t => { + if (process.platform !== 'win32') { + shell.cp('-R', 'resources/cp/links/sym.lnk', t.context.tmp); + t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + } +}); + +test('using -P explicitly works', t => { + if (process.platform !== 'win32') { + shell.cp('-P', 'resources/cp/links/sym.lnk', t.context.tmp); + t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + } +}); + +test('using -PR on a link to a folder does not follow the link', t => { + if (process.platform !== 'win32') { + shell.cp('-PR', 'resources/cp/symFolder', t.context.tmp); + t.truthy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); + } +}); + +test('-L overrides -P for copying directory', t => { + if (process.platform !== 'win32') { + shell.cp('-LPR', 'resources/cp/symFolder', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); + t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder/sym.lnk`).isSymbolicLink()); + } +}); + +test('Recursive, copies entire directory with no symlinks and -L option does not cause change in behavior', t => { + if (process.platform !== 'win32') { + const result = shell.cp('-rL', 'resources/cp/dir_a', `${t.context.tmp}/dest`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/dest/z`)); + } +}); + +test('-u flag won\'t overwrite newer files', t => { + shell.touch(`${t.context.tmp}/file1.js`); + shell.cp('-u', 'resources/file1.js', t.context.tmp); + t.falsy(shell.error()); + t.not(shell.cat('resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); +}); + +test('-u flag does overwrite older files', t => { + shell.touch({ '-d': new Date(10) }, `${t.context.tmp}/file1.js`); // really old file + shell.cp('-u', 'resources/file1.js', t.context.tmp); + t.falsy(shell.error()); + t.is(shell.cat('resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); +}); + +test('-u flag works even if it\'s not overwriting a file', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/file1.js`)); + shell.cp('-u', 'resources/file1.js', t.context.tmp); + t.falsy(shell.error()); + t.is(shell.cat('resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); +}); + +test('-u flag works correctly recursively', t => { + shell.mkdir(`${t.context.tmp}/foo`); + [1, 2, 3].forEach(num => { + new shell.ShellString('old\n').to(`${t.context.tmp}/foo/file${num}`); + shell.touch({ '-d': new Date(10) }, `${t.context.tmp}/foo/file${num}`); + }); + shell.mkdir(`${t.context.tmp}/bar`); + [1, 2, 3].forEach(num => { + new shell.ShellString('new\n').to(`${t.context.tmp}/bar/file${num}`); + shell.touch({ '-d': new Date(1000) }, `${t.context.tmp}/bar/file${num}`); + }); + // put one new one in the foo directory + new shell.ShellString('newest\n').to(`${t.context.tmp}/foo/file3`); + shell.touch({ '-d': new Date(10000) }, `${t.context.tmp}/foo/file3`); + shell.cp('-u', `${t.context.tmp}/foo/*`, `${t.context.tmp}/bar`); + t.falsy(shell.error()); + t.is(shell.cat(`${t.context.tmp}/bar/*`).toString(), 'new\nnew\nnewest\n'); +}); + +test('using -R on a link to a folder *does* follow the link', t => { + shell.cp('-R', 'resources/cp/symFolder', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); +}); + +test('Without -R, -L is implied', t => { + shell.cp('resources/cp/links/sym.lnk', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); +}); + +test('-L explicitly works', t => { + shell.cp('-L', 'resources/cp/links/sym.lnk', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); +}); + +test('using -LR does not imply -P', t => { + shell.cp('-LR', 'resources/cp/links/sym.lnk', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); +}); + +test('using -LR also works recursively on directories containing links', t => { + shell.cp('-LR', 'resources/cp/links', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); +}); + +test('-L always overrides a -P', t => { + shell.cp('-LP', 'resources/cp/links/sym.lnk', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + shell.cp('-LPR', 'resources/cp/links/sym.lnk', t.context.tmp); + t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); +}); + +test('Make sure max depth does not limit shallow directory structures', t => { + shell.config.maxdepth = 3; + const TMP = t.context.tmp; + shell.mkdir(`${TMP}/foo`); + for (let k = 0; k < 5; k++) { + shell.mkdir(`${TMP}/foo/dir${k}`); + } + shell.cp('-r', `${TMP}/foo`, `${TMP}/bar`); + t.is(shell.ls(`${TMP}/foo`).stdout, shell.ls(`${TMP}/bar`).stdout); +}); + +test('Test max depth.', t => { + shell.config.maxdepth = 32; + let directory = ''; + for (let i = 1; i < 40; i++) { + directory += '/' + i; + } + let directory32deep = ''; + for (let i = 1; i < 32; i++) { + directory32deep += '/' + i; + } + shell.mkdir('-p', `${t.context.tmp}/0${directory}`); + shell.cp('-r', `${t.context.tmp}/0`, `${t.context.tmp}/copytestdepth`); + // Check full directory exists. + t.truthy(shell.test('-d', `${t.context.tmp}/0/${directory}`)); + // Check full copy of directory does not exist. + t.falsy(shell.test('-d', `${t.context.tmp}/copytestdepth${directory}`)); + // Check last directory to exist is below maxdepth. + t.truthy(shell.test('-d', `${t.context.tmp}/copytestdepth${directory32deep}`)); + t.falsy(shell.test('-d', `${t.context.tmp}/copytestdepth${directory32deep}/32`)); + utils.skipOnWinForEPERM(shell.ln.bind(shell, '-s', `${t.context.tmp}/0`, `${t.context.tmp}/symlinktest`), () => { + if (!shell.test('-L', `${t.context.tmp}/symlinktest`)) { + t.fail(); + } + + // Create symlinks to check for cycle. + shell.cd(`${t.context.tmp}/0/1/2/3/4`); + t.falsy(shell.error()); + shell.ln('-s', '../../../2', 'link'); + t.falsy(shell.error()); + shell.ln('-s', './5/6/7', 'link1'); + t.falsy(shell.error()); + shell.cd('../../../../../..'); + t.falsy(shell.error()); + t.truthy(shell.test('-d', t.context.tmp)); + + shell.cp('-r', `${t.context.tmp}/0/1`, `${t.context.tmp}/copytestdepth`); + t.falsy(shell.error()); + t.truthy(shell.test('-d', `${t.context.tmp}/copytestdepth/1/2/3/4/link/3/4/link/3/4`)); + }); +}); + +test('cp -L follows symlinks', t => { + utils.skipOnWinForEPERM(shell.ln.bind(shell, '-s', `${t.context.tmp}/0`, `${t.context.tmp}/symlinktest`), () => { + shell.mkdir('-p', `${t.context.tmp}/sub`); + shell.mkdir('-p', `${t.context.tmp}/new`); + shell.cp('-f', 'resources/file1.txt', `${t.context.tmp}/sub/file.txt`); + shell.cd(`${t.context.tmp}/sub`); + shell.ln('-s', 'file.txt', 'foo.lnk'); + shell.ln('-s', 'file.txt', 'sym.lnk'); + shell.cd('..'); + shell.cp('-L', 'sub/*', 'new/'); + shell.cd('new'); + + shell.cp('-f', '../../resources/file2.txt', 'file.txt'); + t.is(shell.cat('file.txt').toString(), 'test2\n'); + // Ensure other files have not changed. + t.is(shell.cat('foo.lnk').toString(), 'test1\n'); + t.is(shell.cat('sym.lnk').toString(), 'test1\n'); + t.falsy(shell.test('-L', 'foo.lnk')); + t.falsy(shell.test('-L', 'sym.lnk')); + shell.cd('../..'); + }); +}); + +test('Test with recursive option and symlinks.', t => { + utils.skipOnWinForEPERM(shell.ln.bind(shell, '-s', `${t.context.tmp}/0`, `${t.context.tmp}/symlinktest`), () => { + shell.mkdir('-p', `${t.context.tmp}/sub/sub1`); + shell.cp('-f', 'resources/file1.txt', `${t.context.tmp}/sub/file.txt`); + shell.cp('-f', 'resources/file1.txt', `${t.context.tmp}/sub/sub1/file.txt`); + shell.cd(`${t.context.tmp}/sub`); + shell.ln('-s', 'file.txt', 'foo.lnk'); + shell.ln('-s', 'file.txt', 'sym.lnk'); + shell.cd('sub1'); + shell.ln('-s', '../file.txt', 'foo.lnk'); + shell.ln('-s', '../file.txt', 'sym.lnk'); + + // Ensure file reads from proper source + t.is(shell.cat('file.txt').toString(), 'test1\n'); + t.is(shell.cat('foo.lnk').toString(), 'test1\n'); + t.is(shell.cat('sym.lnk').toString(), 'test1\n'); + t.truthy(shell.test('-L', 'foo.lnk')); + t.truthy(shell.test('-L', 'sym.lnk')); + shell.cd('../..'); + shell.cp('-rL', 'sub/', 'new/'); + shell.cd('new'); + + // Ensure copies of files are symlinks by updating file contents. + shell.cp('-f', '../../resources/file2.txt', 'file.txt'); + t.is(shell.cat('file.txt').toString(), 'test2\n'); + // Ensure other files have not changed. + t.is(shell.cat('foo.lnk').toString(), 'test1\n'); + t.is(shell.cat('sym.lnk').toString(), 'test1\n'); + + // Ensure the links are converted to files. + t.falsy(shell.test('-L', 'foo.lnk')); + t.falsy(shell.test('-L', 'sym.lnk')); + + // Ensure other files have not changed. + shell.cd('sub1'); + shell.cp('-f', '../../../resources/file2.txt', 'file.txt'); + t.is(shell.cat('file.txt').toString(), 'test2\n'); + t.is(shell.cat('foo.lnk').toString(), 'test1\n'); + t.is(shell.cat('sym.lnk').toString(), 'test1\n'); + + // Ensure the links are converted to files + t.falsy(shell.test('-L', 'foo.lnk')); + t.falsy(shell.test('-L', 'sym.lnk')); + }); +}); diff --git a/test/cp.js b/test/cp.js deleted file mode 100644 index 9adf3895d..000000000 --- a/test/cp.js +++ /dev/null @@ -1,577 +0,0 @@ -var shell = require('..'); -var common = require('../src/common'); - -var assert = require('assert'); -var fs = require('fs'); -var numLines = require('./utils/utils').numLines; - -shell.config.silent = true; - -var isWindows = common.platform === 'win'; - -// On Windows, symlinks for files need admin permissions. This helper -// skips certain tests if we are on Windows and got an EPERM error -function skipOnWinForEPERM(action, test) { - action(); - var error = shell.error(); - - if (isWindows && error && /EPERM:/.test(error)) { - console.log('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); - } else { - test(); - } -} - - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result = shell.cp(); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cp: missing and/or '); - -result = shell.cp('file1'); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cp: missing and/or '); - -result = shell.cp('-f'); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cp: missing and/or '); - -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-@', 'resources/file1', 'tmp/file1'); // option not supported, files OK -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/file1'), false); -assert.equal(result.stderr, 'cp: option not recognized: @'); - -result = shell.cp('-Z', 'asdfasdf', 'tmp/file2'); // option not supported, files NOT OK -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/file2'), false); -assert.equal(result.stderr, 'cp: option not recognized: Z'); - -result = shell.cp('asdfasdf', 'tmp'); // source does not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(numLines(result.stderr), 1); -assert.equal(fs.existsSync('tmp/asdfasdf'), false); -assert.equal(result.stderr, 'cp: no such file or directory: asdfasdf'); - -result = shell.cp('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(numLines(result.stderr), 2); -assert.equal(fs.existsSync('tmp/asdfasdf1'), false); -assert.equal(fs.existsSync('tmp/asdfasdf2'), false); -assert.equal(result.stderr, 'cp: no such file or directory: asdfasdf1\ncp: no such file or directory: asdfasdf2'); - -result = shell.cp('asdfasdf1', 'asdfasdf2', 'resources/file1'); // too many sources (dest is file) -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'cp: dest is not a directory (too many sources)'); - -result = shell.cp('resources/file1', 'resources/file2', 'tmp/a_file'); // too many sources -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/a_file'), false); -assert.equal(result.stderr, 'cp: dest is not a directory (too many sources)'); - -// -// Valids -// - -var oldContents = shell.cat('resources/file2').toString(); -result = shell.cp('-n', 'resources/file1', 'resources/file2'); // dest already exists -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.equal(result.stderr, ''); -assert.equal(shell.cat('resources/file2').toString(), oldContents); - -// -f by default -result = shell.cp('resources/file2', 'resources/copyfile2'); -result = shell.cp('resources/file1', 'resources/file2'); // dest already exists -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.ok(!result.stderr); -assert.equal(shell.cat('resources/file1') + '', shell.cat('resources/file2') + ''); // after cp -shell.mv('resources/copyfile2', 'resources/file2'); // restore -assert.ok(!shell.error()); - -// -f (explicitly) -result = shell.cp('resources/file2', 'resources/copyfile2'); -result = shell.cp('-f', 'resources/file1', 'resources/file2'); // dest already exists -assert.ok(!shell.error()); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(shell.cat('resources/file1') + '', shell.cat('resources/file2') + ''); // after cp -shell.mv('resources/copyfile2', 'resources/file2'); // restore -assert.ok(!shell.error()); -assert.equal(result.code, 0); - -// simple - to dir -result = shell.cp('resources/file1', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); - -// simple - to file -result = shell.cp('resources/file2', 'tmp/file2'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file2'), true); - -// simple - file list -shell.rm('-rf', 'tmp/*'); -result = shell.cp('resources/file1', 'resources/file2', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); - -// simple - file list, array syntax -shell.rm('-rf', 'tmp/*'); -result = shell.cp(['resources/file1', 'resources/file2'], 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); - -result = shell.cp('resources/file2', 'tmp/file3'); -assert.equal(fs.existsSync('tmp/file3'), true); -result = shell.cp('-f', 'resources/file2', 'tmp/file3'); // file exists, but -f specified -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file3'), true); - -// glob -shell.rm('-rf', 'tmp/*'); -result = shell.cp('resources/file?', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1')); -assert.ok(fs.existsSync('tmp/file2')); -assert.ok(!fs.existsSync('tmp/file1.js')); -assert.ok(!fs.existsSync('tmp/file2.js')); -assert.ok(!fs.existsSync('tmp/file1.txt')); -assert.ok(!fs.existsSync('tmp/file2.txt')); - -// wildcard -shell.rm('tmp/file1', 'tmp/file2'); -result = shell.cp('resources/file*', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1')); -assert.ok(fs.existsSync('tmp/file2')); -assert.ok(fs.existsSync('tmp/file1.js')); -assert.ok(fs.existsSync('tmp/file2.js')); -assert.ok(fs.existsSync('tmp/file1.txt')); -assert.ok(fs.existsSync('tmp/file2.txt')); - -// recursive, with regular files -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-R', 'resources/file1', 'resources/file2', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1')); -assert.ok(fs.existsSync('tmp/file2')); - -// recursive, nothing exists -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-R', 'resources/cp', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(shell.ls('-R', 'resources/cp') + '', shell.ls('-R', 'tmp/cp') + ''); - -// recursive, nothing exists, source ends in '/' (see Github issue #15) -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-R', 'resources/cp/', 'tmp/'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(shell.ls('-R', 'resources/cp') + '', shell.ls('-R', 'tmp/cp') + ''); - -// recursive, globbing regular files with extension (see Github issue #376) -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-R', 'resources/file*.txt', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1.txt')); -assert.ok(fs.existsSync('tmp/file2.txt')); - -// recursive, copying one regular file (also related to Github issue #376) -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-R', 'resources/file1.txt', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/file1.txt')); -assert.ok(!fs.statSync('tmp/file1.txt').isDirectory()); // don't let it be a dir - -// recursive, everything exists, no force flag -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-R', 'resources/cp', 'tmp'); -result = shell.cp('-R', 'resources/cp', 'tmp'); -assert.equal(shell.error(), null); // crash test only -assert.ok(!result.stderr); -assert.equal(result.code, 0); - -if (process.platform !== 'win32') { - // Recursive, everything exists, overwrite a real file with a link (if same name) - // Because -R implies to not follow links! - shell.rm('-rf', 'tmp/*'); - shell.cp('-R', 'resources/cp/*', 'tmp'); - assert.ok(fs.lstatSync('tmp/links/sym.lnk').isSymbolicLink()); // this one is a link - assert.ok(!(fs.lstatSync('tmp/fakeLinks/sym.lnk').isSymbolicLink())); // this one isn't - assert.notEqual(shell.cat('tmp/links/sym.lnk').toString(), shell.cat('tmp/fakeLinks/sym.lnk').toString()); - result = shell.cp('-R', 'tmp/links/*', 'tmp/fakeLinks'); - assert.equal(shell.error(), null); - assert.ok(!result.stderr); - assert.equal(result.code, 0); - assert.ok(fs.lstatSync('tmp/links/sym.lnk').isSymbolicLink()); // this one is a link - assert.ok(fs.lstatSync('tmp/fakeLinks/sym.lnk').isSymbolicLink()); // this one is now a link - assert.equal(shell.cat('tmp/links/sym.lnk').toString(), shell.cat('tmp/fakeLinks/sym.lnk').toString()); - - // Recursive, everything exists, overwrite a real file *by following a link* - // Because missing the -R implies -L. - shell.rm('-rf', 'tmp/*'); - shell.cp('-R', 'resources/cp/*', 'tmp'); - assert.ok(fs.lstatSync('tmp/links/sym.lnk').isSymbolicLink()); // this one is a link - assert.ok(!(fs.lstatSync('tmp/fakeLinks/sym.lnk').isSymbolicLink())); // this one isn't - assert.notEqual(shell.cat('tmp/links/sym.lnk').toString(), shell.cat('tmp/fakeLinks/sym.lnk').toString()); - result = shell.cp('tmp/links/*', 'tmp/fakeLinks'); // don't use -R - assert.equal(shell.error(), null); - assert.ok(!result.stderr); - assert.equal(result.code, 0); - assert.ok(fs.lstatSync('tmp/links/sym.lnk').isSymbolicLink()); // this one is a link - assert.ok(!fs.lstatSync('tmp/fakeLinks/sym.lnk').isSymbolicLink()); // this one is still not a link - // But it still follows the link - assert.equal(shell.cat('tmp/links/sym.lnk').toString(), shell.cat('tmp/fakeLinks/sym.lnk').toString()); -} - -// recursive, everything exists, with force flag -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-R', 'resources/cp', 'tmp'); -shell.ShellString('changing things around').to('tmp/cp/dir_a/z'); -assert.notEqual(shell.cat('resources/cp/dir_a/z') + '', shell.cat('tmp/cp/dir_a/z') + ''); // before cp -result = shell.cp('-Rf', 'resources/cp', 'tmp'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(shell.cat('resources/cp/dir_a/z') + '', shell.cat('tmp/cp/dir_a/z') + ''); // after cp - -// recursive, creates dest dir since it's only one level deep (see Github issue #44) -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-r', 'resources/issue44', 'tmp/dir2'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(shell.ls('-R', 'resources/issue44') + '', shell.ls('-R', 'tmp/dir2') + ''); -assert.equal(shell.cat('resources/issue44/main.js') + '', shell.cat('tmp/dir2/main.js') + ''); - -// recursive, does *not* create dest dir since it's too deep (see Github issue #44) -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-r', 'resources/issue44', 'tmp/dir2/dir3'); -assert.ok(shell.error()); -assert.equal(result.stderr, 'cp: cannot create directory \'tmp/dir2/dir3\': No such file or directory'); -assert.equal(result.code, 1); -assert.equal(fs.existsSync('tmp/dir2'), false); - -// recursive, copies entire directory -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-r', 'resources/cp/dir_a', 'tmp/dest'); -assert.equal(shell.error(), null); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/dest/z'), true); - -// recursive, with trailing slash, does the exact same -shell.rm('-rf', 'tmp/*'); -result = shell.cp('-r', 'resources/cp/dir_a/', 'tmp/dest'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/dest/z'), true); - -// On Windows, permission bits are quite different so skip those tests for now -if (common.platform !== 'win') { - // preserve mode bits - shell.rm('-rf', 'tmp/*'); - var execBit = parseInt('001', 8); - assert.equal(fs.statSync('resources/cp-mode-bits/executable').mode & execBit, execBit); - shell.cp('resources/cp-mode-bits/executable', 'tmp/executable'); - assert.equal(fs.statSync('resources/cp-mode-bits/executable').mode, fs.statSync('tmp/executable').mode); -} - -// Make sure hidden files are copied recursively -shell.rm('-rf', 'tmp/'); -result = shell.cp('-r', 'resources/ls/', 'tmp/'); -assert.ok(!shell.error()); -assert.ok(!result.stderr); -assert.equal(result.code, 0); -assert.ok(fs.existsSync('tmp/.hidden_file')); - -// no-recursive will copy regular files only -shell.rm('-rf', 'tmp/'); -shell.mkdir('tmp/'); -result = shell.cp('resources/file1.txt', 'resources/ls/', 'tmp/'); -assert.ok(shell.error()); -assert.ok(!fs.existsSync('tmp/.hidden_file')); // doesn't copy dir contents -assert.ok(!fs.existsSync('tmp/ls')); // doesn't copy dir itself -assert.ok(fs.existsSync('tmp/file1.txt')); - -// no-recursive will copy regular files only -shell.rm('-rf', 'tmp/'); -shell.mkdir('tmp/'); -result = shell.cp('resources/file1.txt', 'resources/file2.txt', 'resources/cp', - 'resources/ls/', 'tmp/'); -assert.ok(shell.error()); -assert.ok(!fs.existsSync('tmp/.hidden_file')); // doesn't copy dir contents -assert.ok(!fs.existsSync('tmp/ls')); // doesn't copy dir itself -assert.ok(!fs.existsSync('tmp/a')); // doesn't copy dir contents -assert.ok(!fs.existsSync('tmp/cp')); // doesn't copy dir itself -assert.ok(fs.existsSync('tmp/file1.txt')); -assert.ok(fs.existsSync('tmp/file2.txt')); - -if (process.platform !== 'win32') { - // -R implies -P - shell.rm('-rf', 'tmp/*'); - shell.cp('-R', 'resources/cp/links/sym.lnk', 'tmp'); - assert.ok(fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); - - // using -P explicitly works - shell.rm('-rf', 'tmp/*'); - shell.cp('-P', 'resources/cp/links/sym.lnk', 'tmp'); - assert.ok(fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); - - // using -PR on a link to a folder does not follow the link - shell.rm('-rf', 'tmp/*'); - shell.cp('-PR', 'resources/cp/symFolder', 'tmp'); - assert.ok(fs.lstatSync('tmp/symFolder').isSymbolicLink()); - - // -L overrides -P for copying directory - shell.rm('-rf', 'tmp/*'); - shell.cp('-LPR', 'resources/cp/symFolder', 'tmp'); - assert.ok(!fs.lstatSync('tmp/symFolder').isSymbolicLink()); - assert.ok(!fs.lstatSync('tmp/symFolder/sym.lnk').isSymbolicLink()); - - // Recursive, copies entire directory with no symlinks and -L option does not cause change in behavior. - shell.rm('-rf', 'tmp/*'); - result = shell.cp('-rL', 'resources/cp/dir_a', 'tmp/dest'); - assert.equal(shell.error(), null); - assert.ok(!result.stderr); - assert.equal(result.code, 0); - assert.equal(fs.existsSync('tmp/dest/z'), true); -} - -// -u flag won't overwrite newer files -shell.rm('-rf', 'tmp/*'); -shell.touch('tmp/file1.js'); -shell.cp('-u', 'resources/file1.js', 'tmp'); -assert.ok(!shell.error()); -assert.notEqual(shell.cat('resources/file1.js').toString(), shell.cat('tmp/file1.js').toString()); - -// -u flag does overwrite older files -shell.rm('-rf', 'tmp/*'); -shell.touch({ '-d': new Date(10) }, 'tmp/file1.js'); // really old file -shell.cp('-u', 'resources/file1.js', 'tmp'); -assert.ok(!shell.error()); -assert.equal(shell.cat('resources/file1.js').toString(), shell.cat('tmp/file1.js').toString()); - -// -u flag works even if it's not overwriting a file -shell.rm('-rf', 'tmp/*'); -shell.cp('-u', 'resources/file1.js', 'tmp'); -assert.ok(!shell.error()); -assert.equal(shell.cat('resources/file1.js').toString(), shell.cat('tmp/file1.js').toString()); - -// -u flag works correctly recursively -shell.rm('-rf', 'tmp/*'); -shell.mkdir('tmp/foo'); -[1, 2, 3].forEach(function (num) { - new shell.ShellString('old\n').to('tmp/foo/file' + num); - shell.touch({ '-d': new Date(10) }, 'tmp/foo/file' + num); -}); -shell.mkdir('tmp/bar'); -[1, 2, 3].forEach(function (num) { - new shell.ShellString('new\n').to('tmp/bar/file' + num); - shell.touch({ '-d': new Date(1000) }, 'tmp/bar/file' + num); -}); -// put one new one in the foo directory -new shell.ShellString('newest\n').to('tmp/foo/file3'); -shell.touch({ '-d': new Date(10000) }, 'tmp/foo/file3'); -shell.cp('-u', 'tmp/foo/*', 'tmp/bar'); -assert.ok(!shell.error()); -assert.equal(shell.cat('tmp/bar/*').toString(), 'new\nnew\nnewest\n'); - -// using -R on a link to a folder *does* follow the link -shell.rm('-rf', 'tmp/*'); -shell.cp('-R', 'resources/cp/symFolder', 'tmp'); -assert.ok(!fs.lstatSync('tmp/symFolder').isSymbolicLink()); - -// Without -R, -L is implied -shell.rm('-rf', 'tmp/*'); -shell.cp('resources/cp/links/sym.lnk', 'tmp'); -assert.ok(!fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); - -// -L explicitly works -shell.rm('-rf', 'tmp/*'); -shell.cp('-L', 'resources/cp/links/sym.lnk', 'tmp'); -assert.ok(!fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); - -// using -LR does not imply -P -shell.rm('-rf', 'tmp/*'); -shell.cp('-LR', 'resources/cp/links/sym.lnk', 'tmp'); -assert.ok(!fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); - -// using -LR also works recursively on directories containing links -shell.rm('-rf', 'tmp/*'); -shell.cp('-LR', 'resources/cp/links', 'tmp'); -assert.ok(!fs.lstatSync('tmp/links/sym.lnk').isSymbolicLink()); - -// -L always overrides a -P -shell.rm('-rf', 'tmp/*'); -shell.cp('-LP', 'resources/cp/links/sym.lnk', 'tmp'); -assert.ok(!fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); -shell.rm('-rf', 'tmp/*'); -shell.cp('-LPR', 'resources/cp/links/sym.lnk', 'tmp'); -assert.ok(!fs.lstatSync('tmp/sym.lnk').isSymbolicLink()); - -// Make sure max depth doesn't limit shallow directory structures -shell.rm('-rf', 'tmp/'); -shell.mkdir('tmp/'); -var oldMaxDepth = shell.config.maxdepth; -shell.config.maxdepth = 3; -shell.mkdir('tmp/foo'); -for (var k = 0; k < 5; k++) { - shell.mkdir('tmp/foo/tmp' + k); -} -shell.cp('-r', 'tmp/foo', 'tmp/bar'); -assert.equal(shell.ls('tmp/foo').stdout, shell.ls('tmp/bar').stdout); -shell.config.maxdepth = oldMaxDepth; - -// Test max depth. -shell.rm('-rf', 'tmp/'); -shell.mkdir('tmp/'); -shell.config.maxdepth = 32; -var directory = ''; -var i; -for (i = 1; i < 40; i++) { - directory += '/' + i; -} -var directory32deep = ''; -for (i = 1; i < 32; i++) { - directory32deep += '/' + i; -} -shell.mkdir('-p', 'tmp/0' + directory); -shell.cp('-r', 'tmp/0', 'tmp/copytestdepth'); -// Check full directory exists. -assert.ok(shell.test('-d', 'tmp/0/' + directory)); -// Check full copy of directory does not exist. -assert.ok(!shell.test('-d', 'tmp/copytestdepth' + directory)); -// Check last directory to exist is bellow maxdepth. -assert.ok(shell.test('-d', 'tmp/copytestdepth' + directory32deep)); -assert.ok(!shell.test('-d', 'tmp/copytestdepth' + directory32deep + '/32')); - -// Only complete sym link checks if script has permission to do so. -skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'tmp/0', 'tmp/symlinktest'), function () { - if (!shell.test('-L', 'tmp/symlinktest')) { - return; - } - shell.rm('-rf', 'tmp/symlinktest'); - // Create sym links to check for cycle. - shell.cd('tmp/0/1/2/3/4'); - shell.ln('-s', '../../../2', 'link'); - shell.ln('-s', './5/6/7', 'link1'); - shell.cd('../../../../../..'); - assert.ok(shell.test('-d', 'tmp/')); - - shell.rm('-fr', 'tmp/copytestdepth'); - shell.cp('-r', 'tmp/0', 'tmp/copytestdepth'); - assert.ok(shell.test('-d', 'tmp/copytestdepth/1/2/3/4/link/3/4/link/3/4')); - - // Test copying of symlinked files cp -L. - shell.rm('-fr', 'tmp'); - shell.mkdir('-p', 'tmp/sub'); - shell.mkdir('-p', 'tmp/new'); - shell.cp('-f', 'resources/file1.txt', 'tmp/sub/file.txt'); - shell.cd('tmp/sub'); - shell.ln('-s', 'file.txt', 'foo.lnk'); - shell.ln('-s', 'file.txt', 'sym.lnk'); - shell.cd('..'); - shell.cp('-L', 'sub/*', 'new/'); - - // Ensure copies are files. - shell.cd('new'); - shell.cp('-f', '../../resources/file2.txt', 'file.txt'); - assert.equal(shell.cat('file.txt').toString(), 'test2\n'); - // Ensure other files have not changed. - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - - // Ensure the links are converted to files. - assert.equal(shell.test('-L', 'foo.lnk'), false); - assert.equal(shell.test('-L', 'sym.lnk'), false); - shell.cd('../..'); - - // Test with recursive option and symlinks. - - shell.rm('-fr', 'tmp'); - shell.mkdir('-p', 'tmp/sub/sub1'); - shell.cp('-f', 'resources/file1.txt', 'tmp/sub/file.txt'); - shell.cp('-f', 'resources/file1.txt', 'tmp/sub/sub1/file.txt'); - shell.cd('tmp/sub'); - shell.ln('-s', 'file.txt', 'foo.lnk'); - shell.ln('-s', 'file.txt', 'sym.lnk'); - shell.cd('sub1'); - shell.ln('-s', '../file.txt', 'foo.lnk'); - shell.ln('-s', '../file.txt', 'sym.lnk'); - - // Ensure file reads from proper source. - assert.equal(shell.cat('file.txt').toString(), 'test1\n'); - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - assert.equal(shell.test('-L', 'foo.lnk'), true); - assert.equal(shell.test('-L', 'sym.lnk'), true); - shell.cd('../..'); - shell.cp('-rL', 'sub/', 'new/'); - shell.cd('new'); - - // Ensure copies of files are symlinks by updating file contents. - shell.cp('-f', '../../resources/file2.txt', 'file.txt'); - assert.equal(shell.cat('file.txt').toString(), 'test2\n'); - // Ensure other files have not changed. - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - - // Ensure the links are converted to files. - assert.equal(shell.test('-L', 'foo.lnk'), false); - assert.equal(shell.test('-L', 'sym.lnk'), false); - - shell.cd('sub1'); - shell.cp('-f', '../../../resources/file2.txt', 'file.txt'); - assert.equal(shell.cat('file.txt').toString(), 'test2\n'); - // Ensure other files have not changed. - assert.equal(shell.cat('foo.lnk').toString(), 'test1\n'); - assert.equal(shell.cat('sym.lnk').toString(), 'test1\n'); - - // Ensure the links are converted to files. - assert.equal(shell.test('-L', 'foo.lnk'), false); - assert.equal(shell.test('-L', 'sym.lnk'), false); -}); - -shell.exit(123); From 106e05fc4549be3f87a0f5bf4dee1963ed573c4b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 23 Nov 2016 22:38:46 -0800 Subject: [PATCH 047/338] test: refactor config tests to AVA (#571) --- ava-test/config.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++ test/config.js | 69 ------------------------------------------ 2 files changed, 75 insertions(+), 69 deletions(-) create mode 100644 ava-test/config.js delete mode 100644 test/config.js diff --git a/ava-test/config.js b/ava-test/config.js new file mode 100644 index 000000000..83c45ffda --- /dev/null +++ b/ava-test/config.js @@ -0,0 +1,75 @@ +import test from 'ava'; + +import shell from '..'; +import common from '../src/common'; +import utils from './utils/utils'; + +// +// Valids +// + +// +// config.silent +// + +test('config.silent is false by default', t => { + t.falsy(shell.config.silent); +}); + +test('config.silent can be set to true', t => { + shell.config.silent = true; + t.truthy(shell.config.silent); +}); + +test('config.silent can be set to false', t => { + shell.config.silent = false; + t.falsy(shell.config.silent); +}); + +// +// config.fatal +// + +test.cb('config.fatal = false', t => { + t.falsy(shell.config.fatal); + const script = 'require(\'../global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; + utils.runScript(script, (err, stdout) => { + t.truthy(stdout.match('got here')); + t.end(); + }); +}); + +test.cb('config.fatal = true', t => { + const script = 'require(\'../global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; + utils.runScript(script, (err, stdout) => { + t.falsy(stdout.match('got here')); + t.end(); + }); +}); + +// +// config.globOptions +// + +test('Expands to directories by default', t => { + const result = common.expand(['resources/*a*']); + t.is(result.length, 5); + t.truthy(result.indexOf('resources/a.txt') > -1); + t.truthy(result.indexOf('resources/badlink') > -1); + t.truthy(result.indexOf('resources/cat') > -1); + t.truthy(result.indexOf('resources/head') > -1); + t.truthy(result.indexOf('resources/external') > -1); +}); + +test( + 'Check to make sure options get passed through (nodir is an example)', + t => { + shell.config.globOptions = { nodir: true }; + const result = common.expand(['resources/*a*']); + t.is(result.length, 2); + t.truthy(result.indexOf('resources/a.txt') > -1); + t.truthy(result.indexOf('resources/badlink') > -1); + t.truthy(result.indexOf('resources/cat') < 0); + t.truthy(result.indexOf('resources/external') < 0); + } +); diff --git a/test/config.js b/test/config.js deleted file mode 100644 index 8392e76d6..000000000 --- a/test/config.js +++ /dev/null @@ -1,69 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var child = require('child_process'); -var common = require('../src/common'); - -// -// config.silent -// - -assert.equal(shell.config.silent, false); // default - -shell.config.silent = true; -assert.equal(shell.config.silent, true); - -shell.config.silent = false; -assert.equal(shell.config.silent, false); - -// -// config.fatal -// - -assert.equal(shell.config.fatal, false); // default - -// -// config.fatal = false -// -shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript' + Math.random() + '.js'; -var script = 'require(\'../../global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; -shell.ShellString(script).to(file); -child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err, stdout) { - assert.ok(stdout.match('got here')); - - // - // config.fatal = true - // - shell.mkdir('-p', 'tmp'); - file = 'tmp/tempscript' + Math.random() + '.js'; - script = 'require(\'../../global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; - shell.ShellString(script).to(file); - child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err2, stdout2) { - assert.ok(!stdout2.match('got here')); - - shell.exit(123); - }); -}); - -// -// config.globOptions -// - -// Expands to directories by default -var result = common.expand(['resources/*a*']); -assert.equal(result.length, 5); -assert.ok(result.indexOf('resources/a.txt') > -1); -assert.ok(result.indexOf('resources/badlink') > -1); -assert.ok(result.indexOf('resources/cat') > -1); -assert.ok(result.indexOf('resources/head') > -1); -assert.ok(result.indexOf('resources/external') > -1); - -// Check to make sure options get passed through (nodir is an example) -shell.config.globOptions = { nodir: true }; -result = common.expand(['resources/*a*']); -assert.equal(result.length, 2); -assert.ok(result.indexOf('resources/a.txt') > -1); -assert.ok(result.indexOf('resources/badlink') > -1); -assert.ok(result.indexOf('resources/cat') < 0); -assert.ok(result.indexOf('resources/external') < 0); From 612e51b89713faff363e4b328375062b43293db9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 23 Nov 2016 23:05:08 -0800 Subject: [PATCH 048/338] test: refactor to tests to AVA (#577) --- ava-test/to.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ test/to.js | 47 --------------------------------------- 2 files changed, 60 insertions(+), 47 deletions(-) create mode 100644 ava-test/to.js delete mode 100644 test/to.js diff --git a/ava-test/to.js b/ava-test/to.js new file mode 100644 index 000000000..e9584f47f --- /dev/null +++ b/ava-test/to.js @@ -0,0 +1,60 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('Normal strings don\'t have \'.to()\' anymore', t => { + const str = 'hello world'; + t.is(typeof str.to, 'undefined'); +}); + +test('no file argument', t => { + shell.ShellString('hello world').to(); + t.truthy(shell.error()); +}); + +test('cannot write to a non-existent directory', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + shell.ShellString('hello world').to('/asdfasdf/file'); + t.truthy(shell.error()); +}); + +// +// Valids +// + +test('can be chained', t => { + shell.ShellString('hello world').to(`${t.context.tmp}/to1`).to(`${t.context.tmp}/to2`); + let result = shell.cat(`${t.context.tmp}/to1`); + t.falsy(shell.error()); + t.is(result.toString(), 'hello world'); + result = shell.cat(`${t.context.tmp}/to2`); + t.falsy(shell.error()); + t.is(result.toString(), 'hello world'); +}); + +test('With a glob', t => { + shell.touch(`${t.context.tmp}/to1`); + shell.ShellString('goodbye').to(`${t.context.tmp}/t*1`); + t.falsy(fs.existsSync(`${t.context.tmp}/t*1`), 'globs are not interpreted literally'); + const result = shell.cat(`${t.context.tmp}/to1`); + t.falsy(shell.error()); + t.is(result.toString(), 'goodbye'); +}); diff --git a/test/to.js b/test/to.js deleted file mode 100644 index 1b5b86805..000000000 --- a/test/to.js +++ /dev/null @@ -1,47 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -// Normal strings don't have '.to()' anymore -var str = 'hello world'; -assert.ok(typeof str.to === 'undefined'); - -shell.ShellString('hello world').to(); -assert.ok(shell.error()); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -shell.ShellString('hello world').to('/asdfasdf/file'); -assert.ok(shell.error()); - -// -// Valids -// - -var result; - -shell.ShellString('hello world').to('tmp/to1').to('tmp/to2'); -result = shell.cat('tmp/to1'); -assert.equal(shell.error(), null); -assert.equal(result, 'hello world'); -result = shell.cat('tmp/to2'); -assert.equal(shell.error(), null); -assert.equal(result, 'hello world'); - -// With a glob -shell.ShellString('goodbye').to('tmp/t*1'); -assert.equal(fs.existsSync('tmp/t*1'), false, 'globs are not interpreted literally'); -result = shell.cat('tmp/to1'); -assert.equal(shell.error(), null); -assert.equal(result, 'goodbye'); - -shell.exit(123); From 2d1d68e9eae167511887deab8ce0c1624b09bb8a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 23 Nov 2016 23:09:30 -0800 Subject: [PATCH 049/338] test: refactor chmod tests to AVA (#569) --- ava-test/chmod.js | 358 ++++++++++++++++++++++++++++++++++++++++++++++ test/chmod.js | 199 -------------------------- 2 files changed, 358 insertions(+), 199 deletions(-) create mode 100644 ava-test/chmod.js delete mode 100644 test/chmod.js diff --git a/ava-test/chmod.js b/ava-test/chmod.js new file mode 100644 index 000000000..3ed210e5b --- /dev/null +++ b/ava-test/chmod.js @@ -0,0 +1,358 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +let TMP; +const BITMASK = parseInt('777', 8); + +test.before(() => { + TMP = utils.getTempDir(); + shell.cp('-r', 'resources', TMP); + shell.config.silent = true; +}); + +test.after(() => { + shell.rm('-rf', TMP); +}); + +// +// Invalids +// + +test('invalid permissions', t => { + let result = shell.chmod('blah'); + t.truthy(shell.error()); + t.is(result.code, 1); + result = shell.chmod('893', `${TMP}/chmod`); // invalid permissions - mode must be in octal + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('Basic usage with octal codes', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('755', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + parseInt('755', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + parseInt('644', 8) + ); + } +}); + +test('symbolic mode', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('o+x', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('007', 8), + parseInt('005', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); + } +}); + +test('symbolic mode, without group', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('+x', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + parseInt('755', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); + } +}); + +test('Test setuid', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('u+s', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('4000', 8), + parseInt('4000', 8) + ); + result = shell.chmod('u-s', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + parseInt('644', 8) + ); + + // according to POSIX standards at http://linux.die.net/man/1/chmod, + // setuid is never cleared from a directory unless explicitly asked for. + result = shell.chmod('u+s', `${TMP}/chmod/c`); + + t.is(result.code, 0); + result = shell.chmod('755', `${TMP}/chmod/c`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/c`).mode & parseInt('4000', 8), + parseInt('4000', 8) + ); + result = shell.chmod('u-s', `${TMP}/chmod/c`); + t.is(result.code, 0); + } +}); + +test('Test setgid', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('g+s', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('2000', 8), + parseInt('2000', 8) + ); + result = shell.chmod('g-s', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + parseInt('644', 8) + ); + } +}); + +test('Test sticky bit', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('+t', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('1000', 8), + parseInt('1000', 8) + ); + result = shell.chmod('-t', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + parseInt('644', 8) + ); + t.is(fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('1000', 8), 0); + } +}); + +test('Test directories', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('a-w', `${TMP}/chmod/b/a/b`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/b/a/b`).mode & BITMASK, + parseInt('555', 8) + ); + result = shell.chmod('755', `${TMP}/chmod/b/a/b`); + t.is(result.code, 0); + } +}); + +test('Test recursion', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('-R', 'a+w', `${TMP}/chmod/b`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/b/a/b`).mode & BITMASK, + BITMASK + ); + result = shell.chmod('-R', '755', `${TMP}/chmod/b`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/b/a/b`).mode & BITMASK, + parseInt('755', 8) + ); + } +}); + +test('Test symbolic links w/ recursion - WARNING: *nix only', t => { + if (process.platform !== 'win32') { + fs.symlinkSync(`${TMP}/chmod/b/a`, `${TMP}/chmod/a/b/c/link`, 'dir'); + let result = shell.chmod('-R', 'u-w', `${TMP}/chmod/a/b`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/a/b/c`).mode & parseInt('700', 8), + parseInt('500', 8) + ); + t.is( + fs.statSync(`${TMP}/chmod/b/a`).mode & parseInt('700', 8), + parseInt('700', 8) + ); + result = shell.chmod('-R', 'u+w', `${TMP}/chmod/a/b`); + t.is(result.code, 0); + fs.unlinkSync(`${TMP}/chmod/a/b/c/link`); + } +}); + +test('Test combinations', t => { + let result = shell.chmod('a-rwx', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('000', 8), + parseInt('000', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); +}); + +test('multiple symbolic modes', t => { + let result = shell.chmod('a-rwx,u+r', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('400', 8), + parseInt('400', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); +}); + +test('multiple symbolic modes #2', t => { + let result = shell.chmod('a-rwx,u+rw', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + parseInt('600', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); +}); + +test('multiple symbolic modes #3', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('a-rwx,u+rwx', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('700', 8), + parseInt('700', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); + } +}); + +test('u+rw', t => { + let result = shell.chmod('000', `${TMP}/chmod/file1`); + t.is(result.code, 0); + result = shell.chmod('u+rw', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + parseInt('600', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); +}); + +test('u+wx', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('000', `${TMP}/chmod/file1`); + t.is(result.code, 0); + result = shell.chmod('u+wx', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('300', 8), + parseInt('300', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); + } +}); + +test('Multiple symbolic modes at once', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('000', `${TMP}/chmod/file1`); + t.is(result.code, 0); + result = shell.chmod('u+r,g+w,o+x', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('421', 8), + parseInt('421', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); + } +}); + +test('u+rw,g+wx', t => { + if (process.platform !== 'win32') { + let result = shell.chmod('000', `${TMP}/chmod/file1`); + t.is(result.code, 0); + result = shell.chmod('u+rw,g+wx', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('630', 8), + parseInt('630', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); + } +}); + +test('u-x,g+rw', t => { + let result = shell.chmod('700', `${TMP}/chmod/file1`); + t.is(result.code, 0); + result = shell.chmod('u-x,g+rw', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('660', 8), + parseInt('660', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); +}); + +test('a-rwx,u+rw', t => { + let result = shell.chmod('a-rwx,u+rw', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + parseInt('600', 8) + ); + result = shell.chmod('a-rwx,u+rw', `${TMP}/chmod/file1`); + t.is(result.code, 0); + t.is( + fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + parseInt('600', 8) + ); + result = shell.chmod('644', `${TMP}/chmod/file1`); + t.is(result.code, 0); +}); + +test('Numeric modes', t => { + let result = shell.chmod('744', `${TMP}/chmod/xdir`); + t.is(result.code, 0); + result = shell.chmod('644', `${TMP}/chmod/xdir/file`); + t.is(result.code, 0); + result = shell.chmod('744', `${TMP}/chmod/xdir/deep`); + t.is(result.code, 0); + result = shell.chmod('644', `${TMP}/chmod/xdir/deep/file`); + t.is(result.code, 0); + result = shell.chmod('-R', 'a+X', `${TMP}/chmod/xdir`); + t.is(result.code, 0); +}); + +test('Make sure chmod succeeds for a variety of octal codes', t => { + if (process.platform !== 'win32') { + t.is( + fs.statSync(`${TMP}/chmod/xdir`).mode & parseInt('755', 8), + parseInt('755', 8) + ); + t.is( + fs.statSync(`${TMP}/chmod/xdir/file`).mode & parseInt('644', 8), + parseInt('644', 8) + ); + t.is( + fs.statSync(`${TMP}/chmod/xdir/deep`).mode & parseInt('755', 8), + parseInt('755', 8) + ); + t.is( + fs.statSync(`${TMP}/chmod/xdir/deep/file`).mode & parseInt('644', 8), + parseInt('644', 8) + ); + } +}); diff --git a/test/chmod.js b/test/chmod.js deleted file mode 100644 index 16dec0e28..000000000 --- a/test/chmod.js +++ /dev/null @@ -1,199 +0,0 @@ -var shell = require('..'); -var common = require('../src/common'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -// -// Invalids -// - -var result = shell.chmod('blah'); // missing args -assert.ok(shell.error()); -assert.equal(result.code, 1); -result = shell.chmod('893', 'resources/chmod'); // invalid permissions - mode must be in octal -assert.ok(shell.error()); -assert.equal(result.code, 1); - -// -// Valids -// - -// On Windows, chmod acts VERY differently so skip those tests for now -if (common.platform === 'win') shell.exit(123); - -// Test files - the bitmasking is to ignore the upper bits. -result = shell.chmod('755', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('755', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); - -result = shell.chmod('o+x', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('007', 8), parseInt('005', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('+x', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('755', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -// Test setuid -result = shell.chmod('u+s', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('4000', 8), parseInt('4000', 8)); -result = shell.chmod('u-s', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); - -// according to POSIX standards at http://linux.die.net/man/1/chmod, -// setuid is never cleared from a directory unless explicitly asked for. -result = shell.chmod('u+s', 'resources/chmod/c'); -assert.equal(result.code, 0); -result = shell.chmod('755', 'resources/chmod/c'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/c').mode & parseInt('4000', 8), parseInt('4000', 8)); -result = shell.chmod('u-s', 'resources/chmod/c'); -assert.equal(result.code, 0); - -// Test setgid -result = shell.chmod('g+s', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('2000', 8), parseInt('2000', 8)); -result = shell.chmod('g-s', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); - -// Test sticky bit -result = shell.chmod('+t', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('1000', 8), parseInt('1000', 8)); -result = shell.chmod('-t', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('1000', 8), 0); - -// Test directories -result = shell.chmod('a-w', 'resources/chmod/b/a/b'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/b/a/b').mode & parseInt('777', 8), parseInt('555', 8)); -result = shell.chmod('755', 'resources/chmod/b/a/b'); -assert.equal(result.code, 0); - -// Test recursion -result = shell.chmod('-R', 'a+w', 'resources/chmod/b'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/b/a/b').mode & parseInt('777', 8), parseInt('777', 8)); -result = shell.chmod('-R', '755', 'resources/chmod/b'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/b/a/b').mode & parseInt('777', 8), parseInt('755', 8)); - -// Test symbolic links w/ recursion - WARNING: *nix only -fs.symlinkSync('resources/chmod/b/a', 'resources/chmod/a/b/c/link', 'dir'); -result = shell.chmod('-R', 'u-w', 'resources/chmod/a/b'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/a/b/c').mode & parseInt('700', 8), parseInt('500', 8)); -assert.equal(fs.statSync('resources/chmod/b/a').mode & parseInt('700', 8), parseInt('700', 8)); -result = shell.chmod('-R', 'u+w', 'resources/chmod/a/b'); -assert.equal(result.code, 0); -fs.unlinkSync('resources/chmod/a/b/c/link'); - -// Test combinations -result = shell.chmod('a-rwx', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('000', 8), parseInt('000', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('a-rwx,u+r', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('400', 8), parseInt('400', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('a-rwx,u+rw', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('600', 8), parseInt('600', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('a-rwx,u+rwx', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('700', 8), parseInt('700', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('000', 'resources/chmod/file1'); -assert.equal(result.code, 0); -result = shell.chmod('u+rw', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('600', 8), parseInt('600', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('000', 'resources/chmod/file1'); -assert.equal(result.code, 0); -result = shell.chmod('u+wx', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('300', 8), parseInt('300', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('000', 'resources/chmod/file1'); -assert.equal(result.code, 0); -result = shell.chmod('u+r,g+w,o+x', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('421', 8), parseInt('421', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('000', 'resources/chmod/file1'); -assert.equal(result.code, 0); -result = shell.chmod('u+rw,g+wx', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('630', 8), parseInt('630', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('700', 'resources/chmod/file1'); -assert.equal(result.code, 0); -result = shell.chmod('u-x,g+rw', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('660', 8), parseInt('660', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -result = shell.chmod('a-rwx,u+rw', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('600', 8), parseInt('600', 8)); -result = shell.chmod('a-rwx,u+rw', 'resources/chmod/file1'); -assert.equal(result.code, 0); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('600', 8), parseInt('600', 8)); -result = shell.chmod('644', 'resources/chmod/file1'); -assert.equal(result.code, 0); - -// Support capital X ("entry" permission aka directory-only execute) - -result = shell.chmod('744', 'resources/chmod/xdir'); -assert.equal(result.code, 0); -result = shell.chmod('644', 'resources/chmod/xdir/file'); -assert.equal(result.code, 0); -result = shell.chmod('744', 'resources/chmod/xdir/deep'); -assert.equal(result.code, 0); -result = shell.chmod('644', 'resources/chmod/xdir/deep/file'); -assert.equal(result.code, 0); -result = shell.chmod('-R', 'a+X', 'resources/chmod/xdir'); -assert.equal(result.code, 0); - -assert.equal(fs.statSync('resources/chmod/xdir').mode & parseInt('755', 8), parseInt('755', 8)); -assert.equal(fs.statSync('resources/chmod/xdir/file').mode & parseInt('644', 8), parseInt('644', 8)); -assert.equal(fs.statSync('resources/chmod/xdir/deep').mode & parseInt('755', 8), parseInt('755', 8)); -assert.equal(fs.statSync('resources/chmod/xdir/deep/file').mode & parseInt('644', 8), parseInt('644', 8)); - -shell.exit(123); From f92407e0329b21332347693f3bedd05e0534f4c7 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 23 Nov 2016 23:09:53 -0800 Subject: [PATCH 050/338] test: refactor common tests to AVA (#570) --- ava-test/common.js | 137 +++++++++++++++++++++++++++++++++++++++++++++ test/common.js | 115 ------------------------------------- 2 files changed, 137 insertions(+), 115 deletions(-) create mode 100644 ava-test/common.js delete mode 100644 test/common.js diff --git a/ava-test/common.js b/ava-test/common.js new file mode 100644 index 000000000..91de6ad26 --- /dev/null +++ b/ava-test/common.js @@ -0,0 +1,137 @@ +import test from 'ava'; + +import shell from '..'; +import common from '../src/common'; +import utils from './utils/utils'; + +shell.config.silent = true; + +// +// Invalids +// + +test('too few args', t => { + t.throws(() => { + common.expand(); + }, TypeError); +}); + +test('should be a list', t => { + t.throws(() => { + common.expand('resources'); + }, TypeError); +}); + +// +// Valids +// + +test('single file, array syntax', t => { + const result = common.expand(['resources/file1.txt']); + t.falsy(shell.error()); + t.deepEqual(result, ['resources/file1.txt']); +}); + +test('multiple file, glob syntax, * for file name', t => { + const result = common.expand(['resources/file*.txt']); + t.falsy(shell.error()); + t.deepEqual(result.sort(), ['resources/file1.txt', 'resources/file2.txt'].sort()); +}); + +test('multiple file, glob syntax, * for directory name', t => { + const result = common.expand(['r*/file*.txt']); + t.falsy(shell.error()); + t.deepEqual(result.sort(), ['resources/file1.txt', 'resources/file2.txt'].sort()); +}); + +test('multiple file, glob syntax, ** for directory name', t => { + const result = common.expand(['resources/**/file*.js']); + t.falsy(shell.error()); + t.deepEqual( + result.sort(), + ['resources/file1.js', 'resources/file2.js', 'resources/ls/file1.js', 'resources/ls/file2.js'].sort() + ); +}); + +test('broken links still expand', t => { + const result = common.expand(['resources/b*dlink']); + t.falsy(shell.error()); + t.deepEqual(result, ['resources/badlink']); +}); + +test('common.parseOptions (normal case)', t => { + const result = common.parseOptions('-Rf', { + R: 'recursive', + f: 'force', + r: 'reverse', + }); + + t.truthy(result.recursive); + t.truthy(result.force); + t.falsy(result.reverse); +}); + +test('common.parseOptions (with mutually-negating options)', t => { + const result = common.parseOptions('-f', { + n: 'no_force', + f: '!no_force', + R: 'recursive', + }); + + t.falsy(result.recursive); + t.falsy(result.no_force); + t.is(result.force, undefined); // this key shouldn't exist +}); + +test( + 'common.parseOptions (the last of the conflicting options should hold)', + t => { + const options = { + n: 'no_force', + f: '!no_force', + R: 'recursive', + }; + let result = common.parseOptions('-fn', options); + t.false(result.recursive); + t.truthy(result.no_force); + t.is(result.force, undefined); // this key shouldn't exist + result = common.parseOptions('-nf', options); + t.false(result.recursive); + t.false(result.no_force); + t.is(result.force, undefined); // this key shouldn't exist + } +); + +test('common.parseOptions using an object to hold options', t => { + const result = common.parseOptions({ '-v': 'some text here' }, { + v: 'value', + f: 'force', + r: 'reverse', + }); + + t.is(result.value, 'some text here'); + t.false(result.force); + t.false(result.reverse); +}); + +test('Some basic tests on the ShellString type', t => { + const result = shell.ShellString('foo'); + t.is(result.toString(), 'foo'); + t.is(result.stdout, 'foo'); + t.is(typeof result.stderr, 'undefined'); + t.truthy(result.to); + t.truthy(result.toEnd); +}); + +test.cb('Commands that fail will still output error messages to stderr', t => { + const script = 'require(\'../global\'); ls(\'noexist\'); cd(\'noexist\');'; + utils.runScript(script, (err, stdout, stderr) => { + t.is(stdout, ''); + t.is( + stderr, + 'ls: no such file or directory: noexist\ncd: no such file or directory: noexist\n' + ); + t.end(); + }); +}); + diff --git a/test/common.js b/test/common.js deleted file mode 100644 index 746762c38..000000000 --- a/test/common.js +++ /dev/null @@ -1,115 +0,0 @@ -var shell = require('..'); -var common = require('../src/common'); - -var assert = require('assert'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -// too few args -assert.throws(function () { - common.expand(); -}, TypeError); - -// should be a list -assert.throws(function () { - common.expand('resources'); -}, TypeError); - -// -// Valids -// - -var result; - -// single file, array syntax -result = common.expand(['resources/file1.txt']); -assert.equal(shell.error(), null); -assert.deepEqual(result, ['resources/file1.txt']); - -// multiple file, glob syntax, * for file name -result = common.expand(['resources/file*.txt']); -assert.equal(shell.error(), null); -assert.deepEqual(result.sort(), ['resources/file1.txt', 'resources/file2.txt'].sort()); - -// multiple file, glob syntax, * for directory name -result = common.expand(['*/file*.txt']); -assert.equal(shell.error(), null); -assert.deepEqual(result.sort(), ['resources/file1.txt', 'resources/file2.txt'].sort()); - -// multiple file, glob syntax, ** for directory name -result = common.expand(['**/file*.js']); -assert.equal(shell.error(), null); -assert.deepEqual(result.sort(), ['resources/file1.js', 'resources/file2.js', 'resources/ls/file1.js', 'resources/ls/file2.js'].sort()); - -// broken links still expand -result = common.expand(['resources/b*dlink']); -assert.equal(shell.error(), null); -assert.deepEqual(result, ['resources/badlink']); - -// common.parseOptions (normal case) -result = common.parseOptions('-Rf', { - 'R': 'recursive', - 'f': 'force', - 'r': 'reverse' -}); -assert.ok(result.recursive === true); -assert.ok(result.force === true); -assert.ok(result.reverse === false); - -// common.parseOptions (with mutually-negating options) -result = common.parseOptions('-f', { - 'n': 'no_force', - 'f': '!no_force', - 'R': 'recursive' -}); -assert.ok(result.recursive === false); -assert.ok(result.no_force === false); -assert.ok(result.force === undefined); // this key shouldn't exist - -// common.parseOptions (the last of the conflicting options should hold) -var options = { - 'n': 'no_force', - 'f': '!no_force', - 'R': 'recursive' -}; -result = common.parseOptions('-fn', options); -assert.ok(result.recursive === false); -assert.ok(result.no_force === true); -assert.ok(result.force === undefined); // this key shouldn't exist -result = common.parseOptions('-nf', options); -assert.ok(result.recursive === false); -assert.ok(result.no_force === false); -assert.ok(result.force === undefined); // this key shouldn't exist - -// common.parseOptions using an object to hold options -result = common.parseOptions({ '-v': 'some text here' }, { - 'v': 'value', - 'f': 'force', - 'r': 'reverse' -}); -assert.ok(result.value === 'some text here'); -assert.ok(result.force === false); -assert.ok(result.reverse === false); - -// Some basic tests on the ShellString type -result = shell.ShellString('foo'); -assert.strictEqual(result.toString(), 'foo'); -assert.equal(result.stdout, 'foo'); -assert.ok(typeof result.stderr === 'undefined'); -assert.ok(result.to); -assert.ok(result.toEnd); - -// Commands that fail will still output error messages to stderr -result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); ls(\'noexist\'); cd(\'noexist\');"'); -assert.equal(result.stdout, ''); -assert.equal(result.stderr, 'ls: no such file or directory: noexist\ncd: no such file or directory: noexist\n'); - -shell.exit(123); - From 895bbf3ae66883b962b2c266ccf1b51700de7062 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 23 Nov 2016 23:11:26 -0800 Subject: [PATCH 051/338] test: refactor dirs tests to AVA (#572) --- ava-test/dirs.js | 39 +++++++++++++++++++++++++++++++++++++++ test/dirs.js | 33 --------------------------------- 2 files changed, 39 insertions(+), 33 deletions(-) create mode 100644 ava-test/dirs.js delete mode 100644 test/dirs.js diff --git a/ava-test/dirs.js b/ava-test/dirs.js new file mode 100644 index 000000000..9a2bf13d4 --- /dev/null +++ b/ava-test/dirs.js @@ -0,0 +1,39 @@ +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; + +test.beforeEach(() => { + shell.config.silent = true; + shell.pushd('resources/pushd'); + shell.pushd('a'); +}); + +// +// Valids +// + +const trail = [ + path.resolve(path.resolve(), 'resources/pushd/a'), + path.resolve(path.resolve(), 'resources/pushd'), + path.resolve(), +]; + +test('no arguments', t => { + t.deepEqual(shell.dirs(), trail); +}); + +test('Single items', t => { + t.is(shell.dirs('+0'), trail[0]); + t.is(shell.dirs('+1'), trail[1]); + t.is(shell.dirs('+2'), trail[2]); + t.is(shell.dirs('-0'), trail[2]); + t.is(shell.dirs('-1'), trail[1]); + t.is(shell.dirs('-2'), trail[0]); +}); + +test('Clearing items', t => { + t.deepEqual(shell.dirs('-c'), []); + t.falsy(shell.error()); +}); diff --git a/test/dirs.js b/test/dirs.js deleted file mode 100644 index a8db4f935..000000000 --- a/test/dirs.js +++ /dev/null @@ -1,33 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var path = require('path'); - -shell.config.silent = true; - -var root = path.resolve(); - -shell.pushd('resources/pushd'); -shell.pushd('a'); - -var trail = [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]; - -assert.deepEqual(shell.dirs(), trail); - -// Single items -assert.equal(shell.dirs('+0'), trail[0]); -assert.equal(shell.dirs('+1'), trail[1]); -assert.equal(shell.dirs('+2'), trail[2]); -assert.equal(shell.dirs('-0'), trail[2]); -assert.equal(shell.dirs('-1'), trail[1]); -assert.equal(shell.dirs('-2'), trail[0]); - -// Clearing items -assert.deepEqual(shell.dirs('-c'), []); -assert(!shell.error()); - -shell.exit(123); From 49b7dbd7a240600dfa235647041bea9a91bdf52d Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 24 Nov 2016 01:29:14 -0800 Subject: [PATCH 052/338] test: refactor toEnd tests to AVA (#578) --- ava-test/toEnd.js | 70 +++++++++++++++++++++++++++++++++++++++++++++++ test/toEnd.js | 49 --------------------------------- 2 files changed, 70 insertions(+), 49 deletions(-) create mode 100644 ava-test/toEnd.js delete mode 100644 test/toEnd.js diff --git a/ava-test/toEnd.js b/ava-test/toEnd.js new file mode 100644 index 000000000..99a4fb6aa --- /dev/null +++ b/ava-test/toEnd.js @@ -0,0 +1,70 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('Normal strings don\'t have \'.toEnd()\' anymore', t => { + const str = 'hello world'; + t.is(typeof str.toEnd, 'undefined'); +}); + +test('missing file argument', t => { + shell.ShellString('hello world').toEnd(); + t.truthy(shell.error()); +}); + +// +// Valids +// + +test('creates a new file', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/toEnd1`)); // Check file toEnd() creates does not already exist + shell.ShellString('hello ').toEnd(`${t.context.tmp}/toEnd1`); + t.truthy(fs.existsSync(`${t.context.tmp}/toEnd1`)); // Check that file was created + const result = shell.cat(`${t.context.tmp}/toEnd1`); + t.is(result.toString(), 'hello '); +}); + +test('can be chained', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/toEnd1`)); + t.falsy(fs.existsSync(`${t.context.tmp}/toEnd2`)); + shell.ShellString('hello ').toEnd(`${t.context.tmp}/toEnd1`); + shell.ShellString('world') + .toEnd(`${t.context.tmp}/toEnd1`) + .toEnd(`${t.context.tmp}/toEnd2`); // Write some more to the file + const result1 = shell.cat(`${t.context.tmp}/toEnd1`); + t.falsy(shell.error()); + t.is(result1.toString(), 'hello world'); // Check that the result is what we expect + const result2 = shell.cat(`${t.context.tmp}/toEnd2`); + t.falsy(shell.error()); + t.is(result2.toString(), 'world'); // Check that the result is what we expect +}); + +test('With a glob', t => { + shell.touch(`${t.context.tmp}/toEnd1`); + shell.ShellString('good').to(`${t.context.tmp}/toE*1`); + shell.ShellString('bye').toEnd(`${t.context.tmp}/toE*1`); + t.falsy( + fs.existsSync(`${t.context.tmp}/toE*1`) + ); + const result = shell.cat(`${t.context.tmp}/toEnd1`); + t.falsy(shell.error()); + t.is(result.toString(), 'goodbye'); +}); diff --git a/test/toEnd.js b/test/toEnd.js deleted file mode 100644 index a2936f613..000000000 --- a/test/toEnd.js +++ /dev/null @@ -1,49 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -// Normal strings don't have '.toEnd()' anymore -var str = 'hello world'; -assert.ok(typeof str.toEnd === 'undefined'); - -shell.ShellString('hello world').toEnd(); -assert.ok(shell.error()); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -assert.ok(shell.error()); -// -// Valids -// - -var result; -assert.equal(fs.existsSync('tmp/toEnd1'), false); // Check file toEnd() creates does not already exist -assert.equal(fs.existsSync('tmp/toEnd2'), false); -shell.ShellString('hello ').toEnd('tmp/toEnd1'); -assert.equal(fs.existsSync('tmp/toEnd1'), true); // Check that file was created -shell.ShellString('world').toEnd('tmp/toEnd1').toEnd('tmp/toEnd2'); // Write some more to the file -result = shell.cat('tmp/toEnd1'); -assert.equal(shell.error(), null); -assert.equal(result, 'hello world'); // Check that the result is what we expect -result = shell.cat('tmp/toEnd2'); -assert.equal(shell.error(), null); -assert.equal(result, 'world'); // Check that the result is what we expect - -// With a glob -shell.ShellString('good').to('tmp/toE*1'); -shell.ShellString('bye').toEnd('tmp/toE*1'); -assert.equal(fs.existsSync('tmp/toE*1'), false, 'globs are not interpreted literally'); -result = shell.cat('tmp/toEnd1'); -assert.equal(shell.error(), null); -assert.equal(result, 'goodbye'); - -shell.exit(123); From 2f3aea364357aac2746ae383b26674d1388408d1 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 24 Nov 2016 03:06:33 -0800 Subject: [PATCH 053/338] test: refactor env tests to AVA (#573) --- ava-test/env.js | 18 ++++++++++++++++++ test/env.js | 19 ------------------- 2 files changed, 18 insertions(+), 19 deletions(-) create mode 100644 ava-test/env.js delete mode 100644 test/env.js diff --git a/ava-test/env.js b/ava-test/env.js new file mode 100644 index 000000000..50a143545 --- /dev/null +++ b/ava-test/env.js @@ -0,0 +1,18 @@ +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +// +// Valids +// + +test('existing variables', t => { + t.is(shell.env.PATH, process.env.PATH); +}); + +test('variables are exported', t => { + shell.env.SHELLJS_TEST = 'hello world'; + t.is(shell.env.SHELLJS_TEST, process.env.SHELLJS_TEST); +}); diff --git a/test/env.js b/test/env.js deleted file mode 100644 index c9edcb6b0..000000000 --- a/test/env.js +++ /dev/null @@ -1,19 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - -assert.equal(shell.env.PATH, process.env.PATH); - -shell.env.SHELLJS_TEST = 'hello world'; -assert.equal(shell.env.SHELLJS_TEST, process.env.SHELLJS_TEST); - -shell.exit(123); From e52caa5e2545c3f9f30088261434339093e8c8e9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 25 Nov 2016 10:58:42 -0800 Subject: [PATCH 054/338] test: refactor echo tests to AVA (#575) --- ava-test/echo.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ test/echo.js | 56 --------------------------------------------- 2 files changed, 59 insertions(+), 56 deletions(-) create mode 100644 ava-test/echo.js delete mode 100644 test/echo.js diff --git a/ava-test/echo.js b/ava-test/echo.js new file mode 100644 index 000000000..7887d88ee --- /dev/null +++ b/ava-test/echo.js @@ -0,0 +1,59 @@ +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +shell.config.silent = true; + +// +// Valids +// + +test.cb('simple test with defaults', t => { + const script = 'require(\'../global.js\'); echo("hello", "world");'; + utils.runScript(script, (err, stdout, stderr) => { + t.falsy(err); + t.is(stdout, 'hello world\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +test.cb('allow arguments to begin with a hyphen', t => { + // see issue #20 + const script = 'require(\'../global.js\'); echo("-asdf", "111");'; + utils.runScript(script, (err, stdout, stderr) => { + t.falsy(err); + t.is(stdout, '-asdf 111\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +test.cb("using null as an explicit argument doesn't crash the function", t => { + const script = 'require(\'../global.js\'); echo(null);'; + utils.runScript(script, (err, stdout, stderr) => { + t.falsy(err); + t.is(stdout, 'null\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +test.cb('simple test with silent(true)', t => { + const script = 'require(\'../global.js\'); config.silent=true; echo(555);'; + utils.runScript(script, (err, stdout) => { + t.falsy(err); + t.is(stdout, '555\n'); + t.end(); + }); +}); + +test.cb('-e option', t => { + const script = "require('../global.js'); echo('-e', '\\tmessage');"; + utils.runScript(script, (err, stdout) => { + t.falsy(err); + t.is(stdout, '\tmessage\n'); + t.end(); + }); +}); diff --git a/test/echo.js b/test/echo.js deleted file mode 100644 index ec83413ca..000000000 --- a/test/echo.js +++ /dev/null @@ -1,56 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var child = require('child_process'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - - -// From here on we use child.exec() to intercept the stdout - - -// simple test with defaults -shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript' + Math.random() + '.js'; -var script = 'require(\'../../global.js\'); echo("-asdf", "111");'; // test '-' bug (see issue #20) -shell.ShellString(script).to(file); -child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err, stdout) { - assert.equal(stdout, '-asdf 111\n'); - - // using null as an explicit argument doesn't crash the function - file = 'tmp/tempscript' + Math.random() + '.js'; - script = 'require(\'../../global.js\'); echo(null);'; - shell.ShellString(script).to(file); - child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err2, stdout2, stderr2) { - assert.equal(stdout2, 'null\n'); - assert.equal(stderr2, ''); - - // simple test with silent(true) - script = 'require(\'../../global.js\'); config.silent=true; echo(555);'; - shell.ShellString(script).to(file); - child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err3, stdout3) { - assert.equal(stdout3, '555\n'); - - script = "require('../../global.js'); echo('-e', '\\tmessage');"; - shell.ShellString(script).to(file); - child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err4, stdout4) { - assert.equal(stdout4, '\tmessage\n'); - - theEnd(); - }); - }); - - // simple test with silent(true) - }); -}); - -function theEnd() { - shell.exit(123); -} From f225f35ddae92a44131a36c6c6a57723d1b73385 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 25 Nov 2016 10:59:17 -0800 Subject: [PATCH 055/338] test: refactor rm tests to AVA (#586) --- ava-test/rm.js | 284 +++++++++++++++++++++++++++++++++++++++++++++++++ test/rm.js | 244 ------------------------------------------ 2 files changed, 284 insertions(+), 244 deletions(-) create mode 100644 ava-test/rm.js delete mode 100644 test/rm.js diff --git a/ava-test/rm.js b/ava-test/rm.js new file mode 100644 index 000000000..f56d3053c --- /dev/null +++ b/ava-test/rm.js @@ -0,0 +1,284 @@ +import fs from 'fs'; +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.cp('-r', 'resources', t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('no args', t => { + const result = shell.rm(); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'rm: no paths given'); +}); + +test('file does not exist', t => { + const result = shell.rm('asdfasdf'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'rm: no such file or directory: asdfasdf'); +}); + +test('only an option', t => { + const result = shell.rm('-f'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'rm: no paths given'); +}); + +test('invalid option', t => { + const result = shell.rm('-@', 'resources/file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.truthy(fs.existsSync('resources/file1')); + t.is(result.stderr, 'rm: option not recognized: @'); +}); + +// +// Valids +// + +test('file does not exist, but -f specified', t => { + const result = shell.rm('-f', 'asdfasdf'); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('directory does not exist, but -fr specified', t => { + const result = shell.rm('-fr', 'fake_dir/'); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('directory does not exist, but *only -f* specified', t => { + const result = shell.rm('-f', 'fake_dir/'); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('file (in fake dir) does not exist, but -f specified', t => { + const result = shell.rm('-f', 'fake_dir/asdfasdf'); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('dir (in fake dir) does not exist, but -fr specified', t => { + const result = shell.rm('-fr', 'fake_dir/sub/'); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('simple rm', t => { + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); + const result = shell.rm(`${t.context.tmp}/file1`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); +}); + +test('recursive dir removal: -r option', t => { + shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + const result = shell.rm('-rf', `${t.context.tmp}/a`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/a`)); +}); + +test('-R option does the same thing', t => { + shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + const result = shell.rm('-Rf', `${t.context.tmp}/a`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/a`)); +}); + +test('recursive dir removal - absolute path', t => { + shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + const result = shell.rm('-Rf', path.resolve(`./${t.context.tmp}/a`)); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/a`)); +}); + +test('wildcard', t => { + const result = shell.rm(`${t.context.tmp}/file*`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file2`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file1.js`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file2.js`)); +}); + +test('recursive dir removal', t => { + shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + shell.mkdir('-p', `${t.context.tmp}/b`); + shell.mkdir('-p', `${t.context.tmp}/c`); + shell.mkdir('-p', `${t.context.tmp}/.hidden`); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + t.truthy(fs.existsSync(`${t.context.tmp}/b`)); + t.truthy(fs.existsSync(`${t.context.tmp}/c`)); + t.truthy(fs.existsSync(`${t.context.tmp}/.hidden`)); + const result = shell.rm('-rf', `${t.context.tmp}/*`); + t.falsy(shell.error()); + t.is(result.code, 0); + const contents = fs.readdirSync(t.context.tmp); + t.is(contents.length, 1); + t.is(contents[0], '.hidden'); // shouldn't remove hiddden if no .* given +}); + +test('recursive dir removal #2', t => { + shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + shell.mkdir('-p', `${t.context.tmp}/b`); + shell.mkdir('-p', `${t.context.tmp}/c`); + shell.mkdir('-p', `${t.context.tmp}/.hidden`); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + t.truthy(fs.existsSync(`${t.context.tmp}/b`)); + t.truthy(fs.existsSync(`${t.context.tmp}/c`)); + t.truthy(fs.existsSync(`${t.context.tmp}/.hidden`)); + const result = shell.rm('-rf', `${t.context.tmp}/*`, `${t.context.tmp}/.*`); + t.falsy(shell.error()); + t.is(result.code, 0); + const contents = fs.readdirSync(t.context.tmp); + t.is(contents.length, 0); +}); + +test('recursive dir removal - array-syntax', t => { + shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + shell.mkdir('-p', `${t.context.tmp}/b`); + shell.mkdir('-p', `${t.context.tmp}/c`); + shell.mkdir('-p', `${t.context.tmp}/.hidden`); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + t.truthy(fs.existsSync(`${t.context.tmp}/b`)); + t.truthy(fs.existsSync(`${t.context.tmp}/c`)); + t.truthy(fs.existsSync(`${t.context.tmp}/.hidden`)); + const result = shell.rm('-rf', [`${t.context.tmp}/*`, `${t.context.tmp}/.*`]); + t.falsy(shell.error()); + t.is(result.code, 0); + const contents = fs.readdirSync(t.context.tmp); + t.is(contents.length, 0); +}); + +test('removal of a read-only file (unforced)', t => { + shell.mkdir('-p', `${t.context.tmp}/readonly`); + shell.ShellString('asdf').to(`${t.context.tmp}/readonly/file1`); + fs.chmodSync(`${t.context.tmp}/readonly/file1`, '0444'); // -r--r--r-- + shell.rm(`${t.context.tmp}/readonly/file1`); + t.truthy(shell.error()); + t.truthy(fs.existsSync(`${t.context.tmp}/readonly/file1`)); // bash's rm always asks before removing read-only files + // here we just assume "no" +}); + +test('removal of a read-only file (forced)', t => { + shell.mkdir('-p', `${t.context.tmp}/readonly`); + shell.ShellString('asdf').to(`${t.context.tmp}/readonly/file2`); + fs.chmodSync(`${t.context.tmp}/readonly/file2`, '0444'); // -r--r--r-- + shell.rm('-f', `${t.context.tmp}/readonly/file2`); + t.falsy(shell.error()); + t.falsy(fs.existsSync(`${t.context.tmp}/readonly/file2`)); +}); + +test('removal of a tree containing read-only files (unforced)', t => { + shell.mkdir('-p', `${t.context.tmp}/tree2`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree2/file1`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree2/file2`); + fs.chmodSync(`${t.context.tmp}/tree2/file1`, '0444'); // -r--r--r-- + shell.rm('-r', `${t.context.tmp}/tree2`); + t.truthy(shell.error()); + t.truthy(fs.existsSync(`${t.context.tmp}/tree2/file1`)); + t.falsy(fs.existsSync(`${t.context.tmp}/tree2/file2`)); +}); + +test('removal of a tree containing read-only files (forced)', t => { + shell.mkdir('-p', `${t.context.tmp}/tree`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree/file1`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree/file2`); + fs.chmodSync(`${t.context.tmp}/tree/file1`, '0444'); // -r--r--r-- + shell.rm('-rf', `${t.context.tmp}/tree`); + t.falsy(shell.error()); + t.falsy(fs.existsSync(`${t.context.tmp}/tree`)); +}); + +test( + 'removal of a sub-tree containing read-only and hidden files - glob', + t => { + shell.mkdir('-p', `${t.context.tmp}/tree3`); + shell.mkdir('-p', `${t.context.tmp}/tree3/subtree`); + shell.mkdir('-p', `${t.context.tmp}/tree3/.hidden`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree3/subtree/file`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree3/.hidden/file`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree3/file`); + fs.chmodSync(`${t.context.tmp}/tree3/file`, '0444'); // -r--r--r-- + fs.chmodSync(`${t.context.tmp}/tree3/subtree/file`, '0444'); // -r--r--r-- + fs.chmodSync(`${t.context.tmp}/tree3/.hidden/file`, '0444'); // -r--r--r-- + shell.rm('-rf', `${t.context.tmp}/tree3/*`, `${t.context.tmp}/tree3/.*`); // erase dir contents + t.is(shell.ls(`${t.context.tmp}/tree3`).length, 0); + } +); + +test( + 'removal of a sub-tree containing read-only and hidden files - without glob', + t => { + shell.mkdir('-p', `${t.context.tmp}/tree4`); + shell.mkdir('-p', `${t.context.tmp}/tree4/subtree`); + shell.mkdir('-p', `${t.context.tmp}/tree4/.hidden`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree4/subtree/file`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree4/.hidden/file`); + shell.ShellString('asdf').to(`${t.context.tmp}/tree4/file`); + fs.chmodSync(`${t.context.tmp}/tree4/file`, '0444'); // -r--r--r-- + fs.chmodSync(`${t.context.tmp}/tree4/subtree/file`, '0444'); // -r--r--r-- + fs.chmodSync(`${t.context.tmp}/tree4/.hidden/file`, '0444'); // -r--r--r-- + shell.rm('-rf', `${t.context.tmp}/tree4`); // erase dir contents + t.falsy(fs.existsSync(`${t.context.tmp}/tree4`)); + } +); + +test('remove symbolic link to a dir', t => { + const result = shell.rm('-f', `${t.context.tmp}/rm/link_to_a_dir`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/rm/link_to_a_dir`)); + t.truthy(fs.existsSync(`${t.context.tmp}/rm/a_dir`)); +}); + +// TODO(nfischer): fix this behavior in rm +test.skip('rm -rf on a symbolic link to a dir deletes its contents', t => { + const result = shell.rm('-rf', `${t.context.tmp}/rm/link_to_a_dir/`); + t.falsy(shell.error()); + t.is(result.code, 0); + + // Both the link and original dir should remain, but contents are deleted + t.truthy(fs.existsSync(`${t.context.tmp}/rm/link_to_a_dir`)); + t.truthy(fs.existsSync(`${t.context.tmp}/rm/a_dir`)); + t.falsy(fs.existsSync(`${t.context.tmp}/rm/a_dir/a_file`)); +}); + +test('remove broken symbolic link', t => { + if (process.platform !== 'win32') { + t.truthy(shell.test('-L', `${t.context.tmp}/rm/fake.lnk`)); + const result = shell.rm(`${t.context.tmp}/rm/fake.lnk`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(shell.test('-L', `${t.context.tmp}/rm/fake.lnk`)); + t.falsy(fs.existsSync(`${t.context.tmp}/rm/fake.lnk`)); + } +}); diff --git a/test/rm.js b/test/rm.js deleted file mode 100644 index ab98a72fe..000000000 --- a/test/rm.js +++ /dev/null @@ -1,244 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var path = require('path'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var contents; -var result; - -result = shell.rm(); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'rm: no paths given'); - -result = shell.rm('asdfasdf'); // file does not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'rm: no such file or directory: asdfasdf'); - -result = shell.rm('-f'); // no file -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'rm: no paths given'); - -result = shell.rm('-@', 'resources/file1'); // invalid option -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(fs.existsSync('resources/file1'), true); -assert.equal(result.stderr, 'rm: option not recognized: @'); - -// -// Valids -// - -// file does not exist, but -f specified -result = shell.rm('-f', 'asdfasdf'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); - -// directory does not exist, but -fr specified -result = shell.rm('-fr', 'fake_dir/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); - -// directory does not exist, but *only -f* specified -result = shell.rm('-f', 'fake_dir/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); - -// file (in fake dir) does not exist, but -f specified -result = shell.rm('-f', 'fake_dir/asdfasdf'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); - -// dir (in fake dir) does not exist, but -fr specified -result = shell.rm('-fr', 'fake_dir/sub/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); - -// simple rm -shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('tmp/file1'), true); -result = shell.rm('tmp/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), false); - -// recursive dir removal - small-caps '-r' -shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -result = shell.rm('-rf', 'tmp/a'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a'), false); - -// recursive dir removal - capital '-R' -shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -result = shell.rm('-Rf', 'tmp/a'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a'), false); - -// recursive dir removal - absolute path -shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -result = shell.rm('-Rf', path.resolve('./tmp/a')); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a'), false); - -// wildcard -shell.cp('-f', 'resources/file*', 'tmp'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); -assert.equal(fs.existsSync('tmp/file1.js'), true); -assert.equal(fs.existsSync('tmp/file2.js'), true); -result = shell.rm('tmp/file*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), false); -assert.equal(fs.existsSync('tmp/file2'), false); -assert.equal(fs.existsSync('tmp/file1.js'), false); -assert.equal(fs.existsSync('tmp/file2.js'), false); - -// recursive dir removal -shell.mkdir('-p', 'tmp/a/b/c'); -shell.mkdir('-p', 'tmp/b'); -shell.mkdir('-p', 'tmp/c'); -shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); -result = shell.rm('-rf', 'tmp/*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -contents = fs.readdirSync('tmp'); -assert.equal(contents.length, 1); -assert.equal(contents[0], '.hidden'); // shouldn't remove hiddden if no .* given - -// recursive dir removal -shell.mkdir('-p', 'tmp/a/b/c'); -shell.mkdir('-p', 'tmp/b'); -shell.mkdir('-p', 'tmp/c'); -shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); -result = shell.rm('-rf', 'tmp/*', 'tmp/.*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -contents = fs.readdirSync('tmp'); -assert.equal(contents.length, 0); - -// recursive dir removal - array-syntax -shell.mkdir('-p', 'tmp/a/b/c'); -shell.mkdir('-p', 'tmp/b'); -shell.mkdir('-p', 'tmp/c'); -shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); -result = shell.rm('-rf', ['tmp/*', 'tmp/.*']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -contents = fs.readdirSync('tmp'); -assert.equal(contents.length, 0); - -// removal of a read-only file (unforced) -shell.mkdir('-p', 'tmp/readonly'); -shell.ShellString('asdf').to('tmp/readonly/file1'); -fs.chmodSync('tmp/readonly/file1', '0444'); // -r--r--r-- -result = shell.rm('tmp/readonly/file1'); -assert.equal(fs.existsSync('tmp/readonly/file1'), true); // bash's rm always asks before removing read-only files - // here we just assume "no" - -// removal of a read-only file (forced) -shell.mkdir('-p', 'tmp/readonly'); -shell.ShellString('asdf').to('tmp/readonly/file2'); -fs.chmodSync('tmp/readonly/file2', '0444'); // -r--r--r-- -result = shell.rm('-f', 'tmp/readonly/file2'); -assert.equal(fs.existsSync('tmp/readonly/file2'), false); - -// removal of a tree containing read-only files (unforced) -shell.mkdir('-p', 'tmp/tree2'); -shell.ShellString('asdf').to('tmp/tree2/file1'); -shell.ShellString('asdf').to('tmp/tree2/file2'); -fs.chmodSync('tmp/tree2/file1', '0444'); // -r--r--r-- -result = shell.rm('-r', 'tmp/tree2'); -assert.equal(fs.existsSync('tmp/tree2/file1'), true); -assert.equal(fs.existsSync('tmp/tree2/file2'), false); - -// removal of a tree containing read-only files (forced) -shell.mkdir('-p', 'tmp/tree'); -shell.ShellString('asdf').to('tmp/tree/file1'); -shell.ShellString('asdf').to('tmp/tree/file2'); -fs.chmodSync('tmp/tree/file1', '0444'); // -r--r--r-- -result = shell.rm('-rf', 'tmp/tree'); -assert.equal(fs.existsSync('tmp/tree'), false); - -// removal of a sub-tree containing read-only and hidden files - rm('dir/*') -shell.mkdir('-p', 'tmp/tree3'); -shell.mkdir('-p', 'tmp/tree3/subtree'); -shell.mkdir('-p', 'tmp/tree3/.hidden'); -shell.ShellString('asdf').to('tmp/tree3/subtree/file'); -shell.ShellString('asdf').to('tmp/tree3/.hidden/file'); -shell.ShellString('asdf').to('tmp/tree3/file'); -fs.chmodSync('tmp/tree3/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree3/subtree/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree3/.hidden/file', '0444'); // -r--r--r-- -result = shell.rm('-rf', 'tmp/tree3/*', 'tmp/tree3/.*'); // erase dir contents -assert.equal(shell.ls('tmp/tree3').length, 0); - -// removal of a sub-tree containing read-only and hidden files - rm('dir') -shell.mkdir('-p', 'tmp/tree4'); -shell.mkdir('-p', 'tmp/tree4/subtree'); -shell.mkdir('-p', 'tmp/tree4/.hidden'); -shell.ShellString('asdf').to('tmp/tree4/subtree/file'); -shell.ShellString('asdf').to('tmp/tree4/.hidden/file'); -shell.ShellString('asdf').to('tmp/tree4/file'); -fs.chmodSync('tmp/tree4/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree4/subtree/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree4/.hidden/file', '0444'); // -r--r--r-- -result = shell.rm('-rf', 'tmp/tree4'); // erase dir contents -assert.equal(fs.existsSync('tmp/tree4'), false); - -// remove symbolic link to a dir -result = shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); -shell.cp('-R', 'resources/rm', 'tmp'); -result = shell.rm('-f', 'tmp/rm/link_to_a_dir'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/rm/link_to_a_dir'), false); -assert.equal(fs.existsSync('tmp/rm/a_dir'), true); - -// remove broken symbolic link -if (process.platform !== 'win32') { - result = shell.rm('-rf', 'tmp'); - shell.mkdir('tmp'); - shell.cp('-R', 'resources/rm', 'tmp'); - assert.ok(shell.test('-L', 'tmp/rm/fake.lnk')); - result = shell.rm('tmp/rm/fake.lnk'); - assert.equal(shell.error(), null); - assert.equal(result.code, 0); - assert.ok(!shell.test('-L', 'tmp/rm/fake.lnk')); - assert.equal(fs.existsSync('tmp/rm/fake.lnk'), false); -} - -shell.exit(123); From c78eecdff06cf9e437a36627c64a972b7dd521f5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 25 Nov 2016 11:03:05 -0800 Subject: [PATCH 056/338] test: refactor tempdir tests to AVA (#581) --- ava-test/tempdir.js | 21 +++++++++++++++++++++ test/tempdir.js | 19 ------------------- 2 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 ava-test/tempdir.js delete mode 100644 test/tempdir.js diff --git a/ava-test/tempdir.js b/ava-test/tempdir.js new file mode 100644 index 000000000..ed7ec77fd --- /dev/null +++ b/ava-test/tempdir.js @@ -0,0 +1,21 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + + +// +// Valids +// + +test('basic usage', t => { + const tmp = shell.tempdir(); + t.falsy(shell.error()); + t.truthy(fs.existsSync(tmp)); + + // It's a directory + t.truthy(shell.test('-d', tmp)); +}); diff --git a/test/tempdir.js b/test/tempdir.js deleted file mode 100644 index beddec289..000000000 --- a/test/tempdir.js +++ /dev/null @@ -1,19 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - -var tmp = shell.tempdir(); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync(tmp), true); - -shell.exit(123); From 00dd0f66417cb86c1a7a3e794c71aeb9a778f5cb Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 27 Nov 2016 11:48:18 -0800 Subject: [PATCH 057/338] test: refactor plugin tests to AVA (#579) --- ava-test/plugin.js | 148 +++++++++++++++++++++++++++++++++++++++++++++ test/plugin.js | 128 --------------------------------------- 2 files changed, 148 insertions(+), 128 deletions(-) create mode 100644 ava-test/plugin.js delete mode 100644 test/plugin.js diff --git a/ava-test/plugin.js b/ava-test/plugin.js new file mode 100644 index 000000000..05704773d --- /dev/null +++ b/ava-test/plugin.js @@ -0,0 +1,148 @@ +import test from 'ava'; + +// This is the supported order for importing these files +import plugin from '../plugin'; +import shell from '..'; + +let data = 0; +let fname; + +function fooImplementation(options, arg) { + // Some sort of side effect, so we know when this is called + if (arg) { + fname = arg; + } else { + fname = plugin.readFromPipe(); + } + + if (arg === 'exitWithCode5') { + plugin.error('Exited with code 5', 5); + } else if (arg === 'changePrefix') { + plugin.error('prefix was changed', { + prefix: 'prefix: ', + }); + } else if (arg === 'continue') { + plugin.error('Error, but continuing', { + continue: true, + }); + } + + if (options.flag) { + data = 12; + } else { + data++; + } + return 'hello world'; +} + +test.beforeEach(() => { + shell.config.silent = true; +}); + + +// +// Valids +// + +test('All plugin utils exist', t => { + t.is(typeof plugin.error, 'function'); + t.is(typeof plugin.parseOptions, 'function'); + t.is(typeof plugin.readFromPipe, 'function'); + t.is(typeof plugin.register, 'function'); +}); + +test('The plugin does not exist before it\'s registered', t => { + t.falsy(shell.foo); +}); + +test('Register the plugin', t => { + plugin.register('foo', fooImplementation, { + cmdOptions: { + f: 'flag', + }, + wrapOutput: true, + canReceivePipe: true, + }); + t.pass(); +}); + +test('The plugin exists after registering', t => { + t.is(typeof shell.foo, 'function'); +}); + +test('The command fails for invalid options', t => { + const result = shell.foo('-n', 'filename'); + t.is(result.code, 1); + t.is(result.stdout, ''); + t.is(result.stderr, 'foo: option not recognized: n'); + t.is(shell.error(), 'foo: option not recognized: n'); +}); + +test('The command succeeds for normal calls', t => { + t.is(data, 0); + shell.foo('filename'); + t.is(data, 1); + t.is(fname, 'filename'); + shell.foo('filename2'); + t.is(data, 2); + t.is(fname, 'filename2'); +}); + +test('The command parses options', t => { + shell.foo('-f', 'filename'); + t.is(data, 12); + t.is(fname, 'filename'); +}); + +test('The command supports globbing by default', t => { + shell.foo('-f', 're*u?ces'); + t.is(data, 12); + t.is(fname, 'resources'); +}); + +test('Plugins are also compatible with shelljs/global', t => { + require('../global'); + t.is(typeof global.foo, 'function'); + t.is(global.foo, shell.foo); +}); + +test('Plugins can be added as methods to ShellStrings', t => { + const result = shell.ShellString('hello world\n'); + t.is(result.toString(), 'hello world\n'); + t.is(typeof result.grep, 'function'); // existing methods persist + t.is(typeof result.foo, 'function'); + result.foo(); + t.is(fname, 'hello world\n'); // readFromPipe() works +}); + +test('Plugins can signal errors', t => { + const result = shell.foo('exitWithCode5'); + t.is(result.code, 5); + t.is(result.stdout, ''); + t.is(result.stderr, 'foo: Exited with code 5'); + t.is(shell.error(), 'foo: Exited with code 5'); +}); + +test('Plugins can change the prefix', t => { + const result = shell.foo('changePrefix'); + t.is(result.code, 1); + t.is(result.stdout, ''); + t.is(result.stderr, 'prefix: prefix was changed'); + t.is(shell.error(), 'prefix: prefix was changed'); +}); + +test('Plugins can continue from errors', t => { + const result = shell.foo('continue'); + t.is(result.code, 1); + t.is(result.stdout, 'hello world'); + t.is(result.stderr, 'foo: Error, but continuing'); + t.is(shell.error(), 'foo: Error, but continuing'); +}); + +test('Cannot overwrite an existing command by default', t => { + const oldCat = shell.cat; + t.throws(() => { + plugin.register('cat', fooImplementation); + }, 'unable to overwrite `cat` command'); + t.is(shell.cat, oldCat); +}); diff --git a/test/plugin.js b/test/plugin.js deleted file mode 100644 index 681f1f6aa..000000000 --- a/test/plugin.js +++ /dev/null @@ -1,128 +0,0 @@ -var plugin = require('../plugin'); -var shell = require('..'); - -var assert = require('assert'); - -shell.config.silent = true; - -var data = 0; -var ret; -var fname; - -function fooImplementation(options, arg) { - // Some sort of side effect, so we know when this is called - if (arg) { - fname = arg; - } else { - fname = plugin.readFromPipe(); - } - - if (arg === 'exitWithCode5') { - plugin.error('Exited with code 5', 5); - } else if (arg === 'changePrefix') { - plugin.error('prefix was changed', { - prefix: 'prefix: ', - }); - } else if (arg === 'continue') { - plugin.error('Error, but continuing', { - continue: true, - }); - } - - if (options.flag) { - data = 12; - } else { - data++; - } - return 'hello world'; -} - -// All plugin utils exist -assert.equal(typeof plugin.error, 'function'); -assert.equal(typeof plugin.parseOptions, 'function'); -assert.equal(typeof plugin.readFromPipe, 'function'); -assert.equal(typeof plugin.register, 'function'); - -// The plugin does not exist before it's registered -assert.ok(!shell.foo); - -// Register the plugin -plugin.register('foo', fooImplementation, { - cmdOptions: { - 'f': 'flag', - }, - wrapOutput: true, - canReceivePipe: true, -}); - -// The plugin exists after registering -assert.equal(typeof shell.foo, 'function'); - -// The command fails for invalid options -ret = shell.foo('-n', 'filename'); -assert.equal(ret.code, 1); -assert.equal(ret.stdout, ''); -assert.equal(ret.stderr, 'foo: option not recognized: n'); -assert.equal(shell.error(), 'foo: option not recognized: n'); - -// The command succeeds for normal calls -assert.equal(data, 0); -shell.foo('filename'); -assert.equal(data, 1); -assert.equal(fname, 'filename'); -shell.foo('filename2'); -assert.equal(data, 2); -assert.equal(fname, 'filename2'); - -// The command parses options -shell.foo('-f', 'filename'); -assert.equal(data, 12); -assert.equal(fname, 'filename'); - -// The command supports globbing by default -shell.foo('-f', 're*u?ces'); -assert.equal(data, 12); -assert.equal(fname, 'resources'); - -// Plugins are also compatible with shelljs/global -require('../global'); -assert.equal(typeof global.foo, 'function'); -assert.equal(global.foo, shell.foo); - -// Plugins can be added as methods to ShellStrings -ret = shell.ShellString('hello world\n'); -assert.equal(ret.toString(), 'hello world\n'); -assert.equal(typeof ret.grep, 'function'); // existing methods persist -assert.equal(typeof ret.foo, 'function'); -ret.foo(); -assert.equal(fname, 'hello world\n'); // readFromPipe() works - -// Plugins can signal errors -ret = shell.foo('exitWithCode5'); -assert.equal(ret.code, 5); -assert.equal(ret.stdout, ''); -assert.equal(ret.stderr, 'foo: Exited with code 5'); -assert.equal(shell.error(), 'foo: Exited with code 5'); - -// Plugins can change the prefix -ret = shell.foo('changePrefix'); -assert.equal(ret.code, 1); -assert.equal(ret.stdout, ''); -assert.equal(ret.stderr, 'prefix: prefix was changed'); -assert.equal(shell.error(), 'prefix: prefix was changed'); - -// Plugins can continue from errors -ret = shell.foo('continue'); -assert.equal(ret.code, 1); -assert.equal(ret.stdout, 'hello world'); -assert.equal(ret.stderr, 'foo: Error, but continuing'); -assert.equal(shell.error(), 'foo: Error, but continuing'); - -// Cannot overwrite an existing command by default -var oldCat = shell.cat; -assert.throws(function () { - plugin.register('cat', fooImplementation); -}, 'Error: unable to overwrite `cat` command'); -assert.equal(shell.cat, oldCat); - -shell.exit(123); From a8b593354567fc38916e00887740eb307370e20e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 27 Nov 2016 11:48:40 -0800 Subject: [PATCH 058/338] test: refactor which tests to AVA (#580) --- ava-test/which.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++ test/which.js | 41 ----------------------------------------- 2 files changed, 47 insertions(+), 41 deletions(-) create mode 100644 ava-test/which.js delete mode 100644 test/which.js diff --git a/ava-test/which.js b/ava-test/which.js new file mode 100644 index 000000000..13b92c7bf --- /dev/null +++ b/ava-test/which.js @@ -0,0 +1,47 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +// +// Invalids +// + +test('no args', t => { + shell.which(); + t.truthy(shell.error()); +}); + +test('command does not exist in the path', t => { + const result = shell.which('asdfasdfasdfasdfasdf'); // what are the odds... + t.falsy(shell.error()); + t.falsy(result); +}); + +// +// Valids +// + +// TODO(nate): make sure this does not have a false negative if 'git' is missing +test('basic usage', t => { + const git = shell.which('git'); + t.is(git.code, 0); + t.falsy(git.stderr); + t.falsy(shell.error()); + t.truthy(fs.existsSync(git.toString())); +}); + +test('Windows can search with or without a .exe extension', t => { + if (process.platform === 'win32') { + // This should be equivalent on Windows + const node = shell.which('node'); + const nodeExe = shell.which('node.exe'); + t.falsy(shell.error()); + // If the paths are equal, then this file *should* exist, since that's + // already been checked. + t.is(node.toString(), nodeExe.toString()); + } +}); diff --git a/test/which.js b/test/which.js deleted file mode 100644 index fdf96c2cc..000000000 --- a/test/which.js +++ /dev/null @@ -1,41 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.which(); -assert.ok(shell.error()); - -var result = shell.which('asdfasdfasdfasdfasdf'); // what are the odds... -assert.ok(!shell.error()); -assert.ok(!result); - -// -// Valids -// - -var node = shell.which('node'); -assert.equal(node.code, 0); -assert.ok(!node.stderr); -assert.ok(!shell.error()); -assert.ok(fs.existsSync(node + '')); - -if (process.platform === 'win32') { - // This should be equivalent on Windows - var nodeExe = shell.which('node.exe'); - assert.ok(!shell.error()); - // If the paths are equal, then this file *should* exist, since that's - // already been checked. - assert.equal(node + '', nodeExe + ''); -} - -shell.exit(123); From b0d00ea0319fe4284a88225d0ed35762d8754dd7 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 27 Nov 2016 13:14:04 -0800 Subject: [PATCH 059/338] test: refactor set tests to AVA (#576) --- ava-test/set.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ test/set.js | 67 ------------------------------------------ 2 files changed, 78 insertions(+), 67 deletions(-) create mode 100644 ava-test/set.js delete mode 100644 test/set.js diff --git a/ava-test/set.js b/ava-test/set.js new file mode 100644 index 000000000..5ff50649b --- /dev/null +++ b/ava-test/set.js @@ -0,0 +1,78 @@ +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +const oldConfigSilent = shell.config.silent; +const uncaughtErrorExitCode = 1; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.cp('-r', 'resources', t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + +// +// Valids +// + +test('initial values', t => { + t.false(oldConfigSilent); + t.false(shell.config.verbose); + t.false(shell.config.fatal); + t.false(shell.config.noglob); +}); + +test('default behavior', t => { + const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + t.is(result.code, 0); + t.is(result.stdout, '1234\n'); + t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); +}); + +test('set -e', t => { + const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + t.is(result.code, uncaughtErrorExitCode); + t.is(result.stdout, ''); + t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); +}); + +test('set -v', t => { + const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + t.is(result.code, 0); + t.is(result.stdout, '1234\n'); + t.is( + result.stderr, + 'ls file_doesnt_exist\nls: no such file or directory: file_doesnt_exist\necho 1234\n' + ); +}); + +test('set -ev', t => { + const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + t.is(result.code, uncaughtErrorExitCode); + t.is(result.stdout, ''); + t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); + t.truthy(result.stderr.indexOf('ls file_doesnt_exist\n') >= 0); + t.is(result.stderr.indexOf('echo 1234\n'), -1); +}); + +test('set -e, set +e', t => { + const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + t.is(result.code, 0); + t.is(result.stdout, '1234\n'); + t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); +}); + +test('set -f', t => { + shell.set('-f'); // disable globbing + shell.rm(`${t.context.tmp}/*.txt`); + t.truthy(shell.error()); // file '*.txt' doesn't exist, so rm() fails + shell.set('+f'); + shell.rm(`${t.context.tmp}/*.txt`); + t.falsy(shell.error()); // globbing works, so rm succeeds +}); + diff --git a/test/set.js b/test/set.js deleted file mode 100644 index 005cab8f3..000000000 --- a/test/set.js +++ /dev/null @@ -1,67 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); - -var oldConfigSilent = shell.config.silent; -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); - -// -// Valids -// - -var result; - -// initial values -assert.strictEqual(oldConfigSilent, false); -assert.strictEqual(shell.config.verbose, false); -assert.strictEqual(shell.config.fatal, false); -assert.strictEqual(shell.config.noglob, false); - -shell.cp('-R', 'resources/', 'tmp'); - -// default behavior -result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); -assert.equal(result.code, 0); -assert.equal(result.stdout, '1234\n'); -assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); - -// set -e -result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); -var nodeVersion = process.versions.node.split('.').map(function (str) { return parseInt(str, 10); }); -var uncaughtErrorExitCode = (nodeVersion[0] === 0 && nodeVersion[1] < 11) ? 8 : 1; -assert.equal(result.code, uncaughtErrorExitCode); -assert.equal(result.stdout, ''); -assert(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); - -// set -v -result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); -assert.equal(result.code, 0); -assert.equal(result.stdout, '1234\n'); -assert.equal(result.stderr, 'ls file_doesnt_exist\nls: no such file or directory: file_doesnt_exist\necho 1234\n'); - -// set -ev -result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); -assert.equal(result.code, uncaughtErrorExitCode); -assert.equal(result.stdout, ''); -assert(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); -assert(result.stderr.indexOf('ls file_doesnt_exist\n') >= 0); -assert.equal(result.stderr.indexOf('echo 1234\n'), -1); - -// set -e, set +e -result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); -assert.equal(result.code, 0); -assert.equal(result.stdout, '1234\n'); -assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); - -// set -f -shell.set('-f'); // disable globbing -shell.rm('tmp/*.txt'); -assert.ok(shell.error()); // file '*.txt' doesn't exist, so rm() fails -shell.set('+f'); -shell.rm('tmp/*.txt'); -assert.ok(!shell.error()); // globbing works, so rm succeeds - -shell.exit(123); - From 6b15577541c76b3b4ddfe55b3a08969a6985d47b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 30 Nov 2016 21:14:49 -0800 Subject: [PATCH 060/338] test: refactor exec tests to AVA (#574) * test: refactor exec tests to AVA * change single quotes to double quotes for Win --- ava-test/exec.js | 193 +++++++++++++++++++++++++++++++++++++++++++++++ test/exec.js | 174 ------------------------------------------ 2 files changed, 193 insertions(+), 174 deletions(-) create mode 100644 ava-test/exec.js delete mode 100644 test/exec.js diff --git a/ava-test/exec.js b/ava-test/exec.js new file mode 100644 index 000000000..8222bede5 --- /dev/null +++ b/ava-test/exec.js @@ -0,0 +1,193 @@ +import os from 'os'; +import path from 'path'; +import util from 'util'; + +import test from 'ava'; + +import shell from '..'; + +const CWD = process.cwd(); +shell.config.silent = true; + +test.afterEach.always(() => { + process.chdir(CWD); +}); + +// +// Invalids +// + +test('no args', t => { + shell.exec(); + t.truthy(shell.error()); +}); + +test('unknown command', t => { + const result = shell.exec('asdfasdf'); // could not find command + t.truthy(result.code > 0); +}); + +test('config.fatal and unknown command', t => { + const oldFatal = shell.config.fatal; + shell.config.fatal = true; + t.throws(() => { + shell.exec('asdfasdf'); // could not find command + }, /exec: internal error/); + shell.config.fatal = oldFatal; +}); + +// +// Valids +// + +// +// sync +// + +test('check if stdout goes to output', t => { + const result = shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(1234);"`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '1234\n'); +}); + +test('check if stderr goes to output', t => { + const result = shell.exec(`${JSON.stringify(process.execPath)} -e "console.error(1234);"`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, ''); + t.is(result.stderr, '1234\n'); +}); + +test('check if stdout + stderr go to output', t => { + const result = shell.exec(`${JSON.stringify(process.execPath)} -e "console.error(1234); console.log(666);"`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '666\n'); + t.is(result.stderr, '1234\n'); +}); + +test('check exit code', t => { + const result = shell.exec(`${JSON.stringify(process.execPath)} -e "process.exit(12);"`); + t.truthy(shell.error()); + t.is(result.code, 12); +}); + +test('interaction with cd', t => { + shell.cd('resources/external'); + const result = shell.exec(`${JSON.stringify(process.execPath)} node_script.js`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'node_script_1234\n'); +}); + +test('check quotes escaping', t => { + const result = shell.exec(util.format(JSON.stringify(process.execPath) + ' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"")); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, "'+'_'+'\n"); +}); + +test('set cwd', t => { + const cmdString = process.platform === 'win32' ? 'cd' : 'pwd'; + const result = shell.exec(cmdString, { cwd: '..' }); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, path.resolve('..') + os.EOL); +}); + +test('set maxBuffer (very small)', t => { + const result = shell.exec('echo 1234567890'); // default maxBuffer is ok + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '1234567890' + os.EOL); + if (process.version >= 'v0.11') { // this option doesn't work on v0.10 + shell.exec('echo 1234567890', { maxBuffer: 6 }); + t.truthy(shell.error()); + } +}); + +test('set timeout option', t => { + const result = shell.exec(`${JSON.stringify(process.execPath)} resources/exec/slow.js 100`); // default timeout is ok + t.falsy(shell.error()); + t.is(result.code, 0); + if (process.version >= 'v0.11') { + // this option doesn't work on v0.10 + shell.exec(`${JSON.stringify(process.execPath)} resources/exec/slow.js 100`, { timeout: 10 }); // times out + + t.truthy(shell.error()); + } +}); + +test('check process.env works', t => { + t.falsy(shell.env.FOO); + shell.env.FOO = 'Hello world'; + const result = shell.exec(process.platform !== 'win32' ? 'echo $FOO' : 'echo %FOO%'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'Hello world' + os.EOL); + t.is(result.stderr, ''); +}); + +test('set shell option (TODO: add tests for Windows)', t => { + if (process.platform !== 'win32') { + let result = shell.exec('echo $0'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '/bin/sh\n'); // sh by default + const bashPath = shell.which('bash').trim(); + // this option doesn't work on v0.10 + if (bashPath && process.version >= 'v0.11') { + result = shell.exec('echo $0', { shell: '/bin/bash' }); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '/bin/bash\n'); + } + } +}); + +test('exec returns a ShellString', t => { + const result = shell.exec('echo foo'); + t.is(typeof result, 'object'); + t.truthy(result instanceof String); + t.is(typeof result.stdout, 'string'); + t.is(result.toString(), result.stdout); +}); + +// +// async +// + +test.cb('no callback', t => { + const c = shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(1234)"`, { async: true }); + t.falsy(shell.error()); + t.truthy('stdout' in c, 'async exec returns child process object'); + t.end(); +}); + +test.cb('callback as 2nd argument', t => { + shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(5678);"`, (code, stdout, stderr) => { + t.is(code, 0); + t.is(stdout, '5678\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +test.cb('callback as end argument', t => { + shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(5566);"`, { async: true }, (code, stdout, stderr) => { + t.is(code, 0); + t.is(stdout, '5566\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +test.cb('callback as 3rd argument (silent:true)', t => { + shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(5678);"`, { silent: true }, (code, stdout, stderr) => { + t.is(code, 0); + t.is(stdout, '5678\n'); + t.is(stderr, ''); + t.end(); + }); +}); diff --git a/test/exec.js b/test/exec.js deleted file mode 100644 index 1c725c383..000000000 --- a/test/exec.js +++ /dev/null @@ -1,174 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var util = require('util'); -var path = require('path'); -var os = require('os'); - -shell.config.silent = true; - -// -// Invalids -// - -shell.exec(); -assert.ok(shell.error()); - -var result = shell.exec('asdfasdf'); // could not find command -assert.ok(result.code > 0); - -// Test 'fatal' mode for exec, temporarily overriding process.exit -var oldFatal = shell.config.fatal; - -shell.config.fatal = true; - -assert.throws(function () { - shell.exec('asdfasdf'); // could not find command -}, /exec: internal error/); - -shell.config.fatal = oldFatal; - -// -// Valids -// - -// -// sync -// - -// check if stdout goes to output -result = shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(1234);"'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.stdout === '1234\n' || result.stdout === '1234\nundefined\n'); // 'undefined' for v0.4 - -// check if stderr goes to output -result = shell.exec(JSON.stringify(process.execPath) + ' -e "console.error(1234);"'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.stdout === '' || result.stdout === 'undefined\n'); // 'undefined' for v0.4 -assert.ok(result.stderr === '1234\n' || result.stderr === '1234\nundefined\n'); // 'undefined' for v0.4 - -// check if stdout + stderr go to output -result = shell.exec(JSON.stringify(process.execPath) + ' -e "console.error(1234); console.log(666);"'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.stdout === '666\n' || result.stdout === '666\nundefined\n'); // 'undefined' for v0.4 -assert.ok(result.stderr === '1234\n' || result.stderr === '1234\nundefined\n'); // 'undefined' for v0.4 - -// check exit code -result = shell.exec(JSON.stringify(process.execPath) + ' -e "process.exit(12);"'); -assert.ok(shell.error()); -assert.equal(result.code, 12); - -// interaction with cd -shell.cd('resources/external'); -result = shell.exec(JSON.stringify(process.execPath) + ' node_script.js'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.stdout, 'node_script_1234\n'); -shell.cd('../..'); - -// check quotes escaping -result = shell.exec(util.format(JSON.stringify(process.execPath) + ' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"")); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.stdout, "'+'_'+'\n"); - -// set cwd -var cmdString = process.platform === 'win32' ? 'cd' : 'pwd'; -result = shell.exec(cmdString, { cwd: '..' }); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.stdout, path.resolve('..') + os.EOL); - -// set maxBuffer (very small) -result = shell.exec('echo 1234567890'); // default maxBuffer is ok -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.stdout, '1234567890' + os.EOL); -if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - shell.exec('echo 1234567890', { maxBuffer: 6 }); - assert.ok(shell.error()); -} - -// set timeout option -result = shell.exec(JSON.stringify(process.execPath) + ' resources/exec/slow.js 100'); // default timeout is ok -assert.ok(!shell.error()); -assert.equal(result.code, 0); -if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - result = shell.exec(JSON.stringify(process.execPath) + ' resources/exec/slow.js 100', { timeout: 10 }); // times out - assert.ok(shell.error()); -} - -// check process.env works -assert.ok(!shell.env.FOO); -shell.env.FOO = 'Hello world'; -result = shell.exec(process.platform !== 'win32' ? 'echo $FOO' : 'echo %FOO%'); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.equal(result.stdout, 'Hello world' + os.EOL); -assert.equal(result.stderr, ''); - -// set shell option (TODO: add tests for Windows) -if (process.platform !== 'win32') { - result = shell.exec('echo $0'); - assert.ok(!shell.error()); - assert.equal(result.code, 0); - assert.equal(result.stdout, '/bin/sh\n'); // sh by default - var bashPath = shell.which('bash').trim(); - // this option doesn't work on v0.10 - if (bashPath && process.version >= 'v0.11') { - result = shell.exec('echo $0', { shell: '/bin/bash' }); - assert.ok(!shell.error()); - assert.equal(result.code, 0); - assert.equal(result.stdout, '/bin/bash\n'); - } -} - -// exec returns a ShellString -result = shell.exec('echo foo'); -assert.ok(typeof result === 'object'); -assert.ok(result instanceof String); -assert.ok(typeof result.stdout === 'string'); -assert.strictEqual(result.toString(), result.stdout); - -// -// async -// - -// no callback -var c = shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(1234)"', { async: true }); -assert.equal(shell.error(), null); -assert.ok('stdout' in c, 'async exec returns child process object'); - -// -// callback as 2nd argument -// -shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(5678);"', function (code, stdout, stderr) { - assert.equal(code, 0); - assert.ok(stdout === '5678\n' || stdout === '5678\nundefined\n'); // 'undefined' for v0.4 - assert.ok(stderr === '' || stderr === 'undefined\n'); // 'undefined' for v0.4 - - // - // callback as 3rd argument - // - shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(5566);"', { async: true }, function (code2, stdout2, stderr2) { - assert.equal(code2, 0); - assert.ok(stdout2 === '5566\n' || stdout2 === '5566\nundefined\n'); // 'undefined' for v0.4 - assert.ok(stderr2 === '' || stderr2 === 'undefined\n'); // 'undefined' for v0.4 - - // - // callback as 3rd argument (slient:true) - // - shell.exec(JSON.stringify(process.execPath) + ' -e "console.log(5678);"', { silent: true }, function (code3, stdout3, stderr3) { - assert.equal(code3, 0); - assert.ok(stdout3 === '5678\n' || stdout3 === '5678\nundefined\n'); // 'undefined' for v0.4 - assert.ok(stderr3 === '' || stderr3 === 'undefined\n'); // 'undefined' for v0.4 - - shell.exit(123); - }); - }); -}); - -assert.equal(shell.error(), null); From e4b71f0a231a12f47db3ac07158f37f4ac9667e6 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 6 Dec 2016 23:52:02 -0800 Subject: [PATCH 061/338] Add ability to configure error from parseOptions (#594) --- src/common.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/common.js b/src/common.js index 8211feff4..573849f9c 100644 --- a/src/common.js +++ b/src/common.js @@ -135,7 +135,7 @@ exports.getUserHome = getUserHome; // parseOptions('-a', {'a':'alice', 'b':'bob'}); // Returns {'reference': 'string-value', 'bob': false} when passed two dictionaries of the form: // parseOptions({'-r': 'string-value'}, {'r':'reference', 'b':'bob'}); -function parseOptions(opt, map) { +function parseOptions(opt, map, errorOptions) { if (!map) error('parseOptions() internal error: no map given'); // All options are false by default @@ -165,6 +165,8 @@ function parseOptions(opt, map) { } else { options[optionName] = true; } + } else if (typeof errorOptions === 'object') { + error('option not recognized: ' + c, errorOptions); } else { error('option not recognized: ' + c); } @@ -176,10 +178,14 @@ function parseOptions(opt, map) { if (c in map) { optionName = map[c]; options[optionName] = opt[key]; // assign the given value + } else if (typeof errorOptions === 'object') { + error('option not recognized: ' + c, errorOptions); } else { error('option not recognized: ' + c); } }); + } else if (typeof errorOptions === 'object') { + error('options must be strings or key-value pairs', errorOptions); } else { error('options must be strings or key-value pairs'); } From 5ded216dc2d111fb32a3769ca38f091d2005b135 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 7 Dec 2016 12:11:40 -0800 Subject: [PATCH 062/338] Use Object.assign if possible (#593) * Fix typo * Set objectAssign to Object.assign if defined * Use correct terminology --- src/common.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/common.js b/src/common.js index 573849f9c..12f5298d4 100644 --- a/src/common.js +++ b/src/common.js @@ -251,19 +251,21 @@ function randomFileName() { exports.randomFileName = randomFileName; // objectAssign(target_obj, source_obj1 [, source_obj2 ...]) -// Ponyfill for Object.assign +// "Ponyfill" for Object.assign // objectAssign({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} -function objectAssign(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function (source) { - Object.keys(source).forEach(function (key) { - target[key] = source[key]; +var objectAssign = typeof Object.assign === 'function' ? + Object.assign : + function objectAssign(target) { + var sources = [].slice.call(arguments, 1); + sources.forEach(function (source) { + Object.keys(source).forEach(function (key) { + target[key] = source[key]; + }); }); - }); - return target; -} -exports.extend = Object.assign || objectAssign; + return target; + }; +exports.extend = objectAssign; // Common wrapper for all Unix-like commands that performs glob expansion, // command-logging, and other nice things From 76370ed946be790fcb7efe377128c5e7c5a58af6 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 7 Dec 2016 21:59:51 -0800 Subject: [PATCH 063/338] Remove files related to lgtm.co (#596) --- .lgtm | 2 -- MAINTAINERS | 2 -- 2 files changed, 4 deletions(-) delete mode 100644 .lgtm delete mode 100644 MAINTAINERS diff --git a/.lgtm b/.lgtm deleted file mode 100644 index 6702a0df2..000000000 --- a/.lgtm +++ /dev/null @@ -1,2 +0,0 @@ -approvals = 1 -pattern = "(?i):shipit:|:\\+1:|LGTM|\\+1" diff --git a/MAINTAINERS b/MAINTAINERS deleted file mode 100644 index f6e5d47ae..000000000 --- a/MAINTAINERS +++ /dev/null @@ -1,2 +0,0 @@ -Nate Fischer (@nfischer) -Brandon Freitag (@freitagbr) From 947e47ebb6614bcfc53afa6d5c1d5d84986535cd Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 20:14:44 -0800 Subject: [PATCH 064/338] test: refactor pwd tests to AVA (#582) --- ava-test/pwd.js | 41 +++++++++++++++++++++++++++++++++++++++++ test/pwd.js | 28 ---------------------------- 2 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 ava-test/pwd.js delete mode 100644 test/pwd.js diff --git a/ava-test/pwd.js b/ava-test/pwd.js new file mode 100644 index 000000000..84ad68bd2 --- /dev/null +++ b/ava-test/pwd.js @@ -0,0 +1,41 @@ +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +const cur = process.cwd(); + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + process.chdir(cur); + shell.rm('-rf', t.context.tmp); +}); + + +// +// Valids +// + +test('initial directory', t => { + const cwd = shell.pwd(); + t.falsy(shell.error()); + t.is(cwd.code, 0); + t.falsy(cwd.stderr); + t.is(cwd.toString(), path.resolve('.')); +}); + +test('after changing directory', t => { + shell.cd(t.context.tmp); + const cwd = shell.pwd(); + t.is(cwd.code, 0); + t.falsy(cwd.stderr); + t.falsy(shell.error()); + t.is(path.basename(cwd.toString()), t.context.tmp); +}); diff --git a/test/pwd.js b/test/pwd.js deleted file mode 100644 index 8d86b2460..000000000 --- a/test/pwd.js +++ /dev/null @@ -1,28 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var path = require('path'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - -var _pwd = shell.pwd(); -assert.equal(shell.error(), null); -assert.equal(_pwd.code, 0); -assert.ok(!_pwd.stderr); -assert.equal(_pwd, path.resolve('.')); - -shell.cd('tmp'); -_pwd = shell.pwd(); -assert.equal(_pwd.code, 0); -assert.ok(!_pwd.stderr); -assert.equal(shell.error(), null); -assert.equal(path.basename(_pwd.toString()), 'tmp'); - -shell.exit(123); From c51abffc5c49ccaede0f2396768bde06a487ba95 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 21:35:39 -0800 Subject: [PATCH 065/338] test: refactor mv tests to AVA (#597) --- ava-test/mv.js | 206 +++++++++++++++++++++++++++++++++++++++++++++++++ test/mv.js | 166 --------------------------------------- 2 files changed, 206 insertions(+), 166 deletions(-) create mode 100644 ava-test/mv.js delete mode 100644 test/mv.js diff --git a/ava-test/mv.js b/ava-test/mv.js new file mode 100644 index 000000000..dc2788529 --- /dev/null +++ b/ava-test/mv.js @@ -0,0 +1,206 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +const CWD = process.cwd(); +const numLines = utils.numLines; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.cp('-r', 'resources', t.context.tmp); + shell.cd(t.context.tmp); +}); + +test.afterEach.always(t => { + process.chdir(CWD); + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('no args', t => { + const result = shell.mv(); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mv: missing and/or '); +}); + +test('one arg', t => { + const result = shell.mv('file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mv: missing and/or '); +}); + +test('option only', t => { + const result = shell.mv('-f'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mv: missing and/or '); +}); + +test('option not supported', t => { + t.truthy(fs.existsSync('file1')); // precondition + const result = shell.mv('-Z', 'file1', 'file1'); + t.truthy(shell.error()); + t.truthy(fs.existsSync('file1')); + t.is(result.code, 1); + t.is(result.stderr, 'mv: option not recognized: Z'); +}); + +test('source does not exist', t => { + const result = shell.mv('asdfasdf', '..'); + t.truthy(shell.error()); + t.is(numLines(shell.error()), 1); + t.falsy(fs.existsSync('../asdfasdf')); + t.is(result.code, 1); + t.is(result.stderr, 'mv: no such file or directory: asdfasdf'); +}); + +test('sources do not exist', t => { + const result = shell.mv('asdfasdf1', 'asdfasdf2', '..'); + t.truthy(shell.error()); + t.is(numLines(shell.error()), 2); + t.falsy(fs.existsSync('../asdfasdf1')); + t.falsy(fs.existsSync('../asdfasdf2')); + t.is(result.code, 1); + t.is( + result.stderr, + 'mv: no such file or directory: asdfasdf1\nmv: no such file or directory: asdfasdf2' + ); +}); + +test('too many sources (dest is file)', t => { + const result = shell.mv('asdfasdf1', 'asdfasdf2', 'file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mv: dest is not a directory (too many sources)'); +}); + +test('-n is no-force/no-clobber', t => { + const result = shell.mv('-n', 'file1', 'file2'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mv: dest file already exists: file2'); +}); + +test('-f is the default behavior', t => { + const result = shell.mv('file1', 'file2'); // dest already exists (but that's ok) + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); +}); + +test('-fn is the same as -n', t => { + const result = shell.mv('-fn', 'file1', 'file2'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mv: dest file already exists: file2'); +}); + +test('too many sources (exist, but dest is file)', t => { + const result = shell.mv('file1', 'file2', 'a_file'); + t.truthy(shell.error()); + t.falsy(fs.existsSync('a_file')); + t.is(result.code, 1); + t.is(result.stderr, 'mv: dest is not a directory (too many sources)'); +}); + +test('can\'t use wildcard when dest is file', t => { + const result = shell.mv('file*', 'file1'); + t.truthy(shell.error()); + t.truthy(fs.existsSync('file1')); + t.truthy(fs.existsSync('file2')); + t.truthy(fs.existsSync('file1.js')); + t.truthy(fs.existsSync('file2.js')); + t.is(result.code, 1); + t.is(result.stderr, 'mv: dest is not a directory (too many sources)'); +}); + +// +// Valids +// + +test('handles self OK', t => { + const tmp2 = `${t.context.tmp}-2`; + shell.mkdir(tmp2); + let result = shell.mv('*', tmp2); // has to handle self (tmp2 --> tmp2) without throwing error + t.truthy(shell.error()); // there's an error, but not fatal + t.truthy(fs.existsSync(`${tmp2}/file1`)); // moved OK + t.is(result.code, 1); + result = shell.mv(`${tmp2}/*`, '.'); // revert + t.truthy(fs.existsSync('file1')); // moved OK + t.is(result.code, 0); +}); + +test('one source', t => { + let result = shell.mv('file1', 'file3'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync('file1')); + t.truthy(fs.existsSync('file3')); + result = shell.mv('file3', 'file1'); // revert + t.falsy(shell.error()); + t.truthy(fs.existsSync('file1')); + t.is(result.code, 0); +}); + +test('two sources', t => { + shell.rm('-rf', 't'); + shell.mkdir('-p', 't'); + let result = shell.mv('file1', 'file2', 't'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync('file1')); + t.falsy(fs.existsSync('file2')); + t.truthy(fs.existsSync('t/file1')); + t.truthy(fs.existsSync('t/file2')); + result = shell.mv('t/*', '.'); // revert + t.is(result.code, 0); + t.truthy(fs.existsSync('file1')); + t.truthy(fs.existsSync('file2')); +}); + +test('two sources, array style', t => { + shell.rm('-rf', 't'); + shell.mkdir('-p', 't'); + let result = shell.mv(['file1', 'file2'], 't'); // two sources + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync('file1')); + t.falsy(fs.existsSync('file2')); + t.truthy(fs.existsSync('t/file1')); + t.truthy(fs.existsSync('t/file2')); + result = shell.mv('t/*', '.'); // revert + t.truthy(fs.existsSync('file1')); + t.truthy(fs.existsSync('file2')); +}); + +test('wildcard', t => { + shell.mkdir('-p', 't'); + let result = shell.mv('file*.js', 't'); // wildcard + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync('file1.js')); + t.falsy(fs.existsSync('file2.js')); + t.truthy(fs.existsSync('t/file1.js')); + t.truthy(fs.existsSync('t/file2.js')); + result = shell.mv('t/*', '.'); // revert + t.truthy(fs.existsSync('file1.js')); + t.truthy(fs.existsSync('file2.js')); +}); + +test('dest exists, but -f given', t => { + const result = shell.mv('-f', 'file1', 'file2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync('file1')); + t.truthy(fs.existsSync('file2')); +}); diff --git a/test/mv.js b/test/mv.js deleted file mode 100644 index 2bb62efef..000000000 --- a/test/mv.js +++ /dev/null @@ -1,166 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); -var numLines = require('./utils/utils').numLines; - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// Prepare tmp/ -shell.cp('resources/*', 'tmp'); - -// -// Invalids -// - -var result = shell.mv(); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: missing and/or '); - -result = shell.mv('file1'); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: missing and/or '); - -result = shell.mv('-f'); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: missing and/or '); - -result = shell.mv('-Z', 'tmp/file1', 'tmp/file1'); // option not supported -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: option not recognized: Z'); - -result = shell.mv('asdfasdf', 'tmp'); // source does not exist -assert.ok(shell.error()); -assert.equal(numLines(shell.error()), 1); -assert.equal(fs.existsSync('tmp/asdfasdf'), false); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: no such file or directory: asdfasdf'); - -result = shell.mv('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist -assert.ok(shell.error()); -assert.equal(numLines(shell.error()), 2); -assert.equal(fs.existsSync('tmp/asdfasdf1'), false); -assert.equal(fs.existsSync('tmp/asdfasdf2'), false); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: no such file or directory: asdfasdf1\nmv: no such file or directory: asdfasdf2'); - -result = shell.mv('asdfasdf1', 'asdfasdf2', 'tmp/file1'); // too many sources (dest is file) -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: dest is not a directory (too many sources)'); - -// -n is no-force/no-clobber -result = shell.mv('-n', 'tmp/file1', 'tmp/file2'); // dest already exists -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: dest file already exists: tmp/file2'); - -// -f is the default behavior -shell.cp('tmp/file1', 'tmp/tmp_file'); -result = shell.mv('tmp/tmp_file', 'tmp/file2'); // dest already exists (but that's ok) -assert.ok(!shell.error()); -assert.ok(!result.stderr); -assert.equal(result.code, 0); - -// -fn is the same as -n -result = shell.mv('-fn', 'tmp/file1', 'tmp/file2'); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: dest file already exists: tmp/file2'); - -result = shell.mv('tmp/file1', 'tmp/file2', 'tmp/a_file'); // too many sources (exist, but dest is file) -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/a_file'), false); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: dest is not a directory (too many sources)'); - -result = shell.mv('tmp/file*', 'tmp/file1'); // can't use wildcard when dest is file -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); -assert.equal(fs.existsSync('tmp/file1.js'), true); -assert.equal(fs.existsSync('tmp/file2.js'), true); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mv: dest is not a directory (too many sources)'); - -// -// Valids -// - -shell.cd('tmp'); - -// handles self OK -shell.mkdir('tmp2'); -result = shell.mv('*', 'tmp2'); // has to handle self (tmp2 --> tmp2) without throwing error -assert.ok(shell.error()); // there's an error, but not fatal -assert.equal(fs.existsSync('tmp2/file1'), true); // moved OK -assert.equal(result.code, 1); -result = shell.mv('tmp2/*', '.'); // revert -assert.equal(fs.existsSync('file1'), true); // moved OK -assert.equal(result.code, 0); - -result = shell.mv('file1', 'file3'); // one source -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file3'), true); -result = shell.mv('file3', 'file1'); // revert -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), true); -assert.equal(result.code, 0); - -// two sources -shell.rm('-rf', 't'); -shell.mkdir('-p', 't'); -result = shell.mv('file1', 'file2', 't'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), false); -assert.equal(fs.existsSync('t/file1'), true); -assert.equal(fs.existsSync('t/file2'), true); -result = shell.mv('t/*', '.'); // revert -assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), true); -assert.equal(fs.existsSync('file2'), true); - -// two sources, array style -shell.rm('-rf', 't'); -shell.mkdir('-p', 't'); -result = shell.mv(['file1', 'file2'], 't'); // two sources -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), false); -assert.equal(fs.existsSync('t/file1'), true); -assert.equal(fs.existsSync('t/file2'), true); -result = shell.mv('t/*', '.'); // revert -assert.equal(fs.existsSync('file1'), true); -assert.equal(fs.existsSync('file2'), true); - -result = shell.mv('file*.js', 't'); // wildcard -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1.js'), false); -assert.equal(fs.existsSync('file2.js'), false); -assert.equal(fs.existsSync('t/file1.js'), true); -assert.equal(fs.existsSync('t/file2.js'), true); -result = shell.mv('t/*', '.'); // revert -assert.equal(fs.existsSync('file1.js'), true); -assert.equal(fs.existsSync('file2.js'), true); - -result = shell.mv('-f', 'file1', 'file2'); // dest exists, but -f given -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), true); - -shell.exit(123); From 1cdb0518765956bb670102e109a61808c5100ed0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 21:35:53 -0800 Subject: [PATCH 066/338] test: refactor head tests to AVA (#600) --- ava-test/head.js | 120 +++++++++++++++++++++++++++++++++++++++++++++++ test/head.js | 113 -------------------------------------------- 2 files changed, 120 insertions(+), 113 deletions(-) create mode 100644 ava-test/head.js delete mode 100644 test/head.js diff --git a/ava-test/head.js b/ava-test/head.js new file mode 100644 index 000000000..19ee9e459 --- /dev/null +++ b/ava-test/head.js @@ -0,0 +1,120 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +// +// Invalids +// + +test('no args', t => { + const result = shell.head(); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('file does not exist', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.head('/adsfasdf'); // file does not exist + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +// +// Valids +// + +const topOfFile1 = ['file1 1', 'file1 2', 'file1 3', 'file1 4', 'file1 5', + 'file1 6', 'file1 7', 'file1 8', 'file1 9', 'file1 10', + 'file1 11', 'file1 12', 'file1 13', 'file1 14', 'file1 15', + 'file1 16', 'file1 17', 'file1 18', 'file1 19', 'file1 20']; +const topOfFile2 = ['file2 1', 'file2 2', 'file2 3', 'file2 4', 'file2 5', + 'file2 6', 'file2 7', 'file2 8', 'file2 9', 'file2 10', + 'file2 11', 'file2 12', 'file2 13', 'file2 14', 'file2 15', + 'file2 16', 'file2 17', 'file2 18', 'file2 19', 'file2 20']; + +test('simple', t => { + const result = shell.head('resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), topOfFile1.slice(0, 10).join('\n') + '\n'); +}); + +test('multiple files', t => { + const result = shell.head('resources/head/file2.txt', + 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), topOfFile2 + .slice(0, 10) + .concat(topOfFile1.slice(0, 10)) + .join('\n') + '\n'); +}); + +test('multiple files, array syntax', t => { + const result = shell.head(['resources/head/file2.txt', + 'resources/head/file1.txt']); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), topOfFile2 + .slice(0, 10) + .concat(topOfFile1.slice(0, 10)) + .join('\n') + '\n'); +}); + +test('reading more lines than are in the file (no trailing newline)', t => { + const result = shell.head('resources/file2', 'resources/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'test2\ntest1'); // these files only have one line (no \n) +}); + +test('reading more lines than are in the file (with trailing newline)', t => { + const result = shell.head('resources/head/shortfile2', + 'resources/head/shortfile1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'short2\nshort1\n'); // these files only have one line (with \n) +}); + +test('Globbed file', t => { + const result = shell.head('resources/head/file?.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), topOfFile1 + .slice(0, 10) + .concat(topOfFile2.slice(0, 10)) + .join('\n') + '\n'); +}); + +test('With `\'-n\' ` option', t => { + const result = shell.head('-n', 4, 'resources/head/file2.txt', + 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), topOfFile2 + .slice(0, 4) + .concat(topOfFile1.slice(0, 4)) + .join('\n') + '\n'); +}); + +test('With `{\'-n\': }` option', t => { + const result = shell.head({ '-n': 4 }, 'resources/head/file2.txt', + 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), topOfFile2 + .slice(0, 4) + .concat(topOfFile1.slice(0, 4)) + .join('\n') + '\n'); +}); + +test('negative values (-num) are the same as (numLines - num)', t => { + const result = shell.head('-n', -46, 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'file1 1\nfile1 2\nfile1 3\nfile1 4\n'); +}); diff --git a/test/head.js b/test/head.js deleted file mode 100644 index 4692bdad2..000000000 --- a/test/head.js +++ /dev/null @@ -1,113 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -var result; - -// -// Invalids -// - -result = shell.head(); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.head('/adsfasdf'); // file does not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); - -// -// Valids -// - -var topOfFile1 = ['file1 1', 'file1 2', 'file1 3', 'file1 4', 'file1 5', - 'file1 6', 'file1 7', 'file1 8', 'file1 9', 'file1 10', - 'file1 11', 'file1 12', 'file1 13', 'file1 14', 'file1 15', - 'file1 16', 'file1 17', 'file1 18', 'file1 19', 'file1 20']; -var topOfFile2 = ['file2 1', 'file2 2', 'file2 3', 'file2 4', 'file2 5', - 'file2 6', 'file2 7', 'file2 8', 'file2 9', 'file2 10', - 'file2 11', 'file2 12', 'file2 13', 'file2 14', 'file2 15', - 'file2 16', 'file2 17', 'file2 18', 'file2 19', 'file2 20']; - -// simple -result = shell.head('resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, topOfFile1.slice(0, 10).join('\n') + '\n'); - -// multiple files -result = shell.head('resources/head/file2.txt', 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, topOfFile2 - .slice(0, 10) - .concat(topOfFile1.slice(0, 10)) - .join('\n') + '\n' -); - -// multiple files, array syntax -result = shell.head(['resources/head/file2.txt', 'resources/head/file1.txt']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, topOfFile2 - .slice(0, 10) - .concat(topOfFile1.slice(0, 10)) - .join('\n') + '\n' -); - -// reading more lines than are in the file (no trailing newline) -result = shell.head('resources/file2', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'test2\ntest1'); // these files only have one line (no \n) - -// reading more lines than are in the file (with trailing newline) -result = shell.head('resources/head/shortfile2', 'resources/head/shortfile1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'short2\nshort1\n'); // these files only have one line (with \n) - -// Globbed file -result = shell.head('resources/head/file?.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, topOfFile1 - .slice(0, 10) - .concat(topOfFile2.slice(0, 10)) - .join('\n') + '\n' -); - -// With `'-n' ` option -result = shell.head('-n', 4, 'resources/head/file2.txt', 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, topOfFile2 - .slice(0, 4) - .concat(topOfFile1.slice(0, 4)) - .join('\n') + '\n' -); - -// With `{'-n': }` option -result = shell.head({ '-n': 4 }, 'resources/head/file2.txt', 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, topOfFile2 - .slice(0, 4) - .concat(topOfFile1.slice(0, 4)) - .join('\n') + '\n' -); - -// negative values (-num) are the same as (numLines - num) -result = shell.head('-n', -46, 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'file1 1\nfile1 2\nfile1 3\nfile1 4\n'); - -shell.exit(123); From ef68bd32afd0e06f85a69b033f24b902355a66c7 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 21:36:09 -0800 Subject: [PATCH 067/338] test: refactor tail tests to AVA (#601) --- ava-test/tail.js | 133 +++++++++++++++++++++++++++++++++++++++++++++++ test/tail.js | 105 ------------------------------------- 2 files changed, 133 insertions(+), 105 deletions(-) create mode 100644 ava-test/tail.js delete mode 100644 test/tail.js diff --git a/ava-test/tail.js b/ava-test/tail.js new file mode 100644 index 000000000..1ec7dd80f --- /dev/null +++ b/ava-test/tail.js @@ -0,0 +1,133 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +// +// Invalids +// + +test('no args', t => { + const result = shell.tail(); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('file does not exist', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.tail('/adsfasdf'); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +// +// Valids +// + +const bottomOfFile1 = ['file1 50', 'file1 49', 'file1 48', 'file1 47', 'file1 46', + 'file1 45', 'file1 44', 'file1 43', 'file1 42', 'file1 41', + 'file1 40', 'file1 39', 'file1 38', 'file1 37', 'file1 36', + 'file1 35', 'file1 34', 'file1 33', 'file1 32', 'file1 31']; +const bottomOfFile2 = ['file2 50', 'file2 49', 'file2 48', 'file2 47', 'file2 46', + 'file2 45', 'file2 44', 'file2 43', 'file2 42', 'file2 41', + 'file2 40', 'file2 39', 'file2 38', 'file2 37', 'file2 36', + 'file2 35', 'file2 34', 'file2 33', 'file2 32', 'file2 31']; + +test('simple', t => { + const result = shell.tail('resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), bottomOfFile1.slice(0, 10).reverse().join('\n') + '\n'); +}); + +test('multiple files', t => { + const result = shell.tail('resources/head/file2.txt', 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile2 + .slice(0, 10) + .reverse() + .concat(bottomOfFile1.slice(0, 10).reverse()) + .join('\n') + '\n'); +}); + +test('multiple files, array syntax', t => { + const result = shell.tail(['resources/head/file2.txt', 'resources/head/file1.txt']); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile2 + .slice(0, 10) + .reverse() + .concat(bottomOfFile1.slice(0, 10).reverse()) + .join('\n') + '\n'); +}); + +test('reading more lines than are in the file (no trailing newline)', t => { + const result = shell.tail('resources/file2', 'resources/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'test2\ntest1'); // these files only have one line (no \n) +}); + +test('reading more lines than are in the file (with trailing newline)', t => { + const result = shell.tail('resources/head/shortfile2', 'resources/head/shortfile1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'short2\nshort1\n'); // these files only have one line (with \n) +}); + +test('Globbed file', t => { + const result = shell.tail('resources/head/file?.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile1 + .slice(0, 10) + .reverse() + .concat(bottomOfFile2.slice(0, 10).reverse()) + .join('\n') + '\n'); +}); + +test('With `\'-n\' ` option', t => { + const result = shell.tail('-n', 4, 'resources/head/file2.txt', + 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile2 + .slice(0, 4) + .reverse() + .concat(bottomOfFile1.slice(0, 4).reverse()) + .join('\n') + '\n'); +}); + +test('With `{\'-n\': }` option', t => { + const result = shell.tail({ '-n': 4 }, 'resources/head/file2.txt', + 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile2 + .slice(0, 4) + .reverse() + .concat(bottomOfFile1.slice(0, 4).reverse()) + .join('\n') + '\n'); +}); + +test('negative values are the same as positive values', t => { + const result = shell.tail('-n', -4, 'resources/head/file2.txt', + 'resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile2 + .slice(0, 4) + .reverse() + .concat(bottomOfFile1.slice(0, 4).reverse()) + .join('\n') + '\n'); +}); diff --git a/test/tail.js b/test/tail.js deleted file mode 100644 index 1aa077e21..000000000 --- a/test/tail.js +++ /dev/null @@ -1,105 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -var result; - -// -// Invalids -// - -result = shell.tail(); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.tail('/adsfasdf'); // file does not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); - -// -// Valids -// - -var bottomOfFile1 = ['file1 50', 'file1 49', 'file1 48', 'file1 47', 'file1 46', - 'file1 45', 'file1 44', 'file1 43', 'file1 42', 'file1 41', - 'file1 40', 'file1 39', 'file1 38', 'file1 37', 'file1 36', - 'file1 35', 'file1 34', 'file1 33', 'file1 32', 'file1 31']; -var bottomOfFile2 = ['file2 50', 'file2 49', 'file2 48', 'file2 47', 'file2 46', - 'file2 45', 'file2 44', 'file2 43', 'file2 42', 'file2 41', - 'file2 40', 'file2 39', 'file2 38', 'file2 37', 'file2 36', - 'file2 35', 'file2 34', 'file2 33', 'file2 32', 'file2 31']; - -// simple -result = shell.tail('resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, bottomOfFile1.slice(0, 10).reverse().join('\n') + '\n'); - -// multiple files -result = shell.tail('resources/head/file2.txt', 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, bottomOfFile2.slice(0, 10).reverse().concat( - bottomOfFile1.slice(0, 10).reverse() - ).join('\n') + '\n'); - -// multiple files, array syntax -result = shell.tail(['resources/head/file2.txt', 'resources/head/file1.txt']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, bottomOfFile2.slice(0, 10).reverse().concat( - bottomOfFile1.slice(0, 10).reverse() - ).join('\n') + '\n'); - -// reading more lines than are in the file (no trailing newline) -result = shell.tail('resources/file2', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'test2\ntest1'); // these files only have one line (no \n) - -// reading more lines than are in the file (with trailing newline) -result = shell.tail('resources/head/shortfile2', 'resources/head/shortfile1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'short2\nshort1\n'); // these files only have one line (with \n) - -// Globbed file -result = shell.tail('resources/head/file?.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, bottomOfFile1.slice(0, 10).reverse().concat( - bottomOfFile2.slice(0, 10).reverse() - ).join('\n') + '\n'); - -// With `'-n' ` option -result = shell.tail('-n', 4, 'resources/head/file2.txt', 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, bottomOfFile2.slice(0, 4).reverse().concat( - bottomOfFile1.slice(0, 4).reverse() - ).join('\n') + '\n'); - -// With `{'-n': }` option -result = shell.tail({ '-n': 4 }, 'resources/head/file2.txt', 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, bottomOfFile2.slice(0, 4).reverse().concat( - bottomOfFile1.slice(0, 4).reverse() - ).join('\n') + '\n'); - -// negative values are the same as positive values -result = shell.tail('-n', -4, 'resources/head/file2.txt', 'resources/head/file1.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result, bottomOfFile2.slice(0, 4).reverse().concat( - bottomOfFile1.slice(0, 4).reverse() - ).join('\n') + '\n'); - -shell.exit(123); From 66fa1048aa3d88c85217065390045578423325fc Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 21:36:22 -0800 Subject: [PATCH 068/338] test: refactor sort tests to AVA (#602) --- ava-test/sort.js | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ test/sort.js | 94 --------------------------------------------- 2 files changed, 99 insertions(+), 94 deletions(-) create mode 100644 ava-test/sort.js delete mode 100644 test/sort.js diff --git a/ava-test/sort.js b/ava-test/sort.js new file mode 100644 index 000000000..23109d24e --- /dev/null +++ b/ava-test/sort.js @@ -0,0 +1,99 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +const doubleSorted = shell.cat('resources/sort/sorted') + .trimRight() + .split('\n') + .reduce((prev, cur) => prev.concat([cur, cur]), []) + .join('\n') + '\n'; + + +// +// Invalids +// + +test('no args', t => { + const result = shell.sort(); + t.truthy(shell.error()); + t.truthy(result.code); +}); + +test('file does not exist', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.sort('/adsfasdf'); + t.truthy(shell.error()); + t.truthy(result.code); +}); + +// +// Valids +// + +test('simple', t => { + const result = shell.sort('resources/sort/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/sort/sorted').toString()); +}); + +test('simple #2', t => { + const result = shell.sort('resources/sort/file2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/sort/sorted').toString()); +}); + +test('multiple files', t => { + const result = shell.sort('resources/sort/file2', 'resources/sort/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), doubleSorted); +}); + +test('multiple files, array syntax', t => { + const result = shell.sort(['resources/sort/file2', 'resources/sort/file1']); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), doubleSorted); +}); + +test('Globbed file', t => { + const result = shell.sort('resources/sort/file?'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), doubleSorted); +}); + +test('With \'-n\' option', t => { + const result = shell.sort('-n', 'resources/sort/file2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/sort/sortedDashN').toString()); +}); + +test('With \'-r\' option', t => { + const result = shell.sort('-r', 'resources/sort/file2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/sort/sorted') + .trimRight() + .split('\n') + .reverse() + .join('\n') + '\n'); +}); + +test('With \'-rn\' option', t => { + const result = shell.sort('-rn', 'resources/sort/file2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/sort/sortedDashN') + .trimRight() + .split('\n') + .reverse() + .join('\n') + '\n'); +}); diff --git a/test/sort.js b/test/sort.js deleted file mode 100644 index 4e50fd405..000000000 --- a/test/sort.js +++ /dev/null @@ -1,94 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -var result; - -var doubleSorted = shell.cat('resources/sort/sorted') - .trimRight() - .split('\n') - .reduce(function (prev, cur) { - return prev.concat([cur, cur]); - }, []) - .join('\n') + '\n'; - -// -// Invalids -// - -result = shell.sort(); -assert.ok(shell.error()); -assert.ok(result.code); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.sort('/adsfasdf'); // file does not exist -assert.ok(shell.error()); -assert.ok(result.code); - -// -// Valids -// - -// simple -result = shell.sort('resources/sort/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/sort/sorted')); - -// simple -result = shell.sort('resources/sort/file2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/sort/sorted')); - -// multiple files -result = shell.sort('resources/sort/file2', 'resources/sort/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', doubleSorted); - -// multiple files, array syntax -result = shell.sort(['resources/sort/file2', 'resources/sort/file1']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', doubleSorted); - -// Globbed file -result = shell.sort('resources/sort/file?'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', doubleSorted); - -// With '-n' option -result = shell.sort('-n', 'resources/sort/file2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/sort/sortedDashN')); - -// With '-r' option -result = shell.sort('-r', 'resources/sort/file2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/sort/sorted') - .trimRight() - .split('\n') - .reverse() - .join('\n') + '\n'); - -// With '-rn' option -result = shell.sort('-rn', 'resources/sort/file2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/sort/sortedDashN') - .trimRight() - .split('\n') - .reverse() - .join('\n') + '\n'); - -shell.exit(123); From f06c5845e91a0b0abffc00e811ecbcd233484994 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 21:36:49 -0800 Subject: [PATCH 069/338] test: refactor pipe tests to AVA (#608) --- ava-test/pipe.js | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ test/pipe.js | 64 ----------------------------------------- 2 files changed, 74 insertions(+), 64 deletions(-) create mode 100644 ava-test/pipe.js delete mode 100644 test/pipe.js diff --git a/ava-test/pipe.js b/ava-test/pipe.js new file mode 100644 index 000000000..dbb2cc5fd --- /dev/null +++ b/ava-test/pipe.js @@ -0,0 +1,74 @@ +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +// +// Invalids +// + +test('commands like `rm` cannot be on the right side of pipes', t => { + t.is(typeof shell.ls('.').rm, 'undefined'); + t.is(typeof shell.cat('resources/file1.txt').rm, 'undefined'); +}); + +// +// Valids +// + +test('piping to cat() should return roughly the same thing', t => { + t.is( + shell.cat('resources/file1.txt').cat().toString(), + shell.cat('resources/file1.txt').toString() + ); +}); + +test('piping ls() into cat() converts to a string-like object', t => { + t.is(shell.ls('resources/').cat().toString(), shell.ls('resources/').stdout); +}); + +test('grep works in a pipe', t => { + const result = shell.ls('resources/').grep('file1'); + t.is(result.toString(), 'file1\nfile1.js\nfile1.txt\n'); +}); + +test('multiple pipes work', t => { + const result = shell.ls('resources/').cat().grep('file1'); + t.is(result.toString(), 'file1\nfile1.js\nfile1.txt\n'); +}); + +test('Equivalent to a simple grep() test case', t => { + const result = shell.cat('resources/grep/file').grep(/alpha*beta/); + t.falsy(shell.error()); + t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); +}); + +test('Equivalent to a simple sed() test case', t => { + const result = shell.cat('resources/grep/file').sed(/l*\.js/, ''); + t.falsy(shell.error()); + t.is( + result.toString(), + 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n' + ); +}); + +test('Sort a file by frequency of each line', t => { + const result = shell.sort('resources/uniq/pipe').uniq('-c').sort('-n'); + t.falsy(shell.error()); + t.is(result.toString(), shell.cat('resources/uniq/pipeSorted').toString()); +}); + +test('Synchronous exec', t => { + const result = shell.cat('resources/grep/file').exec('shx grep "alpha*beta"'); + t.falsy(shell.error()); + t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); +}); + +test.cb('Asynchronous exec', t => { + shell.cat('resources/grep/file').exec('shx grep "alpha*beta"', (code, stdout) => { + t.is(code, 0); + t.is(stdout, 'alphaaaaaaabeta\nalphbeta\n'); + t.end(); + }); +}); diff --git a/test/pipe.js b/test/pipe.js deleted file mode 100644 index 9a0560e1b..000000000 --- a/test/pipe.js +++ /dev/null @@ -1,64 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -// commands like `rm` can't be on the right side of pipes -assert.equal(typeof shell.ls('.').rm, 'undefined'); -assert.equal(typeof shell.cat('resources/file1.txt').rm, 'undefined'); - -// -// Valids -// - -// piping to cat() should return roughly the same thing -assert.strictEqual(shell.cat('resources/file1.txt').cat().toString(), - shell.cat('resources/file1.txt').toString()); - -// piping ls() into cat() converts to a string -assert.strictEqual(shell.ls('resources/').cat().toString(), - shell.ls('resources/').stdout); - -var result; -result = shell.ls('resources/').grep('file1'); -assert.equal(result + '', 'file1\nfile1.js\nfile1.txt\n'); - -result = shell.ls('resources/').cat().grep('file1'); -assert.equal(result + '', 'file1\nfile1.js\nfile1.txt\n'); - -// Equivalent to a simple grep() test case -result = shell.cat('resources/grep/file').grep(/alpha*beta/); -assert.equal(shell.error(), null); -assert.equal(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); - -// Equivalent to a simple sed() test case -result = shell.cat('resources/grep/file').sed(/l*\.js/, ''); -assert.ok(!shell.error()); -assert.equal(result.toString(), 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n'); - -// Sort a file by frequency of each line -result = shell.sort('resources/uniq/pipe').uniq('-c').sort('-n'); -assert.equal(shell.error(), null); -assert.equal(result.toString(), shell.cat('resources/uniq/pipeSorted').toString()); - -// Synchronous exec. To support Windows, the arguments must be passed -// using double quotes because node, following win32 convention, -// passes single quotes through to process.argv verbatim. -result = shell.cat('resources/grep/file').exec('shx grep "alpha*beta"'); -assert.ok(!shell.error()); -assert.equal(result, 'alphaaaaaaabeta\nalphbeta\n'); - -// Async exec -shell.cat('resources/grep/file').exec('shx grep "alpha*beta"', function (code, stdout) { - assert.equal(code, 0); - assert.equal(stdout, 'alphaaaaaaabeta\nalphbeta\n'); - shell.exit(123); -}); From c3811f7e667bad473084a6f025a551539f82e65d Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 21:47:08 -0800 Subject: [PATCH 070/338] test: refactor find tests to AVA (#611) --- ava-test/find.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ test/find.js | 56 ------------------------------------------- 2 files changed, 62 insertions(+), 56 deletions(-) create mode 100644 ava-test/find.js delete mode 100644 test/find.js diff --git a/ava-test/find.js b/ava-test/find.js new file mode 100644 index 000000000..af6be88f7 --- /dev/null +++ b/ava-test/find.js @@ -0,0 +1,62 @@ +import test from 'ava'; + +import shell from '..'; + +const CWD = process.cwd(); + +test.beforeEach(() => { + shell.config.silent = true; + process.chdir(CWD); +}); + +// +// Invalids +// + +test('no args', t => { + const result = shell.find(); + t.is(result.code, 1); + t.truthy(shell.error()); +}); + +// +// Valids +// + +test('current path', t => { + shell.cd('resources/find'); + const result = shell.find('.'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('.hidden') > -1); + t.truthy(result.indexOf('dir1/dir11/a_dir11') > -1); + t.is(result.length, 11); + shell.cd('../..'); +}); + +test('simple path', t => { + const result = shell.find('resources/find'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/find/.hidden') > -1); + t.truthy(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1); + t.is(result.length, 11); +}); + +test('multiple paths - comma', t => { + const result = shell.find('resources/find/dir1', 'resources/find/dir2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1); + t.truthy(result.indexOf('resources/find/dir2/a_dir1') > -1); + t.is(result.length, 6); +}); + +test('multiple paths - array', t => { + const result = shell.find(['resources/find/dir1', 'resources/find/dir2']); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1); + t.truthy(result.indexOf('resources/find/dir2/a_dir1') > -1); + t.is(result.length, 6); +}); diff --git a/test/find.js b/test/find.js deleted file mode 100644 index 4f1408f33..000000000 --- a/test/find.js +++ /dev/null @@ -1,56 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result = shell.find(); // no paths given -assert.equal(result.code, 1); -assert.ok(shell.error()); - -// -// Valids -// - -// current path -shell.cd('resources/find'); -result = shell.find('.'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('.hidden') > -1, true); -assert.equal(result.indexOf('dir1/dir11/a_dir11') > -1, true); -assert.equal(result.length, 11); -shell.cd('../..'); - -// simple path -result = shell.find('resources/find'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/find/.hidden') > -1, true); -assert.equal(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1, true); -assert.equal(result.length, 11); - -// multiple paths - comma -result = shell.find('resources/find/dir1', 'resources/find/dir2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1, true); -assert.equal(result.indexOf('resources/find/dir2/a_dir1') > -1, true); -assert.equal(result.length, 6); - -// multiple paths - array -result = shell.find(['resources/find/dir1', 'resources/find/dir2']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1, true); -assert.equal(result.indexOf('resources/find/dir2/a_dir1') > -1, true); -assert.equal(result.length, 6); - -shell.exit(123); From 40273b73c45490a60c30054c3d49509d63d20491 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 22:10:58 -0800 Subject: [PATCH 071/338] test: refactor 'test' command tests to AVA (#612) --- ava-test/test.js | 131 +++++++++++++++++++++++++++++++++++++++++++++++ test/test.js | 98 ----------------------------------- 2 files changed, 131 insertions(+), 98 deletions(-) create mode 100644 ava-test/test.js delete mode 100644 test/test.js diff --git a/ava-test/test.js b/ava-test/test.js new file mode 100644 index 000000000..498bbea6d --- /dev/null +++ b/ava-test/test.js @@ -0,0 +1,131 @@ +import test from 'ava'; + +import shell from '..'; +import common from '../src/common'; + +shell.config.silent = true; + +// +// Invalids +// + +test('no expression given', t => { + shell.test(); + t.truthy(shell.error()); +}); + +test('bad expression', t => { + shell.test('asdf'); + t.truthy(shell.error()); +}); + +test('bad expression #2', t => { + shell.test('f', 'resources/file1'); + t.truthy(shell.error()); +}); + +test('no file', t => { + shell.test('-f'); + t.truthy(shell.error()); +}); + +// +// Valids +// + + +test('-e option succeeds for files', t => { + const result = shell.test('-e', 'resources/file1'); + t.falsy(shell.error()); + t.truthy(result); +}); + +test('-e option fails if it does not exist', t => { + const result = shell.test('-e', 'resources/404'); + t.falsy(shell.error()); + t.falsy(result); +}); + +test('-d option succeeds for a directory', t => { + const result = shell.test('-d', 'resources'); + t.falsy(shell.error()); + t.truthy(result); +}); + +test('-f option fails for a directory', t => { + const result = shell.test('-f', 'resources'); + t.falsy(shell.error()); + t.falsy(result); +}); + +test('-L option fails for a directory', t => { + const result = shell.test('-L', 'resources'); + t.falsy(shell.error()); + t.falsy(result); +}); + +test('-d option fails for a file', t => { + const result = shell.test('-d', 'resources/file1'); + t.falsy(shell.error()); + t.falsy(result); +}); + +test('-f option succeeds for a file', t => { + const result = shell.test('-f', 'resources/file1'); + t.falsy(shell.error()); + t.truthy(result); +}); + +test('-L option fails for a file', t => { + const result = shell.test('-L', 'resources/file1'); + t.falsy(shell.error()); + t.falsy(result); +}); + +test('test command is not globbed', t => { + // regression #529 + const result = shell.test('-f', 'resources/**/*.js'); + t.falsy(shell.error()); + t.falsy(result); +}); + +// TODO(nate): figure out a way to test links on Windows +test('-d option fails for a link', t => { + if (common.platform !== 'win') { + const result = shell.test('-d', 'resources/link'); + t.falsy(shell.error()); + t.falsy(result); + } +}); + +test('-f option succeeds for a link', t => { + if (common.platform !== 'win') { + const result = shell.test('-f', 'resources/link'); + t.falsy(shell.error()); + t.truthy(result); + } +}); + +test('-L option succeeds for a symlink', t => { + if (common.platform !== 'win') { + const result = shell.test('-L', 'resources/link'); + t.falsy(shell.error()); + t.truthy(result); + } +}); + +test('-L option works for broken symlinks', t => { + if (common.platform !== 'win') { + const result = shell.test('-L', 'resources/badlink'); + t.falsy(shell.error()); + t.truthy(result); + } +}); + +test('-L option fails for missing files', t => { + if (common.platform !== 'win') { + const result = shell.test('-L', 'resources/404'); + t.falsy(shell.error()); + t.falsy(result); + } +}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 5486970ca..000000000 --- a/test/test.js +++ /dev/null @@ -1,98 +0,0 @@ -var shell = require('..'); -var common = require('../src/common'); - -var assert = require('assert'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result; - -result = shell.test(); // no expression given -assert.ok(shell.error()); - -result = shell.test('asdf'); // bad expression -assert.ok(shell.error()); - -result = shell.test('f', 'resources/file1'); // bad expression -assert.ok(shell.error()); - -result = shell.test('-f'); // no file -assert.ok(shell.error()); - -// -// Valids -// - -// exists -result = shell.test('-e', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, true);// true - -result = shell.test('-e', 'resources/404'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -// directory -result = shell.test('-d', 'resources'); -assert.equal(shell.error(), null); -assert.equal(result, true);// true - -result = shell.test('-f', 'resources'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -result = shell.test('-L', 'resources'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -// file -result = shell.test('-d', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -result = shell.test('-f', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, true);// true - -result = shell.test('-L', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -// regression #529 -result = shell.test('-f', 'resources/**/*.js'); -assert.equal(shell.error(), null); -assert.equal(result, false); - - -// link -// Windows is weird with links so skip these tests -if (common.platform !== 'win') { - result = shell.test('-d', 'resources/link'); - assert.equal(shell.error(), null); - assert.equal(result, false); - - result = shell.test('-f', 'resources/link'); - assert.equal(shell.error(), null); - assert.equal(result, true);// true - - result = shell.test('-L', 'resources/link'); - assert.equal(shell.error(), null); - assert.equal(result, true);// true - - result = shell.test('-L', 'resources/badlink'); - assert.equal(shell.error(), null); - assert.equal(result, true);// true - - result = shell.test('-L', 'resources/404'); - assert.equal(shell.error(), null); - assert.equal(result, false);// false -} - -shell.exit(123); From ffb1cf3db94a75fae1226d4eefca0c1d34dd1036 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 22:26:49 -0800 Subject: [PATCH 072/338] chore: switch to files attribute from npmignore (#613) Prefer the `files` attribute over `.npmignore` to minimize the bytes users download when installing ShellJS. This cuts the size down from ~1.8M to ~1.2M. --- .npmignore | 13 ------------- package.json | 8 ++++++++ 2 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index e5c8da9a0..000000000 --- a/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -test/ -tmp/ -.github/ -.documentup.json -.gitignore -.eslintrc -.eslintignore -.lgtm -.travis.yml -.gitattributes -appveyor.yml -RELEASE.md -CONTRIBUTING.md diff --git a/package.json b/package.json index cbb635764..462f7db86 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,14 @@ "license": "BSD-3-Clause", "homepage": "http://github.com/shelljs/shelljs", "main": "./shell.js", + "files": [ + "global.js", + "make.js", + "plugin.js", + "shell.js", + "bin", + "src" + ], "scripts": { "posttest": "npm run lint", "test": "node scripts/run-tests && ava --serial ava-test/*.js", From 94d65a32f8ab0e2467f056363aad0092caa8d98d Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 23:13:00 -0800 Subject: [PATCH 073/338] test: refactor uniq tests to AVA (#603) --- ava-test/uniq.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ test/uniq.js | 73 ------------------------------------------- 2 files changed, 80 insertions(+), 73 deletions(-) create mode 100644 ava-test/uniq.js delete mode 100644 test/uniq.js diff --git a/ava-test/uniq.js b/ava-test/uniq.js new file mode 100644 index 000000000..ef4fad70f --- /dev/null +++ b/ava-test/uniq.js @@ -0,0 +1,80 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; + +shell.config.silent = true; + +// +// Invalids +// + +test('no args', t => { + const result = shell.uniq(); + t.truthy(shell.error()); + t.truthy(result.code); +}); + +test('file does not exist', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.sort('/adsfasdf'); + t.truthy(shell.error()); + t.truthy(result.code); +}); + +// +// Valids +// + +test('uniq file1', t => { + const result = shell.uniq('resources/uniq/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/uniq/file1u').toString()); +}); + +test('uniq -i file2', t => { + const result = shell.uniq('-i', 'resources/uniq/file2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/uniq/file2u').toString()); +}); + +test('with glob character', t => { + const result = shell.uniq('-i', 'resources/uniq/fi?e2'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/uniq/file2u').toString()); +}); + +test('uniq file1 file2', t => { + const result = shell.uniq('resources/uniq/file1', 'resources/uniq/file1t'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is( + shell.cat('resources/uniq/file1u').toString(), + shell.cat('resources/uniq/file1t').toString() + ); +}); + +test('cat file1 |uniq', t => { + const result = shell.cat('resources/uniq/file1').uniq(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/uniq/file1u').toString()); +}); + +test('uniq -c file1', t => { + const result = shell.uniq('-c', 'resources/uniq/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/uniq/file1c').toString()); +}); + +test('uniq -d file1', t => { + const result = shell.uniq('-d', 'resources/uniq/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), shell.cat('resources/uniq/file1d').toString()); +}); diff --git a/test/uniq.js b/test/uniq.js deleted file mode 100644 index 82a8d5672..000000000 --- a/test/uniq.js +++ /dev/null @@ -1,73 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -var result; - -// -// Invalids -// - -result = shell.uniq(); -assert.ok(shell.error()); -assert.ok(result.code); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.sort('/adsfasdf'); // file does not exist -assert.ok(shell.error()); -assert.ok(result.code); - -// -// Valids -// - -// uniq file1 -result = shell.uniq('resources/uniq/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/uniq/file1u').toString()); - -// uniq -i file2 -result = shell.uniq('-i', 'resources/uniq/file2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/uniq/file2u').toString()); - -// with glob character -result = shell.uniq('-i', 'resources/uniq/fi?e2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/uniq/file2u').toString()); - -// uniq file1 file2 -shell.uniq('resources/uniq/file1', 'resources/uniq/file1t'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(shell.cat('resources/uniq/file1u').toString(), - shell.cat('resources/uniq/file1t').toString()); - -// cat file1 |uniq -result = shell.cat('resources/uniq/file1').uniq(); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/uniq/file1u').toString()); - -// uniq -c file1 -result = shell.uniq('-c', 'resources/uniq/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/uniq/file1c').toString()); - -// uniq -d file1 -result = shell.uniq('-d', 'resources/uniq/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result + '', shell.cat('resources/uniq/file1d').toString()); - -shell.exit(123); From a7ca4d6a8a68146c1afea7185c4b8702a422a3d8 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Dec 2016 23:19:42 -0800 Subject: [PATCH 074/338] test: refactor grep tests to AVA (#606) --- ava-test/grep.js | 138 +++++++++++++++++++++++++++++++++++++++++++++++ test/grep.js | 109 ------------------------------------- 2 files changed, 138 insertions(+), 109 deletions(-) create mode 100644 ava-test/grep.js delete mode 100644 test/grep.js diff --git a/ava-test/grep.js b/ava-test/grep.js new file mode 100644 index 000000000..784c8f2ed --- /dev/null +++ b/ava-test/grep.js @@ -0,0 +1,138 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.cp('-r', 'resources', t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('no args', t => { + const result = shell.grep(); + t.truthy(shell.error()); + t.is(result.code, 2); +}); + +test('too few args', t => { + const result = shell.grep(/asdf/g); // too few args + t.truthy(shell.error()); + t.is(result.code, 2); +}); + +test('no such file', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.grep(/asdf/g, '/asdfasdf'); // no such file + t.truthy(shell.error()); + t.is(result.stderr, 'grep: no such file or directory: /asdfasdf'); + t.is(result.code, 2); +}); + +test('if at least one file is missing, this should be an error', t => { + t.falsy(fs.existsSync('asdfasdf')); // sanity check + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); // sanity check + const result = shell.grep(/asdf/g, `${t.context.tmp}/file1`, 'asdfasdf'); + t.truthy(shell.error()); + t.is(result.stderr, 'grep: no such file or directory: asdfasdf'); + t.is(result.code, 2); +}); + +// +// Valids +// + +test('basic', t => { + const result = shell.grep('line', 'resources/a.txt'); + t.falsy(shell.error()); + t.is(result.split('\n').length - 1, 4); +}); + +test('-v option', t => { + const result = shell.grep('-v', 'line', 'resources/a.txt'); + t.falsy(shell.error()); + t.is(result.split('\n').length - 1, 8); +}); + +test('matches one line', t => { + const result = shell.grep('line one', 'resources/a.txt'); + t.falsy(shell.error()); + t.is(result.toString(), 'This is line one\n'); +}); + +test('multiple files', t => { + const result = shell.grep(/test/, 'resources/file1.txt', + 'resources/file2.txt'); + t.falsy(shell.error()); + t.is(result.toString(), 'test1\ntest2\n'); +}); + +test('multiple files, array syntax', t => { + const result = shell.grep(/test/, ['resources/file1.txt', + 'resources/file2.txt']); + t.falsy(shell.error()); + t.is(result.toString(), 'test1\ntest2\n'); +}); + +test('multiple files, glob syntax, * for file name', t => { + const result = shell.grep(/test/, 'resources/file*.txt'); + t.falsy(shell.error()); + t.truthy(result.toString(), 'test1\ntest2\n'); +}); + +test('multiple files, glob syntax, * for directory name', t => { + const result = shell.grep(/test/, 'r*/file*.txt'); + t.falsy(shell.error()); + t.is(result.toString(), 'test1\ntest2\n'); +}); + +test('multiple files, double-star glob', t => { + const result = shell.grep(/test/, 'resources/**/file*.js'); + t.falsy(shell.error()); + t.is(result.toString(), 'test\ntest\ntest\ntest\n'); +}); + +test('one file, * in regex', t => { + const result = shell.grep(/alpha*beta/, 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); +}); + +test('one file, * in string-regex', t => { + const result = shell.grep('alpha*beta', 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); +}); + +test('one file, * in regex, make sure * is not globbed', t => { + const result = shell.grep(/l*\.js/, 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.toString(), 'this line ends in.js\nlllllllllllllllll.js\n'); +}); + +test('one file, * in string-regex, make sure * is not globbed', t => { + const result = shell.grep('l*\\.js', 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.toString(), 'this line ends in.js\nlllllllllllllllll.js\n'); +}); + +test('-l option', t => { + const result = shell.grep('-l', 'test1', 'resources/file1', 'resources/file2', + 'resources/file1.txt'); + t.falsy(shell.error()); + t.truthy(result.match(/file1(\n|$)/)); + t.truthy(result.match(/file1.txt/)); + t.falsy(result.match(/file2.txt/)); + t.is(result.split('\n').length - 1, 2); +}); diff --git a/test/grep.js b/test/grep.js deleted file mode 100644 index fe377d1e4..000000000 --- a/test/grep.js +++ /dev/null @@ -1,109 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result; - -result = shell.grep(); -assert.ok(shell.error()); -assert.equal(result.code, 2); - -result = shell.grep(/asdf/g); // too few args -assert.ok(shell.error()); -assert.equal(result.code, 2); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.grep(/asdf/g, '/asdfasdf'); // no such file -assert.ok(shell.error()); -assert.equal(result.stderr, 'grep: no such file or directory: /asdfasdf'); -assert.equal(result.code, 2); - -// if at least one file is missing, this should be an error -shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('asdfasdf'), false); // sanity check -assert.equal(fs.existsSync('tmp/file1'), true); // sanity check -result = shell.grep(/asdf/g, 'tmp/file1', 'asdfasdf'); -assert.ok(shell.error()); -assert.equal(result.stderr, 'grep: no such file or directory: asdfasdf'); -assert.equal(result.code, 2); - -// -// Valids -// - -result = shell.grep('line', 'resources/a.txt'); -assert.equal(shell.error(), null); -assert.equal(result.split('\n').length - 1, 4); - -result = shell.grep('-v', 'line', 'resources/a.txt'); -assert.equal(shell.error(), null); -assert.equal(result.split('\n').length - 1, 8); - -result = shell.grep('line one', 'resources/a.txt'); -assert.equal(shell.error(), null); -assert.equal(result, 'This is line one\n'); - -// multiple files -result = shell.grep(/test/, 'resources/file1.txt', 'resources/file2.txt'); -assert.equal(shell.error(), null); -assert.equal(result, 'test1\ntest2\n'); - -// multiple files, array syntax -result = shell.grep(/test/, ['resources/file1.txt', 'resources/file2.txt']); -assert.equal(shell.error(), null); -assert.equal(result, 'test1\ntest2\n'); - -// multiple files, glob syntax, * for file name -result = shell.grep(/test/, 'resources/file*.txt'); -assert.equal(shell.error(), null); -assert.ok(result.toString() === 'test1\ntest2\n' || result.toString() === 'test2\ntest1\n'); - -// multiple files, glob syntax, * for directory name -result = shell.grep(/test/, '*/file*.txt'); -assert.equal(shell.error(), null); -assert.ok(result.toString() === 'test1\ntest2\n' || result.toString() === 'test2\ntest1\n'); - -// multiple files, glob syntax, ** for directory name -result = shell.grep(/test/, '**/file*.js'); -assert.equal(shell.error(), null); -assert.equal(result, 'test\ntest\ntest\ntest\n'); - -// one file, * in regex -result = shell.grep(/alpha*beta/, 'resources/grep/file'); -assert.equal(shell.error(), null); -assert.equal(result, 'alphaaaaaaabeta\nalphbeta\n'); - -// one file, * in string-regex -result = shell.grep('alpha*beta', 'resources/grep/file'); -assert.equal(shell.error(), null); -assert.equal(result, 'alphaaaaaaabeta\nalphbeta\n'); - -// one file, * in regex, make sure * is not globbed -result = shell.grep(/l*\.js/, 'resources/grep/file'); -assert.equal(shell.error(), null); -assert.equal(result, 'this line ends in.js\nlllllllllllllllll.js\n'); - -// one file, * in string-regex, make sure * is not globbed -result = shell.grep('l*\\.js', 'resources/grep/file'); -assert.equal(shell.error(), null); -assert.equal(result, 'this line ends in.js\nlllllllllllllllll.js\n'); - -// -l option -result = shell.grep('-l', 'test1', 'resources/file1', 'resources/file2', 'resources/file1.txt'); -assert.equal(shell.error(), null); -assert.ok(result.match(/file1(\n|$)/)); -assert.ok(result.match(/file1.txt/)); -assert.ok(!result.match(/file2.txt/)); -assert.equal(result.split('\n').length - 1, 2); - -shell.exit(123); From ded1a3e4a3e00be3bcd1095a4066913011fa930a Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Thu, 8 Dec 2016 23:45:35 -0800 Subject: [PATCH 075/338] Fix: rm behavior regarding symlinks (#598) * Treat files and symlinks separately * Remove -f flag from dir symlink test * Simplify control flow --- ava-test/rm.js | 2 +- src/rm.js | 33 ++++++++++++--------------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/ava-test/rm.js b/ava-test/rm.js index f56d3053c..a3f6b109c 100644 --- a/ava-test/rm.js +++ b/ava-test/rm.js @@ -253,7 +253,7 @@ test( ); test('remove symbolic link to a dir', t => { - const result = shell.rm('-f', `${t.context.tmp}/rm/link_to_a_dir`); + const result = shell.rm(`${t.context.tmp}/rm/link_to_a_dir`); t.falsy(shell.error()); t.is(result.code, 0); t.falsy(fs.existsSync(`${t.context.tmp}/rm/link_to_a_dir`)); diff --git a/src/rm.js b/src/rm.js index c039a3b5f..803adbc5e 100644 --- a/src/rm.js +++ b/src/rm.js @@ -123,31 +123,22 @@ function _rm(options, files) { } // If here, path exists - if (stats.isFile() || stats.isSymbolicLink()) { - // Do not check for file writing permissions - if (options.force) { - common.unlinkSync(file); - return; - } - - if (isWriteable(file)) { + if (stats.isFile()) { + if (options.force || isWriteable(file)) { + // -f was passed, or file is writable, so it can be removed common.unlinkSync(file); } else { common.error('permission denied: ' + file, { continue: true }); } - - return; - } // simple file - - // Path is an existing directory, but no -r flag given - if (stats.isDirectory() && !options.recursive) { - common.error('path is a directory', { continue: true }); - return; // skip path - } - - // Recursively remove existing directory - if (stats.isDirectory() && options.recursive) { - rmdirSyncRecursive(file, options.force); + } else if (stats.isDirectory()) { + if (options.recursive) { + // -r was passed, so directory can be removed + rmdirSyncRecursive(file, options.force); + } else { + common.error('path is a directory', { continue: true }); + } + } else if (stats.isSymbolicLink()) { + common.unlinkSync(file); } }); // forEach(file) return ''; From 6f26d52eab87e3cdf6dfa418cd5ca352843d3641 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 9 Dec 2016 01:25:10 -0800 Subject: [PATCH 076/338] test: refactor ln tests to AVA (#610) --- ava-test/ln.js | 190 +++++++++++++++++++++++++++++++++++++++++++++++ test/ln.js | 197 ------------------------------------------------- 2 files changed, 190 insertions(+), 197 deletions(-) create mode 100644 ava-test/ln.js delete mode 100644 test/ln.js diff --git a/ava-test/ln.js b/ava-test/ln.js new file mode 100644 index 000000000..ec0641897 --- /dev/null +++ b/ava-test/ln.js @@ -0,0 +1,190 @@ +import fs from 'fs'; +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +const CWD = process.cwd(); + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.cp('-r', 'resources', t.context.tmp); + process.chdir(CWD); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('no args', t => { + const result = shell.ln(); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('too few args', t => { + const result = shell.ln('file'); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('only an option', t => { + const result = shell.ln('-f'); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('destination already exists', t => { + const result = shell.ln(`${t.context.tmp}/file1`, `${t.context.tmp}/file2`); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('non-existent source', t => { + const result = shell.ln(`${t.context.tmp}/noexist`, `${t.context.tmp}/linkfile1`); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('non-existent source (-sf)', t => { + const result = shell.ln('-sf', 'no/exist', `${t.context.tmp}/badlink`); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('non-existent source (-f)', t => { + const result = shell.ln('-f', 'noexist', `${t.context.tmp}/badlink`); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +// +// Valids +// + +test('basic usage', t => { + const result = shell.ln(`${t.context.tmp}/file1`, `${t.context.tmp}/linkfile1`); + t.truthy(fs.existsSync(`${t.context.tmp}/linkfile1`)); + t.is( + fs.readFileSync(`${t.context.tmp}/file1`).toString(), + fs.readFileSync(`${t.context.tmp}/linkfile1`).toString() + ); + fs.writeFileSync(`${t.context.tmp}/file1`, 'new content 1'); + t.is(fs.readFileSync(`${t.context.tmp}/linkfile1`).toString(), 'new content 1'); + t.is(result.code, 0); +}); + +test('With glob', t => { + shell.rm(`${t.context.tmp}/linkfile1`); + const result = shell.ln(`${t.context.tmp}/fi*1`, `${t.context.tmp}/linkfile1`); + t.truthy(fs.existsSync(`${t.context.tmp}/linkfile1`)); + t.is( + fs.readFileSync(`${t.context.tmp}/file1`).toString(), + fs.readFileSync(`${t.context.tmp}/linkfile1`).toString() + ); + fs.writeFileSync(`${t.context.tmp}/file1`, 'new content 1'); + t.is(fs.readFileSync(`${t.context.tmp}/linkfile1`).toString(), 'new content 1'); + t.is(result.code, 0); +}); + +test('-s option', t => { + utils.skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'file2', `${t.context.tmp}/linkfile2`), () => { + t.truthy(fs.existsSync(`${t.context.tmp}/linkfile2`)); + t.is( + fs.readFileSync(`${t.context.tmp}/file2`).toString(), + fs.readFileSync(`${t.context.tmp}/linkfile2`).toString() + ); + fs.writeFileSync(`${t.context.tmp}/file2`, 'new content 2'); + t.is(fs.readFileSync(`${t.context.tmp}/linkfile2`).toString(), 'new content 2'); + }); +}); + +test('Symbolic link directory test', t => { + shell.mkdir(`${t.context.tmp}/ln`); + shell.touch(`${t.context.tmp}/ln/hello`); + const result = shell.ln('-s', 'ln', `${t.context.tmp}/dir1`); + t.truthy(fs.existsSync(`${t.context.tmp}/ln/hello`)); + t.truthy(fs.existsSync(`${t.context.tmp}/dir1/hello`)); + t.is(result.code, 0); +}); + +test('To current directory', t => { + shell.cd(t.context.tmp); + let result = shell.ln('-s', './', 'dest'); + t.is(result.code, 0); + shell.touch('testfile.txt'); + t.truthy(fs.existsSync('testfile.txt')); + t.truthy(fs.existsSync('dest/testfile.txt')); + shell.rm('-f', 'dest'); + shell.mkdir('dir1'); + shell.cd('dir1'); + result = shell.ln('-s', './', '../dest'); + t.is(result.code, 0); + shell.touch('insideDir.txt'); + shell.cd('..'); + t.truthy(fs.existsSync('testfile.txt')); + t.truthy(fs.existsSync('dest/testfile.txt')); + t.truthy(fs.existsSync('dir1/insideDir.txt')); + t.falsy(fs.existsSync('dest/insideDir.txt')); + shell.cd('..'); +}); + +test('-f option', t => { + const result = shell.ln('-f', `${t.context.tmp}/file1.js`, `${t.context.tmp}/file2.js`); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file2.js`)); + t.is( + fs.readFileSync(`${t.context.tmp}/file1.js`).toString(), + fs.readFileSync(`${t.context.tmp}/file2.js`).toString() + ); + fs.writeFileSync(`${t.context.tmp}/file1.js`, 'new content js'); + t.is(fs.readFileSync(`${t.context.tmp}/file2.js`).toString(), 'new content js'); +}); + +test('-sf option', t => { + utils.skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', `${t.context.tmp}/file2.txt`), () => { + t.truthy(fs.existsSync(`${t.context.tmp}/file2.txt`)); + t.is( + fs.readFileSync(`${t.context.tmp}/file1.txt`).toString(), + fs.readFileSync(`${t.context.tmp}/file2.txt`).toString() + ); + fs.writeFileSync(`${t.context.tmp}/file1.txt`, 'new content txt'); + t.is(fs.readFileSync(`${t.context.tmp}/file2.txt`).toString(), 'new content txt'); + }); +}); + +test('Abspath regression', t => { + utils.skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1', path.resolve(`${t.context.tmp}/abspath`)), () => { + t.truthy(fs.existsSync(`${t.context.tmp}/abspath`)); + t.is( + fs.readFileSync(`${t.context.tmp}/file1`).toString(), + fs.readFileSync(`${t.context.tmp}/abspath`).toString() + ); + fs.writeFileSync(`${t.context.tmp}/file1`, 'new content 3'); + t.is(fs.readFileSync(`${t.context.tmp}/abspath`).toString(), 'new content 3'); + }); +}); + +test('Relative regression', t => { + utils.skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', `${t.context.tmp}/file2.txt`), () => { + shell.mkdir('-p', `${t.context.tmp}/new`); + // Move the symlink first, as the reverse confuses `mv`. + shell.mv(`${t.context.tmp}/file2.txt`, `${t.context.tmp}/new/file2.txt`); + shell.mv(`${t.context.tmp}/file1.txt`, `${t.context.tmp}/new/file1.txt`); + t.truthy(fs.existsSync(`${t.context.tmp}/new/file2.txt`)); + t.is( + fs.readFileSync(`${t.context.tmp}/new/file1.txt`).toString(), + fs.readFileSync(`${t.context.tmp}/new/file2.txt`).toString() + ); + fs.writeFileSync(`${t.context.tmp}/new/file1.txt`, 'new content txt'); + t.is(fs.readFileSync(`${t.context.tmp}/new/file2.txt`).toString(), 'new content txt'); + }); +}); diff --git a/test/ln.js b/test/ln.js deleted file mode 100644 index b2d1ebc80..000000000 --- a/test/ln.js +++ /dev/null @@ -1,197 +0,0 @@ -var shell = require('..'); -var common = require('../src/common'); -var isWindows = common.platform === 'win'; - -var assert = require('assert'); -var fs = require('fs'); -var path = require('path'); - -shell.config.silent = true; - -// On Windows, symlinks for files need admin permissions. This helper -// skips certain tests if we are on Windows and got an EPERM error -function skipOnWinForEPERM(action, test) { - action(); - var error = shell.error(); - - if (isWindows && error && /EPERM:/.test(error)) { - console.log('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); - } else { - test(); - } -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// Prepare tmp/ -shell.cp('resources/*', 'tmp'); - -// -// Invalids -// - -var result = shell.ln(); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.ln('file'); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.ln('-f'); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.ln('tmp/file1', 'tmp/file2'); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.ln('tmp/noexist', 'tmp/linkfile1'); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.ln('-sf', 'no/exist', 'tmp/badlink'); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.ln('-sf', 'noexist', 'tmp/badlink'); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.ln('-f', 'noexist', 'tmp/badlink'); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -// -// Valids -// - -result = shell.ln('tmp/file1', 'tmp/linkfile1'); -assert(fs.existsSync('tmp/linkfile1')); -assert.equal( - fs.readFileSync('tmp/file1').toString(), - fs.readFileSync('tmp/linkfile1').toString() -); -fs.writeFileSync('tmp/file1', 'new content 1'); -assert.equal( - fs.readFileSync('tmp/linkfile1').toString(), - 'new content 1' -); -assert.equal(result.code, 0); - -// With glob -shell.rm('tmp/linkfile1'); -result = shell.ln('tmp/fi*1', 'tmp/linkfile1'); -assert(fs.existsSync('tmp/linkfile1')); -assert.equal( - fs.readFileSync('tmp/file1').toString(), - fs.readFileSync('tmp/linkfile1').toString() -); -fs.writeFileSync('tmp/file1', 'new content 1'); -assert.equal( - fs.readFileSync('tmp/linkfile1').toString(), - 'new content 1' -); -assert.equal(result.code, 0); - -skipOnWinForEPERM(shell.ln.bind(shell, '-s', 'file2', 'tmp/linkfile2'), function () { - assert(fs.existsSync('tmp/linkfile2')); - assert.equal( - fs.readFileSync('tmp/file2').toString(), - fs.readFileSync('tmp/linkfile2').toString() - ); - fs.writeFileSync('tmp/file2', 'new content 2'); - assert.equal( - fs.readFileSync('tmp/linkfile2').toString(), - 'new content 2' - ); -}); - -// Symbolic link directory test -shell.mkdir('tmp/ln'); -shell.touch('tmp/ln/hello'); -result = shell.ln('-s', 'ln', 'tmp/dir1'); -assert(fs.existsSync('tmp/ln/hello')); -assert(fs.existsSync('tmp/dir1/hello')); -assert.equal(result.code, 0); - -// To current directory -shell.cd('tmp'); -result = shell.ln('-s', './', 'dest'); -assert.equal(result.code, 0); -shell.touch('testfile.txt'); -assert(fs.existsSync('testfile.txt')); -assert(fs.existsSync('dest/testfile.txt')); -shell.rm('-f', 'dest'); -shell.mkdir('dir1'); -shell.cd('dir1'); -result = shell.ln('-s', './', '../dest'); -assert.equal(result.code, 0); -shell.touch('insideDir.txt'); -shell.cd('..'); -assert(fs.existsSync('testfile.txt')); -assert(fs.existsSync('dest/testfile.txt')); -assert(fs.existsSync('dir1/insideDir.txt')); -assert(!fs.existsSync('dest/insideDir.txt')); -shell.cd('..'); - -result = shell.ln('-f', 'tmp/file1.js', 'tmp/file2.js'); -assert.equal(result.code, 0); -assert(fs.existsSync('tmp/file2.js')); -assert.equal( - fs.readFileSync('tmp/file1.js').toString(), - fs.readFileSync('tmp/file2.js').toString() -); -fs.writeFileSync('tmp/file1.js', 'new content js'); -assert.equal( - fs.readFileSync('tmp/file2.js').toString(), - 'new content js' -); - -skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), function () { - assert(fs.existsSync('tmp/file2.txt')); - assert.equal( - fs.readFileSync('tmp/file1.txt').toString(), - fs.readFileSync('tmp/file2.txt').toString() - ); - fs.writeFileSync('tmp/file1.txt', 'new content txt'); - assert.equal( - fs.readFileSync('tmp/file2.txt').toString(), - 'new content txt' - ); -}); - -// Abspath regression -skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1', path.resolve('tmp/abspath')), function () { - assert(fs.existsSync('tmp/abspath')); - assert.equal( - fs.readFileSync('tmp/file1').toString(), - fs.readFileSync('tmp/abspath').toString() - ); - fs.writeFileSync('tmp/file1', 'new content 3'); - assert.equal( - fs.readFileSync('tmp/abspath').toString(), - 'new content 3' - ); -}); - -// Relative regression -skipOnWinForEPERM(shell.ln.bind(shell, '-sf', 'file1.txt', 'tmp/file2.txt'), function () { - shell.mkdir('-p', 'tmp/new'); - // Move the symlink first, as the reverse confuses `mv`. - shell.mv('tmp/file2.txt', 'tmp/new/file2.txt'); - shell.mv('tmp/file1.txt', 'tmp/new/file1.txt'); - assert(fs.existsSync('tmp/new/file2.txt')); - assert.equal( - fs.readFileSync('tmp/new/file1.txt').toString(), - fs.readFileSync('tmp/new/file2.txt').toString() - ); - fs.writeFileSync('tmp/new/file1.txt', 'new content txt'); - assert.equal( - fs.readFileSync('tmp/new/file2.txt').toString(), - 'new content txt' - ); -}); - -shell.exit(123); From 4c82369690a9083d7a23112b2983bd2f174b7c43 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 9 Dec 2016 10:26:43 -0800 Subject: [PATCH 077/338] test: refactor mkdir tests to AVA (#599) --- ava-test/mkdir.js | 149 ++++++++++++++++++++++++++++++++++++++++++++++ test/mkdir.js | 118 ------------------------------------ 2 files changed, 149 insertions(+), 118 deletions(-) create mode 100644 ava-test/mkdir.js delete mode 100644 test/mkdir.js diff --git a/ava-test/mkdir.js b/ava-test/mkdir.js new file mode 100644 index 000000000..343828fb4 --- /dev/null +++ b/ava-test/mkdir.js @@ -0,0 +1,149 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('no args', t => { + const result = shell.mkdir(); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mkdir: no paths given'); +}); + +test('dir already exists', t => { + const mtime = fs.statSync(t.context.tmp).mtime.toString(); + const result = shell.mkdir(t.context.tmp); // dir already exists + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, `mkdir: path already exists: ${t.context.tmp}`); + t.is(fs.statSync(t.context.tmp).mtime.toString(), mtime); // didn't mess with dir +}); + +test('Can\'t overwrite a broken link', t => { + const mtime = fs.lstatSync('resources/badlink').mtime.toString(); + const result = shell.mkdir('resources/badlink'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mkdir: path already exists: resources/badlink'); + t.is(fs.lstatSync('resources/badlink').mtime.toString(), mtime); // didn't mess with file +}); + +test('root path does not exist', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.mkdir('/asdfasdf/foobar'); // root path does not exist + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mkdir: no such file or directory: /asdfasdf'); + t.falsy(fs.existsSync('/asdfasdf')); + t.falsy(fs.existsSync('/asdfasdf/foobar')); +}); + +test('Check for invalid permissions', t => { + if (process.platform !== 'win32') { + // This test case only works on unix, but should work on Windows as well + const dirName = 'nowritedir'; + shell.mkdir(dirName); + t.falsy(shell.error()); + shell.chmod('-w', dirName); + const result = shell.mkdir(dirName + '/foo'); + t.is(result.code, 1); + t.is( + result.stderr, + 'mkdir: cannot create directory nowritedir/foo: Permission denied' + ); + t.truthy(shell.error()); + t.falsy(fs.existsSync(dirName + '/foo')); + shell.rm('-rf', dirName); // clean up + } +}); + +// +// Valids +// + +test('basic usage', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/t1`)); + const result = shell.mkdir(`${t.context.tmp}/t1`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/t1`)); +}); + +test('multiple dirs', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/t2`)); + t.falsy(fs.existsSync(`${t.context.tmp}/t3`)); + const result = shell.mkdir(`${t.context.tmp}/t2`, `${t.context.tmp}/t3`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/t2`)); + t.truthy(fs.existsSync(`${t.context.tmp}/t3`)); +}); + +test('one dir exists, the other does not', t => { + shell.mkdir(`${t.context.tmp}/t1`); + t.truthy(fs.existsSync(`${t.context.tmp}/t1`)); + t.falsy(fs.existsSync(`${t.context.tmp}/t4`)); + const result = shell.mkdir(`${t.context.tmp}/t1`, `${t.context.tmp}/t4`); + t.is(result.code, 1); + t.is(utils.numLines(shell.error()), 1); + t.truthy(fs.existsSync(`${t.context.tmp}/t1`)); + t.truthy(fs.existsSync(`${t.context.tmp}/t4`)); +}); + +test('-p flag', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/a`)); + const result = shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + shell.rm('-Rf', `${t.context.tmp}/a`); // revert +}); + +test('multiple dirs', t => { + const result = shell.mkdir('-p', `${t.context.tmp}/zzza`, + `${t.context.tmp}/zzzb`, `${t.context.tmp}/zzzc`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/zzza`)); + t.truthy(fs.existsSync(`${t.context.tmp}/zzzb`)); + t.truthy(fs.existsSync(`${t.context.tmp}/zzzc`)); +}); + +test('multiple dirs, array syntax', t => { + const result = shell.mkdir('-p', [`${t.context.tmp}/yyya`, + `${t.context.tmp}/yyyb`, `${t.context.tmp}/yyyc`]); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/yyya`)); + t.truthy(fs.existsSync(`${t.context.tmp}/yyyb`)); + t.truthy(fs.existsSync(`${t.context.tmp}/yyyc`)); +}); + +test('globbed dir', t => { + let result = shell.mkdir('-p', `${t.context.tmp}/mydir`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/mydir`)); + result = shell.mkdir('-p', `${t.context.tmp}/m*ir`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/mydir`)); + t.falsy(fs.existsSync(`${t.context.tmp}/m*ir`)); // doesn't create literal name +}); diff --git a/test/mkdir.js b/test/mkdir.js deleted file mode 100644 index 71927d953..000000000 --- a/test/mkdir.js +++ /dev/null @@ -1,118 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); -var numLines = require('./utils/utils').numLines; - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result = shell.mkdir(); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mkdir: no paths given'); - -var mtime = fs.statSync('tmp').mtime.toString(); -result = shell.mkdir('tmp'); // dir already exists -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mkdir: path already exists: tmp'); -assert.equal(fs.statSync('tmp').mtime.toString(), mtime); // didn't mess with dir - -// Can't overwrite a broken link -mtime = fs.lstatSync('resources/badlink').mtime.toString(); -result = shell.mkdir('resources/badlink'); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mkdir: path already exists: resources/badlink'); -assert.equal(fs.lstatSync('resources/badlink').mtime.toString(), mtime); // didn't mess with file - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.mkdir('/asdfasdf/foobar'); // root path does not exist -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.equal(result.stderr, 'mkdir: no such file or directory: /asdfasdf'); -assert.equal(fs.existsSync('/asdfasdf'), false); -assert.equal(fs.existsSync('/asdfasdf/foobar'), false); - -// Check for invalid permissions -if (process.platform !== 'win32') { - // This test case only works on unix, but should work on Windows as well - var dirName = 'nowritedir'; - shell.mkdir(dirName); - assert.ok(!shell.error()); - shell.chmod('-w', dirName); - result = shell.mkdir(dirName + '/foo'); - assert.equal(result.code, 1); - assert.equal(result.stderr, 'mkdir: cannot create directory nowritedir/foo: Permission denied'); - assert.ok(shell.error()); - assert.equal(fs.existsSync(dirName + '/foo'), false); - shell.rm('-rf', dirName); // clean up -} - -// -// Valids -// - -assert.equal(fs.existsSync('tmp/t1'), false); -result = shell.mkdir('tmp/t1'); // simple dir -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/t1'), true); - -assert.equal(fs.existsSync('tmp/t2'), false); -assert.equal(fs.existsSync('tmp/t3'), false); -result = shell.mkdir('tmp/t2', 'tmp/t3'); // multiple dirs -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/t2'), true); -assert.equal(fs.existsSync('tmp/t3'), true); - -assert.equal(fs.existsSync('tmp/t1'), true); -assert.equal(fs.existsSync('tmp/t4'), false); -result = shell.mkdir('tmp/t1', 'tmp/t4'); // one dir exists, one doesn't -assert.equal(numLines(shell.error()), 1); -assert.equal(fs.existsSync('tmp/t1'), true); -assert.equal(fs.existsSync('tmp/t4'), true); - -assert.equal(fs.existsSync('tmp/a'), false); -result = shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -shell.rm('-Rf', 'tmp/a'); // revert - -// multiple dirs -result = shell.mkdir('-p', 'tmp/zzza', 'tmp/zzzb', 'tmp/zzzc'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/zzza'), true); -assert.equal(fs.existsSync('tmp/zzzb'), true); -assert.equal(fs.existsSync('tmp/zzzc'), true); - -// multiple dirs, array syntax -result = shell.mkdir('-p', ['tmp/yyya', 'tmp/yyyb', 'tmp/yyyc']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/yyya'), true); -assert.equal(fs.existsSync('tmp/yyyb'), true); -assert.equal(fs.existsSync('tmp/yyyc'), true); - -// globbed dir -result = shell.mkdir('-p', 'tmp/mydir'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/mydir'), true); -result = shell.mkdir('-p', 'tmp/m*ir'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/mydir'), true); -assert.equal(fs.existsSync('tmp/m*ir'), false); // doesn't create literal name - -shell.exit(123); From 0bb686d758c0d177e84142c4ac8f9e176bba5556 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 9 Dec 2016 10:26:52 -0800 Subject: [PATCH 078/338] test: refactor touch tests to AVA (#604) --- ava-test/touch.js | 174 ++++++++++++++++++++++++++++++++++++++++++++++ test/touch.js | 143 ------------------------------------- 2 files changed, 174 insertions(+), 143 deletions(-) create mode 100644 ava-test/touch.js delete mode 100644 test/touch.js diff --git a/ava-test/touch.js b/ava-test/touch.js new file mode 100644 index 000000000..613ab1232 --- /dev/null +++ b/ava-test/touch.js @@ -0,0 +1,174 @@ +import crypto from 'crypto'; +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + +// Helper functions +function resetUtimes(f) { + const d = new Date(); + d.setYear(2000); + fs.utimesSync(f, d, d); + return fs.statSync(f); +} + +function tmpFile(t, noCreate) { + const str = crypto.randomBytes(Math.ceil(10 / 2)).toString('hex'); + const file = `${t.context.tmp}/${str}`; + if (!noCreate) { + fs.closeSync(fs.openSync(file, 'a')); + } + return file; +} + + +// +// Valids +// + +test('should handle args', t => { + const result = shell.touch(); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('arguments must be strings', t => { + const result = shell.touch(1); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('exits without error when trying to touch a directory', t => { + const result = shell.touch(t.context.tmp); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('creates new files', t => { + const testFile = tmpFile(t); + const result = shell.touch(testFile); + t.truthy(fs.existsSync(testFile)); + t.is(result.code, 0); +}); + +test('does not create a file if told not to', t => { + const testFile = tmpFile(t, true); + const result = shell.touch('-c', testFile); + t.is(result.code, 0); + t.falsy(fs.existsSync(testFile)); +}); + +test('handles globs correctly', t => { + shell.touch(`${t.context.tmp}/file.txt`); + shell.touch(`${t.context.tmp}/file.js`); + const result = shell.touch(`${t.context.tmp}/file*`); + t.is(result.code, 0); + const files = shell.ls(`${t.context.tmp}/file*`); + t.truthy(files.indexOf(`${t.context.tmp}/file.txt`) > -1); + t.truthy(files.indexOf(`${t.context.tmp}/file.js`) > -1); + t.is(files.length, 2); +}); + +test('errors if reference file is not found', t => { + const testFile = tmpFile(t); + const refFile = tmpFile(t, true); + const result = shell.touch({ '-r': refFile }, testFile); + t.is(result.code, 1); + t.truthy(shell.error()); +}); + +test('uses a reference file for mtime', t => { + const testFile = tmpFile(t); + const testFile2 = tmpFile(t); + shell.touch(testFile2); + utils.sleep(1000); + let result = shell.touch(testFile); + t.falsy(shell.error()); + t.is(result.code, 0); + t.not( + fs.statSync(testFile).mtime.getTime(), + fs.statSync(testFile2).mtime.getTime() + ); + t.not( + fs.statSync(testFile).atime.getTime(), + fs.statSync(testFile2).atime.getTime() + ); + result = shell.touch({ '-r': testFile2 }, testFile); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is( + fs.statSync(testFile).mtime.getTime(), + fs.statSync(testFile2).mtime.getTime() + ); + t.is( + fs.statSync(testFile).atime.getTime(), + fs.statSync(testFile2).atime.getTime() + ); +}); + +test('sets mtime and atime by default', t => { + const testFile = tmpFile(t); + const oldStat = resetUtimes(testFile); + const result = shell.touch(testFile); + t.is(result.code, 0); + t.truthy(oldStat.mtime < fs.statSync(testFile).mtime); + t.truthy(oldStat.atime < fs.statSync(testFile).atime); +}); + +test('does not set mtime if told not to', t => { + const testFile = tmpFile(t); + const oldStat = resetUtimes(testFile); + const result = shell.touch('-a', testFile); + t.is(result.code, 0); + t.is(oldStat.mtime.getTime(), fs.statSync(testFile).mtime.getTime()); +}); + +test('does not set atime if told not to', t => { + const testFile = tmpFile(t); + const oldStat = resetUtimes(testFile); + const result = shell.touch('-m', testFile); + t.is(result.code, 0); + t.is(oldStat.atime.getTime(), fs.statSync(testFile).atime.getTime()); +}); + +test('multiple files', t => { + const testFile = tmpFile(t, true); + const testFile2 = tmpFile(t, true); + shell.rm('-f', testFile, testFile2); + const result = shell.touch(testFile, testFile2); + t.is(result.code, 0); + t.truthy(fs.existsSync(testFile)); + t.truthy(fs.existsSync(testFile2)); +}); + +test('file array', t => { + const testFile = tmpFile(t, true); + const testFile2 = tmpFile(t, true); + shell.rm('-f', testFile, testFile2); + const result = shell.touch([testFile, testFile2]); + t.is(result.code, 0); + t.truthy(fs.existsSync(testFile)); + t.truthy(fs.existsSync(testFile2)); +}); + +test('touching broken link creates a new file', t => { + if (process.platform !== 'win32') { + const result = shell.touch('resources/badlink'); + t.is(result.code, 0); + t.falsy(shell.error()); + t.truthy(fs.existsSync('resources/not_existed_file')); + shell.rm('resources/not_existed_file'); + } +}); diff --git a/test/touch.js b/test/touch.js deleted file mode 100644 index 3b8d5d919..000000000 --- a/test/touch.js +++ /dev/null @@ -1,143 +0,0 @@ -var shell = require('..'); -var assert = require('assert'); -var fs = require('fs'); -var crypto = require('crypto'); - -shell.config.silent = true; -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -var oldStat; -var testFile; - -// should handle args -var result = shell.touch(); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.touch(1); -assert.ok(shell.error()); -assert.equal(result.code, 1); - -// exits without error when trying to touch a directory -result = shell.touch('tmp/'); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -result = shell.touch('tmp'); -assert.ok(!shell.error()); -assert.equal(result.code, 0); - -// creates new files -testFile = tmpFile(); -result = shell.touch(testFile); -assert(fs.existsSync(testFile)); - -// does not create a file if told not to -testFile = tmpFile(true); -result = shell.touch('-c', testFile); -assert.equal(result.code, 0); -assert.ok(!fs.existsSync(testFile)); - -// handles globs correctly -result = shell.touch('tmp/file.txt'); -result = shell.touch('tmp/file.js'); -result = shell.touch('tmp/file*'); -assert.equal(result.code, 0); -var files = shell.ls('tmp/file*'); -assert.ok(files.indexOf('tmp/file.txt') > -1); -assert.ok(files.indexOf('tmp/file.js') > -1); -assert.equal(files.length, 2); - -// errors if reference file is not found -testFile = tmpFile(); -var refFile = tmpFile(true); -result = shell.touch({ '-r': refFile }, testFile); -assert.equal(result.code, 1); -assert.ok(shell.error()); - -// uses a reference file for mtime -testFile = tmpFile(false); -var testFile2 = tmpFile(); -shell.touch(testFile2); -shell.exec(JSON.stringify(process.execPath) + ' resources/exec/slow.js 3000'); -result = shell.touch(testFile); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.notEqual(fs.statSync(testFile).mtime.getTime(), fs.statSync(testFile2).mtime.getTime()); -assert.notEqual(fs.statSync(testFile).atime.getTime(), fs.statSync(testFile2).atime.getTime()); -result = shell.touch({ '-r': testFile2 }, testFile); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.equal(fs.statSync(testFile).mtime.getTime(), fs.statSync(testFile2).mtime.getTime()); -assert.equal(fs.statSync(testFile).atime.getTime(), fs.statSync(testFile2).atime.getTime()); - -// sets mtime -testFile = tmpFile(); -oldStat = resetUtimes(testFile); -result = shell.touch(testFile); -assert.equal(result.code, 0); -assert(oldStat.mtime < fs.statSync(testFile).mtime); -// sets atime -assert(oldStat.atime < fs.statSync(testFile).atime); - -// does not sets mtime if told not to -testFile = tmpFile(); -oldStat = resetUtimes(testFile); -result = shell.touch('-a', testFile); -assert.equal(result.code, 0); -assert.equal(oldStat.mtime.getTime(), fs.statSync(testFile).mtime.getTime()); - -// does not sets atime if told not to -testFile = tmpFile(); -oldStat = resetUtimes(testFile); -result = shell.touch('-m', testFile); -assert.equal(result.code, 0); -assert.equal(oldStat.atime.getTime(), fs.statSync(testFile).atime.getTime()); - -// multiple files -testFile = tmpFile(true); -testFile2 = tmpFile(true); -shell.rm('-f', testFile, testFile2); -result = shell.touch(testFile, testFile2); -assert.equal(result.code, 0); -assert(fs.existsSync(testFile)); -assert(fs.existsSync(testFile2)); - -// file array -testFile = tmpFile(true); -testFile2 = tmpFile(true); -shell.rm('-f', testFile, testFile2); -result = shell.touch([testFile, testFile2]); -assert.equal(result.code, 0); -assert(fs.existsSync(testFile)); -assert(fs.existsSync(testFile2)); - -// touching broken link creates a new file -if (process.platform !== 'win32') { - result = shell.touch('resources/badlink'); - assert.equal(result.code, 0); - assert.ok(!shell.error()); - assert.ok(fs.existsSync('resources/not_existed_file')); - shell.rm('resources/not_existed_file'); -} - -function resetUtimes(f) { - var d = new Date(); - d.setYear(2000); - fs.utimesSync(f, d, d); - return fs.statSync(f); -} - -function tmpFile(noCreate) { - var str = crypto.randomBytes(Math.ceil(10 / 2)).toString('hex'); - var file = 'tmp/' + str; - if (!noCreate) { - fs.closeSync(fs.openSync(file, 'a')); - } - return file; -} - - -// required for the test runner -shell.exit(123); - From 5bd6ac88964fb03d2137046a51efe2e8ddf8cd4e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 9 Dec 2016 10:27:02 -0800 Subject: [PATCH 079/338] test: refactor sed tests to AVA (#607) --- ava-test/sed.js | 176 ++++++++++++++++++++++++++++++++++++++++++++++++ test/sed.js | 137 ------------------------------------- 2 files changed, 176 insertions(+), 137 deletions(-) create mode 100644 ava-test/sed.js delete mode 100644 test/sed.js diff --git a/ava-test/sed.js b/ava-test/sed.js new file mode 100644 index 000000000..14f0f582c --- /dev/null +++ b/ava-test/sed.js @@ -0,0 +1,176 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.cp('-r', 'resources', t.context.tmp); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('no arguments', t => { + const result = shell.sed(); + t.truthy(shell.error()); + t.is(result.code, 1); + t.truthy(result.stderr); +}); + +test('only one argument', t => { + const result = shell.sed(/asdf/g); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('only two arguments', t => { + const result = shell.sed(/asdf/g, 'nada'); + t.truthy(shell.error()); + t.is(result.code, 1); +}); + +test('no such file', t => { + t.falsy(fs.existsSync('asdfasdf')); // sanity check + const result = shell.sed(/asdf/g, 'nada', 'asdfasdf'); + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.stderr, 'sed: no such file or directory: asdfasdf'); +}); + +// TODO(nate): flaky test +test('if at least one file is missing, this should be an error', t => { + t.falsy(fs.existsSync('asdfasdf')); // sanity check + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); // sanity check + const result = shell.sed(/asdf/g, 'nada', `${t.context.tmp}/file1`, 'asdfasdf'); + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.stderr, 'sed: no such file or directory: asdfasdf'); +}); + +// +// Valids +// + +test('search with a string', t => { + const result = shell.sed('test1', 'hello', `${t.context.tmp}/file1`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'hello'); +}); + +test('search with a regex', t => { + const result = shell.sed(/test1/, 'hello', `${t.context.tmp}/file1`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'hello'); +}); + +test('replace with a number instead of a string', t => { + const result = shell.sed(/test1/, 1234, `${t.context.tmp}/file1`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), '1234'); +}); + +test('replace using a function', t => { + const replaceFun = match => match.toUpperCase() + match; + const result = shell.sed(/test1/, replaceFun, `${t.context.tmp}/file1`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'TEST1test1'); +}); + +test('-i option', t => { + const result = shell.sed('-i', /test1/, 'hello', `${t.context.tmp}/file1`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'hello'); + t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'hello'); +}); + +test('make sure * in regex is not globbed', t => { + const result = shell.sed(/alpha*beta/, 'hello', 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is( + result.toString(), + 'hello\nhowareyou\nhello\nthis line ends in.js\nlllllllllllllllll.js\n' + ); +}); + +test('make sure * in string-regex is not globbed', t => { + const result = shell.sed('alpha*beta', 'hello', 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is( + result.toString(), + 'hello\nhowareyou\nhello\nthis line ends in.js\nlllllllllllllllll.js\n' + ); +}); + +test('make sure * in regex is not globbed (matches something)', t => { + const result = shell.sed(/l*\.js/, '', 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is( + result.toString(), + 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n' + ); +}); + +test('make sure * in string-regex is not globbed (matches something)', t => { + const result = shell.sed('l*\\.js', '', 'resources/grep/file'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is( + result.toString(), + 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n' + ); +}); + +test('multiple file names', t => { + const result = shell.sed('test', 'hello', `${t.context.tmp}/file1`, + `${t.context.tmp}/file2`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'hello1\nhello2'); +}); + +test('array of file names (and try it out with a simple regex)', t => { + const result = shell.sed(/t.*st/, 'hello', [`${t.context.tmp}/file1`, + `${t.context.tmp}/file2`]); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'hello1\nhello2'); +}); + +test('multiple file names, with in-place-replacement', t => { + const result = shell.sed('-i', 'test', 'hello', [`${t.context.tmp}/file1`, + `${t.context.tmp}/file2`]); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'hello1\nhello2'); + t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'hello1'); + t.is(shell.cat(`${t.context.tmp}/file2`).toString(), 'hello2'); +}); + +test('glob file names, with in-place-replacement', t => { + t.is(shell.cat(`${t.context.tmp}/file1.txt`).toString(), 'test1\n'); + t.is(shell.cat(`${t.context.tmp}/file2.txt`).toString(), 'test2\n'); + const result = shell.sed('-i', 'test', 'hello', `${t.context.tmp}/file*.txt`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'hello1\n\nhello2\n'); // TODO: fix sed's behavior + t.is(shell.cat(`${t.context.tmp}/file1.txt`).toString(), 'hello1\n'); + t.is(shell.cat(`${t.context.tmp}/file2.txt`).toString(), 'hello2\n'); +}); diff --git a/test/sed.js b/test/sed.js deleted file mode 100644 index 2105dcc4d..000000000 --- a/test/sed.js +++ /dev/null @@ -1,137 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -var result; - -// -// Invalids -// - -result = shell.sed(); -assert.ok(shell.error()); -assert.equal(result.code, 1); -assert.ok(result.stderr); - -result = shell.sed(/asdf/g); // too few args -assert.ok(shell.error()); -assert.equal(result.code, 1); - -result = shell.sed(/asdf/g, 'nada'); // too few args -assert.ok(shell.error()); -assert.equal(result.code, 1); - -assert.equal(fs.existsSync('asdfasdf'), false); // sanity check -result = shell.sed(/asdf/g, 'nada', 'asdfasdf'); // no such file -assert.ok(shell.error()); -assert.equal(result.code, 2); -assert.equal(result.stderr, 'sed: no such file or directory: asdfasdf'); - -// if at least one file is missing, this should be an error -shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('asdfasdf'), false); // sanity check -assert.equal(fs.existsSync('tmp/file1'), true); // sanity check -result = shell.sed(/asdf/g, 'nada', 'tmp/file1', 'asdfasdf'); -assert.ok(shell.error()); -assert.equal(result.code, 2); -assert.equal(result.stderr, 'sed: no such file or directory: asdfasdf'); - -// -// Valids -// - -shell.cp('-f', 'resources/file1', 'tmp/file1'); -result = shell.sed('test1', 'hello', 'tmp/file1'); // search string -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello'); - -result = shell.sed(/test1/, 'hello', 'tmp/file1'); // search regex -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello'); - -result = shell.sed(/test1/, 1234, 'tmp/file1'); // numeric replacement -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), '1234'); - -var replaceFun = function (match) { - return match.toUpperCase() + match; -}; -result = shell.sed(/test1/, replaceFun, 'tmp/file1'); // replacement function -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'TEST1test1'); - -result = shell.sed('-i', /test1/, 'hello', 'tmp/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello'); -assert.equal(shell.cat('tmp/file1').toString(), 'hello'); - -// make sure * in regex is not globbed -result = shell.sed(/alpha*beta/, 'hello', 'resources/grep/file'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello\nhowareyou\nhello\nthis line ends in.js\nlllllllllllllllll.js\n'); - -// make sure * in string-regex is not globbed -result = shell.sed('alpha*beta', 'hello', 'resources/grep/file'); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello\nhowareyou\nhello\nthis line ends in.js\nlllllllllllllllll.js\n'); - -// make sure * in regex is not globbed -result = shell.sed(/l*\.js/, '', 'resources/grep/file'); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n'); - -// make sure * in string-regex is not globbed -result = shell.sed('l*\\.js', '', 'resources/grep/file'); -assert.ok(!shell.error()); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'alphaaaaaaabeta\nhowareyou\nalphbeta\nthis line ends in\n\n'); - -shell.cp('-f', 'resources/file1', 'tmp/file1'); -shell.cp('-f', 'resources/file2', 'tmp/file2'); - -// multiple file names -result = shell.sed('test', 'hello', 'tmp/file1', 'tmp/file2'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello1\nhello2'); - -// array of file names (and try it out with a simple regex) -result = shell.sed(/t.*st/, 'hello', ['tmp/file1', 'tmp/file2']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello1\nhello2'); - -// multiple file names, with in-place-replacement -result = shell.sed('-i', 'test', 'hello', ['tmp/file1', 'tmp/file2']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello1\nhello2'); -assert.equal(shell.cat('tmp/file1').toString(), 'hello1'); -assert.equal(shell.cat('tmp/file2').toString(), 'hello2'); - -// glob file names, with in-place-replacement -shell.cp('resources/file*.txt', 'tmp/'); -assert.equal(shell.cat('tmp/file1.txt').toString(), 'test1\n'); -assert.equal(shell.cat('tmp/file2.txt').toString(), 'test2\n'); -result = shell.sed('-i', 'test', 'hello', 'tmp/file*.txt'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.toString(), 'hello1\n\nhello2\n'); // TODO: fix sed's behavior -assert.equal(shell.cat('tmp/file1.txt').toString(), 'hello1\n'); -assert.equal(shell.cat('tmp/file2.txt').toString(), 'hello2\n'); - -shell.exit(123); From b26284a3194a0bb60e007fc29dece31bec3a6eba Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 13 Dec 2016 21:13:41 -0800 Subject: [PATCH 080/338] test: refactor ls to use AVA (#609) --- ava-test/ls.js | 468 +++++++++++++++++++++++++++++++++++++++++++++++++ test/ls.js | 425 -------------------------------------------- 2 files changed, 468 insertions(+), 425 deletions(-) create mode 100644 ava-test/ls.js delete mode 100644 test/ls.js diff --git a/ava-test/ls.js b/ava-test/ls.js new file mode 100644 index 000000000..cc5cca2ff --- /dev/null +++ b/ava-test/ls.js @@ -0,0 +1,468 @@ +import fs from 'fs'; + +import test from 'ava'; + +import shell from '..'; +import utils from './utils/utils'; + +const CWD = process.cwd(); + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + shell.config.silent = true; + shell.mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + process.chdir(CWD); + shell.rm('-rf', t.context.tmp); +}); + + +// +// Invalids +// + +test('no such file or dir', t => { + t.falsy(fs.existsSync('/asdfasdf')); + const result = shell.ls('/asdfasdf'); // no such file or dir + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.length, 0); +}); + +// +// Valids +// + +test('it\'s ok to use no arguments', t => { + const result = shell.ls(); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('root directory', t => { + const result = shell.ls('/'); + t.falsy(shell.error()); + t.is(result.code, 0); +}); + +test('no args provides the correct result', t => { + shell.cd('resources/ls'); + const result = shell.ls(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('file1') > -1); + t.truthy(result.indexOf('file2') > -1); + t.truthy(result.indexOf('file1.js') > -1); + t.truthy(result.indexOf('file2.js') > -1); + t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); + t.truthy(result.indexOf('a_dir') > -1); + t.is(result.length, 6); +}); + +test('simple arg', t => { + const result = shell.ls('resources/ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('file1') > -1); + t.truthy(result.indexOf('file2') > -1); + t.truthy(result.indexOf('file1.js') > -1); + t.truthy(result.indexOf('file2.js') > -1); + t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); + t.truthy(result.indexOf('a_dir') > -1); + t.is(result.length, 6); +}); + +test('simple arg, with a trailing slash', t => { + const result = shell.ls('resources/ls/'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('file1') > -1); + t.truthy(result.indexOf('file2') > -1); + t.truthy(result.indexOf('file1.js') > -1); + t.truthy(result.indexOf('file2.js') > -1); + t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); + t.truthy(result.indexOf('a_dir') > -1); + t.is(result.length, 6); +}); + +test('no args, -A option', t => { + shell.cd('resources/ls'); + const result = shell.ls('-A'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('file1') > -1); + t.truthy(result.indexOf('file2') > -1); + t.truthy(result.indexOf('file1.js') > -1); + t.truthy(result.indexOf('file2.js') > -1); + t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('.hidden_file') > -1); + t.truthy(result.indexOf('.hidden_dir') > -1); + t.is(result.length, 8); +}); + +test('no args, deprecated -a option', t => { + shell.cd('resources/ls'); + const result = shell.ls('-a'); // (deprecated) backwards compatibility test + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('file1') > -1); + t.truthy(result.indexOf('file2') > -1); + t.truthy(result.indexOf('file1.js') > -1); + t.truthy(result.indexOf('file2.js') > -1); + t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('.hidden_file') > -1); + t.truthy(result.indexOf('.hidden_dir') > -1); + t.is(result.length, 8); +}); + +test('wildcard, very simple', t => { + const result = shell.ls('resources/cat/*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/cat/file1') > -1); + t.truthy(result.indexOf('resources/cat/file2') > -1); + t.is(result.length, 2); +}); + +test('wildcard, simple', t => { + const result = shell.ls('resources/ls/*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/ls/file1') > -1); + t.truthy(result.indexOf('resources/ls/file2') > -1); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy( + result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + ); + t.is(result.indexOf('resources/ls/a_dir'), -1); // this shouldn't be there + t.truthy(result.indexOf('nada') > -1); + t.truthy(result.indexOf('b_dir') > -1); + t.is(result.length, 7); +}); + +test('wildcard, simple, with -d', t => { + const result = shell.ls('-d', 'resources/ls/*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/ls/file1') > -1); + t.truthy(result.indexOf('resources/ls/file2') > -1); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy( + result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + ); + t.truthy(result.indexOf('resources/ls/a_dir') > -1); + t.is(result.length, 6); +}); + +test('wildcard, hidden only', t => { + const result = shell.ls('-d', 'resources/ls/.*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/ls/.hidden_file') > -1); + t.truthy(result.indexOf('resources/ls/.hidden_dir') > -1); + t.is(result.length, 2); +}); + +test('wildcard, mid-file', t => { + const result = shell.ls('resources/ls/f*le*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 5); + t.truthy(result.indexOf('resources/ls/file1') > -1); + t.truthy(result.indexOf('resources/ls/file2') > -1); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy( + result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + ); +}); + +test('wildcard, mid-file with dot (should escape dot for regex)', t => { + const result = shell.ls('resources/ls/f*le*.js'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 2); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); +}); + +test('one file that exists, one that doesn\'t', t => { + const result = shell.ls('resources/ls/file1.js', 'resources/ls/thisdoesntexist'); + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.length, 1); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); +}); + +test('one file that exists, one that doesn\'t (other order)', t => { + const result = shell.ls('resources/ls/thisdoesntexist', 'resources/ls/file1.js'); + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.length, 1); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); +}); + +test('wildcard, should not do partial matches', t => { + const result = shell.ls('resources/ls/*.j'); // shouldn't get .js + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.length, 0); +}); + +test('wildcard, all files with extension', t => { + const result = shell.ls('resources/ls/*.*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 3); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy( + result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + ); +}); + +test('wildcard, with additional path', t => { + const result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 4); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('b_dir') > -1); // no wildcard == no path prefix + t.truthy(result.indexOf('nada') > -1); // no wildcard == no path prefix +}); + +test('wildcard for both paths', t => { + const result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir/*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 4); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('z') > -1); + t.truthy(result.indexOf('resources/ls/a_dir/nada') > -1); +}); + +test('wildcard for both paths, array', t => { + const result = shell.ls(['resources/ls/f*le*.js', 'resources/ls/a_dir/*']); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 4); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('z') > -1); + t.truthy(result.indexOf('resources/ls/a_dir/nada') > -1); +}); + +test('recursive, no path', t => { + shell.cd('resources/ls'); + const result = shell.ls('-R'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.is(result.length, 9); +}); + +test('recusive, path given', t => { + const result = shell.ls('-R', 'resources/ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.is(result.length, 9); +}); + +test('-RA flag, path given', t => { + const result = shell.ls('-RA', 'resources/ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.truthy(result.indexOf('a_dir/.hidden_dir/nada') > -1); + t.is(result.length, 14); +}); + +test('recursive, wildcard', t => { + const result = shell.ls('-R', 'resources/ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.is(result.length, 9); +}); + +test('-Rd works like -d', t => { + const result = shell.ls('-Rd', 'resources/ls'); + t.falsy(shell.error()); + t.is(result.length, 1); +}); + +test('directory option, single arg', t => { + const result = shell.ls('-d', 'resources/ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 1); +}); + +test('directory option, single arg with trailing \'/\'', t => { + const result = shell.ls('-d', 'resources/ls/'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.length, 1); +}); + +test('directory option, multiple args', t => { + const result = shell.ls('-d', 'resources/ls/a_dir', 'resources/ls/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/ls/a_dir') > -1); + t.truthy(result.indexOf('resources/ls/file1') > -1); + t.is(result.length, 2); +}); + +test('directory option, globbed arg', t => { + const result = shell.ls('-d', 'resources/ls/*'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/ls/a_dir') > -1); + t.truthy(result.indexOf('resources/ls/file1') > -1); + t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('resources/ls/file2') > -1); + t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('resources/ls/file2') > -1); + t.truthy( + result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + ); + t.is(result.length, 6); +}); + +test('long option, single file', t => { + let result = shell.ls('-l', 'resources/ls/file1'); + t.is(result.length, 1); + result = result[0]; + t.falsy(shell.error()); + t.truthy(result.name, 'file1'); + t.is(result.nlink, 1); + t.is(result.size, 5); + t.truthy(result.mode); // check that these keys exist + t.truthy(process.platform === 'win32' || result.uid); // only on unix + t.truthy(process.platform === 'win32' || result.gid); // only on unix + t.truthy(result.mtime); // check that these keys exist + t.truthy(result.atime); // check that these keys exist + t.truthy(result.ctime); // check that these keys exist + t.truthy(result.toString().match(/^(\d+ +){5}.*$/)); +}); + +test('long option, glob files', t => { + let result = shell.ls('-l', 'resources/ls/f*le1'); + t.is(result.length, 1); + result = result[0]; + t.falsy(shell.error()); + t.truthy(result.name, 'file1'); + t.is(result.nlink, 1); + t.is(result.size, 5); + t.truthy(result.mode); // check that these keys exist + t.truthy(process.platform === 'win32' || result.uid); // only on unix + t.truthy(process.platform === 'win32' || result.gid); // only on unix + t.truthy(result.mtime); // check that these keys exist + t.truthy(result.atime); // check that these keys exist + t.truthy(result.ctime); // check that these keys exist + t.truthy(result.toString().match(/^(\d+ +){5}.*$/)); +}); + +test('long option, directory', t => { + let result = shell.ls('-l', 'resources/ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + const idx = result.map(r => r.name).indexOf('file1'); + t.truthy(idx >= 0); + t.is(result.length, 6); + result = result[idx]; + t.is(result.name, 'file1'); + t.is(result.nlink, 1); + t.is(result.size, 5); + t.truthy(result.mode); // check that these keys exist + t.truthy(process.platform === 'win32' || result.uid); // only on unix + t.truthy(process.platform === 'win32' || result.gid); // only on unix + t.truthy(result.mtime); // check that these keys exist + t.truthy(result.atime); // check that these keys exist + t.truthy(result.ctime); // check that these keys exist + t.truthy(result.toString().match(/^(\d+ +){5}.*$/)); +}); + +test('long option, directory, recursive (and windows converts slashes)', t => { + let result = shell.ls('-lR', 'resources/ls/'); + t.falsy(shell.error()); + t.is(result.code, 0); + const idx = result.map(r => r.name).indexOf('a_dir/b_dir'); + t.is(result.length, 9); + t.truthy(idx >= 0); + result = result[idx]; + t.is(result.name, result.name); + t.truthy(fs.statSync('resources/ls/a_dir/b_dir').isDirectory()); + t.truthy(typeof result.nlink === 'number'); // This can vary between the local machine and travis + t.truthy(typeof result.size === 'number'); // This can vary between different file systems + t.truthy(result.mode); // check that these keys exist + t.truthy(process.platform === 'win32' || result.uid); // only on unix + t.truthy(process.platform === 'win32' || result.gid); // only on unix + t.truthy(result.mtime); // check that these keys exist + t.truthy(result.atime); // check that these keys exist + t.truthy(result.ctime); // check that these keys exist + t.truthy(result.toString().match(/^(\d+ +){5}.*$/)); +}); + +test('still lists broken links', t => { + const result = shell.ls('resources/badlink'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('resources/badlink') > -1); + t.is(result.length, 1); +}); + +test('Test new ShellString-like attributes', t => { + const result = shell.ls('resources/ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.stdout.indexOf('file1') > -1); + t.truthy(result.stdout.indexOf('file2') > -1); + t.truthy(result.stdout.indexOf('file1.js') > -1); + t.truthy(result.stdout.indexOf('file2.js') > -1); + t.truthy( + result.stdout.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1 + ); + t.truthy(result.stdout.indexOf('a_dir') > -1); + t.is(typeof result.stdout, 'string'); + t.truthy(result.to); + t.truthy(result.toEnd); + result.to(`${t.context.tmp}/testingToOutput.txt`); + t.is(shell.cat(`${t.context.tmp}/testingToOutput.txt`).toString(), result.stdout); + shell.rm(`${t.context.tmp}/testingToOutput.txt`); +}); + +test('No trailing newline for ls() on empty directories', t => { + shell.mkdir('foo'); + t.falsy(shell.error()); + const result = shell.ls('foo'); + t.falsy(shell.error()); + t.is(result.stdout, ''); + shell.rm('-r', 'foo'); + t.falsy(shell.error()); +}); + +test('Check stderr field', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.ls('resources/ls/file1', '/asdfasdf'); + t.truthy(shell.error()); + t.is('ls: no such file or directory: /asdfasdf', result.stderr); +}); diff --git a/test/ls.js b/test/ls.js deleted file mode 100644 index e74c4d056..000000000 --- a/test/ls.js +++ /dev/null @@ -1,425 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var fs = require('fs'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -var idx; -var k; - -// -// Invalids -// - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -var result = shell.ls('/asdfasdf'); // no such file or dir -assert.ok(shell.error()); -assert.equal(result.code, 2); -assert.equal(result.length, 0); - -// -// Valids -// - -result = shell.ls(); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); - -result = shell.ls('/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); - -// no args -shell.cd('resources/ls'); -result = shell.ls(); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.length, 6); -shell.cd('../..'); - -// simple arg -result = shell.ls('resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.length, 6); - -// simple arg, with a trailing slash -result = shell.ls('resources/ls/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.length, 6); - -// no args, 'all' option -shell.cd('resources/ls'); -result = shell.ls('-A'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('.hidden_file') > -1, true); -assert.equal(result.indexOf('.hidden_dir') > -1, true); -assert.equal(result.length, 8); -shell.cd('../..'); - -// no args, 'all' option -shell.cd('resources/ls'); -result = shell.ls('-a'); // (deprecated) backwards compatibility test -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('.hidden_file') > -1, true); -assert.equal(result.indexOf('.hidden_dir') > -1, true); -assert.equal(result.length, 8); -shell.cd('../..'); - -// wildcard, very simple -result = shell.ls('resources/cat/*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/cat/file1') > -1, true); -assert.equal(result.indexOf('resources/cat/file2') > -1, true); -assert.equal(result.length, 2); - -// wildcard, simple -result = shell.ls('resources/ls/*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/ls/file1') > -1, true); -assert.equal(result.indexOf('resources/ls/file2') > -1, true); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.ok(result.indexOf('resources/ls/a_dir') === -1); // this shouldn't be there -assert.ok(result.indexOf('nada') > -1); -assert.ok(result.indexOf('b_dir') > -1); -assert.equal(result.length, 7); - -// wildcard, simple, with -d -result = shell.ls('-d', 'resources/ls/*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/ls/file1') > -1, true); -assert.equal(result.indexOf('resources/ls/file2') > -1, true); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.ok(result.indexOf('resources/ls/a_dir') > -1); -assert.equal(result.length, 6); - -// wildcard, hidden only -result = shell.ls('-d', 'resources/ls/.*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/ls/.hidden_file') > -1, true); -assert.equal(result.indexOf('resources/ls/.hidden_dir') > -1, true); -assert.equal(result.length, 2); - -// wildcard, mid-file -result = shell.ls('resources/ls/f*le*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 5); -assert.equal(result.indexOf('resources/ls/file1') > -1, true); -assert.equal(result.indexOf('resources/ls/file2') > -1, true); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1, true); - -// wildcard, mid-file with dot (should escape dot for regex) -result = shell.ls('resources/ls/f*le*.js'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 2); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); - -// one file that exists, one that doesn't -result = shell.ls('resources/ls/file1.js', 'resources/ls/thisdoesntexist'); -assert.ok(shell.error()); -assert.equal(result.code, 2); -assert.equal(result.length, 1); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); - -// one file that exists, one that doesn't (other order) -result = shell.ls('resources/ls/thisdoesntexist', 'resources/ls/file1.js'); -assert.ok(shell.error()); -assert.equal(result.code, 2); -assert.equal(result.length, 1); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); - -// wildcard, should not do partial matches -result = shell.ls('resources/ls/*.j'); // shouldn't get .js -assert.ok(shell.error()); -assert.equal(result.code, 2); -assert.equal(result.length, 0); - -// wildcard, all files with extension -result = shell.ls('resources/ls/*.*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 3); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1, true); - -// wildcard, with additional path -result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 4); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('b_dir') > -1, true); // no wildcard == no path prefix -assert.equal(result.indexOf('nada') > -1, true); // no wildcard == no path prefix - -// wildcard for both paths -result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir/*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 4); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('z') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/nada') > -1, true); - -// wildcard for both paths, array -result = shell.ls(['resources/ls/f*le*.js', 'resources/ls/a_dir/*']); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 4); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('z') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/nada') > -1, true); - -// recursive, no path -shell.cd('resources/ls'); -result = shell.ls('-R'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir/z') > -1, true); -assert.equal(result.length, 9); -shell.cd('../..'); - -// recusive, path given -result = shell.ls('-R', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir/z') > -1, true); -assert.equal(result.length, 9); - -// recusive, path given - 'all' flag -result = shell.ls('-RA', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir/z') > -1, true); -assert.equal(result.indexOf('a_dir/.hidden_dir/nada') > -1, true); -assert.equal(result.length, 14); - -// recursive, wildcard -result = shell.ls('-R', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir/z') > -1, true); -assert.equal(result.length, 9); - -// -Rd works like -d -result = shell.ls('-Rd', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.length, 1); - -// directory option, single arg -result = shell.ls('-d', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 1); - -// directory option, single arg with trailing '/' -result = shell.ls('-d', 'resources/ls/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.length, 1); - -// directory option, multiple args -result = shell.ls('-d', 'resources/ls/a_dir', 'resources/ls/file1'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.indexOf('resources/ls/a_dir') > -1); -assert.ok(result.indexOf('resources/ls/file1') > -1); -assert.equal(result.length, 2); - -// directory option, globbed arg -result = shell.ls('-d', 'resources/ls/*'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.indexOf('resources/ls/a_dir') > -1); -assert.ok(result.indexOf('resources/ls/file1') > -1); -assert.ok(result.indexOf('resources/ls/file1.js') > -1); -assert.ok(result.indexOf('resources/ls/file2') > -1); -assert.ok(result.indexOf('resources/ls/file2.js') > -1); -assert.ok(result.indexOf('resources/ls/file2') > -1); -assert.ok(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1); -assert.equal(result.length, 6); - -// long option, single file -result = shell.ls('-l', 'resources/ls/file1'); -assert.equal(result.length, 1); -result = result[0]; -assert.equal(shell.error(), null); -assert.ok(result.name, 'file1'); -assert.equal(result.nlink, 1); -assert.equal(result.size, 5); -assert.ok(result.mode); // check that these keys exist -assert.ok(process.platform === 'win32' || result.uid); // only on unix -assert.ok(process.platform === 'win32' || result.gid); // only on unix -assert.ok(result.mtime); // check that these keys exist -assert.ok(result.atime); // check that these keys exist -assert.ok(result.ctime); // check that these keys exist -assert.ok(result.toString().match(/^(\d+ +){5}.*$/)); - -// long option, glob files -result = shell.ls('-l', 'resources/ls/f*le1'); -assert.equal(result.length, 1); -result = result[0]; -assert.equal(shell.error(), null); -assert.ok(result.name, 'file1'); -assert.equal(result.nlink, 1); -assert.equal(result.size, 5); -assert.ok(result.mode); // check that these keys exist -assert.ok(process.platform === 'win32' || result.uid); // only on unix -assert.ok(process.platform === 'win32' || result.gid); // only on unix -assert.ok(result.mtime); // check that these keys exist -assert.ok(result.atime); // check that these keys exist -assert.ok(result.ctime); // check that these keys exist -assert.ok(result.toString().match(/^(\d+ +){5}.*$/)); - -// long option, directory -result = shell.ls('-l', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -idx = -1; -for (k = 0; k < result.length; k++) { - if (result[k].name === 'file1') { - idx = k; - break; - } -} -assert.ok(idx >= 0); -assert.equal(result.length, 6); -result = result[idx]; -assert.equal(result.name, 'file1'); -assert.equal(result.nlink, 1); -assert.equal(result.size, 5); -assert.ok(result.mode); // check that these keys exist -assert.ok(process.platform === 'win32' || result.uid); // only on unix -assert.ok(process.platform === 'win32' || result.gid); // only on unix -assert.ok(result.mtime); // check that these keys exist -assert.ok(result.atime); // check that these keys exist -assert.ok(result.ctime); // check that these keys exist -assert.ok(result.toString().match(/^(\d+ +){5}.*$/)); - -// long option, directory, recursive (and windows converts slashes) -result = shell.ls('-lR', 'resources/ls/'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -idx = -1; -for (k = 0; k < result.length; k++) { - if (result[k].name === 'a_dir/b_dir') { - idx = k; - break; - } -} -assert.equal(result.length, 9); -assert.ok(idx >= 0); -result = result[idx]; -assert.equal(result.name, result.name); -assert.ok(fs.statSync('resources/ls/a_dir/b_dir').isDirectory()); -assert.ok(typeof result.nlink === 'number'); // This can vary between the local machine and travis -assert.ok(typeof result.size === 'number'); // This can vary between different file systems -assert.ok(result.mode); // check that these keys exist -assert.ok(process.platform === 'win32' || result.uid); // only on unix -assert.ok(process.platform === 'win32' || result.gid); // only on unix -assert.ok(result.mtime); // check that these keys exist -assert.ok(result.atime); // check that these keys exist -assert.ok(result.ctime); // check that these keys exist -assert.ok(result.toString().match(/^(\d+ +){5}.*$/)); - -// still lists broken links -result = shell.ls('resources/badlink'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.indexOf('resources/badlink') > -1, true); -assert.equal(result.length, 1); - -// Test new ShellString-like attributes -result = shell.ls('resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.stdout.indexOf('file1') > -1, true); -assert.equal(result.stdout.indexOf('file2') > -1, true); -assert.equal(result.stdout.indexOf('file1.js') > -1, true); -assert.equal(result.stdout.indexOf('file2.js') > -1, true); -assert.equal(result.stdout.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.stdout.indexOf('a_dir') > -1, true); -assert.strictEqual(typeof result.stdout, 'string'); -assert.ok(result.to); -assert.ok(result.toEnd); -result.to('tmp/testingToOutput.txt'); -assert.equal(shell.cat('tmp/testingToOutput.txt'), result.stdout); -shell.rm('tmp/testingToOutput.txt'); - -// No trailing newline for ls() on empty directories -shell.mkdir('foo'); -assert.ok(!shell.error()); -result = shell.ls('foo'); -assert.ok(!shell.error()); -assert.equal(result.stdout, ''); -shell.rm('-r', 'foo'); -assert.ok(!shell.error()); - -// Check stderr field -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -result = shell.ls('resources/ls/file1', '/asdfasdf'); -assert.ok(shell.error()); -assert.equal('ls: no such file or directory: /asdfasdf', result.stderr); - -shell.exit(123); From 927758f714dacd49612b7e8530eb7464e82571a9 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 14 Dec 2016 07:06:15 -0800 Subject: [PATCH 081/338] Ignore test temp directories during linting (#623) --- .eslintignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.eslintignore b/.eslintignore index 80bd0e81e..e9c04ea5a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,6 @@ ava-test/resources/ +ava-test/tmp/ test/resources/ +test/tmp/ node_modules/ make.js From 1ed8a173e19933c180495cf2afa8ab6a8294adeb Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 14 Dec 2016 07:09:09 -0800 Subject: [PATCH 082/338] test: remove tests for make (deprecated) (#624) --- test/make.js | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 test/make.js diff --git a/test/make.js b/test/make.js deleted file mode 100644 index cc46e07bb..000000000 --- a/test/make.js +++ /dev/null @@ -1,20 +0,0 @@ -var shell = require('..'); -var child = require('child_process'); -var assert = require('assert'); - -shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript' + Math.random() + '.js'; -var script = 'require(\'../../make.js\');' + - 'target.all=function(){' + - ' echo("first"); ' + - ' cp("this_file_doesnt_exist", ".");' + - ' echo("second");' + - '}'; - -shell.ShellString(script).to(file); -child.exec(JSON.stringify(process.execPath) + ' ' + file, function (err, stdout) { - assert.ok(stdout.match('first')); - assert.ok(!stdout.match('second')); // Make should die on errors, so this should never get echoed - - shell.exit(123); -}); From 51fea9b7f0943e26b8e8b1fe6c640586ca64de7c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 14 Dec 2016 13:57:40 -0800 Subject: [PATCH 083/338] test: refactor global tests to AVA (#605) --- ava-test/global.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++ test/global.js | 40 ------------------------------------- 2 files changed, 50 insertions(+), 40 deletions(-) create mode 100644 ava-test/global.js delete mode 100644 test/global.js diff --git a/ava-test/global.js b/ava-test/global.js new file mode 100644 index 000000000..37123c17c --- /dev/null +++ b/ava-test/global.js @@ -0,0 +1,50 @@ +/* globals cat, config, cp, env, error, mkdir, rm */ +import fs from 'fs'; + +import test from 'ava'; + +import '../global'; +import utils from './utils/utils'; + +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); + config.silent = true; + mkdir(t.context.tmp); +}); + +test.afterEach.always(t => { + rm('-rf', t.context.tmp); +}); + + +// +// Valids +// + +test('env is exported', t => { + t.is(process.env, env); +}); + +test('cat', t => { + const result = cat('resources/cat/file1'); + t.falsy(error()); + t.is(result.code, 0); + t.is(result.toString(), 'test1\n'); +}); + +test('rm', t => { + cp('-f', 'resources/file1', `${t.context.tmp}/file1`); + t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); + const result = rm(`${t.context.tmp}/file1`); + t.falsy(error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); +}); + +test('String.prototype is modified for global require', t => { + 'foo'.to(`${t.context.tmp}/testfile.txt`); + t.is('foo', cat(`${t.context.tmp}/testfile.txt`).toString()); + 'bar'.toEnd(`${t.context.tmp}/testfile.txt`); + t.is('foobar', cat(`${t.context.tmp}/testfile.txt`).toString()); +}); + diff --git a/test/global.js b/test/global.js deleted file mode 100644 index e3c1b2769..000000000 --- a/test/global.js +++ /dev/null @@ -1,40 +0,0 @@ -/* globals cat, config, cp, env, error, exit, mkdir, rm */ - -require('../global'); - -var assert = require('assert'); -var fs = require('fs'); - -config.silent = true; - -rm('-rf', 'tmp'); -mkdir('tmp'); - -// -// Valids -// - -assert.equal(process.env, env); - -// cat -var result = cat('resources/cat/file1'); -assert.equal(error(), null); -assert.equal(result.code, 0); -assert.equal(result, 'test1\n'); - -// rm -cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('tmp/file1'), true); -result = rm('tmp/file1'); -assert.equal(error(), null); -assert.equal(result.code, 0); -assert.equal(fs.existsSync('tmp/file1'), false); - -// String.prototype is modified for global require -'foo'.to('tmp/testfile.txt'); -assert.equal('foo', cat('tmp/testfile.txt')); -'bar'.toEnd('tmp/testfile.txt'); -assert.equal('foobar', cat('tmp/testfile.txt')); - -exit(123); - From 1548b3da004da56a9672b11e38cddbe5aa63f6a2 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 14 Dec 2016 17:57:11 -0800 Subject: [PATCH 084/338] refactor: list all commands in commands.json (#616) * refactor: list all commands in commands.json This also changes the order of commands in the docs, due to how I changed the doc-generating script. * fix lint error and alphabetize command list --- .eslintrc.json | 2 +- README.md | 528 +++++++++++++++++++-------------------- commands.json | 29 +++ package.json | 1 + scripts/generate-docs.js | 10 +- shell.js | 119 +-------- 6 files changed, 316 insertions(+), 373 deletions(-) create mode 100644 commands.json diff --git a/.eslintrc.json b/.eslintrc.json index 4f98ed05f..411b11ae0 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,7 +7,7 @@ "comma-dangle": 0, "global-require": 0, "vars-on-top": 0, - "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], + "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], "no-param-reassign": 0, "no-console": 0, "curly": [2, "multi-line"], diff --git a/README.md b/README.md index dd811e359..eeb5c7711 100644 --- a/README.md +++ b/README.md @@ -156,53 +156,52 @@ For less-commonly used commands and features, please check out our [wiki page](https://github.com/shelljs/shelljs/wiki). -### cd([dir]) -Changes to directory `dir` for the duration of the script. Changes to home -directory if no argument is supplied. +### cat(file [, file ...]) +### cat(file_array) +Examples: -### pwd() -Returns the current directory. +```javascript +var str = cat('file*.txt'); +var str = cat('file1', 'file2'); +var str = cat(['file1', 'file2']); // same as above +``` +Returns a string containing the given file, or a concatenated string +containing the files if more than one file is given (a new line character is +introduced between each file). -### ls([options,] [path, ...]) -### ls([options,] path_array) -Available options: -+ `-R`: recursive -+ `-A`: all files (include files beginning with `.`, except for `.` and `..`) -+ `-d`: list directories themselves, not their contents -+ `-l`: list objects representing each file, each with fields containing `ls - -l` output fields. See - [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) - for more info +### cd([dir]) +Changes to directory `dir` for the duration of the script. Changes to home +directory if no argument is supplied. -Examples: -```javascript -ls('projs/*.js'); -ls('-R', '/users/me', '/tmp'); -ls('-R', ['/users/me', '/tmp']); // same as above -ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} -``` +### chmod(octal_mode || octal_string, file) +### chmod(symbolic_mode, file) -Returns array of files in the given path, or in current directory if no path provided. +Available options: ++ `-v`: output a diagnostic for every file processed ++ `-c`: like verbose but report only when a change is made ++ `-R`: change files and directories recursively -### find(path [, path ...]) -### find(path_array) Examples: ```javascript -find('src', 'lib'); -find(['src', 'lib']); // same as above -find('.').filter(function(file) { return file.match(/\.js$/); }); +chmod(755, '/Users/brandon'); +chmod('755', '/Users/brandon'); // same as above +chmod('u+x', '/Users/brandon'); ``` -Returns array of all files (however deep) in the given paths. +Alters the permissions of a file or directory by either specifying the +absolute permissions in octal form or expressing the changes in symbols. +This command tries to mimic the POSIX behavior as much as possible. +Notable exceptions: -The main difference from `ls('-R', path)` is that the resulting file names -include the base directories, e.g. `lib/resources/file1` instead of just `file1`. ++ In symbolic modes, 'a-r' and '-r' are identical. No consideration is + given to the umask. ++ There is no "quiet" option since default behavior is to run silent. ### cp([options,] source [, source ...], dest) @@ -228,412 +227,405 @@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above Copies files. -### rm([options,] file [, file ...]) -### rm([options,] file_array) +### pushd([options,] [dir | '-N' | '+N']) + Available options: -+ `-f`: force -+ `-r, -R`: recursive ++ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. + +Arguments: + ++ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. ++ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. ++ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. Examples: ```javascript -rm('-rf', '/tmp/*'); -rm('some_file.txt', 'another_file.txt'); -rm(['some_file.txt', 'another_file.txt']); // same as above +// process.cwd() === '/usr' +pushd('/etc'); // Returns /etc /usr +pushd('+1'); // Returns /usr /etc ``` -Removes files. +Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. +### popd([options,] ['-N' | '+N']) -### mv([options ,] source [, source ...], dest') -### mv([options ,] source_array, dest') Available options: -+ `-f`: force (default behavior) -+ `-n`: no-clobber ++ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. + +Arguments: + ++ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. ++ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. Examples: ```javascript -mv('-n', 'file', 'dir/'); -mv('file1', 'file2', 'dir/'); -mv(['file1', 'file2'], 'dir/'); // same as above +echo(process.cwd()); // '/usr' +pushd('/etc'); // '/etc /usr' +echo(process.cwd()); // '/etc' +popd(); // '/usr' +echo(process.cwd()); // '/usr' ``` -Moves files. +When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. +### dirs([options | '+N' | '-N']) -### mkdir([options,] dir [, dir ...]) -### mkdir([options,] dir_array) Available options: -+ `-p`: full path (will create intermediate dirs if necessary) ++ `-c`: Clears the directory stack by deleting all of the elements. -Examples: +Arguments: -```javascript -mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -``` ++ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. ++ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. -Creates directories. +Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. +See also: pushd, popd -### test(expression) -Available expression primaries: -+ `'-b', 'path'`: true if path is a block device -+ `'-c', 'path'`: true if path is a character device -+ `'-d', 'path'`: true if path is a directory -+ `'-e', 'path'`: true if path exists -+ `'-f', 'path'`: true if path is a regular file -+ `'-L', 'path'`: true if path is a symbolic link -+ `'-p', 'path'`: true if path is a pipe (FIFO) -+ `'-S', 'path'`: true if path is a socket +### echo([options,] string [, string ...]) +Available options: + ++ `-e`: interpret backslash escapes (default) Examples: ```javascript -if (test('-d', path)) { /* do something with dir */ }; -if (!test('-f', path)) continue; // skip if it's a regular file +echo('hello world'); +var str = echo('hello world'); ``` -Evaluates expression using the available primaries and returns corresponding value. +Prints string to stdout, and returns string with additional utility methods +like `.to()`. -### cat(file [, file ...]) -### cat(file_array) +### exec(command [, options] [, callback]) +Available options (all `false` by default): + ++ `async`: Asynchronous execution. If a callback is provided, it will be set to + `true`, regardless of the passed value. ++ `silent`: Do not echo program output to console. ++ and any option available to NodeJS's + [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) Examples: ```javascript -var str = cat('file*.txt'); -var str = cat('file1', 'file2'); -var str = cat(['file1', 'file2']); // same as above +var version = exec('node --version', {silent:true}).stdout; + +var child = exec('some_long_running_process', {async:true}); +child.stdout.on('data', function(data) { + /* ... do something with data ... */ +}); + +exec('some_long_running_process', function(code, stdout, stderr) { + console.log('Exit code:', code); + console.log('Program output:', stdout); + console.log('Program stderr:', stderr); +}); ``` -Returns a string containing the given file, or a concatenated string -containing the files if more than one file is given (a new line character is -introduced between each file). +Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous +mode, this returns a ShellString (compatible with ShellJS v0.6.x, which returns an object +of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process +object, and the `callback` gets the arguments `(code, stdout, stderr)`. +Not seeing the behavior you want? `exec()` runs everything through `sh` +by default (or `cmd.exe` on Windows), which differs from `bash`. If you +need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. -### head([{'-n': \},] file [, file ...]) -### head([{'-n': \},] file_array) -Available options: +**Note:** For long-lived processes, it's best to run `exec()` asynchronously as +the current synchronous implementation uses a lot of CPU. This should be getting +fixed soon. -+ `-n `: Show the first `` lines of the files +### find(path [, path ...]) +### find(path_array) Examples: ```javascript -var str = head({'-n': 1}, 'file*.txt'); -var str = head('file1', 'file2'); -var str = head(['file1', 'file2']); // same as above +find('src', 'lib'); +find(['src', 'lib']); // same as above +find('.').filter(function(file) { return file.match(/\.js$/); }); ``` -Read the start of a file. +Returns array of all files (however deep) in the given paths. + +The main difference from `ls('-R', path)` is that the resulting file names +include the base directories, e.g. `lib/resources/file1` instead of just `file1`. -### tail([{'-n': \},] file [, file ...]) -### tail([{'-n': \},] file_array) +### grep([options,] regex_filter, file [, file ...]) +### grep([options,] regex_filter, file_array) Available options: -+ `-n `: Show the last `` lines of the files ++ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. ++ `-l`: Print only filenames of matching files Examples: ```javascript -var str = tail({'-n': 1}, 'file*.txt'); -var str = tail('file1', 'file2'); -var str = tail(['file1', 'file2']); // same as above +grep('-v', 'GLOBAL_VARIABLE', '*.js'); +grep('GLOBAL_VARIABLE', '*.js'); ``` -Read the end of a file. - - -### ShellString.prototype.to(file) - -Examples: - -```javascript -cat('input.txt').to('output.txt'); -``` +Reads input string from given files and returns a string containing all lines of the +file that match the given `regex_filter`. -Analogous to the redirection operator `>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix -redirections, `to()` will overwrite any existing file!_ +### head([{'-n': \},] file [, file ...]) +### head([{'-n': \},] file_array) +Available options: -### ShellString.prototype.toEnd(file) ++ `-n `: Show the first `` lines of the files Examples: ```javascript -cat('input.txt').toEnd('output.txt'); +var str = head({'-n': 1}, 'file*.txt'); +var str = head('file1', 'file2'); +var str = head(['file1', 'file2']); // same as above ``` -Analogous to the redirect-and-append operator `>>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). +Read the start of a file. -### sed([options,] search_regex, replacement, file [, file ...]) -### sed([options,] search_regex, replacement, file_array) +### ln([options,] source, dest) Available options: -+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ ++ `-s`: symlink ++ `-f`: force Examples: ```javascript -sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); +ln('file', 'newlink'); +ln('-sf', 'file', 'existing'); ``` -Reads an input string from `files` and performs a JavaScript `replace()` on the input -using the given search regex and replacement string or function. Returns the new string after replacement. - -Note: - -Like unix `sed`, ShellJS `sed` supports capture groups. Capture groups are specified -using the `$n` syntax: - -```javascript -sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); -``` +Links source to dest. Use -f to force the link, should dest already exist. -### sort([options,] file [, file ...]) -### sort([options,] file_array) +### ls([options,] [path, ...]) +### ls([options,] path_array) Available options: -+ `-r`: Reverse the result of comparisons -+ `-n`: Compare according to numerical value ++ `-R`: recursive ++ `-A`: all files (include files beginning with `.`, except for `.` and `..`) ++ `-d`: list directories themselves, not their contents ++ `-l`: list objects representing each file, each with fields containing `ls + -l` output fields. See + [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) + for more info Examples: ```javascript -sort('foo.txt', 'bar.txt'); -sort('-r', 'foo.txt'); +ls('projs/*.js'); +ls('-R', '/users/me', '/tmp'); +ls('-R', ['/users/me', '/tmp']); // same as above +ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} ``` -Return the contents of the files, sorted line-by-line. Sorting multiple -files mixes their content, just like unix sort does. +Returns array of files in the given path, or in current directory if no path provided. -### uniq([options,] [input, [output]]) +### mkdir([options,] dir [, dir ...]) +### mkdir([options,] dir_array) Available options: -+ `-i`: Ignore case while comparing -+ `-c`: Prefix lines by the number of occurrences -+ `-d`: Only print duplicate lines, one for each group of identical lines ++ `-p`: full path (will create intermediate dirs if necessary) Examples: ```javascript -uniq('foo.txt'); -uniq('-i', 'foo.txt'); -uniq('-cd', 'foo.txt', 'bar.txt'); +mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); +mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above ``` -Filter adjacent matching lines from input +Creates directories. -### grep([options,] regex_filter, file [, file ...]) -### grep([options,] regex_filter, file_array) +### mv([options ,] source [, source ...], dest') +### mv([options ,] source_array, dest') Available options: -+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. -+ `-l`: Print only filenames of matching files ++ `-f`: force (default behavior) ++ `-n`: no-clobber Examples: ```javascript -grep('-v', 'GLOBAL_VARIABLE', '*.js'); -grep('GLOBAL_VARIABLE', '*.js'); +mv('-n', 'file', 'dir/'); +mv('file1', 'file2', 'dir/'); +mv(['file1', 'file2'], 'dir/'); // same as above ``` -Reads input string from given files and returns a string containing all lines of the -file that match the given `regex_filter`. +Moves files. -### which(command) +### pwd() +Returns the current directory. + + +### rm([options,] file [, file ...]) +### rm([options,] file_array) +Available options: + ++ `-f`: force ++ `-r, -R`: recursive Examples: ```javascript -var nodeExec = which('node'); +rm('-rf', '/tmp/*'); +rm('some_file.txt', 'another_file.txt'); +rm(['some_file.txt', 'another_file.txt']); // same as above ``` -Searches for `command` in the system's PATH. On Windows, this uses the -`PATHEXT` variable to append the extension if it's not already executable. -Returns string containing the absolute path to the command. +Removes files. -### echo([options,] string [, string ...]) +### sed([options,] search_regex, replacement, file [, file ...]) +### sed([options,] search_regex, replacement, file_array) Available options: -+ `-e`: interpret backslash escapes (default) ++ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ Examples: ```javascript -echo('hello world'); -var str = echo('hello world'); +sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); +sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); ``` -Prints string to stdout, and returns string with additional utility methods -like `.to()`. +Reads an input string from `files` and performs a JavaScript `replace()` on the input +using the given search regex and replacement string or function. Returns the new string after replacement. +Note: -### pushd([options,] [dir | '-N' | '+N']) +Like unix `sed`, ShellJS `sed` supports capture groups. Capture groups are specified +using the `$n` syntax: -Available options: +```javascript +sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); +``` -+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. -Arguments: +### set(options) +Available options: -+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. ++ `+/-e`: exit upon error (`config.fatal`) ++ `+/-v`: verbose: show all commands (`config.verbose`) ++ `+/-f`: disable filename expansion (globbing) Examples: ```javascript -// process.cwd() === '/usr' -pushd('/etc'); // Returns /etc /usr -pushd('+1'); // Returns /usr /etc +set('-e'); // exit upon first error +set('+e'); // this undoes a "set('-e')" ``` -Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. +Sets global configuration variables -### popd([options,] ['-N' | '+N']) +### sort([options,] file [, file ...]) +### sort([options,] file_array) Available options: -+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. - -Arguments: - -+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. ++ `-r`: Reverse the result of comparisons ++ `-n`: Compare according to numerical value Examples: ```javascript -echo(process.cwd()); // '/usr' -pushd('/etc'); // '/etc /usr' -echo(process.cwd()); // '/etc' -popd(); // '/usr' -echo(process.cwd()); // '/usr' +sort('foo.txt', 'bar.txt'); +sort('-r', 'foo.txt'); ``` -When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. +Return the contents of the files, sorted line-by-line. Sorting multiple +files mixes their content, just like unix sort does. -### dirs([options | '+N' | '-N']) +### tail([{'-n': \},] file [, file ...]) +### tail([{'-n': \},] file_array) Available options: -+ `-c`: Clears the directory stack by deleting all of the elements. - -Arguments: - -+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. ++ `-n `: Show the last `` lines of the files -Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. +Examples: -See also: pushd, popd +```javascript +var str = tail({'-n': 1}, 'file*.txt'); +var str = tail('file1', 'file2'); +var str = tail(['file1', 'file2']); // same as above +``` +Read the end of a file. -### ln([options,] source, dest) -Available options: -+ `-s`: symlink -+ `-f`: force +### tempdir() Examples: ```javascript -ln('file', 'newlink'); -ln('-sf', 'file', 'existing'); +var tmp = tempdir(); // "/tmp" for most *nix platforms ``` -Links source to dest. Use -f to force the link, should dest already exist. - - -### exit(code) -Exits the current process with the given exit code. +Searches and returns string containing a writeable, platform-dependent temporary directory. +Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). -### env['VAR_NAME'] -Object containing environment variables (both getter and setter). Shortcut to process.env. -### exec(command [, options] [, callback]) -Available options (all `false` by default): +### test(expression) +Available expression primaries: -+ `async`: Asynchronous execution. If a callback is provided, it will be set to - `true`, regardless of the passed value. -+ `silent`: Do not echo program output to console. -+ and any option available to NodeJS's - [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) ++ `'-b', 'path'`: true if path is a block device ++ `'-c', 'path'`: true if path is a character device ++ `'-d', 'path'`: true if path is a directory ++ `'-e', 'path'`: true if path exists ++ `'-f', 'path'`: true if path is a regular file ++ `'-L', 'path'`: true if path is a symbolic link ++ `'-p', 'path'`: true if path is a pipe (FIFO) ++ `'-S', 'path'`: true if path is a socket Examples: ```javascript -var version = exec('node --version', {silent:true}).stdout; - -var child = exec('some_long_running_process', {async:true}); -child.stdout.on('data', function(data) { - /* ... do something with data ... */ -}); - -exec('some_long_running_process', function(code, stdout, stderr) { - console.log('Exit code:', code); - console.log('Program output:', stdout); - console.log('Program stderr:', stderr); -}); +if (test('-d', path)) { /* do something with dir */ }; +if (!test('-f', path)) continue; // skip if it's a regular file ``` -Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -mode, this returns a ShellString (compatible with ShellJS v0.6.x, which returns an object -of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -object, and the `callback` gets the arguments `(code, stdout, stderr)`. +Evaluates expression using the available primaries and returns corresponding value. -Not seeing the behavior you want? `exec()` runs everything through `sh` -by default (or `cmd.exe` on Windows), which differs from `bash`. If you -need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. -**Note:** For long-lived processes, it's best to run `exec()` asynchronously as -the current synchronous implementation uses a lot of CPU. This should be getting -fixed soon. +### ShellString.prototype.to(file) +Examples: -### chmod(octal_mode || octal_string, file) -### chmod(symbolic_mode, file) +```javascript +cat('input.txt').to('output.txt'); +``` -Available options: +Analogous to the redirection operator `>` in Unix, but works with +ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix +redirections, `to()` will overwrite any existing file!_ -+ `-v`: output a diagnostic for every file processed -+ `-c`: like verbose but report only when a change is made -+ `-R`: change files and directories recursively + +### ShellString.prototype.toEnd(file) Examples: ```javascript -chmod(755, '/Users/brandon'); -chmod('755', '/Users/brandon'); // same as above -chmod('u+x', '/Users/brandon'); +cat('input.txt').toEnd('output.txt'); ``` -Alters the permissions of a file or directory by either specifying the -absolute permissions in octal form or expressing the changes in symbols. -This command tries to mimic the POSIX behavior as much as possible. -Notable exceptions: - -+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is - given to the umask. -+ There is no "quiet" option since default behavior is to run silent. +Analogous to the redirect-and-append operator `>>` in Unix, but works with +ShellStrings (such as those returned by `cat`, `grep`, etc). ### touch([options,] file [, file ...]) @@ -659,37 +651,39 @@ A FILE argument that does not exist is created empty, unless -c is supplied. This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. -### set(options) +### uniq([options,] [input, [output]]) Available options: -+ `+/-e`: exit upon error (`config.fatal`) -+ `+/-v`: verbose: show all commands (`config.verbose`) -+ `+/-f`: disable filename expansion (globbing) ++ `-i`: Ignore case while comparing ++ `-c`: Prefix lines by the number of occurrences ++ `-d`: Only print duplicate lines, one for each group of identical lines Examples: ```javascript -set('-e'); // exit upon first error -set('+e'); // this undoes a "set('-e')" +uniq('foo.txt'); +uniq('-i', 'foo.txt'); +uniq('-cd', 'foo.txt', 'bar.txt'); ``` -Sets global configuration variables - - -## Non-Unix commands +Filter adjacent matching lines from input -### tempdir() +### which(command) Examples: ```javascript -var tmp = tempdir(); // "/tmp" for most *nix platforms +var nodeExec = which('node'); ``` -Searches and returns string containing a writeable, platform-dependent temporary directory. -Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). +Searches for `command` in the system's PATH. On Windows, this uses the +`PATHEXT` variable to append the extension if it's not already executable. +Returns string containing the absolute path to the command. + +### exit(code) +Exits the current process with the given exit code. ### error() Tests if error occurred in the last command. Returns a truthy value if an @@ -712,6 +706,10 @@ Turns a regular string into a string-like object similar to what each command returns. This has special methods, like `.to()` and `.toEnd()` +### env['VAR_NAME'] +Object containing environment variables (both getter and setter). Shortcut +to process.env. + ### Pipes Examples: diff --git a/commands.json b/commands.json new file mode 100644 index 000000000..9254e92dd --- /dev/null +++ b/commands.json @@ -0,0 +1,29 @@ +[ + "cat", + "cd", + "chmod", + "cp", + "dirs", + "echo", + "exec", + "find", + "grep", + "head", + "ln", + "ls", + "mkdir", + "mv", + "pwd", + "rm", + "sed", + "set", + "sort", + "tail", + "tempdir", + "test", + "to", + "toEnd", + "touch", + "uniq", + "which" +] diff --git a/package.json b/package.json index 462f7db86..039fcd6ad 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "homepage": "http://github.com/shelljs/shelljs", "main": "./shell.js", "files": [ + "commands.json", "global.js", "make.js", "plugin.js", diff --git a/scripts/generate-docs.js b/scripts/generate-docs.js index f777c8ad2..9b31f1701 100755 --- a/scripts/generate-docs.js +++ b/scripts/generate-docs.js @@ -9,7 +9,15 @@ cd(__dirname + '/..'); // Extract docs from shell.js var docs = grep('^//@', 'shell.js'); -// Now extract docs from the appropriate src/*.js files +// Insert the docs for all the registered commands +docs = docs.replace(/\/\/@commands\n/g, function () { + return require('../commands.json').map(function (commandName) { + var file = './src/' + commandName + '.js'; + return grep('^//@', file) + '\n'; + }).join(''); +}); + +// Now extract docs from the remaining src/*.js files docs = docs.replace(/\/\/@include (.+)/g, function (match, path) { var file = path.match('.js$') ? path : path + '.js'; return grep('^//@', file); diff --git a/shell.js b/shell.js index 9e49ef5e7..abf911d48 100644 --- a/shell.js +++ b/shell.js @@ -3,7 +3,7 @@ // Unix shell commands on top of Node's API // // Copyright (c) 2012 Artur Adib -// http://github.com/arturadib/shelljs +// http://github.com/shelljs/shelljs // var common = require('./src/common'); @@ -17,124 +17,31 @@ var common = require('./src/common'); //@ page](https://github.com/shelljs/shelljs/wiki). //@ -// Boilerplate -// ----------- -// Copy the code block below here & replace variables with appropiate values -// ``` -// //@include ./src/fileName -// var functionName = require('./src/fileName'); -// exports.nameOfCommand = common.wrap(nameOfCommand, functionName, {globStart: firstIndexToExpand}); -// ``` -// -// The //@include includes the docs for that command -// -// firstIndexToExpand should usually be 1 (so, put {globStart: 1}) -// Increase this value if the command takes arguments that shouldn't be expanded -// with wildcards, such as with the regexes for sed & grep - -//@include ./src/cd -require('./src/cd'); - -//@include ./src/pwd -require('./src/pwd'); - -//@include ./src/ls -require('./src/ls'); - -//@include ./src/find -require('./src/find'); - -//@include ./src/cp -require('./src/cp'); - -//@include ./src/rm -require('./src/rm'); - -//@include ./src/mv -require('./src/mv'); - -//@include ./src/mkdir -require('./src/mkdir'); - -//@include ./src/test -require('./src/test'); - -//@include ./src/cat -require('./src/cat'); - -//@include ./src/head -require('./src/head'); - -//@include ./src/tail -require('./src/tail'); - -//@include ./src/to -require('./src/to'); - -//@include ./src/toEnd -require('./src/toEnd'); - -//@include ./src/sed -require('./src/sed'); - -//@include ./src/sort -require('./src/sort'); - -//@include ./src/uniq -require('./src/uniq'); - -//@include ./src/grep -require('./src/grep'); - -//@include ./src/which -require('./src/which'); +// Include the docs for all the default commands +//@commands -//@include ./src/echo -require('./src/echo'); - -//@include ./src/dirs -require('./src/dirs'); - -//@include ./src/ln -require('./src/ln'); +// Load all default commands +require('./commands.json').forEach(function (command) { + require('./src/' + command); +}); //@ //@ ### exit(code) //@ Exits the current process with the given exit code. exports.exit = process.exit; -//@ -//@ ### env['VAR_NAME'] -//@ Object containing environment variables (both getter and setter). Shortcut to process.env. -exports.env = process.env; - -//@include ./src/exec -require('./src/exec'); - -//@include ./src/chmod -require('./src/chmod'); - -//@include ./src/touch -require('./src/touch'); - -//@include ./src/set -require('./src/set'); - - -//@ -//@ ## Non-Unix commands -//@ - -//@include ./src/tempdir -require('./src/tempdir'); - //@include ./src/error - exports.error = require('./src/error'); //@include ./src/common exports.ShellString = common.ShellString; +//@ +//@ ### env['VAR_NAME'] +//@ Object containing environment variables (both getter and setter). Shortcut +//@ to process.env. +exports.env = process.env; + //@ //@ ### Pipes //@ From 057a8c89fc314eb1a699e47115a01d016dc62d99 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 19 Dec 2016 22:48:11 -0800 Subject: [PATCH 085/338] test: refactor popd tests to AVA (#626) --- ava-test/popd.js | 116 +++++++++++++++++++++++++++++++++++++++++++++++ test/popd.js | 115 ---------------------------------------------- 2 files changed, 116 insertions(+), 115 deletions(-) create mode 100644 ava-test/popd.js delete mode 100644 test/popd.js diff --git a/ava-test/popd.js b/ava-test/popd.js new file mode 100644 index 000000000..2ebfdfce1 --- /dev/null +++ b/ava-test/popd.js @@ -0,0 +1,116 @@ +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; + +const rootDir = path.resolve(); + +function reset() { + shell.dirs('-c'); + shell.cd(rootDir); +} + +test.beforeEach(() => { + shell.config.silent = true; + reset(); +}); + + +test.after.always(() => { + reset(); +}); + +// +// Valids +// + +test('basic usage', t => { + shell.pushd('resources/pushd'); + const trail = shell.popd(); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [rootDir]); +}); + +test('two directories on the stack', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + const trail = shell.popd(); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('three directories on the stack', t => { + shell.pushd('resources/pushd'); + shell.pushd('b'); + shell.pushd('c'); + const trail = shell.popd(); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('Valid by index', t => { + shell.pushd('resources/pushd'); + const trail = shell.popd('+0'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [rootDir]); +}); + +test('Using +1 option', t => { + shell.pushd('resources/pushd'); + const trail = shell.popd('+1'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [path.resolve(rootDir, 'resources/pushd')]); +}); + +test('Using -0 option', t => { + shell.pushd('resources/pushd'); + const trail = shell.popd('-0'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [path.resolve(rootDir, 'resources/pushd')]); +}); + +test('Using -1 option', t => { + shell.pushd('resources/pushd'); + const trail = shell.popd('-1'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [rootDir]); +}); + +test('Using -n option', t => { + shell.pushd('resources/pushd'); + const trail = shell.popd('-n'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [path.resolve(rootDir, 'resources/pushd')]); +}); + +test('Popping an empty stack', t => { + shell.popd(); + t.truthy(shell.error('popd: directory stack empty\n')); +}); + +test('Test that rootDir is not stored', t => { + shell.cd('resources/pushd'); + shell.pushd('b'); + const trail = shell.popd(); + t.falsy(shell.error()); + t.is(trail[0], path.resolve(rootDir, 'resources/pushd')); + t.is(process.cwd(), trail[0]); + shell.popd(); // no more in the stack + t.truthy(shell.error()); +}); diff --git a/test/popd.js b/test/popd.js deleted file mode 100644 index c7d596738..000000000 --- a/test/popd.js +++ /dev/null @@ -1,115 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var path = require('path'); - -shell.config.silent = true; - -var root = path.resolve(); -var trail; - -function reset() { - shell.dirs('-c'); - shell.cd(root); -} - -// Valid -shell.pushd('resources/pushd'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [root]); - -shell.pushd('resources/pushd'); -shell.pushd('a'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -shell.pushd('b'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -shell.pushd('b'); -shell.pushd('c'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(trail.length, 1); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [root]); - -// Valid by index -shell.pushd('resources/pushd'); -trail = shell.popd('+0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [root]); - -shell.pushd('resources/pushd'); -trail = shell.popd('+1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [path.resolve(root, 'resources/pushd')]); - -reset(); shell.pushd('resources/pushd'); -trail = shell.popd('-0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [path.resolve(root, 'resources/pushd')]); - -reset(); shell.pushd('resources/pushd'); -trail = shell.popd('-1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [root]); - - -reset(); shell.pushd('resources/pushd'); -trail = shell.popd('-n'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [path.resolve(root, 'resources/pushd')]); - -// Invalid -trail = shell.popd(); -assert.ok(shell.error('popd: directory stack empty\n')); - -// Test that the root dir is not stored -shell.cd('resources/pushd'); -shell.pushd('b'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(trail[0], path.resolve(root, 'resources/pushd')); -assert.equal(process.cwd(), trail[0]); -shell.popd(); -assert.ok(shell.error(), null); - -shell.cd(root); - -shell.exit(123); From 63041b74d619ed283202cad0543a8d0a123ab3bf Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 19 Dec 2016 22:51:54 -0800 Subject: [PATCH 086/338] test: refactor pushd tests to AVA (#627) --- ava-test/pushd.js | 329 ++++++++++++++++++++++++++++++++++++++++++++++ test/pushd.js | 225 ------------------------------- 2 files changed, 329 insertions(+), 225 deletions(-) create mode 100644 ava-test/pushd.js delete mode 100644 test/pushd.js diff --git a/ava-test/pushd.js b/ava-test/pushd.js new file mode 100644 index 000000000..727a1ae59 --- /dev/null +++ b/ava-test/pushd.js @@ -0,0 +1,329 @@ +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; + +const rootDir = path.resolve(); + +function reset() { + shell.dirs('-c'); + shell.cd(rootDir); +} + +test.beforeEach(() => { + shell.config.silent = true; + reset(); +}); + +test.after.always(() => { + reset(); +}); + +// +// Valids +// + +test('Push valid directories', t => { + const trail = shell.pushd('resources/pushd'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('Two directories', t => { + shell.pushd('resources/pushd'); + const trail = shell.pushd('a'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('Three directories', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + const trail = shell.pushd('../b'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('Four directories', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + const trail = shell.pushd('c'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('Push stuff around with positive indices', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('+0'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('+1 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('+1'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + ]); +}); + +test('+2 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('+2'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + ]); +}); + +test('+3 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('+3'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd'), + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + ]); +}); + +test('+4 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('+4'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + ]); +}); + +test('Push stuff around with negative indices', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('-0'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + ]); +}); + +test('-1 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('-1'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd'), + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + ]); +}); + +test('-2 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('-2'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + ]); +}); + +test('-3 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('-3'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + path.resolve(rootDir, 'resources/pushd/b/c'), + ]); +}); + +test('-4 option', t => { + shell.pushd('resources/pushd'); + shell.pushd('a'); + shell.pushd('../b'); + shell.pushd('c'); + const trail = shell.pushd('-4'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'resources/pushd'), + rootDir, + ]); +}); + +test('Push without changing directory or resolving paths', t => { + const trail = shell.pushd('-n', 'resources/pushd'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + rootDir, + 'resources/pushd', + ]); +}); + +test('Using the -n option with a non-empty stack', t => { + shell.pushd('-n', 'resources/pushd'); + const trail = shell.pushd('-n', 'resources/pushd/a'); + t.falsy(shell.error()); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + rootDir, + 'resources/pushd/a', + 'resources/pushd', + ]); +}); + +test('Push invalid directory', t => { + const oldCwd = process.cwd(); + shell.pushd('does/not/exist'); + t.is( + shell.error(), + 'pushd: no such file or directory: ' + path.resolve('.', 'does/not/exist') + ); + t.is(process.cwd(), oldCwd); +}); + +test( + 'Push without args swaps top two directories when stack length is 2', + t => { + let trail = shell.pushd('resources/pushd'); + t.falsy(shell.error()); + t.is(trail.length, 2); + t.is(path.relative(rootDir, trail[0]), path.join('resources', 'pushd')); + t.is(trail[1], rootDir); + t.is(process.cwd(), trail[0]); + trail = shell.pushd(); + t.falsy(shell.error()); + t.is(trail.length, 2); + t.is(trail[0], rootDir); + t.is(path.relative(rootDir, trail[1]), path.join('resources', 'pushd')); + t.is(process.cwd(), trail[0]); + } +); + +test( + 'Push without args swaps top two directories for larger stacks', + t => { + shell.pushd('resources/pushd'); + shell.pushd(); + const trail = shell.pushd('resources/pushd/a'); + t.falsy(shell.error()); + t.is(trail.length, 3); + t.is(path.relative(rootDir, trail[0]), path.join('resources', 'pushd', 'a')); + t.is(trail[1], rootDir); + t.is(path.relative(rootDir, trail[2]), path.join('resources', 'pushd')); + t.is(process.cwd(), trail[0]); + } +); + +test('Pushing with no args', t => { + shell.pushd('-n', 'resources/pushd'); + shell.pushd('resources/pushd/a'); + const trail = shell.pushd(); + t.falsy(shell.error()); + t.is(trail.length, 3); + t.is(trail[0], rootDir); + t.is(path.relative(rootDir, trail[1]), path.join('resources', 'pushd', 'a')); + t.is(path.relative(rootDir, trail[2]), path.join('resources', 'pushd')); + t.is(process.cwd(), trail[0]); +}); + +test('Push without arguments invalid when stack is empty', t => { + shell.pushd(); + t.is(shell.error(), 'pushd: no other directory'); +}); diff --git a/test/pushd.js b/test/pushd.js deleted file mode 100644 index cc694074b..000000000 --- a/test/pushd.js +++ /dev/null @@ -1,225 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); -var path = require('path'); - -shell.config.silent = true; - -var root = path.resolve(); -var trail; - -function reset() { - shell.dirs('-c'); - shell.cd(root); -} - -// Push valid directories -trail = shell.pushd('resources/pushd'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('a'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('../b'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('c'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -// Push stuff around with positive indices -trail = shell.pushd('+0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('+1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c') -]); - -trail = shell.pushd('+2'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a') -]); - -trail = shell.pushd('+3'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c') -]); - -trail = shell.pushd('+4'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -// Push stuff around with negative indices -trail = shell.pushd('-0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd') -]); - -trail = shell.pushd('-1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b') -]); - -trail = shell.pushd('-2'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd') -]); - -trail = shell.pushd('-3'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('-4'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -// Push without changing directory or resolving paths -reset(); trail = shell.pushd('-n', 'resources/pushd'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - 'resources/pushd' -]); - -trail = shell.pushd('-n', 'resources/pushd/a'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - 'resources/pushd/a', - 'resources/pushd' -]); - -// Push invalid directory -shell.pushd('does/not/exist'); -assert.equal(shell.error(), 'pushd: no such file or directory: ' + path.resolve('.', 'does/not/exist')); -assert.equal(process.cwd(), trail[0]); - -// Push without arguments should swap top two directories when stack length is 2 -reset(); trail = shell.pushd('resources/pushd'); -assert.equal(shell.error(), null); -assert.equal(trail.length, 2); -assert.equal(path.relative(root, trail[0]), path.join('resources', 'pushd')); -assert.equal(trail[1], root); -assert.equal(process.cwd(), trail[0]); -trail = shell.pushd(); -assert.equal(shell.error(), null); -assert.equal(trail.length, 2); -assert.equal(trail[0], root); -assert.equal(path.relative(root, trail[1]), path.join('resources', 'pushd')); -assert.equal(process.cwd(), trail[0]); - -// Push without arguments should swap top two directories when stack length is > 2 -trail = shell.pushd('resources/pushd/a'); -assert.equal(shell.error(), null); -assert.equal(trail.length, 3); -assert.equal(path.relative(root, trail[0]), path.join('resources', 'pushd', 'a')); -assert.equal(trail[1], root); -assert.equal(path.relative(root, trail[2]), path.join('resources', 'pushd')); -assert.equal(process.cwd(), trail[0]); - -trail = shell.pushd(); -assert.equal(shell.error(), null); -assert.equal(trail.length, 3); -assert.equal(trail[0], root); -assert.equal(path.relative(root, trail[1]), path.join('resources', 'pushd', 'a')); -assert.equal(path.relative(root, trail[2]), path.join('resources', 'pushd')); -assert.equal(process.cwd(), trail[0]); - -// Push without arguments invalid when stack is empty -reset(); shell.pushd(); -assert.equal(shell.error(), 'pushd: no other directory'); - -shell.exit(123); From c95d331be00a175d7f9ce37108d0f7384e7b3a11 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 20 Dec 2016 00:12:59 -0800 Subject: [PATCH 087/338] test: refactor shjs tests to AVA (#625) --- ava-test/shjs.js | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ test/shjs.js | 30 --------------------------- 2 files changed, 54 insertions(+), 30 deletions(-) create mode 100644 ava-test/shjs.js delete mode 100644 test/shjs.js diff --git a/ava-test/shjs.js b/ava-test/shjs.js new file mode 100644 index 000000000..6189a91f1 --- /dev/null +++ b/ava-test/shjs.js @@ -0,0 +1,54 @@ +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; + +function runWithShjs(name) { + // prefix with 'node ' for Windows, don't prefix for unix + const binPath = path.resolve(__dirname, '../bin/shjs'); + const execPath = process.platform === 'win32' + ? `${JSON.stringify(process.execPath)} ` + : ''; + const script = path.resolve(__dirname, 'resources', 'shjs', name); + return shell.exec(`${execPath}${binPath} ${script}`, { silent: true }); +} + +// +// Valids +// + +test('Non-zero exit code', t => { + const result = runWithShjs('exit-codes.js'); + t.is(result.code, 42); + t.is(result.stdout, ''); + t.falsy(result.stderr); +}); + +test('Zero exit code', t => { + const result = runWithShjs('exit-0.js'); + t.is(result.code, 0); + t.is(result.stdout, ''); + t.falsy(result.stderr); +}); + +test('Stdout/Stderr', t => { + const result = runWithShjs('stdout-stderr.js'); + t.is(result.code, 0); + t.is(result.stdout, 'stdout: OK!\n'); + t.is(result.stderr, 'stderr: OK!\n'); +}); + +test('CoffeeScript', t => { + const result = runWithShjs('coffeescript.coffee'); + t.is(result.code, 0); + t.is(result.stdout, 'CoffeeScript: OK!\n'); + t.falsy(result.stderr); +}); + +test('Extension detection', t => { + const result = runWithShjs('a-file'); + t.is(result.code, 0); + t.is(result.stdout, 'OK!\n'); + t.falsy(result.stderr); +}); diff --git a/test/shjs.js b/test/shjs.js deleted file mode 100644 index 15a2a90b5..000000000 --- a/test/shjs.js +++ /dev/null @@ -1,30 +0,0 @@ -var shell = require('..'); -var path = require('path'); -var assert = require('assert'); - -function runScript(name) { - // prefix with 'node ' for Windows, don't prefix for OSX/Linux - var cmd = (process.platform === 'win32' ? JSON.stringify(process.execPath) + ' ' : '') + path.resolve(__dirname, '../bin/shjs'); - var script = path.resolve(__dirname, 'resources', 'shjs', name); - return shell.exec(cmd + ' ' + script, { silent: true }); -} - -// Exit Codes -assert.equal(runScript('exit-codes.js').code, 42, 'exit code works'); -assert.equal(runScript('exit-0.js').code, 0, 'exiting 0 works'); - -// Stdout/Stderr -var stdioRet = runScript('stdout-stderr.js'); -assert.equal(stdioRet.stdout, 'stdout: OK!\n', 'stdout works'); -assert.equal(stdioRet.stderr, 'stderr: OK!\n', 'stderr works'); - -// CoffeeScript -assert.equal(runScript('coffeescript.coffee').stdout, 'CoffeeScript: OK!\n'); - - -// Extension detection -var extDetectRet = runScript('a-file'); -assert.equal(extDetectRet.code, 0, 'error code works'); -assert.equal(extDetectRet.stdout, 'OK!\n', 'stdout works'); - -shell.exit(123); From 7fa4b995bf9096d2b69311d729693b8b0eee8bbf Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 20 Dec 2016 11:27:02 -0800 Subject: [PATCH 088/338] Finalize moving to ava (#630) * Move ava-test/ directory to test/ * Remove unnecessary run-tests.js script * Run only ava during npm test script --- ava-test/resources/a.txt | 11 ---- ava-test/resources/badlink | 1 - ava-test/resources/cat/file1 | 1 - ava-test/resources/cat/file2 | 1 - ava-test/resources/chmod/a/b/c/.gitignore | 0 ava-test/resources/chmod/b/a/b/.gitignore | 0 ava-test/resources/chmod/c/a/b/.gitignore | 0 ava-test/resources/chmod/file1 | 2 - ava-test/resources/chmod/xdir/deep/file | 1 - ava-test/resources/chmod/xdir/file | 1 - ava-test/resources/cp-mode-bits/executable | 1 - ava-test/resources/cp/a | 1 - ava-test/resources/cp/b | 1 - ava-test/resources/cp/dir_a/z | 1 - .../resources/cp/dir_b/dir_b_a/dir_b_a_a/z | 1 - ava-test/resources/cp/fakeLinks/file.txt | 1 - ava-test/resources/cp/fakeLinks/sym.lnk | 1 - ava-test/resources/cp/links/file.txt | 1 - ava-test/resources/cp/links/sym.lnk | 1 - ava-test/resources/cp/symFolder | 1 - ava-test/resources/exec/slow.js | 4 -- ava-test/resources/external/node_script.js | 2 - ava-test/resources/file1 | 1 - ava-test/resources/file1.js | 1 - ava-test/resources/file1.txt | 1 - ava-test/resources/file2 | 1 - ava-test/resources/file2.js | 1 - ava-test/resources/file2.txt | 1 - ava-test/resources/find/.hidden | 1 - ava-test/resources/find/a | 1 - ava-test/resources/find/b | 1 - ava-test/resources/find/broken_link | 1 - ava-test/resources/find/dir1/a_dir1 | 1 - ava-test/resources/find/dir1/dir11/a_dir11 | 1 - ava-test/resources/find/dir2/a_dir1 | 1 - ava-test/resources/grep/file | 5 -- ava-test/resources/head/file1.txt | 50 ------------------- ava-test/resources/head/file2.txt | 50 ------------------- ava-test/resources/head/shortfile1 | 1 - ava-test/resources/head/shortfile2 | 1 - ava-test/resources/issue44/main.js | 1 - ava-test/resources/link | 1 - ava-test/resources/ls/.hidden_dir/nada | 1 - ava-test/resources/ls/.hidden_file | 1 - ava-test/resources/ls/a_dir/.hidden_dir/nada | 1 - ava-test/resources/ls/a_dir/b_dir/z | 1 - ava-test/resources/ls/a_dir/nada | 1 - ava-test/resources/ls/file1 | 1 - ava-test/resources/ls/file1.js | 1 - ava-test/resources/ls/file2 | 1 - ava-test/resources/ls/file2.js | 1 - ...ilename(with)[chars$]^that.must+be-escaped | 1 - ava-test/resources/pushd/a/dummy | 1 - ava-test/resources/pushd/b/c/dummy | 1 - ava-test/resources/rm/a_dir/a_file | 1 - ava-test/resources/rm/fake.lnk | 1 - ava-test/resources/rm/link_to_a_dir | 1 - ava-test/resources/shjs/a-file.js | 2 - ava-test/resources/shjs/coffeescript.coffee | 2 - ava-test/resources/shjs/exit-0.js | 1 - ava-test/resources/shjs/exit-codes.js | 1 - ava-test/resources/shjs/stdout-stderr.js | 2 - ava-test/resources/sort/file1 | 12 ----- ava-test/resources/sort/file2 | 12 ----- ava-test/resources/sort/sorted | 12 ----- ava-test/resources/sort/sortedDashN | 12 ----- ava-test/resources/uniq/file1 | 4 -- ava-test/resources/uniq/file1c | 3 -- ava-test/resources/uniq/file1d | 1 - ava-test/resources/uniq/file1t | 3 -- ava-test/resources/uniq/file1u | 3 -- ava-test/resources/uniq/file2 | 4 -- ava-test/resources/uniq/file2u | 3 -- ava-test/resources/uniq/file3 | 3 -- ava-test/resources/uniq/pipe | 50 ------------------- ava-test/resources/uniq/pipeSorted | 3 -- ava-test/utils/utils.js | 36 ------------- package.json | 2 +- scripts/run-tests.js | 29 ----------- {ava-test => test}/.eslintrc.json | 0 test/.gitignore | 2 - {ava-test => test}/cat.js | 0 {ava-test => test}/cd.js | 0 {ava-test => test}/chmod.js | 0 {ava-test => test}/common.js | 0 {ava-test => test}/config.js | 0 {ava-test => test}/cp.js | 0 {ava-test => test}/dirs.js | 0 {ava-test => test}/echo.js | 0 {ava-test => test}/env.js | 0 {ava-test => test}/exec.js | 0 {ava-test => test}/find.js | 0 {ava-test => test}/global.js | 0 {ava-test => test}/grep.js | 0 {ava-test => test}/head.js | 0 {ava-test => test}/ln.js | 0 {ava-test => test}/ls.js | 0 {ava-test => test}/mkdir.js | 0 {ava-test => test}/mv.js | 0 {ava-test => test}/pipe.js | 0 {ava-test => test}/plugin.js | 0 {ava-test => test}/popd.js | 0 {ava-test => test}/pushd.js | 0 {ava-test => test}/pwd.js | 0 {ava-test => test}/rm.js | 0 {ava-test => test}/sed.js | 0 {ava-test => test}/set.js | 0 {ava-test => test}/shjs.js | 0 {ava-test => test}/sort.js | 0 {ava-test => test}/tail.js | 0 {ava-test => test}/tempdir.js | 0 {ava-test => test}/test.js | 0 {ava-test => test}/to.js | 0 {ava-test => test}/toEnd.js | 0 {ava-test => test}/touch.js | 0 {ava-test => test}/uniq.js | 0 test/utils/utils.js | 35 ++++++++++++- {ava-test => test}/which.js | 0 118 files changed, 34 insertions(+), 374 deletions(-) delete mode 100644 ava-test/resources/a.txt delete mode 120000 ava-test/resources/badlink delete mode 100644 ava-test/resources/cat/file1 delete mode 100644 ava-test/resources/cat/file2 delete mode 100644 ava-test/resources/chmod/a/b/c/.gitignore delete mode 100755 ava-test/resources/chmod/b/a/b/.gitignore delete mode 100644 ava-test/resources/chmod/c/a/b/.gitignore delete mode 100644 ava-test/resources/chmod/file1 delete mode 100644 ava-test/resources/chmod/xdir/deep/file delete mode 100644 ava-test/resources/chmod/xdir/file delete mode 100755 ava-test/resources/cp-mode-bits/executable delete mode 100644 ava-test/resources/cp/a delete mode 100644 ava-test/resources/cp/b delete mode 100644 ava-test/resources/cp/dir_a/z delete mode 100644 ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z delete mode 100644 ava-test/resources/cp/fakeLinks/file.txt delete mode 100644 ava-test/resources/cp/fakeLinks/sym.lnk delete mode 100644 ava-test/resources/cp/links/file.txt delete mode 120000 ava-test/resources/cp/links/sym.lnk delete mode 120000 ava-test/resources/cp/symFolder delete mode 100644 ava-test/resources/exec/slow.js delete mode 100755 ava-test/resources/external/node_script.js delete mode 100644 ava-test/resources/file1 delete mode 100644 ava-test/resources/file1.js delete mode 100644 ava-test/resources/file1.txt delete mode 100644 ava-test/resources/file2 delete mode 100644 ava-test/resources/file2.js delete mode 100644 ava-test/resources/file2.txt delete mode 100644 ava-test/resources/find/.hidden delete mode 100644 ava-test/resources/find/a delete mode 100644 ava-test/resources/find/b delete mode 120000 ava-test/resources/find/broken_link delete mode 100644 ava-test/resources/find/dir1/a_dir1 delete mode 100644 ava-test/resources/find/dir1/dir11/a_dir11 delete mode 100644 ava-test/resources/find/dir2/a_dir1 delete mode 100644 ava-test/resources/grep/file delete mode 100644 ava-test/resources/head/file1.txt delete mode 100644 ava-test/resources/head/file2.txt delete mode 100644 ava-test/resources/head/shortfile1 delete mode 100644 ava-test/resources/head/shortfile2 delete mode 100644 ava-test/resources/issue44/main.js delete mode 120000 ava-test/resources/link delete mode 100644 ava-test/resources/ls/.hidden_dir/nada delete mode 100644 ava-test/resources/ls/.hidden_file delete mode 100644 ava-test/resources/ls/a_dir/.hidden_dir/nada delete mode 100644 ava-test/resources/ls/a_dir/b_dir/z delete mode 100644 ava-test/resources/ls/a_dir/nada delete mode 100644 ava-test/resources/ls/file1 delete mode 100644 ava-test/resources/ls/file1.js delete mode 100644 ava-test/resources/ls/file2 delete mode 100644 ava-test/resources/ls/file2.js delete mode 100644 ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped delete mode 100644 ava-test/resources/pushd/a/dummy delete mode 100644 ava-test/resources/pushd/b/c/dummy delete mode 100644 ava-test/resources/rm/a_dir/a_file delete mode 120000 ava-test/resources/rm/fake.lnk delete mode 120000 ava-test/resources/rm/link_to_a_dir delete mode 100644 ava-test/resources/shjs/a-file.js delete mode 100644 ava-test/resources/shjs/coffeescript.coffee delete mode 100644 ava-test/resources/shjs/exit-0.js delete mode 100644 ava-test/resources/shjs/exit-codes.js delete mode 100644 ava-test/resources/shjs/stdout-stderr.js delete mode 100644 ava-test/resources/sort/file1 delete mode 100644 ava-test/resources/sort/file2 delete mode 100644 ava-test/resources/sort/sorted delete mode 100644 ava-test/resources/sort/sortedDashN delete mode 100644 ava-test/resources/uniq/file1 delete mode 100644 ava-test/resources/uniq/file1c delete mode 100644 ava-test/resources/uniq/file1d delete mode 100644 ava-test/resources/uniq/file1t delete mode 100644 ava-test/resources/uniq/file1u delete mode 100644 ava-test/resources/uniq/file2 delete mode 100644 ava-test/resources/uniq/file2u delete mode 100644 ava-test/resources/uniq/file3 delete mode 100644 ava-test/resources/uniq/pipe delete mode 100644 ava-test/resources/uniq/pipeSorted delete mode 100644 ava-test/utils/utils.js delete mode 100755 scripts/run-tests.js rename {ava-test => test}/.eslintrc.json (100%) delete mode 100644 test/.gitignore rename {ava-test => test}/cat.js (100%) rename {ava-test => test}/cd.js (100%) rename {ava-test => test}/chmod.js (100%) rename {ava-test => test}/common.js (100%) rename {ava-test => test}/config.js (100%) rename {ava-test => test}/cp.js (100%) rename {ava-test => test}/dirs.js (100%) rename {ava-test => test}/echo.js (100%) rename {ava-test => test}/env.js (100%) rename {ava-test => test}/exec.js (100%) rename {ava-test => test}/find.js (100%) rename {ava-test => test}/global.js (100%) rename {ava-test => test}/grep.js (100%) rename {ava-test => test}/head.js (100%) rename {ava-test => test}/ln.js (100%) rename {ava-test => test}/ls.js (100%) rename {ava-test => test}/mkdir.js (100%) rename {ava-test => test}/mv.js (100%) rename {ava-test => test}/pipe.js (100%) rename {ava-test => test}/plugin.js (100%) rename {ava-test => test}/popd.js (100%) rename {ava-test => test}/pushd.js (100%) rename {ava-test => test}/pwd.js (100%) rename {ava-test => test}/rm.js (100%) rename {ava-test => test}/sed.js (100%) rename {ava-test => test}/set.js (100%) rename {ava-test => test}/shjs.js (100%) rename {ava-test => test}/sort.js (100%) rename {ava-test => test}/tail.js (100%) rename {ava-test => test}/tempdir.js (100%) rename {ava-test => test}/test.js (100%) rename {ava-test => test}/to.js (100%) rename {ava-test => test}/toEnd.js (100%) rename {ava-test => test}/touch.js (100%) rename {ava-test => test}/uniq.js (100%) rename {ava-test => test}/which.js (100%) diff --git a/ava-test/resources/a.txt b/ava-test/resources/a.txt deleted file mode 100644 index 356ce4912..000000000 --- a/ava-test/resources/a.txt +++ /dev/null @@ -1,11 +0,0 @@ -This is line one -This is line two - -This is line four -. -. -More content here -. -. - -This is line eleven diff --git a/ava-test/resources/badlink b/ava-test/resources/badlink deleted file mode 120000 index e3404fe47..000000000 --- a/ava-test/resources/badlink +++ /dev/null @@ -1 +0,0 @@ -not_existed_file \ No newline at end of file diff --git a/ava-test/resources/cat/file1 b/ava-test/resources/cat/file1 deleted file mode 100644 index a5bce3fd2..000000000 --- a/ava-test/resources/cat/file1 +++ /dev/null @@ -1 +0,0 @@ -test1 diff --git a/ava-test/resources/cat/file2 b/ava-test/resources/cat/file2 deleted file mode 100644 index 180cf8328..000000000 --- a/ava-test/resources/cat/file2 +++ /dev/null @@ -1 +0,0 @@ -test2 diff --git a/ava-test/resources/chmod/a/b/c/.gitignore b/ava-test/resources/chmod/a/b/c/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/ava-test/resources/chmod/b/a/b/.gitignore b/ava-test/resources/chmod/b/a/b/.gitignore deleted file mode 100755 index e69de29bb..000000000 diff --git a/ava-test/resources/chmod/c/a/b/.gitignore b/ava-test/resources/chmod/c/a/b/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/ava-test/resources/chmod/file1 b/ava-test/resources/chmod/file1 deleted file mode 100644 index db3f9ca6e..000000000 --- a/ava-test/resources/chmod/file1 +++ /dev/null @@ -1,2 +0,0 @@ -this is test file 1 -default state should be 0644 (rw-r--r--) diff --git a/ava-test/resources/chmod/xdir/deep/file b/ava-test/resources/chmod/xdir/deep/file deleted file mode 100644 index 02f6335fc..000000000 --- a/ava-test/resources/chmod/xdir/deep/file +++ /dev/null @@ -1 +0,0 @@ -a file diff --git a/ava-test/resources/chmod/xdir/file b/ava-test/resources/chmod/xdir/file deleted file mode 100644 index 02f6335fc..000000000 --- a/ava-test/resources/chmod/xdir/file +++ /dev/null @@ -1 +0,0 @@ -a file diff --git a/ava-test/resources/cp-mode-bits/executable b/ava-test/resources/cp-mode-bits/executable deleted file mode 100755 index 5e40c0877..000000000 --- a/ava-test/resources/cp-mode-bits/executable +++ /dev/null @@ -1 +0,0 @@ -asdf \ No newline at end of file diff --git a/ava-test/resources/cp/a b/ava-test/resources/cp/a deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/cp/a +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/cp/b b/ava-test/resources/cp/b deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/cp/b +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/cp/dir_a/z b/ava-test/resources/cp/dir_a/z deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/cp/dir_a/z +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z b/ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/cp/fakeLinks/file.txt b/ava-test/resources/cp/fakeLinks/file.txt deleted file mode 100644 index 0637880d7..000000000 --- a/ava-test/resources/cp/fakeLinks/file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a file diff --git a/ava-test/resources/cp/fakeLinks/sym.lnk b/ava-test/resources/cp/fakeLinks/sym.lnk deleted file mode 100644 index de8e66c01..000000000 --- a/ava-test/resources/cp/fakeLinks/sym.lnk +++ /dev/null @@ -1 +0,0 @@ -This is not a link diff --git a/ava-test/resources/cp/links/file.txt b/ava-test/resources/cp/links/file.txt deleted file mode 100644 index 0637880d7..000000000 --- a/ava-test/resources/cp/links/file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a file diff --git a/ava-test/resources/cp/links/sym.lnk b/ava-test/resources/cp/links/sym.lnk deleted file mode 120000 index 4c330738c..000000000 --- a/ava-test/resources/cp/links/sym.lnk +++ /dev/null @@ -1 +0,0 @@ -file.txt \ No newline at end of file diff --git a/ava-test/resources/cp/symFolder b/ava-test/resources/cp/symFolder deleted file mode 120000 index ce866dd8e..000000000 --- a/ava-test/resources/cp/symFolder +++ /dev/null @@ -1 +0,0 @@ -links/ \ No newline at end of file diff --git a/ava-test/resources/exec/slow.js b/ava-test/resources/exec/slow.js deleted file mode 100644 index cffff43f5..000000000 --- a/ava-test/resources/exec/slow.js +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node -setTimeout(function() { - console.log('slow'); -}, parseInt(process.argv[2], 10)); diff --git a/ava-test/resources/external/node_script.js b/ava-test/resources/external/node_script.js deleted file mode 100755 index 3b2d24a06..000000000 --- a/ava-test/resources/external/node_script.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log('node_script_1234'); - diff --git a/ava-test/resources/file1 b/ava-test/resources/file1 deleted file mode 100644 index f079749c4..000000000 --- a/ava-test/resources/file1 +++ /dev/null @@ -1 +0,0 @@ -test1 \ No newline at end of file diff --git a/ava-test/resources/file1.js b/ava-test/resources/file1.js deleted file mode 100644 index 9daeafb98..000000000 --- a/ava-test/resources/file1.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/ava-test/resources/file1.txt b/ava-test/resources/file1.txt deleted file mode 100644 index a5bce3fd2..000000000 --- a/ava-test/resources/file1.txt +++ /dev/null @@ -1 +0,0 @@ -test1 diff --git a/ava-test/resources/file2 b/ava-test/resources/file2 deleted file mode 100644 index d606037cb..000000000 --- a/ava-test/resources/file2 +++ /dev/null @@ -1 +0,0 @@ -test2 \ No newline at end of file diff --git a/ava-test/resources/file2.js b/ava-test/resources/file2.js deleted file mode 100644 index 9daeafb98..000000000 --- a/ava-test/resources/file2.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/ava-test/resources/file2.txt b/ava-test/resources/file2.txt deleted file mode 100644 index 180cf8328..000000000 --- a/ava-test/resources/file2.txt +++ /dev/null @@ -1 +0,0 @@ -test2 diff --git a/ava-test/resources/find/.hidden b/ava-test/resources/find/.hidden deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/find/.hidden +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/find/a b/ava-test/resources/find/a deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/find/a +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/find/b b/ava-test/resources/find/b deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/find/b +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/find/broken_link b/ava-test/resources/find/broken_link deleted file mode 120000 index 5b9521524..000000000 --- a/ava-test/resources/find/broken_link +++ /dev/null @@ -1 +0,0 @@ -non_existent \ No newline at end of file diff --git a/ava-test/resources/find/dir1/a_dir1 b/ava-test/resources/find/dir1/a_dir1 deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/find/dir1/a_dir1 +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/find/dir1/dir11/a_dir11 b/ava-test/resources/find/dir1/dir11/a_dir11 deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/find/dir1/dir11/a_dir11 +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/find/dir2/a_dir1 b/ava-test/resources/find/dir2/a_dir1 deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/find/dir2/a_dir1 +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/grep/file b/ava-test/resources/grep/file deleted file mode 100644 index dbb55d26c..000000000 --- a/ava-test/resources/grep/file +++ /dev/null @@ -1,5 +0,0 @@ -alphaaaaaaabeta -howareyou -alphbeta -this line ends in.js -lllllllllllllllll.js diff --git a/ava-test/resources/head/file1.txt b/ava-test/resources/head/file1.txt deleted file mode 100644 index f818b0dfa..000000000 --- a/ava-test/resources/head/file1.txt +++ /dev/null @@ -1,50 +0,0 @@ -file1 1 -file1 2 -file1 3 -file1 4 -file1 5 -file1 6 -file1 7 -file1 8 -file1 9 -file1 10 -file1 11 -file1 12 -file1 13 -file1 14 -file1 15 -file1 16 -file1 17 -file1 18 -file1 19 -file1 20 -file1 21 -file1 22 -file1 23 -file1 24 -file1 25 -file1 26 -file1 27 -file1 28 -file1 29 -file1 30 -file1 31 -file1 32 -file1 33 -file1 34 -file1 35 -file1 36 -file1 37 -file1 38 -file1 39 -file1 40 -file1 41 -file1 42 -file1 43 -file1 44 -file1 45 -file1 46 -file1 47 -file1 48 -file1 49 -file1 50 diff --git a/ava-test/resources/head/file2.txt b/ava-test/resources/head/file2.txt deleted file mode 100644 index 37cf79b5e..000000000 --- a/ava-test/resources/head/file2.txt +++ /dev/null @@ -1,50 +0,0 @@ -file2 1 -file2 2 -file2 3 -file2 4 -file2 5 -file2 6 -file2 7 -file2 8 -file2 9 -file2 10 -file2 11 -file2 12 -file2 13 -file2 14 -file2 15 -file2 16 -file2 17 -file2 18 -file2 19 -file2 20 -file2 21 -file2 22 -file2 23 -file2 24 -file2 25 -file2 26 -file2 27 -file2 28 -file2 29 -file2 30 -file2 31 -file2 32 -file2 33 -file2 34 -file2 35 -file2 36 -file2 37 -file2 38 -file2 39 -file2 40 -file2 41 -file2 42 -file2 43 -file2 44 -file2 45 -file2 46 -file2 47 -file2 48 -file2 49 -file2 50 diff --git a/ava-test/resources/head/shortfile1 b/ava-test/resources/head/shortfile1 deleted file mode 100644 index 180ffe1b4..000000000 --- a/ava-test/resources/head/shortfile1 +++ /dev/null @@ -1 +0,0 @@ -short1 diff --git a/ava-test/resources/head/shortfile2 b/ava-test/resources/head/shortfile2 deleted file mode 100644 index b0595c768..000000000 --- a/ava-test/resources/head/shortfile2 +++ /dev/null @@ -1 +0,0 @@ -short2 diff --git a/ava-test/resources/issue44/main.js b/ava-test/resources/issue44/main.js deleted file mode 100644 index d800886d9..000000000 --- a/ava-test/resources/issue44/main.js +++ /dev/null @@ -1 +0,0 @@ -123 \ No newline at end of file diff --git a/ava-test/resources/link b/ava-test/resources/link deleted file mode 120000 index 08219db9b..000000000 --- a/ava-test/resources/link +++ /dev/null @@ -1 +0,0 @@ -file1 \ No newline at end of file diff --git a/ava-test/resources/ls/.hidden_dir/nada b/ava-test/resources/ls/.hidden_dir/nada deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/ls/.hidden_dir/nada +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/ls/.hidden_file b/ava-test/resources/ls/.hidden_file deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/ls/.hidden_file +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/ls/a_dir/.hidden_dir/nada b/ava-test/resources/ls/a_dir/.hidden_dir/nada deleted file mode 100644 index 5fedf5729..000000000 --- a/ava-test/resources/ls/a_dir/.hidden_dir/nada +++ /dev/null @@ -1 +0,0 @@ -nada \ No newline at end of file diff --git a/ava-test/resources/ls/a_dir/b_dir/z b/ava-test/resources/ls/a_dir/b_dir/z deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/ls/a_dir/b_dir/z +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/ls/a_dir/nada b/ava-test/resources/ls/a_dir/nada deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/ls/a_dir/nada +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/ls/file1 b/ava-test/resources/ls/file1 deleted file mode 100644 index 9daeafb98..000000000 --- a/ava-test/resources/ls/file1 +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/ava-test/resources/ls/file1.js b/ava-test/resources/ls/file1.js deleted file mode 100644 index 9daeafb98..000000000 --- a/ava-test/resources/ls/file1.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/ava-test/resources/ls/file2 b/ava-test/resources/ls/file2 deleted file mode 100644 index 9daeafb98..000000000 --- a/ava-test/resources/ls/file2 +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/ava-test/resources/ls/file2.js b/ava-test/resources/ls/file2.js deleted file mode 100644 index 9daeafb98..000000000 --- a/ava-test/resources/ls/file2.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped b/ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/ls/filename(with)[chars$]^that.must+be-escaped +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/pushd/a/dummy b/ava-test/resources/pushd/a/dummy deleted file mode 100644 index 72e12a968..000000000 --- a/ava-test/resources/pushd/a/dummy +++ /dev/null @@ -1 +0,0 @@ -meh \ No newline at end of file diff --git a/ava-test/resources/pushd/b/c/dummy b/ava-test/resources/pushd/b/c/dummy deleted file mode 100644 index 72e12a968..000000000 --- a/ava-test/resources/pushd/b/c/dummy +++ /dev/null @@ -1 +0,0 @@ -meh \ No newline at end of file diff --git a/ava-test/resources/rm/a_dir/a_file b/ava-test/resources/rm/a_dir/a_file deleted file mode 100644 index 8bd6648ed..000000000 --- a/ava-test/resources/rm/a_dir/a_file +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/ava-test/resources/rm/fake.lnk b/ava-test/resources/rm/fake.lnk deleted file mode 120000 index 6eab79a6c..000000000 --- a/ava-test/resources/rm/fake.lnk +++ /dev/null @@ -1 +0,0 @@ -missing \ No newline at end of file diff --git a/ava-test/resources/rm/link_to_a_dir b/ava-test/resources/rm/link_to_a_dir deleted file mode 120000 index cad027a2e..000000000 --- a/ava-test/resources/rm/link_to_a_dir +++ /dev/null @@ -1 +0,0 @@ -a_dir \ No newline at end of file diff --git a/ava-test/resources/shjs/a-file.js b/ava-test/resources/shjs/a-file.js deleted file mode 100644 index 3050cd9a6..000000000 --- a/ava-test/resources/shjs/a-file.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log('OK!'); -process.exit(0); diff --git a/ava-test/resources/shjs/coffeescript.coffee b/ava-test/resources/shjs/coffeescript.coffee deleted file mode 100644 index 5b2766405..000000000 --- a/ava-test/resources/shjs/coffeescript.coffee +++ /dev/null @@ -1,2 +0,0 @@ -msg = 'CoffeeScript: OK!' -console.log msg diff --git a/ava-test/resources/shjs/exit-0.js b/ava-test/resources/shjs/exit-0.js deleted file mode 100644 index dcbbff6c9..000000000 --- a/ava-test/resources/shjs/exit-0.js +++ /dev/null @@ -1 +0,0 @@ -process.exit(0); diff --git a/ava-test/resources/shjs/exit-codes.js b/ava-test/resources/shjs/exit-codes.js deleted file mode 100644 index 6427ca060..000000000 --- a/ava-test/resources/shjs/exit-codes.js +++ /dev/null @@ -1 +0,0 @@ -process.exit(42); diff --git a/ava-test/resources/shjs/stdout-stderr.js b/ava-test/resources/shjs/stdout-stderr.js deleted file mode 100644 index 220cb58f8..000000000 --- a/ava-test/resources/shjs/stdout-stderr.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log('stdout: OK!'); -console.error('stderr: OK!'); diff --git a/ava-test/resources/sort/file1 b/ava-test/resources/sort/file1 deleted file mode 100644 index 08c355283..000000000 --- a/ava-test/resources/sort/file1 +++ /dev/null @@ -1,12 +0,0 @@ -22 -symbolic -46 integers -melt -admiral -aardvark -scanner -Dynamite -Witness -12345 -blackwater -5 numbers diff --git a/ava-test/resources/sort/file2 b/ava-test/resources/sort/file2 deleted file mode 100644 index e93f1c23e..000000000 --- a/ava-test/resources/sort/file2 +++ /dev/null @@ -1,12 +0,0 @@ -admiral -scanner -5 numbers -Witness -46 integers -12345 -Dynamite -blackwater -aardvark -22 -symbolic -melt diff --git a/ava-test/resources/sort/sorted b/ava-test/resources/sort/sorted deleted file mode 100644 index 47c17061e..000000000 --- a/ava-test/resources/sort/sorted +++ /dev/null @@ -1,12 +0,0 @@ -12345 -22 -46 integers -5 numbers -aardvark -admiral -blackwater -Dynamite -melt -scanner -symbolic -Witness diff --git a/ava-test/resources/sort/sortedDashN b/ava-test/resources/sort/sortedDashN deleted file mode 100644 index 9892c3474..000000000 --- a/ava-test/resources/sort/sortedDashN +++ /dev/null @@ -1,12 +0,0 @@ -aardvark -admiral -blackwater -Dynamite -melt -scanner -symbolic -Witness -5 numbers -22 -46 integers -12345 diff --git a/ava-test/resources/uniq/file1 b/ava-test/resources/uniq/file1 deleted file mode 100644 index 8687fd613..000000000 --- a/ava-test/resources/uniq/file1 +++ /dev/null @@ -1,4 +0,0 @@ -foo -bar -bar -baz diff --git a/ava-test/resources/uniq/file1c b/ava-test/resources/uniq/file1c deleted file mode 100644 index 7162bb424..000000000 --- a/ava-test/resources/uniq/file1c +++ /dev/null @@ -1,3 +0,0 @@ - 1 foo - 2 bar - 1 baz diff --git a/ava-test/resources/uniq/file1d b/ava-test/resources/uniq/file1d deleted file mode 100644 index 5716ca598..000000000 --- a/ava-test/resources/uniq/file1d +++ /dev/null @@ -1 +0,0 @@ -bar diff --git a/ava-test/resources/uniq/file1t b/ava-test/resources/uniq/file1t deleted file mode 100644 index 86e041dad..000000000 --- a/ava-test/resources/uniq/file1t +++ /dev/null @@ -1,3 +0,0 @@ -foo -bar -baz diff --git a/ava-test/resources/uniq/file1u b/ava-test/resources/uniq/file1u deleted file mode 100644 index 86e041dad..000000000 --- a/ava-test/resources/uniq/file1u +++ /dev/null @@ -1,3 +0,0 @@ -foo -bar -baz diff --git a/ava-test/resources/uniq/file2 b/ava-test/resources/uniq/file2 deleted file mode 100644 index 2bf57bbeb..000000000 --- a/ava-test/resources/uniq/file2 +++ /dev/null @@ -1,4 +0,0 @@ -foo -bar -Bar -baz diff --git a/ava-test/resources/uniq/file2u b/ava-test/resources/uniq/file2u deleted file mode 100644 index 86e041dad..000000000 --- a/ava-test/resources/uniq/file2u +++ /dev/null @@ -1,3 +0,0 @@ -foo -bar -baz diff --git a/ava-test/resources/uniq/file3 b/ava-test/resources/uniq/file3 deleted file mode 100644 index 86e041dad..000000000 --- a/ava-test/resources/uniq/file3 +++ /dev/null @@ -1,3 +0,0 @@ -foo -bar -baz diff --git a/ava-test/resources/uniq/pipe b/ava-test/resources/uniq/pipe deleted file mode 100644 index b7eb19584..000000000 --- a/ava-test/resources/uniq/pipe +++ /dev/null @@ -1,50 +0,0 @@ -bar -foo -foo -baz -foo -foo -bar -foo -baz -baz -foo -baz -baz -baz -bar -baz -bar -bar -baz -bar -baz -foo -baz -foo -baz -foo -bar -baz -bar -bar -bar -foo -foo -foo -foo -baz -foo -baz -foo -foo -bar -foo -foo -bar -foo -foo -baz -foo -foo -foo diff --git a/ava-test/resources/uniq/pipeSorted b/ava-test/resources/uniq/pipeSorted deleted file mode 100644 index 0e1845d37..000000000 --- a/ava-test/resources/uniq/pipeSorted +++ /dev/null @@ -1,3 +0,0 @@ - 12 bar - 15 baz - 23 foo diff --git a/ava-test/utils/utils.js b/ava-test/utils/utils.js deleted file mode 100644 index 1f9bf94ab..000000000 --- a/ava-test/utils/utils.js +++ /dev/null @@ -1,36 +0,0 @@ -const child = require('child_process'); - -function numLines(str) { - return typeof str === 'string' ? (str.match(/\n/g) || []).length + 1 : 0; -} -exports.numLines = numLines; - -function getTempDir() { - // a very random directory - return ('tmp' + Math.random() + Math.random()).replace(/\./g, ''); -} -exports.getTempDir = getTempDir; - -// On Windows, symlinks for files need admin permissions. This helper -// skips certain tests if we are on Windows and got an EPERM error -function skipOnWinForEPERM(action, testCase) { - const ret = action(); - const error = ret.code; - const isWindows = process.platform === 'win32'; - if (isWindows && error && /EPERM:/.test(error)) { - console.warn('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); - } else { - testCase(); - } -} -exports.skipOnWinForEPERM = skipOnWinForEPERM; - -function runScript(script, cb) { - child.execFile(process.execPath, ['-e', script], cb); -} -exports.runScript = runScript; - -function sleep(time) { - child.execFileSync(process.execPath, ['resources/exec/slow.js', time.toString()]); -} -exports.sleep = sleep; diff --git a/package.json b/package.json index 039fcd6ad..3ff1aa140 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ ], "scripts": { "posttest": "npm run lint", - "test": "node scripts/run-tests && ava --serial ava-test/*.js", + "test": "ava --serial test/*.js", "gendocs": "node scripts/generate-docs", "lint": "eslint .", "after-travis": "travis-check-changes", diff --git a/scripts/run-tests.js b/scripts/run-tests.js deleted file mode 100755 index 99205623f..000000000 --- a/scripts/run-tests.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node -/* globals cd, echo, exec, exit, ls */ -require('../global'); - -var failed = false; - -// -// Unit tests -// -cd(__dirname + '/../test'); -ls('*.js').forEach(function (file) { - echo('Running test:', file); - if (exec(JSON.stringify(process.execPath) + ' ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) - failed = true; - echo('*** TEST FAILED! (missing exit code "123")'); - echo(); - } -}); - -echo(); - -if (failed) { - echo('*******************************************************'); - echo('WARNING: Some tests did not pass!'); - echo('*******************************************************'); - exit(1); -} else { - echo('All tests passed.'); -} diff --git a/ava-test/.eslintrc.json b/test/.eslintrc.json similarity index 100% rename from ava-test/.eslintrc.json rename to test/.eslintrc.json diff --git a/test/.gitignore b/test/.gitignore deleted file mode 100644 index a1632ab58..000000000 --- a/test/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -tmp/ - diff --git a/ava-test/cat.js b/test/cat.js similarity index 100% rename from ava-test/cat.js rename to test/cat.js diff --git a/ava-test/cd.js b/test/cd.js similarity index 100% rename from ava-test/cd.js rename to test/cd.js diff --git a/ava-test/chmod.js b/test/chmod.js similarity index 100% rename from ava-test/chmod.js rename to test/chmod.js diff --git a/ava-test/common.js b/test/common.js similarity index 100% rename from ava-test/common.js rename to test/common.js diff --git a/ava-test/config.js b/test/config.js similarity index 100% rename from ava-test/config.js rename to test/config.js diff --git a/ava-test/cp.js b/test/cp.js similarity index 100% rename from ava-test/cp.js rename to test/cp.js diff --git a/ava-test/dirs.js b/test/dirs.js similarity index 100% rename from ava-test/dirs.js rename to test/dirs.js diff --git a/ava-test/echo.js b/test/echo.js similarity index 100% rename from ava-test/echo.js rename to test/echo.js diff --git a/ava-test/env.js b/test/env.js similarity index 100% rename from ava-test/env.js rename to test/env.js diff --git a/ava-test/exec.js b/test/exec.js similarity index 100% rename from ava-test/exec.js rename to test/exec.js diff --git a/ava-test/find.js b/test/find.js similarity index 100% rename from ava-test/find.js rename to test/find.js diff --git a/ava-test/global.js b/test/global.js similarity index 100% rename from ava-test/global.js rename to test/global.js diff --git a/ava-test/grep.js b/test/grep.js similarity index 100% rename from ava-test/grep.js rename to test/grep.js diff --git a/ava-test/head.js b/test/head.js similarity index 100% rename from ava-test/head.js rename to test/head.js diff --git a/ava-test/ln.js b/test/ln.js similarity index 100% rename from ava-test/ln.js rename to test/ln.js diff --git a/ava-test/ls.js b/test/ls.js similarity index 100% rename from ava-test/ls.js rename to test/ls.js diff --git a/ava-test/mkdir.js b/test/mkdir.js similarity index 100% rename from ava-test/mkdir.js rename to test/mkdir.js diff --git a/ava-test/mv.js b/test/mv.js similarity index 100% rename from ava-test/mv.js rename to test/mv.js diff --git a/ava-test/pipe.js b/test/pipe.js similarity index 100% rename from ava-test/pipe.js rename to test/pipe.js diff --git a/ava-test/plugin.js b/test/plugin.js similarity index 100% rename from ava-test/plugin.js rename to test/plugin.js diff --git a/ava-test/popd.js b/test/popd.js similarity index 100% rename from ava-test/popd.js rename to test/popd.js diff --git a/ava-test/pushd.js b/test/pushd.js similarity index 100% rename from ava-test/pushd.js rename to test/pushd.js diff --git a/ava-test/pwd.js b/test/pwd.js similarity index 100% rename from ava-test/pwd.js rename to test/pwd.js diff --git a/ava-test/rm.js b/test/rm.js similarity index 100% rename from ava-test/rm.js rename to test/rm.js diff --git a/ava-test/sed.js b/test/sed.js similarity index 100% rename from ava-test/sed.js rename to test/sed.js diff --git a/ava-test/set.js b/test/set.js similarity index 100% rename from ava-test/set.js rename to test/set.js diff --git a/ava-test/shjs.js b/test/shjs.js similarity index 100% rename from ava-test/shjs.js rename to test/shjs.js diff --git a/ava-test/sort.js b/test/sort.js similarity index 100% rename from ava-test/sort.js rename to test/sort.js diff --git a/ava-test/tail.js b/test/tail.js similarity index 100% rename from ava-test/tail.js rename to test/tail.js diff --git a/ava-test/tempdir.js b/test/tempdir.js similarity index 100% rename from ava-test/tempdir.js rename to test/tempdir.js diff --git a/ava-test/test.js b/test/test.js similarity index 100% rename from ava-test/test.js rename to test/test.js diff --git a/ava-test/to.js b/test/to.js similarity index 100% rename from ava-test/to.js rename to test/to.js diff --git a/ava-test/toEnd.js b/test/toEnd.js similarity index 100% rename from ava-test/toEnd.js rename to test/toEnd.js diff --git a/ava-test/touch.js b/test/touch.js similarity index 100% rename from ava-test/touch.js rename to test/touch.js diff --git a/ava-test/uniq.js b/test/uniq.js similarity index 100% rename from ava-test/uniq.js rename to test/uniq.js diff --git a/test/utils/utils.js b/test/utils/utils.js index 88fcc9855..1f9bf94ab 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -1,5 +1,36 @@ -function _numLines(str) { +const child = require('child_process'); + +function numLines(str) { return typeof str === 'string' ? (str.match(/\n/g) || []).length + 1 : 0; } +exports.numLines = numLines; + +function getTempDir() { + // a very random directory + return ('tmp' + Math.random() + Math.random()).replace(/\./g, ''); +} +exports.getTempDir = getTempDir; + +// On Windows, symlinks for files need admin permissions. This helper +// skips certain tests if we are on Windows and got an EPERM error +function skipOnWinForEPERM(action, testCase) { + const ret = action(); + const error = ret.code; + const isWindows = process.platform === 'win32'; + if (isWindows && error && /EPERM:/.test(error)) { + console.warn('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); + } else { + testCase(); + } +} +exports.skipOnWinForEPERM = skipOnWinForEPERM; + +function runScript(script, cb) { + child.execFile(process.execPath, ['-e', script], cb); +} +exports.runScript = runScript; -exports.numLines = _numLines; +function sleep(time) { + child.execFileSync(process.execPath, ['resources/exec/slow.js', time.toString()]); +} +exports.sleep = sleep; diff --git a/ava-test/which.js b/test/which.js similarity index 100% rename from ava-test/which.js rename to test/which.js From 2089d3e4b348ce40b18a8cdd402641b2b3ff5663 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 26 Dec 2016 23:36:16 -0800 Subject: [PATCH 089/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e37880fb7..445ce626f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,108 @@ ## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.4...HEAD) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.5...HEAD) + +**Closed issues:** + +- QUESTION: Feedback while an operation is running? [\#629](https://github.com/shelljs/shelljs/issues/629) +- Test setup/cleanup is broken [\#621](https://github.com/shelljs/shelljs/issues/621) +- Ignore temp directories when running lint [\#620](https://github.com/shelljs/shelljs/issues/620) +- parseOptions should throw an error if the option string doesn't start with '-' [\#614](https://github.com/shelljs/shelljs/issues/614) +- chore: LGTM.co is gone [\#595](https://github.com/shelljs/shelljs/issues/595) +- refactor: objectAssign should refer to Object.assign if it exists, or the internal polyfill otherwise [\#592](https://github.com/shelljs/shelljs/issues/592) +- parseOptions: allow a way to keep errors silent \(exception only\) [\#591](https://github.com/shelljs/shelljs/issues/591) +- \[Question\] commands with multiple options / arguments? [\#589](https://github.com/shelljs/shelljs/issues/589) +- feature: GNU Parallel [\#585](https://github.com/shelljs/shelljs/issues/585) +- write to file [\#568](https://github.com/shelljs/shelljs/issues/568) +- Cannot figure out how to disable globbing for rm [\#567](https://github.com/shelljs/shelljs/issues/567) +- Switch to the ava test framework [\#560](https://github.com/shelljs/shelljs/issues/560) +- feature: echo -n [\#559](https://github.com/shelljs/shelljs/issues/559) +- Option not recognized [\#556](https://github.com/shelljs/shelljs/issues/556) +- chore: add @freitagbr to LGTM maintainers [\#552](https://github.com/shelljs/shelljs/issues/552) +- chore: set up dev branch [\#548](https://github.com/shelljs/shelljs/issues/548) +- bug: cp\(\) doesn't always copy everything [\#547](https://github.com/shelljs/shelljs/issues/547) +- User-friendly lint command [\#544](https://github.com/shelljs/shelljs/issues/544) +- Lint warning [\#542](https://github.com/shelljs/shelljs/issues/542) +- Possible Regression: cp from 0.6.0 to 0.7.x version [\#538](https://github.com/shelljs/shelljs/issues/538) +- chore: add nodejs v7 to CI [\#537](https://github.com/shelljs/shelljs/issues/537) +- error.code is not always available [\#536](https://github.com/shelljs/shelljs/issues/536) +- Add shx as a dependency for testing [\#525](https://github.com/shelljs/shelljs/issues/525) +- Feature request: allow `common.error\(\)` to optionally not insert a prefix and optionally not print to console [\#523](https://github.com/shelljs/shelljs/issues/523) +- Feature request: Add "shelljs.unlink" [\#519](https://github.com/shelljs/shelljs/issues/519) +- Sed should allow a replacement string to contain `\1` for match groups [\#507](https://github.com/shelljs/shelljs/issues/507) +- Don't kill the node process upon unexpected error [\#483](https://github.com/shelljs/shelljs/issues/483) +- Usage with neodoc [\#445](https://github.com/shelljs/shelljs/issues/445) +- \[ Feature idea \] synchronous sleep command [\#441](https://github.com/shelljs/shelljs/issues/441) +- Add a way to prevent shell-expansion on commands \(this issue is not for exec\) [\#345](https://github.com/shelljs/shelljs/issues/345) +- Chown [\#183](https://github.com/shelljs/shelljs/issues/183) +- spawn EMFILE [\#81](https://github.com/shelljs/shelljs/issues/81) +- Rewrite exec using execsync-ng \(which uses node-ffi\) [\#66](https://github.com/shelljs/shelljs/issues/66) +- `exec` gets stuck on my Debian box [\#51](https://github.com/shelljs/shelljs/issues/51) +- 100% cpu usage when a nodejs script goes side ways executing a command. [\#5](https://github.com/shelljs/shelljs/issues/5) + +**Merged pull requests:** + +- Finalize moving to ava [\#630](https://github.com/shelljs/shelljs/pull/630) ([freitagbr](https://github.com/freitagbr)) +- test: refactor pushd tests to AVA [\#627](https://github.com/shelljs/shelljs/pull/627) ([nfischer](https://github.com/nfischer)) +- test: refactor popd tests to AVA [\#626](https://github.com/shelljs/shelljs/pull/626) ([nfischer](https://github.com/nfischer)) +- test: refactor shjs tests to AVA [\#625](https://github.com/shelljs/shelljs/pull/625) ([nfischer](https://github.com/nfischer)) +- test: remove tests for make \(deprecated\) [\#624](https://github.com/shelljs/shelljs/pull/624) ([nfischer](https://github.com/nfischer)) +- Ignore test temp directories during linting [\#623](https://github.com/shelljs/shelljs/pull/623) ([freitagbr](https://github.com/freitagbr)) +- refactor: list all commands in commands.json [\#616](https://github.com/shelljs/shelljs/pull/616) ([nfischer](https://github.com/nfischer)) +- Throw an error if the options string does not start with '-' [\#615](https://github.com/shelljs/shelljs/pull/615) ([freitagbr](https://github.com/freitagbr)) +- chore: switch to files attribute from npmignore [\#613](https://github.com/shelljs/shelljs/pull/613) ([nfischer](https://github.com/nfischer)) +- test: refactor 'test' command tests to AVA [\#612](https://github.com/shelljs/shelljs/pull/612) ([nfischer](https://github.com/nfischer)) +- test: refactor find tests to AVA [\#611](https://github.com/shelljs/shelljs/pull/611) ([nfischer](https://github.com/nfischer)) +- test: refactor ln tests to AVA [\#610](https://github.com/shelljs/shelljs/pull/610) ([nfischer](https://github.com/nfischer)) +- test: refactor ls to use AVA [\#609](https://github.com/shelljs/shelljs/pull/609) ([nfischer](https://github.com/nfischer)) +- test: refactor pipe tests to AVA [\#608](https://github.com/shelljs/shelljs/pull/608) ([nfischer](https://github.com/nfischer)) +- test: refactor sed tests to AVA [\#607](https://github.com/shelljs/shelljs/pull/607) ([nfischer](https://github.com/nfischer)) +- test: refactor grep tests to AVA [\#606](https://github.com/shelljs/shelljs/pull/606) ([nfischer](https://github.com/nfischer)) +- test: refactor global tests to AVA [\#605](https://github.com/shelljs/shelljs/pull/605) ([nfischer](https://github.com/nfischer)) +- test: refactor touch tests to AVA [\#604](https://github.com/shelljs/shelljs/pull/604) ([nfischer](https://github.com/nfischer)) +- test: refactor uniq tests to AVA [\#603](https://github.com/shelljs/shelljs/pull/603) ([nfischer](https://github.com/nfischer)) +- test: refactor sort tests to AVA [\#602](https://github.com/shelljs/shelljs/pull/602) ([nfischer](https://github.com/nfischer)) +- test: refactor tail tests to AVA [\#601](https://github.com/shelljs/shelljs/pull/601) ([nfischer](https://github.com/nfischer)) +- test: refactor head tests to AVA [\#600](https://github.com/shelljs/shelljs/pull/600) ([nfischer](https://github.com/nfischer)) +- test: refactor mkdir tests to AVA [\#599](https://github.com/shelljs/shelljs/pull/599) ([nfischer](https://github.com/nfischer)) +- Fix: rm behavior regarding symlinks [\#598](https://github.com/shelljs/shelljs/pull/598) ([freitagbr](https://github.com/freitagbr)) +- test: refactor mv tests to AVA [\#597](https://github.com/shelljs/shelljs/pull/597) ([nfischer](https://github.com/nfischer)) +- Remove files related to lgtm.co [\#596](https://github.com/shelljs/shelljs/pull/596) ([freitagbr](https://github.com/freitagbr)) +- Add ability to configure error from parseOptions [\#594](https://github.com/shelljs/shelljs/pull/594) ([freitagbr](https://github.com/freitagbr)) +- Use Object.assign if possible [\#593](https://github.com/shelljs/shelljs/pull/593) ([freitagbr](https://github.com/freitagbr)) +- Add "-n" option to echo [\#590](https://github.com/shelljs/shelljs/pull/590) ([freitagbr](https://github.com/freitagbr)) +- test: refactor rm tests to AVA [\#586](https://github.com/shelljs/shelljs/pull/586) ([nfischer](https://github.com/nfischer)) +- test: refactor pwd tests to AVA [\#582](https://github.com/shelljs/shelljs/pull/582) ([nfischer](https://github.com/nfischer)) +- test: refactor tempdir tests to AVA [\#581](https://github.com/shelljs/shelljs/pull/581) ([nfischer](https://github.com/nfischer)) +- test: refactor 'which' tests to AVA [\#580](https://github.com/shelljs/shelljs/pull/580) ([nfischer](https://github.com/nfischer)) +- test: refactor plugin tests to AVA [\#579](https://github.com/shelljs/shelljs/pull/579) ([nfischer](https://github.com/nfischer)) +- test: refactor toEnd tests to AVA [\#578](https://github.com/shelljs/shelljs/pull/578) ([nfischer](https://github.com/nfischer)) +- test: refactor to tests to AVA [\#577](https://github.com/shelljs/shelljs/pull/577) ([nfischer](https://github.com/nfischer)) +- test: refactor 'set' tests to AVA [\#576](https://github.com/shelljs/shelljs/pull/576) ([nfischer](https://github.com/nfischer)) +- test: refactor echo tests to AVA [\#575](https://github.com/shelljs/shelljs/pull/575) ([nfischer](https://github.com/nfischer)) +- test: refactor exec tests to AVA [\#574](https://github.com/shelljs/shelljs/pull/574) ([nfischer](https://github.com/nfischer)) +- test: refactor env tests to AVA [\#573](https://github.com/shelljs/shelljs/pull/573) ([nfischer](https://github.com/nfischer)) +- test: refactor dirs tests to AVA [\#572](https://github.com/shelljs/shelljs/pull/572) ([nfischer](https://github.com/nfischer)) +- test: refactor config tests to AVA [\#571](https://github.com/shelljs/shelljs/pull/571) ([nfischer](https://github.com/nfischer)) +- test: refactor common tests to AVA [\#570](https://github.com/shelljs/shelljs/pull/570) ([nfischer](https://github.com/nfischer)) +- test: refactor chmod tests to AVA [\#569](https://github.com/shelljs/shelljs/pull/569) ([nfischer](https://github.com/nfischer)) +- test: refactor cp tests to ava [\#565](https://github.com/shelljs/shelljs/pull/565) ([nfischer](https://github.com/nfischer)) +- test: refactor cat tests to ava [\#564](https://github.com/shelljs/shelljs/pull/564) ([nfischer](https://github.com/nfischer)) +- test: set up ava and move cd.js [\#561](https://github.com/shelljs/shelljs/pull/561) ([nfischer](https://github.com/nfischer)) +- Update sed documentation regarding capture groups [\#558](https://github.com/shelljs/shelljs/pull/558) ([freitagbr](https://github.com/freitagbr)) +- Add newline to output of echo [\#557](https://github.com/shelljs/shelljs/pull/557) ([freitagbr](https://github.com/freitagbr)) +- fix: handle code-less errors more carefully in exec [\#554](https://github.com/shelljs/shelljs/pull/554) ([nfischer](https://github.com/nfischer)) +- Add Brandon Freitag to maintainers/contributors [\#553](https://github.com/shelljs/shelljs/pull/553) ([freitagbr](https://github.com/freitagbr)) +- Get pipe tests running on Windows. [\#550](https://github.com/shelljs/shelljs/pull/550) ([binki](https://github.com/binki)) +- fix: maxdepth doesn't limit total number of copies [\#549](https://github.com/shelljs/shelljs/pull/549) ([nfischer](https://github.com/nfischer)) +- Safely exit by throwing an error [\#546](https://github.com/shelljs/shelljs/pull/546) ([freitagbr](https://github.com/freitagbr)) +- Fix lint warning [\#543](https://github.com/shelljs/shelljs/pull/543) ([freitagbr](https://github.com/freitagbr)) +- chore: remove v0.10 from Travis CI [\#540](https://github.com/shelljs/shelljs/pull/540) ([nfischer](https://github.com/nfischer)) +- chore: add Node v7 for CI [\#539](https://github.com/shelljs/shelljs/pull/539) ([nfischer](https://github.com/nfischer)) + +## [v0.7.5](https://github.com/shelljs/shelljs/tree/v0.7.5) (2016-10-27) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.4...v0.7.5) **Closed issues:** From a3e622ba0dbf03dc6ac3886ecda20a4c8ede7e5d Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 27 Dec 2016 19:39:13 -0800 Subject: [PATCH 090/338] chore: set up test coverage (#638) Use nyc for test coverage and ignore all nyc-related files in git & eslint. This increases testing time (~35sec -> ~60sec on my 4-core machine). --- .eslintignore | 8 ++++---- .gitignore | 2 ++ package.json | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.eslintignore b/.eslintignore index e9c04ea5a..65dfd0f09 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,6 @@ -ava-test/resources/ -ava-test/tmp/ +.nyc_output/ +coverage/ +make.js +node_modules/ test/resources/ test/tmp/ -node_modules/ -make.js diff --git a/.gitignore b/.gitignore index 77f3ac742..28d0f3bf5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ npm-debug.log* node_modules tmp +coverage/ +.nyc_output/ # Linux *~ diff --git a/package.json b/package.json index 3ff1aa140..2229b19de 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ ], "scripts": { "posttest": "npm run lint", - "test": "ava --serial test/*.js", + "test": "nyc --reporter=text --reporter=lcov ava --serial test/*.js", "gendocs": "node scripts/generate-docs", "lint": "eslint .", "after-travis": "travis-check-changes", @@ -57,6 +57,7 @@ "eslint": "^2.0.0", "eslint-config-airbnb-base": "^3.0.0", "eslint-plugin-import": "^1.11.1", + "nyc": "^10.0.0", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.2.0", "shx": "^0.2.0", From 2da9ab55be124dfa5dd745d27ea313dbb56965c6 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 7 Jan 2017 18:06:15 -0800 Subject: [PATCH 091/338] fix: allow non-normalized paths as input to mkdir (#635) Adds tests to make sure that non-normalized paths (i.e. path/to/./dir) are valid for a few commands, including mkdir() which previously failed when given the -p flag. Fixes #634 --- src/mkdir.js | 2 +- test/cp.js | 8 +++++++- test/ls.js | 10 ++++++++++ test/mkdir.js | 7 +++++++ test/rm.js | 9 +++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/mkdir.js b/src/mkdir.js index f211bc89b..0b8c6fe53 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -75,7 +75,7 @@ function _mkdir(options, dirs) { try { if (options.fullpath) { - mkdirSyncRecursive(dir); + mkdirSyncRecursive(path.resolve(dir)); } else { fs.mkdirSync(dir, parseInt('0777', 8)); } diff --git a/test/cp.js b/test/cp.js index a7faec988..dcd9b0800 100644 --- a/test/cp.js +++ b/test/cp.js @@ -259,7 +259,6 @@ test( ); test('recursive, everything exists, no force flag', t => { - shell.cp('-R', 'resources/cp', t.context.tmp); const result = shell.cp('-R', 'resources/cp', t.context.tmp); t.falsy(shell.error()); // crash test only t.falsy(result.stderr); @@ -647,3 +646,10 @@ test('Test with recursive option and symlinks.', t => { t.falsy(shell.test('-L', 'sym.lnk')); }); }); + +test('recursive, with a non-normalized path', t => { + const result = shell.cp('-R', 'resources/../resources/./cp', t.context.tmp); + t.falsy(shell.error()); // crash test only + t.falsy(result.stderr); + t.is(result.code, 0); +}); diff --git a/test/ls.js b/test/ls.js index cc5cca2ff..56372a5e7 100644 --- a/test/ls.js +++ b/test/ls.js @@ -466,3 +466,13 @@ test('Check stderr field', t => { t.truthy(shell.error()); t.is('ls: no such file or directory: /asdfasdf', result.stderr); }); + +test('non-normalized paths are still ok with -R', t => { + const result = shell.ls('-R', 'resources/./ls/../ls'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir') > -1); + t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.is(result.length, 9); +}); diff --git a/test/mkdir.js b/test/mkdir.js index 343828fb4..7f0299927 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -147,3 +147,10 @@ test('globbed dir', t => { t.truthy(fs.existsSync(`${t.context.tmp}/mydir`)); t.falsy(fs.existsSync(`${t.context.tmp}/m*ir`)); // doesn't create literal name }); + +test('non-normalized paths are still ok with -p', t => { + const result = shell.mkdir('-p', `${t.context.tmp}/asdf/../asdf/./`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/asdf`)); +}); diff --git a/test/rm.js b/test/rm.js index a3f6b109c..f6ead97da 100644 --- a/test/rm.js +++ b/test/rm.js @@ -282,3 +282,12 @@ test('remove broken symbolic link', t => { t.falsy(fs.existsSync(`${t.context.tmp}/rm/fake.lnk`)); } }); + +test('recursive dir removal, for non-normalized path', t => { + shell.mkdir('-p', `${t.context.tmp}/a/b/c`); + t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); + const result = shell.rm('-rf', `${t.context.tmp}/a/.././a`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(fs.existsSync(`${t.context.tmp}/a`)); +}); From ac0ff873f1cab24293d8af9d0f1fa26b26ef2c63 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 7 Jan 2017 22:40:38 -0800 Subject: [PATCH 092/338] refactor: add config.reset() and .resetForTesting() (#641) Add .reset() and .resetForTesting() to shell.config and use .resetForTesting() as a standard set-up for unit tests. --- README.md | 26 ++++++++++++++++++++++++ package.json | 1 + shell.js | 27 +++++++++++++++++++++++++ src/common.js | 54 ++++++++++++++++++++++++++++++-------------------- test/cd.js | 2 +- test/cp.js | 2 +- test/dirs.js | 2 +- test/find.js | 2 +- test/global.js | 2 +- test/grep.js | 2 +- test/ln.js | 2 +- test/ls.js | 2 +- test/mkdir.js | 2 +- test/mv.js | 2 +- test/plugin.js | 2 +- test/popd.js | 2 +- test/pushd.js | 2 +- test/pwd.js | 2 +- test/rm.js | 2 +- test/sed.js | 2 +- test/set.js | 2 +- test/to.js | 2 +- test/toEnd.js | 2 +- test/touch.js | 2 +- 24 files changed, 106 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index eeb5c7711..cf5a0dd77 100644 --- a/README.md +++ b/README.md @@ -784,6 +784,32 @@ config.globOptions = {nodir: true}; Use this value for calls to `glob.sync()` instead of the default options. +### config.reset() + +Example: + +```javascript +var shell = require('shelljs'); +// Make changes to shell.config, and do stuff... +/* ... */ +shell.config.reset(); // reset to original state +// Do more stuff, but with original settings +/* ... */ +``` + +Reset shell.config to the defaults: + +```javascript +{ + fatal: false, + globOptions: {}, + maxdepth: 255, + noglob: false, + silent: false, + verbose: false, +} +``` + ## Team | [![Nate Fischer](https://avatars.githubusercontent.com/u/5801521?s=130)](https://github.com/nfischer) | [![Ari Porad](https://avatars1.githubusercontent.com/u/1817508?v=3&s=130)](http://github.com/ariporad) | diff --git a/package.json b/package.json index 2229b19de..0845f77ba 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "scripts": { "posttest": "npm run lint", "test": "nyc --reporter=text --reporter=lcov ava --serial test/*.js", + "test-no-coverage": "ava --serial test/*.js", "gendocs": "node scripts/generate-docs", "lint": "eslint .", "after-travis": "travis-check-changes", diff --git a/shell.js b/shell.js index abf911d48..44bfbdc78 100644 --- a/shell.js +++ b/shell.js @@ -123,3 +123,30 @@ exports.config = common.config; //@ ``` //@ //@ Use this value for calls to `glob.sync()` instead of the default options. + +//@ +//@ ### config.reset() +//@ +//@ Example: +//@ +//@ ```javascript +//@ var shell = require('shelljs'); +//@ // Make changes to shell.config, and do stuff... +//@ /* ... */ +//@ shell.config.reset(); // reset to original state +//@ // Do more stuff, but with original settings +//@ /* ... */ +//@ ``` +//@ +//@ Reset shell.config to the defaults: +//@ +//@ ```javascript +//@ { +//@ fatal: false, +//@ globOptions: {}, +//@ maxdepth: 255, +//@ noglob: false, +//@ silent: false, +//@ verbose: false, +//@ } +//@ ``` diff --git a/src/common.js b/src/common.js index 12f5298d4..f5bce981d 100644 --- a/src/common.js +++ b/src/common.js @@ -9,15 +9,42 @@ var shell = require('..'); var shellMethods = Object.create(shell); +// objectAssign(target_obj, source_obj1 [, source_obj2 ...]) +// "Ponyfill" for Object.assign +// objectAssign({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} +var objectAssign = typeof Object.assign === 'function' ? + Object.assign : + function objectAssign(target) { + var sources = [].slice.call(arguments, 1); + sources.forEach(function (source) { + Object.keys(source).forEach(function (key) { + target[key] = source[key]; + }); + }); + + return target; + }; +exports.extend = objectAssign; + // Module globals -var config = { - silent: false, +var DEFAULT_CONFIG = { fatal: false, - verbose: false, - noglob: false, globOptions: {}, - maxdepth: 255 + maxdepth: 255, + noglob: false, + silent: false, + verbose: false, +}; +var config = { + reset: function () { + objectAssign(this, DEFAULT_CONFIG); + }, + resetForTesting: function () { + objectAssign(this, DEFAULT_CONFIG); + this.silent = true; + }, }; +config.reset(); exports.config = config; var state = { @@ -250,23 +277,6 @@ function randomFileName() { } exports.randomFileName = randomFileName; -// objectAssign(target_obj, source_obj1 [, source_obj2 ...]) -// "Ponyfill" for Object.assign -// objectAssign({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} -var objectAssign = typeof Object.assign === 'function' ? - Object.assign : - function objectAssign(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function (source) { - Object.keys(source).forEach(function (key) { - target[key] = source[key]; - }); - }); - - return target; - }; -exports.extend = objectAssign; - // Common wrapper for all Unix-like commands that performs glob expansion, // command-logging, and other nice things function wrap(cmd, fn, options) { diff --git a/test/cd.js b/test/cd.js index 760c9b4a9..ca9e88910 100644 --- a/test/cd.js +++ b/test/cd.js @@ -11,7 +11,7 @@ const cur = shell.pwd().toString(); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); process.chdir(cur); shell.mkdir(t.context.tmp); }); diff --git a/test/cp.js b/test/cp.js index dcd9b0800..4cb16e500 100644 --- a/test/cp.js +++ b/test/cp.js @@ -11,7 +11,7 @@ const CWD = process.cwd(); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.mkdir(t.context.tmp); }); diff --git a/test/dirs.js b/test/dirs.js index 9a2bf13d4..085a1294f 100644 --- a/test/dirs.js +++ b/test/dirs.js @@ -5,7 +5,7 @@ import test from 'ava'; import shell from '..'; test.beforeEach(() => { - shell.config.silent = true; + shell.config.resetForTesting(); shell.pushd('resources/pushd'); shell.pushd('a'); }); diff --git a/test/find.js b/test/find.js index af6be88f7..5e65bd9ec 100644 --- a/test/find.js +++ b/test/find.js @@ -5,7 +5,7 @@ import shell from '..'; const CWD = process.cwd(); test.beforeEach(() => { - shell.config.silent = true; + shell.config.resetForTesting(); process.chdir(CWD); }); diff --git a/test/global.js b/test/global.js index 37123c17c..3f339e2b6 100644 --- a/test/global.js +++ b/test/global.js @@ -8,7 +8,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - config.silent = true; + config.resetForTesting(); mkdir(t.context.tmp); }); diff --git a/test/grep.js b/test/grep.js index 784c8f2ed..3d9dc2335 100644 --- a/test/grep.js +++ b/test/grep.js @@ -7,7 +7,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.cp('-r', 'resources', t.context.tmp); }); diff --git a/test/ln.js b/test/ln.js index ec0641897..836be4e48 100644 --- a/test/ln.js +++ b/test/ln.js @@ -10,7 +10,7 @@ const CWD = process.cwd(); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.cp('-r', 'resources', t.context.tmp); process.chdir(CWD); }); diff --git a/test/ls.js b/test/ls.js index 56372a5e7..a50f27006 100644 --- a/test/ls.js +++ b/test/ls.js @@ -9,7 +9,7 @@ const CWD = process.cwd(); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.mkdir(t.context.tmp); }); diff --git a/test/mkdir.js b/test/mkdir.js index 7f0299927..9c0c57e0d 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -7,7 +7,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.mkdir(t.context.tmp); }); diff --git a/test/mv.js b/test/mv.js index dc2788529..dcf1e22f2 100644 --- a/test/mv.js +++ b/test/mv.js @@ -10,7 +10,7 @@ const numLines = utils.numLines; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.cp('-r', 'resources', t.context.tmp); shell.cd(t.context.tmp); }); diff --git a/test/plugin.js b/test/plugin.js index 05704773d..7b7594bfd 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -36,7 +36,7 @@ function fooImplementation(options, arg) { } test.beforeEach(() => { - shell.config.silent = true; + shell.config.resetForTesting(); }); diff --git a/test/popd.js b/test/popd.js index 2ebfdfce1..0ac1447c8 100644 --- a/test/popd.js +++ b/test/popd.js @@ -12,7 +12,7 @@ function reset() { } test.beforeEach(() => { - shell.config.silent = true; + shell.config.resetForTesting(); reset(); }); diff --git a/test/pushd.js b/test/pushd.js index 727a1ae59..96bfe47ee 100644 --- a/test/pushd.js +++ b/test/pushd.js @@ -12,7 +12,7 @@ function reset() { } test.beforeEach(() => { - shell.config.silent = true; + shell.config.resetForTesting(); reset(); }); diff --git a/test/pwd.js b/test/pwd.js index 84ad68bd2..ce55b76ce 100644 --- a/test/pwd.js +++ b/test/pwd.js @@ -9,7 +9,7 @@ const cur = process.cwd(); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.mkdir(t.context.tmp); }); diff --git a/test/rm.js b/test/rm.js index f6ead97da..cdb3e925f 100644 --- a/test/rm.js +++ b/test/rm.js @@ -8,7 +8,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.cp('-r', 'resources', t.context.tmp); }); diff --git a/test/sed.js b/test/sed.js index 14f0f582c..c8342c13d 100644 --- a/test/sed.js +++ b/test/sed.js @@ -7,7 +7,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.cp('-r', 'resources', t.context.tmp); }); diff --git a/test/set.js b/test/set.js index 5ff50649b..e17d5a8f0 100644 --- a/test/set.js +++ b/test/set.js @@ -8,7 +8,7 @@ const uncaughtErrorExitCode = 1; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.cp('-r', 'resources', t.context.tmp); }); diff --git a/test/to.js b/test/to.js index e9584f47f..db3ce2450 100644 --- a/test/to.js +++ b/test/to.js @@ -7,7 +7,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.mkdir(t.context.tmp); }); diff --git a/test/toEnd.js b/test/toEnd.js index 99a4fb6aa..323e4a857 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -7,7 +7,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.mkdir(t.context.tmp); }); diff --git a/test/touch.js b/test/touch.js index 613ab1232..ad5dbfd72 100644 --- a/test/touch.js +++ b/test/touch.js @@ -8,7 +8,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - shell.config.silent = true; + shell.config.resetForTesting(); shell.mkdir(t.context.tmp); }); From 4c48631d745ef4cb3e9d198b37e5772fb57ce905 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 8 Jan 2017 13:52:39 -0800 Subject: [PATCH 093/338] refactor: create common.execPath (#636) Switch to using common.execPath instead of process.execPath directly and warn electron users if we were unable to find the correct path to NodeJS. --- src/common.js | 13 +++++++++++-- src/exec.js | 6 +++++- test/common.js | 10 ++++++++++ test/exec.js | 36 ++++++++++++++++++++++++------------ test/set.js | 11 ++++++----- test/shjs.js | 3 ++- test/utils/utils.js | 6 ++++-- 7 files changed, 62 insertions(+), 23 deletions(-) diff --git a/src/common.js b/src/common.js index f5bce981d..66b541a1e 100644 --- a/src/common.js +++ b/src/common.js @@ -26,7 +26,10 @@ var objectAssign = typeof Object.assign === 'function' ? }; exports.extend = objectAssign; -// Module globals +// Check if we're running under electron +var isElectron = Boolean(process.versions.electron); + +// Module globals (assume no execPath by default) var DEFAULT_CONFIG = { fatal: false, globOptions: {}, @@ -34,16 +37,22 @@ var DEFAULT_CONFIG = { noglob: false, silent: false, verbose: false, + execPath: null, }; + var config = { reset: function () { objectAssign(this, DEFAULT_CONFIG); + if (!isElectron) { + this.execPath = process.execPath; + } }, resetForTesting: function () { - objectAssign(this, DEFAULT_CONFIG); + this.reset(); this.silent = true; }, }; + config.reset(); exports.config = config; diff --git a/src/exec.js b/src/exec.js index 37ee59374..9c9128fea 100644 --- a/src/exec.js +++ b/src/exec.js @@ -19,6 +19,10 @@ common.register('exec', _exec, { // Node is single-threaded; callbacks and other internal state changes are done in the // event loop). function execSync(cmd, opts, pipe) { + if (!common.config.execPath) { + common.error('Unable to find a path to the node binary. Please manually set config.execPath'); + } + var tempDir = _tempDir(); var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); @@ -66,7 +70,7 @@ function execSync(cmd, opts, pipe) { if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); - var execCommand = JSON.stringify(process.execPath) + ' ' + JSON.stringify(scriptFile); + var execCommand = JSON.stringify(common.config.execPath) + ' ' + JSON.stringify(scriptFile); var script; opts.cwd = path.resolve(opts.cwd); diff --git a/test/common.js b/test/common.js index 91de6ad26..2bb4a7600 100644 --- a/test/common.js +++ b/test/common.js @@ -135,3 +135,13 @@ test.cb('Commands that fail will still output error messages to stderr', t => { }); }); +test('execPath value makes sense', t => { + // TODO(nate): change this test if we add electron support in the unit tests + t.is(common.config.execPath, process.execPath); + t.is(typeof common.config.execPath, 'string'); +}); + +test('Changing common.config.execPath does not modify process', t => { + common.config.execPath = 'foo'; + t.not(common.config.execPath, process.execPath); +}); diff --git a/test/exec.js b/test/exec.js index 8222bede5..bf41d7a08 100644 --- a/test/exec.js +++ b/test/exec.js @@ -5,12 +5,15 @@ import util from 'util'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; const CWD = process.cwd(); +const ORIG_EXEC_PATH = common.config.execPath; shell.config.silent = true; test.afterEach.always(() => { process.chdir(CWD); + common.config.execPath = ORIG_EXEC_PATH; }); // @@ -36,6 +39,15 @@ test('config.fatal and unknown command', t => { shell.config.fatal = oldFatal; }); +test('exec exits gracefully if we cannot find the execPath', t => { + common.config.execPath = null; + shell.exec('echo foo'); + t.regex( + shell.error(), + /Unable to find a path to the node binary\. Please manually set config\.execPath/ + ); +}); + // // Valids // @@ -45,14 +57,14 @@ test('config.fatal and unknown command', t => { // test('check if stdout goes to output', t => { - const result = shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(1234);"`); + const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(1234);"`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, '1234\n'); }); test('check if stderr goes to output', t => { - const result = shell.exec(`${JSON.stringify(process.execPath)} -e "console.error(1234);"`); + const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.error(1234);"`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, ''); @@ -60,7 +72,7 @@ test('check if stderr goes to output', t => { }); test('check if stdout + stderr go to output', t => { - const result = shell.exec(`${JSON.stringify(process.execPath)} -e "console.error(1234); console.log(666);"`); + const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.error(1234); console.log(666);"`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, '666\n'); @@ -68,21 +80,21 @@ test('check if stdout + stderr go to output', t => { }); test('check exit code', t => { - const result = shell.exec(`${JSON.stringify(process.execPath)} -e "process.exit(12);"`); + const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "process.exit(12);"`); t.truthy(shell.error()); t.is(result.code, 12); }); test('interaction with cd', t => { shell.cd('resources/external'); - const result = shell.exec(`${JSON.stringify(process.execPath)} node_script.js`); + const result = shell.exec(`${JSON.stringify(common.config.execPath)} node_script.js`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, 'node_script_1234\n'); }); test('check quotes escaping', t => { - const result = shell.exec(util.format(JSON.stringify(process.execPath) + ' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"")); + const result = shell.exec(util.format(JSON.stringify(common.config.execPath) + ' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"")); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, "'+'_'+'\n"); @@ -108,12 +120,12 @@ test('set maxBuffer (very small)', t => { }); test('set timeout option', t => { - const result = shell.exec(`${JSON.stringify(process.execPath)} resources/exec/slow.js 100`); // default timeout is ok + const result = shell.exec(`${JSON.stringify(common.config.execPath)} resources/exec/slow.js 100`); // default timeout is ok t.falsy(shell.error()); t.is(result.code, 0); if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - shell.exec(`${JSON.stringify(process.execPath)} resources/exec/slow.js 100`, { timeout: 10 }); // times out + shell.exec(`${JSON.stringify(common.config.execPath)} resources/exec/slow.js 100`, { timeout: 10 }); // times out t.truthy(shell.error()); } @@ -159,14 +171,14 @@ test('exec returns a ShellString', t => { // test.cb('no callback', t => { - const c = shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(1234)"`, { async: true }); + const c = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(1234)"`, { async: true }); t.falsy(shell.error()); t.truthy('stdout' in c, 'async exec returns child process object'); t.end(); }); test.cb('callback as 2nd argument', t => { - shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(5678);"`, (code, stdout, stderr) => { + shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(5678);"`, (code, stdout, stderr) => { t.is(code, 0); t.is(stdout, '5678\n'); t.is(stderr, ''); @@ -175,7 +187,7 @@ test.cb('callback as 2nd argument', t => { }); test.cb('callback as end argument', t => { - shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(5566);"`, { async: true }, (code, stdout, stderr) => { + shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(5566);"`, { async: true }, (code, stdout, stderr) => { t.is(code, 0); t.is(stdout, '5566\n'); t.is(stderr, ''); @@ -184,7 +196,7 @@ test.cb('callback as end argument', t => { }); test.cb('callback as 3rd argument (silent:true)', t => { - shell.exec(`${JSON.stringify(process.execPath)} -e "console.log(5678);"`, { silent: true }, (code, stdout, stderr) => { + shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(5678);"`, { silent: true }, (code, stdout, stderr) => { t.is(code, 0); t.is(stdout, '5678\n'); t.is(stderr, ''); diff --git a/test/set.js b/test/set.js index e17d5a8f0..446d52ed8 100644 --- a/test/set.js +++ b/test/set.js @@ -1,6 +1,7 @@ import test from 'ava'; import shell from '..'; +import common from '../src/common'; import utils from './utils/utils'; const oldConfigSilent = shell.config.silent; @@ -28,21 +29,21 @@ test('initial values', t => { }); test('default behavior', t => { - const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); }); test('set -e', t => { - const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); }); test('set -v', t => { - const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is( @@ -52,7 +53,7 @@ test('set -v', t => { }); test('set -ev', t => { - const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); @@ -61,7 +62,7 @@ test('set -ev', t => { }); test('set -e, set +e', t => { - const result = shell.exec(JSON.stringify(process.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); diff --git a/test/shjs.js b/test/shjs.js index 6189a91f1..9a4221a5d 100644 --- a/test/shjs.js +++ b/test/shjs.js @@ -3,12 +3,13 @@ import path from 'path'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; function runWithShjs(name) { // prefix with 'node ' for Windows, don't prefix for unix const binPath = path.resolve(__dirname, '../bin/shjs'); const execPath = process.platform === 'win32' - ? `${JSON.stringify(process.execPath)} ` + ? `${JSON.stringify(common.config.execPath)} ` : ''; const script = path.resolve(__dirname, 'resources', 'shjs', name); return shell.exec(`${execPath}${binPath} ${script}`, { silent: true }); diff --git a/test/utils/utils.js b/test/utils/utils.js index 1f9bf94ab..814f82b87 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -1,5 +1,7 @@ const child = require('child_process'); +const common = require('../../src/common'); + function numLines(str) { return typeof str === 'string' ? (str.match(/\n/g) || []).length + 1 : 0; } @@ -26,11 +28,11 @@ function skipOnWinForEPERM(action, testCase) { exports.skipOnWinForEPERM = skipOnWinForEPERM; function runScript(script, cb) { - child.execFile(process.execPath, ['-e', script], cb); + child.execFile(common.config.execPath, ['-e', script], cb); } exports.runScript = runScript; function sleep(time) { - child.execFileSync(process.execPath, ['resources/exec/slow.js', time.toString()]); + child.execFileSync(common.config.execPath, ['resources/exec/slow.js', time.toString()]); } exports.sleep = sleep; From 2e29ba29e6ee100196d088ae92c19d7ccfbc4e56 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Sun, 8 Jan 2017 14:28:27 -0800 Subject: [PATCH 094/338] 0.7.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0845f77ba..af41a52bd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.5", + "version": "0.7.6", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 65901129b3ae0aada456c79e7b35effee74af5bf Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Sun, 8 Jan 2017 14:35:42 -0800 Subject: [PATCH 095/338] docs(changelog): updated by Brandon Freitag [ci skip] --- CHANGELOG.md | 701 +-------------------------------------------------- 1 file changed, 1 insertion(+), 700 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 445ce626f..b8d7ab214 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,700 +1 @@ -# Change Log - -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) - -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.5...HEAD) - -**Closed issues:** - -- QUESTION: Feedback while an operation is running? [\#629](https://github.com/shelljs/shelljs/issues/629) -- Test setup/cleanup is broken [\#621](https://github.com/shelljs/shelljs/issues/621) -- Ignore temp directories when running lint [\#620](https://github.com/shelljs/shelljs/issues/620) -- parseOptions should throw an error if the option string doesn't start with '-' [\#614](https://github.com/shelljs/shelljs/issues/614) -- chore: LGTM.co is gone [\#595](https://github.com/shelljs/shelljs/issues/595) -- refactor: objectAssign should refer to Object.assign if it exists, or the internal polyfill otherwise [\#592](https://github.com/shelljs/shelljs/issues/592) -- parseOptions: allow a way to keep errors silent \(exception only\) [\#591](https://github.com/shelljs/shelljs/issues/591) -- \[Question\] commands with multiple options / arguments? [\#589](https://github.com/shelljs/shelljs/issues/589) -- feature: GNU Parallel [\#585](https://github.com/shelljs/shelljs/issues/585) -- write to file [\#568](https://github.com/shelljs/shelljs/issues/568) -- Cannot figure out how to disable globbing for rm [\#567](https://github.com/shelljs/shelljs/issues/567) -- Switch to the ava test framework [\#560](https://github.com/shelljs/shelljs/issues/560) -- feature: echo -n [\#559](https://github.com/shelljs/shelljs/issues/559) -- Option not recognized [\#556](https://github.com/shelljs/shelljs/issues/556) -- chore: add @freitagbr to LGTM maintainers [\#552](https://github.com/shelljs/shelljs/issues/552) -- chore: set up dev branch [\#548](https://github.com/shelljs/shelljs/issues/548) -- bug: cp\(\) doesn't always copy everything [\#547](https://github.com/shelljs/shelljs/issues/547) -- User-friendly lint command [\#544](https://github.com/shelljs/shelljs/issues/544) -- Lint warning [\#542](https://github.com/shelljs/shelljs/issues/542) -- Possible Regression: cp from 0.6.0 to 0.7.x version [\#538](https://github.com/shelljs/shelljs/issues/538) -- chore: add nodejs v7 to CI [\#537](https://github.com/shelljs/shelljs/issues/537) -- error.code is not always available [\#536](https://github.com/shelljs/shelljs/issues/536) -- Add shx as a dependency for testing [\#525](https://github.com/shelljs/shelljs/issues/525) -- Feature request: allow `common.error\(\)` to optionally not insert a prefix and optionally not print to console [\#523](https://github.com/shelljs/shelljs/issues/523) -- Feature request: Add "shelljs.unlink" [\#519](https://github.com/shelljs/shelljs/issues/519) -- Sed should allow a replacement string to contain `\1` for match groups [\#507](https://github.com/shelljs/shelljs/issues/507) -- Don't kill the node process upon unexpected error [\#483](https://github.com/shelljs/shelljs/issues/483) -- Usage with neodoc [\#445](https://github.com/shelljs/shelljs/issues/445) -- \[ Feature idea \] synchronous sleep command [\#441](https://github.com/shelljs/shelljs/issues/441) -- Add a way to prevent shell-expansion on commands \(this issue is not for exec\) [\#345](https://github.com/shelljs/shelljs/issues/345) -- Chown [\#183](https://github.com/shelljs/shelljs/issues/183) -- spawn EMFILE [\#81](https://github.com/shelljs/shelljs/issues/81) -- Rewrite exec using execsync-ng \(which uses node-ffi\) [\#66](https://github.com/shelljs/shelljs/issues/66) -- `exec` gets stuck on my Debian box [\#51](https://github.com/shelljs/shelljs/issues/51) -- 100% cpu usage when a nodejs script goes side ways executing a command. [\#5](https://github.com/shelljs/shelljs/issues/5) - -**Merged pull requests:** - -- Finalize moving to ava [\#630](https://github.com/shelljs/shelljs/pull/630) ([freitagbr](https://github.com/freitagbr)) -- test: refactor pushd tests to AVA [\#627](https://github.com/shelljs/shelljs/pull/627) ([nfischer](https://github.com/nfischer)) -- test: refactor popd tests to AVA [\#626](https://github.com/shelljs/shelljs/pull/626) ([nfischer](https://github.com/nfischer)) -- test: refactor shjs tests to AVA [\#625](https://github.com/shelljs/shelljs/pull/625) ([nfischer](https://github.com/nfischer)) -- test: remove tests for make \(deprecated\) [\#624](https://github.com/shelljs/shelljs/pull/624) ([nfischer](https://github.com/nfischer)) -- Ignore test temp directories during linting [\#623](https://github.com/shelljs/shelljs/pull/623) ([freitagbr](https://github.com/freitagbr)) -- refactor: list all commands in commands.json [\#616](https://github.com/shelljs/shelljs/pull/616) ([nfischer](https://github.com/nfischer)) -- Throw an error if the options string does not start with '-' [\#615](https://github.com/shelljs/shelljs/pull/615) ([freitagbr](https://github.com/freitagbr)) -- chore: switch to files attribute from npmignore [\#613](https://github.com/shelljs/shelljs/pull/613) ([nfischer](https://github.com/nfischer)) -- test: refactor 'test' command tests to AVA [\#612](https://github.com/shelljs/shelljs/pull/612) ([nfischer](https://github.com/nfischer)) -- test: refactor find tests to AVA [\#611](https://github.com/shelljs/shelljs/pull/611) ([nfischer](https://github.com/nfischer)) -- test: refactor ln tests to AVA [\#610](https://github.com/shelljs/shelljs/pull/610) ([nfischer](https://github.com/nfischer)) -- test: refactor ls to use AVA [\#609](https://github.com/shelljs/shelljs/pull/609) ([nfischer](https://github.com/nfischer)) -- test: refactor pipe tests to AVA [\#608](https://github.com/shelljs/shelljs/pull/608) ([nfischer](https://github.com/nfischer)) -- test: refactor sed tests to AVA [\#607](https://github.com/shelljs/shelljs/pull/607) ([nfischer](https://github.com/nfischer)) -- test: refactor grep tests to AVA [\#606](https://github.com/shelljs/shelljs/pull/606) ([nfischer](https://github.com/nfischer)) -- test: refactor global tests to AVA [\#605](https://github.com/shelljs/shelljs/pull/605) ([nfischer](https://github.com/nfischer)) -- test: refactor touch tests to AVA [\#604](https://github.com/shelljs/shelljs/pull/604) ([nfischer](https://github.com/nfischer)) -- test: refactor uniq tests to AVA [\#603](https://github.com/shelljs/shelljs/pull/603) ([nfischer](https://github.com/nfischer)) -- test: refactor sort tests to AVA [\#602](https://github.com/shelljs/shelljs/pull/602) ([nfischer](https://github.com/nfischer)) -- test: refactor tail tests to AVA [\#601](https://github.com/shelljs/shelljs/pull/601) ([nfischer](https://github.com/nfischer)) -- test: refactor head tests to AVA [\#600](https://github.com/shelljs/shelljs/pull/600) ([nfischer](https://github.com/nfischer)) -- test: refactor mkdir tests to AVA [\#599](https://github.com/shelljs/shelljs/pull/599) ([nfischer](https://github.com/nfischer)) -- Fix: rm behavior regarding symlinks [\#598](https://github.com/shelljs/shelljs/pull/598) ([freitagbr](https://github.com/freitagbr)) -- test: refactor mv tests to AVA [\#597](https://github.com/shelljs/shelljs/pull/597) ([nfischer](https://github.com/nfischer)) -- Remove files related to lgtm.co [\#596](https://github.com/shelljs/shelljs/pull/596) ([freitagbr](https://github.com/freitagbr)) -- Add ability to configure error from parseOptions [\#594](https://github.com/shelljs/shelljs/pull/594) ([freitagbr](https://github.com/freitagbr)) -- Use Object.assign if possible [\#593](https://github.com/shelljs/shelljs/pull/593) ([freitagbr](https://github.com/freitagbr)) -- Add "-n" option to echo [\#590](https://github.com/shelljs/shelljs/pull/590) ([freitagbr](https://github.com/freitagbr)) -- test: refactor rm tests to AVA [\#586](https://github.com/shelljs/shelljs/pull/586) ([nfischer](https://github.com/nfischer)) -- test: refactor pwd tests to AVA [\#582](https://github.com/shelljs/shelljs/pull/582) ([nfischer](https://github.com/nfischer)) -- test: refactor tempdir tests to AVA [\#581](https://github.com/shelljs/shelljs/pull/581) ([nfischer](https://github.com/nfischer)) -- test: refactor 'which' tests to AVA [\#580](https://github.com/shelljs/shelljs/pull/580) ([nfischer](https://github.com/nfischer)) -- test: refactor plugin tests to AVA [\#579](https://github.com/shelljs/shelljs/pull/579) ([nfischer](https://github.com/nfischer)) -- test: refactor toEnd tests to AVA [\#578](https://github.com/shelljs/shelljs/pull/578) ([nfischer](https://github.com/nfischer)) -- test: refactor to tests to AVA [\#577](https://github.com/shelljs/shelljs/pull/577) ([nfischer](https://github.com/nfischer)) -- test: refactor 'set' tests to AVA [\#576](https://github.com/shelljs/shelljs/pull/576) ([nfischer](https://github.com/nfischer)) -- test: refactor echo tests to AVA [\#575](https://github.com/shelljs/shelljs/pull/575) ([nfischer](https://github.com/nfischer)) -- test: refactor exec tests to AVA [\#574](https://github.com/shelljs/shelljs/pull/574) ([nfischer](https://github.com/nfischer)) -- test: refactor env tests to AVA [\#573](https://github.com/shelljs/shelljs/pull/573) ([nfischer](https://github.com/nfischer)) -- test: refactor dirs tests to AVA [\#572](https://github.com/shelljs/shelljs/pull/572) ([nfischer](https://github.com/nfischer)) -- test: refactor config tests to AVA [\#571](https://github.com/shelljs/shelljs/pull/571) ([nfischer](https://github.com/nfischer)) -- test: refactor common tests to AVA [\#570](https://github.com/shelljs/shelljs/pull/570) ([nfischer](https://github.com/nfischer)) -- test: refactor chmod tests to AVA [\#569](https://github.com/shelljs/shelljs/pull/569) ([nfischer](https://github.com/nfischer)) -- test: refactor cp tests to ava [\#565](https://github.com/shelljs/shelljs/pull/565) ([nfischer](https://github.com/nfischer)) -- test: refactor cat tests to ava [\#564](https://github.com/shelljs/shelljs/pull/564) ([nfischer](https://github.com/nfischer)) -- test: set up ava and move cd.js [\#561](https://github.com/shelljs/shelljs/pull/561) ([nfischer](https://github.com/nfischer)) -- Update sed documentation regarding capture groups [\#558](https://github.com/shelljs/shelljs/pull/558) ([freitagbr](https://github.com/freitagbr)) -- Add newline to output of echo [\#557](https://github.com/shelljs/shelljs/pull/557) ([freitagbr](https://github.com/freitagbr)) -- fix: handle code-less errors more carefully in exec [\#554](https://github.com/shelljs/shelljs/pull/554) ([nfischer](https://github.com/nfischer)) -- Add Brandon Freitag to maintainers/contributors [\#553](https://github.com/shelljs/shelljs/pull/553) ([freitagbr](https://github.com/freitagbr)) -- Get pipe tests running on Windows. [\#550](https://github.com/shelljs/shelljs/pull/550) ([binki](https://github.com/binki)) -- fix: maxdepth doesn't limit total number of copies [\#549](https://github.com/shelljs/shelljs/pull/549) ([nfischer](https://github.com/nfischer)) -- Safely exit by throwing an error [\#546](https://github.com/shelljs/shelljs/pull/546) ([freitagbr](https://github.com/freitagbr)) -- Fix lint warning [\#543](https://github.com/shelljs/shelljs/pull/543) ([freitagbr](https://github.com/freitagbr)) -- chore: remove v0.10 from Travis CI [\#540](https://github.com/shelljs/shelljs/pull/540) ([nfischer](https://github.com/nfischer)) -- chore: add Node v7 for CI [\#539](https://github.com/shelljs/shelljs/pull/539) ([nfischer](https://github.com/nfischer)) - -## [v0.7.5](https://github.com/shelljs/shelljs/tree/v0.7.5) (2016-10-27) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.4...v0.7.5) - -**Closed issues:** - -- Project objectives: there is some higher goal to achieve? [\#533](https://github.com/shelljs/shelljs/issues/533) -- fs.existsSync is un-deprecated [\#531](https://github.com/shelljs/shelljs/issues/531) -- Inadvertent breaking change to shell.test\(\) [\#529](https://github.com/shelljs/shelljs/issues/529) -- Add -u flag support for cp [\#526](https://github.com/shelljs/shelljs/issues/526) -- API request: allow `plugin.error\(\)` to take an options parameter [\#522](https://github.com/shelljs/shelljs/issues/522) -- FS Real Path error thrown when requiring shelljs [\#521](https://github.com/shelljs/shelljs/issues/521) -- Question: passing code via pipe? [\#520](https://github.com/shelljs/shelljs/issues/520) -- The performance in `cp` is different between `0.6.0` and `0.7.4` [\#517](https://github.com/shelljs/shelljs/issues/517) -- ShellJS in Electron package don't find ffmpeg anymore [\#516](https://github.com/shelljs/shelljs/issues/516) -- Exec issues with string option introduced in 0.7.4 [\#515](https://github.com/shelljs/shelljs/issues/515) -- \[ Feature \] SSH command [\#435](https://github.com/shelljs/shelljs/issues/435) -- Synchronous exec stalls permenantly when there is an error/w the shell [\#7](https://github.com/shelljs/shelljs/issues/7) - -**Merged pull requests:** - -- feat: plugin.error\(\) takes an options parameter [\#535](https://github.com/shelljs/shelljs/pull/535) ([nfischer](https://github.com/nfischer)) -- Revert "refactor: replace fs.existsSync" fixes\(\#531\) [\#532](https://github.com/shelljs/shelljs/pull/532) ([gyandeeps](https://github.com/gyandeeps)) -- Fix: Remove default glob from shell.test \(fixes \#529\) [\#530](https://github.com/shelljs/shelljs/pull/530) ([gyandeeps](https://github.com/gyandeeps)) -- feat: cp -u option [\#527](https://github.com/shelljs/shelljs/pull/527) ([nfischer](https://github.com/nfischer)) -- chore: add downloads per month on README [\#513](https://github.com/shelljs/shelljs/pull/513) ([nfischer](https://github.com/nfischer)) - -## [v0.7.4](https://github.com/shelljs/shelljs/tree/v0.7.4) (2016-08-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.3...v0.7.4) - -**Closed issues:** - -- fix: echo -e should not print "-e" [\#510](https://github.com/shelljs/shelljs/issues/510) -- Wrong method signature in doc [\#498](https://github.com/shelljs/shelljs/issues/498) -- readFromPipe should be a function with no arguments [\#485](https://github.com/shelljs/shelljs/issues/485) -- TypeError: Cannot read property 'toString' of undefined [\#471](https://github.com/shelljs/shelljs/issues/471) - -**Merged pull requests:** - -- fix: echo supports -e option properly [\#511](https://github.com/shelljs/shelljs/pull/511) ([nfischer](https://github.com/nfischer)) -- refactor: replace fs.existsSync [\#509](https://github.com/shelljs/shelljs/pull/509) ([nfischer](https://github.com/nfischer)) -- refactor: readFromPipe\(\) requires no arguments [\#506](https://github.com/shelljs/shelljs/pull/506) ([nfischer](https://github.com/nfischer)) -- chore: switch to eslint [\#504](https://github.com/shelljs/shelljs/pull/504) ([nfischer](https://github.com/nfischer)) -- feat: add overWrite option for commands [\#503](https://github.com/shelljs/shelljs/pull/503) ([nfischer](https://github.com/nfischer)) -- chore: update issue template [\#502](https://github.com/shelljs/shelljs/pull/502) ([nfischer](https://github.com/nfischer)) -- fixed head/tail readme [\#499](https://github.com/shelljs/shelljs/pull/499) ([charlesread](https://github.com/charlesread)) - -## [v0.7.3](https://github.com/shelljs/shelljs/tree/v0.7.3) (2016-07-27) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.2...v0.7.3) - -**Closed issues:** - -- expose execSync [\#494](https://github.com/shelljs/shelljs/issues/494) -- Add a way to create commands that can receive from a pipe without being standalone commands [\#487](https://github.com/shelljs/shelljs/issues/487) -- cp -r breaks when the directory contains a softlink [\#193](https://github.com/shelljs/shelljs/issues/193) -- Redirect output to file fails [\#60](https://github.com/shelljs/shelljs/issues/60) -- We need sed -n ? [\#38](https://github.com/shelljs/shelljs/issues/38) - -**Merged pull requests:** - -- refactor: allow pipeOnly commands \(methods on ShellStrings\) [\#493](https://github.com/shelljs/shelljs/pull/493) ([nfischer](https://github.com/nfischer)) -- refactor: glob by default for commands [\#492](https://github.com/shelljs/shelljs/pull/492) ([nfischer](https://github.com/nfischer)) -- refactor: switch from notUnix to unix in wrap\(\) [\#491](https://github.com/shelljs/shelljs/pull/491) ([nfischer](https://github.com/nfischer)) -- refactor: switch common.extend\(\) to Object.assign ponyfill [\#490](https://github.com/shelljs/shelljs/pull/490) ([nfischer](https://github.com/nfischer)) -- fix: conflicting options now properly override each other [\#489](https://github.com/shelljs/shelljs/pull/489) ([nfischer](https://github.com/nfischer)) -- refactor: expose plugin utils & add initial tests [\#484](https://github.com/shelljs/shelljs/pull/484) ([nfischer](https://github.com/nfischer)) - -## [v0.7.2](https://github.com/shelljs/shelljs/tree/v0.7.2) (2016-07-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.1...v0.7.2) - -**Closed issues:** - -- shelljs should not kill process if node call throws exception [\#473](https://github.com/shelljs/shelljs/issues/473) -- `cp` work incorrectly when folder name contains '@' [\#463](https://github.com/shelljs/shelljs/issues/463) -- Something went wrong [\#158](https://github.com/shelljs/shelljs/issues/158) - -**Merged pull requests:** - -- fix: resolve a cylcic-dependency problem [\#482](https://github.com/shelljs/shelljs/pull/482) ([nfischer](https://github.com/nfischer)) -- refactor: add wrapOutput option to auto-ShellString-ify command output [\#481](https://github.com/shelljs/shelljs/pull/481) ([nfischer](https://github.com/nfischer)) -- refactor: move option parsing into common.wrap\(\) [\#479](https://github.com/shelljs/shelljs/pull/479) ([nfischer](https://github.com/nfischer)) -- refactor: hook new uniq\(\) command using new format [\#478](https://github.com/shelljs/shelljs/pull/478) ([nfischer](https://github.com/nfischer)) -- Fix mkdir malformed path [\#477](https://github.com/shelljs/shelljs/pull/477) ([nfischer](https://github.com/nfischer)) -- fix: mkdir for invalid perms does not kill process [\#474](https://github.com/shelljs/shelljs/pull/474) ([nfischer](https://github.com/nfischer)) -- feat\(command\): new command: uniq\(\) [\#453](https://github.com/shelljs/shelljs/pull/453) ([joshi-sh](https://github.com/joshi-sh)) - -## [v0.7.1](https://github.com/shelljs/shelljs/tree/v0.7.1) (2016-07-22) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.0...v0.7.1) - -**Closed issues:** - -- cp -n doesn't work correctly [\#465](https://github.com/shelljs/shelljs/issues/465) -- how can i run sudo apt-get install xtodotool by your plugin? [\#448](https://github.com/shelljs/shelljs/issues/448) -- shell.js grep: internal error, Invalid regular expression [\#447](https://github.com/shelljs/shelljs/issues/447) -- Stdout is empty on Git log command [\#439](https://github.com/shelljs/shelljs/issues/439) -- Cannot read toString of null when using execSync [\#415](https://github.com/shelljs/shelljs/issues/415) -- cp -R dir/ target fails to copy hidden files in dir [\#140](https://github.com/shelljs/shelljs/issues/140) -- Adding callback to basic commands [\#102](https://github.com/shelljs/shelljs/issues/102) -- \#mv Won't Work Across Disks [\#1](https://github.com/shelljs/shelljs/issues/1) - -**Merged pull requests:** - -- refactor: commands now register themselves [\#475](https://github.com/shelljs/shelljs/pull/475) ([nfischer](https://github.com/nfischer)) -- chore: switch to shields.io, and add npm badge [\#470](https://github.com/shelljs/shelljs/pull/470) ([nfischer](https://github.com/nfischer)) -- fix\(cp\): -n option no longer raises error [\#466](https://github.com/shelljs/shelljs/pull/466) ([nfischer](https://github.com/nfischer)) -- refactor: expose pipe-ability to command configuration [\#464](https://github.com/shelljs/shelljs/pull/464) ([nfischer](https://github.com/nfischer)) -- fix\(mv\): works across partitions [\#461](https://github.com/shelljs/shelljs/pull/461) ([nfischer](https://github.com/nfischer)) -- chore: switch to shelljs-changelog [\#460](https://github.com/shelljs/shelljs/pull/460) ([nfischer](https://github.com/nfischer)) -- chore: update release process [\#459](https://github.com/shelljs/shelljs/pull/459) ([nfischer](https://github.com/nfischer)) -- chore: revert depreciate shelljs/make \(\#431\) [\#458](https://github.com/shelljs/shelljs/pull/458) ([zephraph](https://github.com/zephraph)) -- chore: clarify message for when docs are not generated [\#457](https://github.com/shelljs/shelljs/pull/457) ([nfischer](https://github.com/nfischer)) -- chore\(gendocs\): add `npm run gendocs` command [\#455](https://github.com/shelljs/shelljs/pull/455) ([nfischer](https://github.com/nfischer)) -- chore: update jshint and move it to an npm script [\#454](https://github.com/shelljs/shelljs/pull/454) ([nfischer](https://github.com/nfischer)) -- test\(ls\): add case for trailing slash on dir name [\#450](https://github.com/shelljs/shelljs/pull/450) ([nfischer](https://github.com/nfischer)) -- docs\(exec\): explicitly mention the `shell` option [\#449](https://github.com/shelljs/shelljs/pull/449) ([nfischer](https://github.com/nfischer)) -- chore: setup changelog [\#443](https://github.com/shelljs/shelljs/pull/443) ([levithomason](https://github.com/levithomason)) -- docs: comment code better to help contributors [\#437](https://github.com/shelljs/shelljs/pull/437) ([nfischer](https://github.com/nfischer)) -- chore\(CI\): update appveyor [\#436](https://github.com/shelljs/shelljs/pull/436) ([nfischer](https://github.com/nfischer)) -- chore: test against node v6 [\#433](https://github.com/shelljs/shelljs/pull/433) ([nfischer](https://github.com/nfischer)) -- chore\(make\): depreciate shelljs/make [\#431](https://github.com/shelljs/shelljs/pull/431) ([ariporad](https://github.com/ariporad)) -- docs: warn that README contains newest features [\#410](https://github.com/shelljs/shelljs/pull/410) ([nfischer](https://github.com/nfischer)) - -## [v0.7.0](https://github.com/shelljs/shelljs/tree/v0.7.0) (2016-04-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.6.0...v0.7.0) - -**Closed issues:** - -- exec\('nohup node some.js &'\) [\#426](https://github.com/shelljs/shelljs/issues/426) -- cp copy to symlinked folder [\#414](https://github.com/shelljs/shelljs/issues/414) -- Invalid version number \(0.0.1alpha1\) [\#399](https://github.com/shelljs/shelljs/issues/399) -- shelljs Breaks SemVer for Alpha and Pre-Release Versions [\#390](https://github.com/shelljs/shelljs/issues/390) -- Copy not accepting source end with wildcards \* when using -r on v0.6.0 [\#389](https://github.com/shelljs/shelljs/issues/389) -- Support globbing in `shjs` [\#388](https://github.com/shelljs/shelljs/issues/388) -- Refactor more commands to return ShellString [\#373](https://github.com/shelljs/shelljs/issues/373) -- ln\('-sf', './', '\'\) is not linking the right folder [\#363](https://github.com/shelljs/shelljs/issues/363) -- v0.6.0 - shell.cp\('r', '/foo/\*, '/bar'\) fails with /foo/\* no such file or directory [\#342](https://github.com/shelljs/shelljs/issues/342) -- Add documentup as a webhook [\#327](https://github.com/shelljs/shelljs/issues/327) -- Dir glob breaks when in the middle of path [\#245](https://github.com/shelljs/shelljs/issues/245) -- could you switch off wiki page? [\#233](https://github.com/shelljs/shelljs/issues/233) -- ls globbing does not behave like shell, consider using glob.sync [\#225](https://github.com/shelljs/shelljs/issues/225) -- Cannot run shell.exec\('heroku config:push'\) -- just hangs [\#218](https://github.com/shelljs/shelljs/issues/218) -- `cp` does not overwrite files by default [\#210](https://github.com/shelljs/shelljs/issues/210) -- exec failed to return [\#208](https://github.com/shelljs/shelljs/issues/208) -- CLI Version [\#202](https://github.com/shelljs/shelljs/issues/202) -- Bracket expansion not working [\#176](https://github.com/shelljs/shelljs/issues/176) -- "exec" causes LiveScript interpreter \(lsc\) to hang [\#160](https://github.com/shelljs/shelljs/issues/160) -- Don't modify string prototype [\#159](https://github.com/shelljs/shelljs/issues/159) -- `exec\(...\).to\(file\)` should work [\#154](https://github.com/shelljs/shelljs/issues/154) -- Would like to see more async variants for cp/rm etc [\#144](https://github.com/shelljs/shelljs/issues/144) -- Can't install shelljs locally instead of globally [\#136](https://github.com/shelljs/shelljs/issues/136) -- shelljs and node 0.10.28 [\#125](https://github.com/shelljs/shelljs/issues/125) -- Use case for global installed shelljs [\#123](https://github.com/shelljs/shelljs/issues/123) -- Only get stdout from `exec` [\#92](https://github.com/shelljs/shelljs/issues/92) -- What about other commands? [\#90](https://github.com/shelljs/shelljs/issues/90) -- Flesh out example of exit\(\) [\#73](https://github.com/shelljs/shelljs/issues/73) -- exec doesn't work with qualified paths on windows [\#41](https://github.com/shelljs/shelljs/issues/41) -- exec does not working in mingw bash in windows [\#17](https://github.com/shelljs/shelljs/issues/17) -- Add support for cp -P option [\#413](https://github.com/shelljs/shelljs/issues/413) -- cp -L: Incorrect behavior for symlinks to regular files [\#407](https://github.com/shelljs/shelljs/issues/407) -- Edit the docs to emphasize ShellStrings and Pipes [\#398](https://github.com/shelljs/shelljs/issues/398) -- Error message isn't always printed [\#372](https://github.com/shelljs/shelljs/issues/372) -- Standardize command output [\#356](https://github.com/shelljs/shelljs/issues/356) -- exec\(\) doesn't clean up all temp files [\#353](https://github.com/shelljs/shelljs/issues/353) -- Document that exec\(\) options don't work on early versions of node [\#350](https://github.com/shelljs/shelljs/issues/350) -- Add -f option to set\(\) [\#344](https://github.com/shelljs/shelljs/issues/344) -- Glob commands by default [\#343](https://github.com/shelljs/shelljs/issues/343) -- rm -rf incorrect behaviour [\#332](https://github.com/shelljs/shelljs/issues/332) -- Switch `exec\(\)` to use bash by default [\#281](https://github.com/shelljs/shelljs/issues/281) -- pipe to proc [\#148](https://github.com/shelljs/shelljs/issues/148) -- shell builtin [\#138](https://github.com/shelljs/shelljs/issues/138) -- add timeout option for exec [\#132](https://github.com/shelljs/shelljs/issues/132) -- shelljs cp handling symlinks badly [\#69](https://github.com/shelljs/shelljs/issues/69) - -**Merged pull requests:** - -- chore: add "Team" section to README [\#423](https://github.com/shelljs/shelljs/pull/423) ([nfischer](https://github.com/nfischer)) -- Contributing guidelines [\#422](https://github.com/shelljs/shelljs/pull/422) ([nfischer](https://github.com/nfischer)) -- feat\(glob\): expose config.globOptions. [\#400](https://github.com/shelljs/shelljs/pull/400) ([nfischer](https://github.com/nfischer)) -- Add shelljs as a keyword in package.json [\#393](https://github.com/shelljs/shelljs/pull/393) ([nfischer](https://github.com/nfischer)) -- docs: add link to wiki page [\#392](https://github.com/shelljs/shelljs/pull/392) ([nfischer](https://github.com/nfischer)) -- refactor\(cd\): use process.env.OLDPWD to store previous dir [\#383](https://github.com/shelljs/shelljs/pull/383) ([nfischer](https://github.com/nfischer)) -- chore\(appveyor\): add in node 4 for appveyor [\#381](https://github.com/shelljs/shelljs/pull/381) ([nfischer](https://github.com/nfischer)) -- Add Cash cross-reference [\#375](https://github.com/shelljs/shelljs/pull/375) ([dthree](https://github.com/dthree)) -- Ignore gitattributes from npm package [\#361](https://github.com/shelljs/shelljs/pull/361) ([nfischer](https://github.com/nfischer)) -- Consistently use LF line endings [\#355](https://github.com/shelljs/shelljs/pull/355) ([TimothyGu](https://github.com/TimothyGu)) -- Release v0.7.0 [\#429](https://github.com/shelljs/shelljs/pull/429) ([nfischer](https://github.com/nfischer)) -- fix: null is no longer confused for an object [\#428](https://github.com/shelljs/shelljs/pull/428) ([nfischer](https://github.com/nfischer)) -- fix\(ls\): no trailing newline for empty directories [\#425](https://github.com/shelljs/shelljs/pull/425) ([nfischer](https://github.com/nfischer)) -- feat\(cp\): -P option, plus better handling of symlinks [\#421](https://github.com/shelljs/shelljs/pull/421) ([nfischer](https://github.com/nfischer)) -- docs\(exec\): fix docs about exec return type [\#419](https://github.com/shelljs/shelljs/pull/419) ([nfischer](https://github.com/nfischer)) -- docs\(error\): deprecate relying on string value [\#418](https://github.com/shelljs/shelljs/pull/418) ([nfischer](https://github.com/nfischer)) -- fix: error message now printed for fatal failures [\#417](https://github.com/shelljs/shelljs/pull/417) ([nfischer](https://github.com/nfischer)) -- issue-407: Add regular files unit tests and fix symlink copy behavior [\#409](https://github.com/shelljs/shelljs/pull/409) ([charlesverge](https://github.com/charlesverge)) -- refactor\(rm\): Remove duplicate code [\#408](https://github.com/shelljs/shelljs/pull/408) ([nfischer](https://github.com/nfischer)) -- docs: wildcards for all commands, other docs cleanups [\#404](https://github.com/shelljs/shelljs/pull/404) ([nfischer](https://github.com/nfischer)) -- test\(rm\): add tests to prevent a future regression [\#403](https://github.com/shelljs/shelljs/pull/403) ([nfischer](https://github.com/nfischer)) -- refactor\(string\): modify string protoype, but only for shelljs/global [\#401](https://github.com/shelljs/shelljs/pull/401) ([nfischer](https://github.com/nfischer)) -- feat: adding error codes to ShellJS [\#394](https://github.com/shelljs/shelljs/pull/394) ([nfischer](https://github.com/nfischer)) -- feature: use rechoir [\#384](https://github.com/shelljs/shelljs/pull/384) ([nfischer](https://github.com/nfischer)) -- refactor\(cp\): clean up code and fix \#376 [\#380](https://github.com/shelljs/shelljs/pull/380) ([nfischer](https://github.com/nfischer)) -- New commands: sort\(\), head\(\), and tail\(\) [\#379](https://github.com/shelljs/shelljs/pull/379) ([nfischer](https://github.com/nfischer)) -- Add unit tests to prevent regression \(see \#376\) [\#378](https://github.com/shelljs/shelljs/pull/378) ([nfischer](https://github.com/nfischer)) -- feat\(pipe\): add support for pipes between commands [\#370](https://github.com/shelljs/shelljs/pull/370) ([nfischer](https://github.com/nfischer)) -- refactor\(ls\): greatly simplify ls implimentation [\#369](https://github.com/shelljs/shelljs/pull/369) ([ariporad](https://github.com/ariporad)) -- chore: drop node v0.10 support [\#368](https://github.com/shelljs/shelljs/pull/368) ([ariporad](https://github.com/ariporad)) -- perf\(cd\): only run `stat` once [\#367](https://github.com/shelljs/shelljs/pull/367) ([ariporad](https://github.com/ariporad)) -- fix\(exec\): properly handles paths with spaces and quotes [\#365](https://github.com/shelljs/shelljs/pull/365) ([nfischer](https://github.com/nfischer)) -- test\(ln\): add tests for linking to cwd [\#364](https://github.com/shelljs/shelljs/pull/364) ([nfischer](https://github.com/nfischer)) -- fix\(verbose\): verbose-style logging is consistent [\#362](https://github.com/shelljs/shelljs/pull/362) ([nfischer](https://github.com/nfischer)) -- Refactor shellstring [\#360](https://github.com/shelljs/shelljs/pull/360) ([nfischer](https://github.com/nfischer)) -- feat\(glob\): use glob module for globbing [\#359](https://github.com/shelljs/shelljs/pull/359) ([nfischer](https://github.com/nfischer)) -- feat\(set\): add -f option to disable globbing [\#358](https://github.com/shelljs/shelljs/pull/358) ([nfischer](https://github.com/nfischer)) -- config.fatal now throws an exception [\#357](https://github.com/shelljs/shelljs/pull/357) ([jrmclaurin](https://github.com/jrmclaurin)) -- fix\(exec\): temp files are now cleaned up [\#354](https://github.com/shelljs/shelljs/pull/354) ([nfischer](https://github.com/nfischer)) -- feat\(glob\): glob support for \(almost\) all commands [\#352](https://github.com/shelljs/shelljs/pull/352) ([nfischer](https://github.com/nfischer)) -- feat\(grep\): add -l option [\#349](https://github.com/shelljs/shelljs/pull/349) ([nfischer](https://github.com/nfischer)) -- fix\(exec\): now actually supports shell option [\#348](https://github.com/shelljs/shelljs/pull/348) ([nfischer](https://github.com/nfischer)) -- feat\(touch\): supports multiple files [\#346](https://github.com/shelljs/shelljs/pull/346) ([nfischer](https://github.com/nfischer)) - -## [v0.6.0](https://github.com/shelljs/shelljs/tree/v0.6.0) (2016-02-05) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.3...v0.6.0) - -**Closed issues:** - -- option not recognized [\#334](https://github.com/shelljs/shelljs/issues/334) -- Feature request: Metadata with `ls` [\#323](https://github.com/shelljs/shelljs/issues/323) -- Gen-docs is broken [\#309](https://github.com/shelljs/shelljs/issues/309) -- `link -s` is broken for files on Windows [\#301](https://github.com/shelljs/shelljs/issues/301) -- Shelljs quits unexpectedly: [\#300](https://github.com/shelljs/shelljs/issues/300) -- Failing tests on Windows [\#296](https://github.com/shelljs/shelljs/issues/296) -- run-tests.js is broken for cmd.exe [\#294](https://github.com/shelljs/shelljs/issues/294) -- Support echo-ing environment variables [\#291](https://github.com/shelljs/shelljs/issues/291) -- Add Windows CI [\#287](https://github.com/shelljs/shelljs/issues/287) -- Add tests for the shjs utility [\#280](https://github.com/shelljs/shelljs/issues/280) -- Allow shjs utility to infer the extension for "filename." [\#278](https://github.com/shelljs/shelljs/issues/278) -- Ability to read the stdout buffer line-by-line [\#277](https://github.com/shelljs/shelljs/issues/277) -- Poor output for commands with multiple errors [\#267](https://github.com/shelljs/shelljs/issues/267) -- Travis ci build status says "unknown" [\#266](https://github.com/shelljs/shelljs/issues/266) -- wild card characters in filename not working as expected [\#262](https://github.com/shelljs/shelljs/issues/262) -- shell.exec - read internal variable [\#260](https://github.com/shelljs/shelljs/issues/260) -- cp and rename directory with -r doesn't match unix behavior [\#256](https://github.com/shelljs/shelljs/issues/256) -- console.log.apply throwing TypeError: Illegal Invocation [\#255](https://github.com/shelljs/shelljs/issues/255) -- How to exit on first error [\#253](https://github.com/shelljs/shelljs/issues/253) -- why not support set 'cwd' when invoke execAsync ? [\#250](https://github.com/shelljs/shelljs/issues/250) -- Not possible to check the failure of cd? [\#247](https://github.com/shelljs/shelljs/issues/247) -- By default shelljs runs command in root [\#246](https://github.com/shelljs/shelljs/issues/246) -- /usr/bin/env: node: No such file or directory [\#243](https://github.com/shelljs/shelljs/issues/243) -- "Which" command not working properly on Windows Platform. [\#238](https://github.com/shelljs/shelljs/issues/238) -- Arguments [\#237](https://github.com/shelljs/shelljs/issues/237) -- sed\(\) should accept multiple file arguments [\#231](https://github.com/shelljs/shelljs/issues/231) -- shelljs.exec\('aaa && bbb'\) blocks [\#229](https://github.com/shelljs/shelljs/issues/229) -- Consider creating a GitHub Organization with more maintainers [\#223](https://github.com/shelljs/shelljs/issues/223) -- Doesn't work inside Electron [\#220](https://github.com/shelljs/shelljs/issues/220) -- \[idea\] Add chmodr function. [\#219](https://github.com/shelljs/shelljs/issues/219) -- Execute a file [\#211](https://github.com/shelljs/shelljs/issues/211) -- Where is standard error going to? [\#209](https://github.com/shelljs/shelljs/issues/209) -- boolean return value for string.to\(\) [\#205](https://github.com/shelljs/shelljs/issues/205) -- `common.error` doesn't throw [\#199](https://github.com/shelljs/shelljs/issues/199) -- Problems with exec \(sync\) on 0.12/io.js [\#197](https://github.com/shelljs/shelljs/issues/197) -- cp --update flag [\#172](https://github.com/shelljs/shelljs/issues/172) -- Is there a way to suppress pushd/popd output? [\#171](https://github.com/shelljs/shelljs/issues/171) -- Cannot recursively list all \*.js files [\#162](https://github.com/shelljs/shelljs/issues/162) -- exec\(\) breaks if executed in a deleted directory [\#157](https://github.com/shelljs/shelljs/issues/157) -- shjs command always exits with zero code [\#133](https://github.com/shelljs/shelljs/issues/133) -- Windows failing tests [\#127](https://github.com/shelljs/shelljs/issues/127) -- touch command [\#122](https://github.com/shelljs/shelljs/issues/122) -- Symbolic links are broken! [\#100](https://github.com/shelljs/shelljs/issues/100) -- interpret `--` as stdin [\#55](https://github.com/shelljs/shelljs/issues/55) -- Error ENOTEMPTY when deleting a directory recursively. [\#49](https://github.com/shelljs/shelljs/issues/49) -- Cross-platform way to add to PATH [\#32](https://github.com/shelljs/shelljs/issues/32) -- `mv` fails on block, character, fifo [\#25](https://github.com/shelljs/shelljs/issues/25) -- ls -l [\#22](https://github.com/shelljs/shelljs/issues/22) - -**Merged pull requests:** - -- feat\(set\): add new set\(\) command [\#329](https://github.com/shelljs/shelljs/pull/329) ([nfischer](https://github.com/nfischer)) -- Fix symlinking on Windows [\#322](https://github.com/shelljs/shelljs/pull/322) ([BYK](https://github.com/BYK)) -- Rewrite .gitignore to be more comprehensive [\#321](https://github.com/shelljs/shelljs/pull/321) ([BYK](https://github.com/BYK)) -- chore\(gitter/travis\): add gitter webhook to travis [\#313](https://github.com/shelljs/shelljs/pull/313) ([ariporad](https://github.com/ariporad)) -- chore\(LGTM\): add LGTM config files [\#312](https://github.com/shelljs/shelljs/pull/312) ([ariporad](https://github.com/ariporad)) -- feat\(ls\): add -d flag to ls\(\) [\#311](https://github.com/shelljs/shelljs/pull/311) ([nfischer](https://github.com/nfischer)) -- fix\(gen-docs\): fix issue where docs are generated wrong [\#310](https://github.com/shelljs/shelljs/pull/310) ([nfischer](https://github.com/nfischer)) -- chore\(package\): remove v0.8 from engines list [\#308](https://github.com/shelljs/shelljs/pull/308) ([nfischer](https://github.com/nfischer)) -- travis: Mark as not using `sudo` and do not test 0.11 [\#307](https://github.com/shelljs/shelljs/pull/307) ([TimothyGu](https://github.com/TimothyGu)) -- fix: jshint works on Windows [\#295](https://github.com/shelljs/shelljs/pull/295) ([nfischer](https://github.com/nfischer)) -- feat: add tilde expansion to expand\(\) [\#293](https://github.com/shelljs/shelljs/pull/293) ([nfischer](https://github.com/nfischer)) -- style: make docs more consistent [\#292](https://github.com/shelljs/shelljs/pull/292) ([nfischer](https://github.com/nfischer)) -- update `exec` docs to match implemented behaviour [\#289](https://github.com/shelljs/shelljs/pull/289) ([vise890](https://github.com/vise890)) -- chore: update github URL in package.json [\#288](https://github.com/shelljs/shelljs/pull/288) ([nfischer](https://github.com/nfischer)) -- docs\(spelling\): fix typo in source comment [\#285](https://github.com/shelljs/shelljs/pull/285) ([nfischer](https://github.com/nfischer)) -- chore\(travis\): add OS X to Travis CI [\#283](https://github.com/shelljs/shelljs/pull/283) ([nfischer](https://github.com/nfischer)) -- Don't do `console.log.apply\(this, ...\)`. [\#274](https://github.com/shelljs/shelljs/pull/274) ([ariporad](https://github.com/ariporad)) -- Implementing cd\('-'\) to behave like Bash's "cd -" [\#273](https://github.com/shelljs/shelljs/pull/273) ([nfischer](https://github.com/nfischer)) -- Fix cp to match unix behavior [\#271](https://github.com/shelljs/shelljs/pull/271) ([freitagbr](https://github.com/freitagbr)) -- Commands that have multiple errors now produce cleaner log output [\#268](https://github.com/shelljs/shelljs/pull/268) ([nfischer](https://github.com/nfischer)) -- Support exit code in shjs. [\#252](https://github.com/shelljs/shelljs/pull/252) ([bryce-gibson](https://github.com/bryce-gibson)) -- add touch\(1\) [\#249](https://github.com/shelljs/shelljs/pull/249) ([blockloop](https://github.com/blockloop)) -- Fix `os.tmpdir` bug [\#240](https://github.com/shelljs/shelljs/pull/240) ([BYK](https://github.com/BYK)) -- Make sure Which\(\) on Windows platform always return the command with … [\#239](https://github.com/shelljs/shelljs/pull/239) ([TingluoHuang](https://github.com/TingluoHuang)) -- Add target node.js \(iojs v1, v2, v3\) [\#230](https://github.com/shelljs/shelljs/pull/230) ([sanemat](https://github.com/sanemat)) -- feat-multisymbolic + Support for directory entry \(capital X in chmod terms\) [\#228](https://github.com/shelljs/shelljs/pull/228) ([rezonant](https://github.com/rezonant)) -- Fixes an issue with multi-symbolic mode specification \(ie a-rwx,u+rw\) [\#227](https://github.com/shelljs/shelljs/pull/227) ([rezonant](https://github.com/rezonant)) -- Memoized the result of target invocation [\#216](https://github.com/shelljs/shelljs/pull/216) ([rizowski](https://github.com/rizowski)) -- remove empty for loop and leaked i var [\#166](https://github.com/shelljs/shelljs/pull/166) ([ratbeard](https://github.com/ratbeard)) -- Wrap script name in double quotes [\#135](https://github.com/shelljs/shelljs/pull/135) ([ndelitski](https://github.com/ndelitski)) -- Fixed coffeescript syntax in top example [\#99](https://github.com/shelljs/shelljs/pull/99) ([maxnordlund](https://github.com/maxnordlund)) -- fix\(touch\): enhance parseOptions and fix touch's -r flag [\#341](https://github.com/shelljs/shelljs/pull/341) ([nfischer](https://github.com/nfischer)) -- chore\(.npmignore\): update npmignore [\#339](https://github.com/shelljs/shelljs/pull/339) ([ariporad](https://github.com/ariporad)) -- Release v0.6.0 [\#338](https://github.com/shelljs/shelljs/pull/338) ([ariporad](https://github.com/ariporad)) -- docs\(README\): remove coffeescript from README [\#337](https://github.com/shelljs/shelljs/pull/337) ([ariporad](https://github.com/ariporad)) -- fix\(cp\): add -n option, make -f default behavior [\#336](https://github.com/shelljs/shelljs/pull/336) ([nfischer](https://github.com/nfischer)) -- feat\(exec\): allow all exec options to pass through [\#335](https://github.com/shelljs/shelljs/pull/335) ([nfischer](https://github.com/nfischer)) -- fix\(mv\): add -n option, make -f default behavior [\#328](https://github.com/shelljs/shelljs/pull/328) ([nfischer](https://github.com/nfischer)) -- fix\(cat\): make behavior more like unix [\#326](https://github.com/shelljs/shelljs/pull/326) ([nfischer](https://github.com/nfischer)) -- feat\(ls\): add -l option [\#324](https://github.com/shelljs/shelljs/pull/324) ([nfischer](https://github.com/nfischer)) -- style\(test/which\): make test/which.js conform to the style guidelines [\#320](https://github.com/shelljs/shelljs/pull/320) ([ariporad](https://github.com/ariporad)) -- chore\(appveyor\): add badge [\#316](https://github.com/shelljs/shelljs/pull/316) ([nfischer](https://github.com/nfischer)) -- fix\(windows\): fix shjs commands for windows [\#315](https://github.com/shelljs/shelljs/pull/315) ([nfischer](https://github.com/nfischer)) -- feat\(sed\): support multiple file names [\#314](https://github.com/shelljs/shelljs/pull/314) ([nfischer](https://github.com/nfischer)) -- feat\(cd\): cd\(\) \(no args\) changes to home directory [\#306](https://github.com/shelljs/shelljs/pull/306) ([nfischer](https://github.com/nfischer)) -- test\(shjs\): add tests for shjs [\#304](https://github.com/shelljs/shelljs/pull/304) ([ariporad](https://github.com/ariporad)) -- fix: regexes are more consistent with sed and grep [\#303](https://github.com/shelljs/shelljs/pull/303) ([nfischer](https://github.com/nfischer)) -- Add appveyor.yml config file [\#299](https://github.com/shelljs/shelljs/pull/299) ([nfischer](https://github.com/nfischer)) -- Fix tests on Windows [\#297](https://github.com/shelljs/shelljs/pull/297) ([BYK](https://github.com/BYK)) -- Search PATHEXT instead of 3 hardcoded values [\#290](https://github.com/shelljs/shelljs/pull/290) ([isiahmeadows](https://github.com/isiahmeadows)) -- Fix relative symlinks [\#282](https://github.com/shelljs/shelljs/pull/282) ([freitagbr](https://github.com/freitagbr)) -- Make to and toEnd chainable [\#276](https://github.com/shelljs/shelljs/pull/276) ([TimothyGu](https://github.com/TimothyGu)) - -## [v0.5.3](https://github.com/shelljs/shelljs/tree/v0.5.3) (2015-08-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.2...v0.5.3) - -**Merged pull requests:** - -- Manually closing streams [\#222](https://github.com/shelljs/shelljs/pull/222) ([JulianLaval](https://github.com/JulianLaval)) - -## [v0.5.2](https://github.com/shelljs/shelljs/tree/v0.5.2) (2015-08-10) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.1...v0.5.2) - -**Closed issues:** - -- Cannot run shell.exec [\#217](https://github.com/shelljs/shelljs/issues/217) -- write after end: internal error [\#206](https://github.com/shelljs/shelljs/issues/206) - -**Merged pull requests:** - -- Update README.md [\#221](https://github.com/shelljs/shelljs/pull/221) ([giosh94mhz](https://github.com/giosh94mhz)) -- prevent internal error: write after end [\#214](https://github.com/shelljs/shelljs/pull/214) ([charlierudolph](https://github.com/charlierudolph)) - -## [v0.5.1](https://github.com/shelljs/shelljs/tree/v0.5.1) (2015-06-05) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.0...v0.5.1) - -**Closed issues:** - -- cd into home directory [\#9](https://github.com/shelljs/shelljs/issues/9) - -**Merged pull requests:** - -- Fix issue \#49: Retry rmdirSync on Windows for up to 1 second if files still exist. [\#179](https://github.com/shelljs/shelljs/pull/179) ([andreialecu](https://github.com/andreialecu)) - -## [v0.5.0](https://github.com/shelljs/shelljs/tree/v0.5.0) (2015-05-19) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.3.0...v0.5.0) - -**Closed issues:** - -- Enter text to prompt [\#203](https://github.com/shelljs/shelljs/issues/203) -- Find which shell is being used [\#195](https://github.com/shelljs/shelljs/issues/195) -- Pass command line params to the make tool [\#188](https://github.com/shelljs/shelljs/issues/188) -- Is it possible to call exec with a command containing new lines ? [\#177](https://github.com/shelljs/shelljs/issues/177) -- The installation would break on Windows 7 [\#161](https://github.com/shelljs/shelljs/issues/161) -- Q.ninvoke\(\) returns undefined [\#153](https://github.com/shelljs/shelljs/issues/153) -- installed shelljs on osx but reported error: npm ERR! 404 '%5B-g%5D' is not in the npm registry. [\#124](https://github.com/shelljs/shelljs/issues/124) -- "ln" not found \(OS X\) [\#106](https://github.com/shelljs/shelljs/issues/106) -- Using shelljs in a CLI app. [\#91](https://github.com/shelljs/shelljs/issues/91) - -**Merged pull requests:** - -- Breaking: Allow -- as args separators \(fixes \#188\) [\#207](https://github.com/shelljs/shelljs/pull/207) ([nzakas](https://github.com/nzakas)) -- Update .travis.yml [\#190](https://github.com/shelljs/shelljs/pull/190) ([arturadib](https://github.com/arturadib)) -- Use new child\_process.execSync instead of busywaiting [\#189](https://github.com/shelljs/shelljs/pull/189) ([devTristan](https://github.com/devTristan)) -- Update README.md: explains how to access "config" [\#145](https://github.com/shelljs/shelljs/pull/145) ([kerphi](https://github.com/kerphi)) -- Fix to set state.error before throw the exception [\#120](https://github.com/shelljs/shelljs/pull/120) ([abdul-martinez](https://github.com/abdul-martinez)) -- Add -l and -s support to grep. [\#116](https://github.com/shelljs/shelljs/pull/116) ([idearat](https://github.com/idearat)) - -## [v0.3.0](https://github.com/shelljs/shelljs/tree/v0.3.0) (2014-05-08) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.6...v0.3.0) - -**Closed issues:** - -- grep\(\) should fully support globing [\#118](https://github.com/shelljs/shelljs/issues/118) -- sed\(\) could support replacement function [\#115](https://github.com/shelljs/shelljs/issues/115) -- How would you close an exec process that runs indefinitely? [\#113](https://github.com/shelljs/shelljs/issues/113) -- listen for intermittent output of a long-running child process [\#111](https://github.com/shelljs/shelljs/issues/111) -- Cannot find module 'shelljs' after installing shelljs with npm [\#109](https://github.com/shelljs/shelljs/issues/109) -- Massive CPU usage on exec\(\) windows [\#108](https://github.com/shelljs/shelljs/issues/108) -- cp skipping dot files? [\#79](https://github.com/shelljs/shelljs/issues/79) -- $variables in exec\(\) aren't handled correctly [\#11](https://github.com/shelljs/shelljs/issues/11) -- debug flag that prints commands instead of executing [\#8](https://github.com/shelljs/shelljs/issues/8) - -**Merged pull requests:** - -- grep\(\) support for globing, fixes \#118 [\#119](https://github.com/shelljs/shelljs/pull/119) ([utensil](https://github.com/utensil)) -- make sed\(\) support replacement function, fixes \#115 [\#117](https://github.com/shelljs/shelljs/pull/117) ([utensil](https://github.com/utensil)) -- which\(\) should only find files, not directories [\#110](https://github.com/shelljs/shelljs/pull/110) ([panrafal](https://github.com/panrafal)) -- Added the New BSD license to the package.json. [\#105](https://github.com/shelljs/shelljs/pull/105) ([keskival](https://github.com/keskival)) -- Added win32 support to ln [\#104](https://github.com/shelljs/shelljs/pull/104) ([jamon](https://github.com/jamon)) -- Fix ln using bad paths when given abspaths. [\#89](https://github.com/shelljs/shelljs/pull/89) ([Schoonology](https://github.com/Schoonology)) -- Add ln support, including both -s and -f options. [\#88](https://github.com/shelljs/shelljs/pull/88) ([Schoonology](https://github.com/Schoonology)) -- add support for symlinking \(junctions\) on win32 [\#87](https://github.com/shelljs/shelljs/pull/87) ([jamon](https://github.com/jamon)) - -## [v0.2.6](https://github.com/shelljs/shelljs/tree/v0.2.6) (2013-09-22) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.5...v0.2.6) - -**Closed issues:** - -- Versions 0.2.4 and 0.2.3 keep throwing strange errors [\#82](https://github.com/shelljs/shelljs/issues/82) -- Add global pollution tests [\#33](https://github.com/shelljs/shelljs/issues/33) - -## [v0.2.5](https://github.com/shelljs/shelljs/tree/v0.2.5) (2013-09-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.4...v0.2.5) - -**Closed issues:** - -- shelljs.exec stalls on Red Hat when script is invoked with 'sudo -u username' [\#72](https://github.com/shelljs/shelljs/issues/72) - -## [v0.2.4](https://github.com/shelljs/shelljs/tree/v0.2.4) (2013-09-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.3...v0.2.4) - -## [v0.2.3](https://github.com/shelljs/shelljs/tree/v0.2.3) (2013-09-09) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.2...v0.2.3) - -**Merged pull requests:** - -- Make shell.exec\(\) treat process error return codes as shelljs errors [\#80](https://github.com/shelljs/shelljs/pull/80) ([nilsbunger](https://github.com/nilsbunger)) - -## [v0.2.2](https://github.com/shelljs/shelljs/tree/v0.2.2) (2013-09-02) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.4...v0.2.2) - -**Closed issues:** - -- which and node\_modules [\#63](https://github.com/shelljs/shelljs/issues/63) -- cannot install with nodejs 0.10.2 [\#57](https://github.com/shelljs/shelljs/issues/57) - -**Merged pull requests:** - -- Addition of a toEnd\(\) function modeled after the Unix \>\> pipe. [\#78](https://github.com/shelljs/shelljs/pull/78) ([andreweduffy](https://github.com/andreweduffy)) -- Added appendTo\(\) function to imitate '\>\>' redirect-and-append pipe. [\#75](https://github.com/shelljs/shelljs/pull/75) ([andreweduffy](https://github.com/andreweduffy)) -- Fix a small typo in README.md [\#71](https://github.com/shelljs/shelljs/pull/71) ([asmblah](https://github.com/asmblah)) -- adding an `.npmignore` file [\#70](https://github.com/shelljs/shelljs/pull/70) ([stephenmathieson](https://github.com/stephenmathieson)) -- tempdir: use `os.tmpDir` when possible [\#67](https://github.com/shelljs/shelljs/pull/67) ([stephenmathieson](https://github.com/stephenmathieson)) - -## [v0.1.4](https://github.com/shelljs/shelljs/tree/v0.1.4) (2013-05-10) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.3...v0.1.4) - -**Merged pull requests:** - -- removing extra fs calls [\#62](https://github.com/shelljs/shelljs/pull/62) ([stephenmathieson](https://github.com/stephenmathieson)) -- moving \_jshint\_ to a development dependency [\#61](https://github.com/shelljs/shelljs/pull/61) ([stephenmathieson](https://github.com/stephenmathieson)) -- Make the maximum buffersize 20 MB. [\#59](https://github.com/shelljs/shelljs/pull/59) ([waddlesplash](https://github.com/waddlesplash)) - -## [v0.1.3](https://github.com/shelljs/shelljs/tree/v0.1.3) (2013-04-21) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.2...v0.1.3) - -**Merged pull requests:** - -- test\('-L', badlink\) should return true [\#56](https://github.com/shelljs/shelljs/pull/56) ([lge88](https://github.com/lge88)) -- exec options now allows `silent:true` with callback. [\#54](https://github.com/shelljs/shelljs/pull/54) ([iapain](https://github.com/iapain)) -- Add Zepto to README [\#53](https://github.com/shelljs/shelljs/pull/53) ([madrobby](https://github.com/madrobby)) - -## [v0.1.2](https://github.com/shelljs/shelljs/tree/v0.1.2) (2013-01-08) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.1...v0.1.2) - -**Closed issues:** - -- pushd/popd [\#24](https://github.com/shelljs/shelljs/issues/24) - -**Merged pull requests:** - -- Implemented chmod command. Github issue 35 [\#48](https://github.com/shelljs/shelljs/pull/48) ([brandonramirez](https://github.com/brandonramirez)) - -## [v0.1.1](https://github.com/shelljs/shelljs/tree/v0.1.1) (2013-01-01) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.0...v0.1.1) - -**Merged pull requests:** - -- Work in progress: pushd/popd/dirs [\#47](https://github.com/shelljs/shelljs/pull/47) ([mstade](https://github.com/mstade)) - -## [v0.1.0](https://github.com/shelljs/shelljs/tree/v0.1.0) (2012-12-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.9...v0.1.0) - -**Closed issues:** - -- test\(\) for binary file? [\#45](https://github.com/shelljs/shelljs/issues/45) -- Inconsistent behaviour of cp command with directories. [\#44](https://github.com/shelljs/shelljs/issues/44) -- Executing SSH with ShellJs [\#43](https://github.com/shelljs/shelljs/issues/43) - -**Merged pull requests:** - -- Fix for \#44 [\#46](https://github.com/shelljs/shelljs/pull/46) ([mstade](https://github.com/mstade)) -- Fix single/double quotes in exec [\#42](https://github.com/shelljs/shelljs/pull/42) ([danielepolencic](https://github.com/danielepolencic)) - -## [v0.0.9](https://github.com/shelljs/shelljs/tree/v0.0.9) (2012-12-01) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.8...v0.0.9) - -**Closed issues:** - -- silent output [\#40](https://github.com/shelljs/shelljs/issues/40) -- asynchronous exec [\#34](https://github.com/shelljs/shelljs/issues/34) - -**Merged pull requests:** - -- Passed process arguments to executable script [\#36](https://github.com/shelljs/shelljs/pull/36) ([Zanisimo](https://github.com/Zanisimo)) - -## [v0.0.8](https://github.com/shelljs/shelljs/tree/v0.0.8) (2012-10-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.7...v0.0.8) - -**Closed issues:** - -- exec with callback should automatically be async [\#31](https://github.com/shelljs/shelljs/issues/31) -- Exporting variables. [\#30](https://github.com/shelljs/shelljs/issues/30) -- Detecting shelljs/node [\#27](https://github.com/shelljs/shelljs/issues/27) - -**Merged pull requests:** - -- fix: global leak 'stats' [\#29](https://github.com/shelljs/shelljs/pull/29) ([ando-takahiro](https://github.com/ando-takahiro)) -- -a includes . and ..; -A does not [\#28](https://github.com/shelljs/shelljs/pull/28) ([aeosynth](https://github.com/aeosynth)) - -## [v0.0.7](https://github.com/shelljs/shelljs/tree/v0.0.7) (2012-09-23) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6...v0.0.7) - -**Closed issues:** - -- gh-pages: clicking 'fork me' just reloads the page [\#26](https://github.com/shelljs/shelljs/issues/26) -- Not declared local var implies possible memory leak [\#21](https://github.com/shelljs/shelljs/issues/21) -- Cannot echo a string that starts with - [\#20](https://github.com/shelljs/shelljs/issues/20) -- Unexpected cp behaviour with directories [\#15](https://github.com/shelljs/shelljs/issues/15) - -**Merged pull requests:** - -- add primaries to \_test [\#23](https://github.com/shelljs/shelljs/pull/23) ([aeosynth](https://github.com/aeosynth)) - -## [v0.0.6](https://github.com/shelljs/shelljs/tree/v0.0.6) (2012-08-07) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6pre2...v0.0.6) - -**Merged pull requests:** - -- Fixed a global variable leak [\#16](https://github.com/shelljs/shelljs/pull/16) ([dallonf](https://github.com/dallonf)) - -## [v0.0.6pre2](https://github.com/shelljs/shelljs/tree/v0.0.6pre2) (2012-05-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6pre1...v0.0.6pre2) - -## [v0.0.6pre1](https://github.com/shelljs/shelljs/tree/v0.0.6pre1) (2012-05-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5...v0.0.6pre1) - -## [v0.0.5](https://github.com/shelljs/shelljs/tree/v0.0.5) (2012-05-24) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre4...v0.0.5) - -**Closed issues:** - -- global.key assigned value 'async' as a result of shell.exec\(...\) [\#12](https://github.com/shelljs/shelljs/issues/12) - -**Merged pull requests:** - -- Add support for grep option -v. [\#13](https://github.com/shelljs/shelljs/pull/13) ([kkujala](https://github.com/kkujala)) - -## [v0.0.5pre4](https://github.com/shelljs/shelljs/tree/v0.0.5pre4) (2012-03-27) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre3...v0.0.5pre4) - -## [v0.0.5pre3](https://github.com/shelljs/shelljs/tree/v0.0.5pre3) (2012-03-27) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre2...v0.0.5pre3) - -## [v0.0.5pre2](https://github.com/shelljs/shelljs/tree/v0.0.5pre2) (2012-03-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre1...v0.0.5pre2) - -## [v0.0.5pre1](https://github.com/shelljs/shelljs/tree/v0.0.5pre1) (2012-03-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.4...v0.0.5pre1) - -**Closed issues:** - -- rm\(\) does not respect read/write modes [\#6](https://github.com/shelljs/shelljs/issues/6) - -## [v0.0.4](https://github.com/shelljs/shelljs/tree/v0.0.4) (2012-03-22) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.3...v0.0.4) - -**Closed issues:** - -- "For convenient iteration via `for in`, ..."? [\#4](https://github.com/shelljs/shelljs/issues/4) - -## [v0.0.3](https://github.com/shelljs/shelljs/tree/v0.0.3) (2012-03-21) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.2...v0.0.3) - -## [v0.0.2](https://github.com/shelljs/shelljs/tree/v0.0.2) (2012-03-15) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.2pre1...v0.0.2) - -## [v0.0.2pre1](https://github.com/shelljs/shelljs/tree/v0.0.2pre1) (2012-03-03) - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file +There is no job for shelljs/shelljs. Make a POST first. \ No newline at end of file From 0ff1244a7e36d8c7961024b670cc79596a101773 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Sun, 8 Jan 2017 14:39:40 -0800 Subject: [PATCH 096/338] docs(changelog): updated by Brandon Freitag [ci skip] --- CHANGELOG.md | 709 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 708 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8d7ab214..e66d72cf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1,708 @@ -There is no job for shelljs/shelljs. Make a POST first. \ No newline at end of file +# Change Log + +## [v0.7.6](https://github.com/shelljs/shelljs/tree/v0.7.6) (2017-01-08) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.5...v0.7.6) + +**Closed issues:** + +- unable to execute ionic command with shell js [\#640](https://github.com/shelljs/shelljs/issues/640) +- How to increase ShellJS buffer size? [\#639](https://github.com/shelljs/shelljs/issues/639) +- mkdir fails with non-normalized path [\#634](https://github.com/shelljs/shelljs/issues/634) +- Move execPath into common [\#633](https://github.com/shelljs/shelljs/issues/633) +- QUESTION: Feedback while an operation is running? [\#629](https://github.com/shelljs/shelljs/issues/629) +- Test setup/cleanup is broken [\#621](https://github.com/shelljs/shelljs/issues/621) +- Ignore temp directories when running lint [\#620](https://github.com/shelljs/shelljs/issues/620) +- parseOptions should throw an error if the option string doesn't start with '-' [\#614](https://github.com/shelljs/shelljs/issues/614) +- chore: LGTM.co is gone [\#595](https://github.com/shelljs/shelljs/issues/595) +- refactor: objectAssign should refer to Object.assign if it exists, or the internal polyfill otherwise [\#592](https://github.com/shelljs/shelljs/issues/592) +- parseOptions: allow a way to keep errors silent \(exception only\) [\#591](https://github.com/shelljs/shelljs/issues/591) +- \[Question\] commands with multiple options / arguments? [\#589](https://github.com/shelljs/shelljs/issues/589) +- feature: GNU Parallel [\#585](https://github.com/shelljs/shelljs/issues/585) +- write to file [\#568](https://github.com/shelljs/shelljs/issues/568) +- Cannot figure out how to disable globbing for rm [\#567](https://github.com/shelljs/shelljs/issues/567) +- Switch to the ava test framework [\#560](https://github.com/shelljs/shelljs/issues/560) +- feature: echo -n [\#559](https://github.com/shelljs/shelljs/issues/559) +- Option not recognized [\#556](https://github.com/shelljs/shelljs/issues/556) +- chore: add @freitagbr to LGTM maintainers [\#552](https://github.com/shelljs/shelljs/issues/552) +- chore: set up dev branch [\#548](https://github.com/shelljs/shelljs/issues/548) +- bug: cp\(\) doesn't always copy everything [\#547](https://github.com/shelljs/shelljs/issues/547) +- User-friendly lint command [\#544](https://github.com/shelljs/shelljs/issues/544) +- Lint warning [\#542](https://github.com/shelljs/shelljs/issues/542) +- Possible Regression: cp from 0.6.0 to 0.7.x version [\#538](https://github.com/shelljs/shelljs/issues/538) +- chore: add nodejs v7 to CI [\#537](https://github.com/shelljs/shelljs/issues/537) +- error.code is not always available [\#536](https://github.com/shelljs/shelljs/issues/536) +- Add shx as a dependency for testing [\#525](https://github.com/shelljs/shelljs/issues/525) +- Feature request: allow `common.error\(\)` to optionally not insert a prefix and optionally not print to console [\#523](https://github.com/shelljs/shelljs/issues/523) +- Feature request: Add "shelljs.unlink" [\#519](https://github.com/shelljs/shelljs/issues/519) +- Sed should allow a replacement string to contain `\1` for match groups [\#507](https://github.com/shelljs/shelljs/issues/507) +- Don't kill the node process upon unexpected error [\#483](https://github.com/shelljs/shelljs/issues/483) +- Usage with neodoc [\#445](https://github.com/shelljs/shelljs/issues/445) +- \[ Feature idea \] synchronous sleep command [\#441](https://github.com/shelljs/shelljs/issues/441) +- Improve test coverage [\#347](https://github.com/shelljs/shelljs/issues/347) +- Add a way to prevent shell-expansion on commands \(this issue is not for exec\) [\#345](https://github.com/shelljs/shelljs/issues/345) +- Chown [\#183](https://github.com/shelljs/shelljs/issues/183) +- spawn EMFILE [\#81](https://github.com/shelljs/shelljs/issues/81) +- Rewrite exec using execsync-ng \(which uses node-ffi\) [\#66](https://github.com/shelljs/shelljs/issues/66) +- `exec` gets stuck on my Debian box [\#51](https://github.com/shelljs/shelljs/issues/51) +- 100% cpu usage when a nodejs script goes side ways executing a command. [\#5](https://github.com/shelljs/shelljs/issues/5) + +**Merged pull requests:** + +- refactor: add config.reset\(\) and .resetForTesting\(\) [\#641](https://github.com/shelljs/shelljs/pull/641) ([nfischer](https://github.com/nfischer)) +- chore: set up test coverage [\#638](https://github.com/shelljs/shelljs/pull/638) ([nfischer](https://github.com/nfischer)) +- refactor: create common.execPath [\#636](https://github.com/shelljs/shelljs/pull/636) ([nfischer](https://github.com/nfischer)) +- fix: allow non-normalized paths as input to mkdir [\#635](https://github.com/shelljs/shelljs/pull/635) ([nfischer](https://github.com/nfischer)) +- Finalize moving to ava [\#630](https://github.com/shelljs/shelljs/pull/630) ([freitagbr](https://github.com/freitagbr)) +- test: refactor pushd tests to AVA [\#627](https://github.com/shelljs/shelljs/pull/627) ([nfischer](https://github.com/nfischer)) +- test: refactor popd tests to AVA [\#626](https://github.com/shelljs/shelljs/pull/626) ([nfischer](https://github.com/nfischer)) +- test: refactor shjs tests to AVA [\#625](https://github.com/shelljs/shelljs/pull/625) ([nfischer](https://github.com/nfischer)) +- test: remove tests for make \(deprecated\) [\#624](https://github.com/shelljs/shelljs/pull/624) ([nfischer](https://github.com/nfischer)) +- Ignore test temp directories during linting [\#623](https://github.com/shelljs/shelljs/pull/623) ([freitagbr](https://github.com/freitagbr)) +- refactor: list all commands in commands.json [\#616](https://github.com/shelljs/shelljs/pull/616) ([nfischer](https://github.com/nfischer)) +- Throw an error if the options string does not start with '-' [\#615](https://github.com/shelljs/shelljs/pull/615) ([freitagbr](https://github.com/freitagbr)) +- chore: switch to files attribute from npmignore [\#613](https://github.com/shelljs/shelljs/pull/613) ([nfischer](https://github.com/nfischer)) +- test: refactor 'test' command tests to AVA [\#612](https://github.com/shelljs/shelljs/pull/612) ([nfischer](https://github.com/nfischer)) +- test: refactor find tests to AVA [\#611](https://github.com/shelljs/shelljs/pull/611) ([nfischer](https://github.com/nfischer)) +- test: refactor ln tests to AVA [\#610](https://github.com/shelljs/shelljs/pull/610) ([nfischer](https://github.com/nfischer)) +- test: refactor ls to use AVA [\#609](https://github.com/shelljs/shelljs/pull/609) ([nfischer](https://github.com/nfischer)) +- test: refactor pipe tests to AVA [\#608](https://github.com/shelljs/shelljs/pull/608) ([nfischer](https://github.com/nfischer)) +- test: refactor sed tests to AVA [\#607](https://github.com/shelljs/shelljs/pull/607) ([nfischer](https://github.com/nfischer)) +- test: refactor grep tests to AVA [\#606](https://github.com/shelljs/shelljs/pull/606) ([nfischer](https://github.com/nfischer)) +- test: refactor global tests to AVA [\#605](https://github.com/shelljs/shelljs/pull/605) ([nfischer](https://github.com/nfischer)) +- test: refactor touch tests to AVA [\#604](https://github.com/shelljs/shelljs/pull/604) ([nfischer](https://github.com/nfischer)) +- test: refactor uniq tests to AVA [\#603](https://github.com/shelljs/shelljs/pull/603) ([nfischer](https://github.com/nfischer)) +- test: refactor sort tests to AVA [\#602](https://github.com/shelljs/shelljs/pull/602) ([nfischer](https://github.com/nfischer)) +- test: refactor tail tests to AVA [\#601](https://github.com/shelljs/shelljs/pull/601) ([nfischer](https://github.com/nfischer)) +- test: refactor head tests to AVA [\#600](https://github.com/shelljs/shelljs/pull/600) ([nfischer](https://github.com/nfischer)) +- test: refactor mkdir tests to AVA [\#599](https://github.com/shelljs/shelljs/pull/599) ([nfischer](https://github.com/nfischer)) +- Fix: rm behavior regarding symlinks [\#598](https://github.com/shelljs/shelljs/pull/598) ([freitagbr](https://github.com/freitagbr)) +- test: refactor mv tests to AVA [\#597](https://github.com/shelljs/shelljs/pull/597) ([nfischer](https://github.com/nfischer)) +- Remove files related to lgtm.co [\#596](https://github.com/shelljs/shelljs/pull/596) ([freitagbr](https://github.com/freitagbr)) +- Add ability to configure error from parseOptions [\#594](https://github.com/shelljs/shelljs/pull/594) ([freitagbr](https://github.com/freitagbr)) +- Use Object.assign if possible [\#593](https://github.com/shelljs/shelljs/pull/593) ([freitagbr](https://github.com/freitagbr)) +- Add "-n" option to echo [\#590](https://github.com/shelljs/shelljs/pull/590) ([freitagbr](https://github.com/freitagbr)) +- test: refactor rm tests to AVA [\#586](https://github.com/shelljs/shelljs/pull/586) ([nfischer](https://github.com/nfischer)) +- test: refactor pwd tests to AVA [\#582](https://github.com/shelljs/shelljs/pull/582) ([nfischer](https://github.com/nfischer)) +- test: refactor tempdir tests to AVA [\#581](https://github.com/shelljs/shelljs/pull/581) ([nfischer](https://github.com/nfischer)) +- test: refactor 'which' tests to AVA [\#580](https://github.com/shelljs/shelljs/pull/580) ([nfischer](https://github.com/nfischer)) +- test: refactor plugin tests to AVA [\#579](https://github.com/shelljs/shelljs/pull/579) ([nfischer](https://github.com/nfischer)) +- test: refactor toEnd tests to AVA [\#578](https://github.com/shelljs/shelljs/pull/578) ([nfischer](https://github.com/nfischer)) +- test: refactor to tests to AVA [\#577](https://github.com/shelljs/shelljs/pull/577) ([nfischer](https://github.com/nfischer)) +- test: refactor 'set' tests to AVA [\#576](https://github.com/shelljs/shelljs/pull/576) ([nfischer](https://github.com/nfischer)) +- test: refactor echo tests to AVA [\#575](https://github.com/shelljs/shelljs/pull/575) ([nfischer](https://github.com/nfischer)) +- test: refactor exec tests to AVA [\#574](https://github.com/shelljs/shelljs/pull/574) ([nfischer](https://github.com/nfischer)) +- test: refactor env tests to AVA [\#573](https://github.com/shelljs/shelljs/pull/573) ([nfischer](https://github.com/nfischer)) +- test: refactor dirs tests to AVA [\#572](https://github.com/shelljs/shelljs/pull/572) ([nfischer](https://github.com/nfischer)) +- test: refactor config tests to AVA [\#571](https://github.com/shelljs/shelljs/pull/571) ([nfischer](https://github.com/nfischer)) +- test: refactor common tests to AVA [\#570](https://github.com/shelljs/shelljs/pull/570) ([nfischer](https://github.com/nfischer)) +- test: refactor chmod tests to AVA [\#569](https://github.com/shelljs/shelljs/pull/569) ([nfischer](https://github.com/nfischer)) +- test: refactor cp tests to ava [\#565](https://github.com/shelljs/shelljs/pull/565) ([nfischer](https://github.com/nfischer)) +- test: refactor cat tests to ava [\#564](https://github.com/shelljs/shelljs/pull/564) ([nfischer](https://github.com/nfischer)) +- test: set up ava and move cd.js [\#561](https://github.com/shelljs/shelljs/pull/561) ([nfischer](https://github.com/nfischer)) +- Update sed documentation regarding capture groups [\#558](https://github.com/shelljs/shelljs/pull/558) ([freitagbr](https://github.com/freitagbr)) +- Add newline to output of echo [\#557](https://github.com/shelljs/shelljs/pull/557) ([freitagbr](https://github.com/freitagbr)) +- fix: handle code-less errors more carefully in exec [\#554](https://github.com/shelljs/shelljs/pull/554) ([nfischer](https://github.com/nfischer)) +- Add Brandon Freitag to maintainers/contributors [\#553](https://github.com/shelljs/shelljs/pull/553) ([freitagbr](https://github.com/freitagbr)) +- Get pipe tests running on Windows. [\#550](https://github.com/shelljs/shelljs/pull/550) ([binki](https://github.com/binki)) +- fix: maxdepth doesn't limit total number of copies [\#549](https://github.com/shelljs/shelljs/pull/549) ([nfischer](https://github.com/nfischer)) +- Safely exit by throwing an error [\#546](https://github.com/shelljs/shelljs/pull/546) ([freitagbr](https://github.com/freitagbr)) +- Fix lint warning [\#543](https://github.com/shelljs/shelljs/pull/543) ([freitagbr](https://github.com/freitagbr)) +- chore: remove v0.10 from Travis CI [\#540](https://github.com/shelljs/shelljs/pull/540) ([nfischer](https://github.com/nfischer)) +- chore: add Node v7 for CI [\#539](https://github.com/shelljs/shelljs/pull/539) ([nfischer](https://github.com/nfischer)) + +## [v0.7.5](https://github.com/shelljs/shelljs/tree/v0.7.5) (2016-10-27) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.4...v0.7.5) + +**Closed issues:** + +- Project objectives: there is some higher goal to achieve? [\#533](https://github.com/shelljs/shelljs/issues/533) +- fs.existsSync is un-deprecated [\#531](https://github.com/shelljs/shelljs/issues/531) +- Inadvertent breaking change to shell.test\(\) [\#529](https://github.com/shelljs/shelljs/issues/529) +- Add -u flag support for cp [\#526](https://github.com/shelljs/shelljs/issues/526) +- API request: allow `plugin.error\(\)` to take an options parameter [\#522](https://github.com/shelljs/shelljs/issues/522) +- FS Real Path error thrown when requiring shelljs [\#521](https://github.com/shelljs/shelljs/issues/521) +- Question: passing code via pipe? [\#520](https://github.com/shelljs/shelljs/issues/520) +- The performance in `cp` is different between `0.6.0` and `0.7.4` [\#517](https://github.com/shelljs/shelljs/issues/517) +- ShellJS in Electron package don't find ffmpeg anymore [\#516](https://github.com/shelljs/shelljs/issues/516) +- Exec issues with string option introduced in 0.7.4 [\#515](https://github.com/shelljs/shelljs/issues/515) +- \[ Feature \] SSH command [\#435](https://github.com/shelljs/shelljs/issues/435) +- Synchronous exec stalls permenantly when there is an error/w the shell [\#7](https://github.com/shelljs/shelljs/issues/7) + +**Merged pull requests:** + +- feat: plugin.error\(\) takes an options parameter [\#535](https://github.com/shelljs/shelljs/pull/535) ([nfischer](https://github.com/nfischer)) +- Revert "refactor: replace fs.existsSync" fixes\(\#531\) [\#532](https://github.com/shelljs/shelljs/pull/532) ([gyandeeps](https://github.com/gyandeeps)) +- Fix: Remove default glob from shell.test \(fixes \#529\) [\#530](https://github.com/shelljs/shelljs/pull/530) ([gyandeeps](https://github.com/gyandeeps)) +- feat: cp -u option [\#527](https://github.com/shelljs/shelljs/pull/527) ([nfischer](https://github.com/nfischer)) +- chore: add downloads per month on README [\#513](https://github.com/shelljs/shelljs/pull/513) ([nfischer](https://github.com/nfischer)) + +## [v0.7.4](https://github.com/shelljs/shelljs/tree/v0.7.4) (2016-08-26) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.3...v0.7.4) + +**Closed issues:** + +- fix: echo -e should not print "-e" [\#510](https://github.com/shelljs/shelljs/issues/510) +- Wrong method signature in doc [\#498](https://github.com/shelljs/shelljs/issues/498) +- readFromPipe should be a function with no arguments [\#485](https://github.com/shelljs/shelljs/issues/485) +- TypeError: Cannot read property 'toString' of undefined [\#471](https://github.com/shelljs/shelljs/issues/471) + +**Merged pull requests:** + +- fix: echo supports -e option properly [\#511](https://github.com/shelljs/shelljs/pull/511) ([nfischer](https://github.com/nfischer)) +- refactor: replace fs.existsSync [\#509](https://github.com/shelljs/shelljs/pull/509) ([nfischer](https://github.com/nfischer)) +- refactor: readFromPipe\(\) requires no arguments [\#506](https://github.com/shelljs/shelljs/pull/506) ([nfischer](https://github.com/nfischer)) +- chore: switch to eslint [\#504](https://github.com/shelljs/shelljs/pull/504) ([nfischer](https://github.com/nfischer)) +- feat: add overWrite option for commands [\#503](https://github.com/shelljs/shelljs/pull/503) ([nfischer](https://github.com/nfischer)) +- chore: update issue template [\#502](https://github.com/shelljs/shelljs/pull/502) ([nfischer](https://github.com/nfischer)) +- fixed head/tail readme [\#499](https://github.com/shelljs/shelljs/pull/499) ([charlesread](https://github.com/charlesread)) + +## [v0.7.3](https://github.com/shelljs/shelljs/tree/v0.7.3) (2016-07-27) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.2...v0.7.3) + +**Closed issues:** + +- expose execSync [\#494](https://github.com/shelljs/shelljs/issues/494) +- Add a way to create commands that can receive from a pipe without being standalone commands [\#487](https://github.com/shelljs/shelljs/issues/487) +- cp -r breaks when the directory contains a softlink [\#193](https://github.com/shelljs/shelljs/issues/193) +- Redirect output to file fails [\#60](https://github.com/shelljs/shelljs/issues/60) +- We need sed -n ? [\#38](https://github.com/shelljs/shelljs/issues/38) + +**Merged pull requests:** + +- refactor: allow pipeOnly commands \(methods on ShellStrings\) [\#493](https://github.com/shelljs/shelljs/pull/493) ([nfischer](https://github.com/nfischer)) +- refactor: glob by default for commands [\#492](https://github.com/shelljs/shelljs/pull/492) ([nfischer](https://github.com/nfischer)) +- refactor: switch from notUnix to unix in wrap\(\) [\#491](https://github.com/shelljs/shelljs/pull/491) ([nfischer](https://github.com/nfischer)) +- refactor: switch common.extend\(\) to Object.assign ponyfill [\#490](https://github.com/shelljs/shelljs/pull/490) ([nfischer](https://github.com/nfischer)) +- fix: conflicting options now properly override each other [\#489](https://github.com/shelljs/shelljs/pull/489) ([nfischer](https://github.com/nfischer)) +- refactor: expose plugin utils & add initial tests [\#484](https://github.com/shelljs/shelljs/pull/484) ([nfischer](https://github.com/nfischer)) + +## [v0.7.2](https://github.com/shelljs/shelljs/tree/v0.7.2) (2016-07-25) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.1...v0.7.2) + +**Closed issues:** + +- shelljs should not kill process if node call throws exception [\#473](https://github.com/shelljs/shelljs/issues/473) +- `cp` work incorrectly when folder name contains '@' [\#463](https://github.com/shelljs/shelljs/issues/463) +- Something went wrong [\#158](https://github.com/shelljs/shelljs/issues/158) + +**Merged pull requests:** + +- fix: resolve a cylcic-dependency problem [\#482](https://github.com/shelljs/shelljs/pull/482) ([nfischer](https://github.com/nfischer)) +- refactor: add wrapOutput option to auto-ShellString-ify command output [\#481](https://github.com/shelljs/shelljs/pull/481) ([nfischer](https://github.com/nfischer)) +- refactor: move option parsing into common.wrap\(\) [\#479](https://github.com/shelljs/shelljs/pull/479) ([nfischer](https://github.com/nfischer)) +- refactor: hook new uniq\(\) command using new format [\#478](https://github.com/shelljs/shelljs/pull/478) ([nfischer](https://github.com/nfischer)) +- Fix mkdir malformed path [\#477](https://github.com/shelljs/shelljs/pull/477) ([nfischer](https://github.com/nfischer)) +- fix: mkdir for invalid perms does not kill process [\#474](https://github.com/shelljs/shelljs/pull/474) ([nfischer](https://github.com/nfischer)) +- feat\(command\): new command: uniq\(\) [\#453](https://github.com/shelljs/shelljs/pull/453) ([joshi-sh](https://github.com/joshi-sh)) + +## [v0.7.1](https://github.com/shelljs/shelljs/tree/v0.7.1) (2016-07-22) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.0...v0.7.1) + +**Closed issues:** + +- cp -n doesn't work correctly [\#465](https://github.com/shelljs/shelljs/issues/465) +- how can i run sudo apt-get install xtodotool by your plugin? [\#448](https://github.com/shelljs/shelljs/issues/448) +- shell.js grep: internal error, Invalid regular expression [\#447](https://github.com/shelljs/shelljs/issues/447) +- Stdout is empty on Git log command [\#439](https://github.com/shelljs/shelljs/issues/439) +- Cannot read toString of null when using execSync [\#415](https://github.com/shelljs/shelljs/issues/415) +- cp -R dir/ target fails to copy hidden files in dir [\#140](https://github.com/shelljs/shelljs/issues/140) +- Adding callback to basic commands [\#102](https://github.com/shelljs/shelljs/issues/102) +- \#mv Won't Work Across Disks [\#1](https://github.com/shelljs/shelljs/issues/1) + +**Merged pull requests:** + +- refactor: commands now register themselves [\#475](https://github.com/shelljs/shelljs/pull/475) ([nfischer](https://github.com/nfischer)) +- chore: switch to shields.io, and add npm badge [\#470](https://github.com/shelljs/shelljs/pull/470) ([nfischer](https://github.com/nfischer)) +- fix\(cp\): -n option no longer raises error [\#466](https://github.com/shelljs/shelljs/pull/466) ([nfischer](https://github.com/nfischer)) +- refactor: expose pipe-ability to command configuration [\#464](https://github.com/shelljs/shelljs/pull/464) ([nfischer](https://github.com/nfischer)) +- fix\(mv\): works across partitions [\#461](https://github.com/shelljs/shelljs/pull/461) ([nfischer](https://github.com/nfischer)) +- chore: switch to shelljs-changelog [\#460](https://github.com/shelljs/shelljs/pull/460) ([nfischer](https://github.com/nfischer)) +- chore: update release process [\#459](https://github.com/shelljs/shelljs/pull/459) ([nfischer](https://github.com/nfischer)) +- chore: revert depreciate shelljs/make \(\#431\) [\#458](https://github.com/shelljs/shelljs/pull/458) ([zephraph](https://github.com/zephraph)) +- chore: clarify message for when docs are not generated [\#457](https://github.com/shelljs/shelljs/pull/457) ([nfischer](https://github.com/nfischer)) +- chore\(gendocs\): add `npm run gendocs` command [\#455](https://github.com/shelljs/shelljs/pull/455) ([nfischer](https://github.com/nfischer)) +- chore: update jshint and move it to an npm script [\#454](https://github.com/shelljs/shelljs/pull/454) ([nfischer](https://github.com/nfischer)) +- test\(ls\): add case for trailing slash on dir name [\#450](https://github.com/shelljs/shelljs/pull/450) ([nfischer](https://github.com/nfischer)) +- docs\(exec\): explicitly mention the `shell` option [\#449](https://github.com/shelljs/shelljs/pull/449) ([nfischer](https://github.com/nfischer)) +- chore: setup changelog [\#443](https://github.com/shelljs/shelljs/pull/443) ([levithomason](https://github.com/levithomason)) +- docs: comment code better to help contributors [\#437](https://github.com/shelljs/shelljs/pull/437) ([nfischer](https://github.com/nfischer)) +- chore\(CI\): update appveyor [\#436](https://github.com/shelljs/shelljs/pull/436) ([nfischer](https://github.com/nfischer)) +- chore: test against node v6 [\#433](https://github.com/shelljs/shelljs/pull/433) ([nfischer](https://github.com/nfischer)) +- chore\(make\): depreciate shelljs/make [\#431](https://github.com/shelljs/shelljs/pull/431) ([ariporad](https://github.com/ariporad)) +- docs: warn that README contains newest features [\#410](https://github.com/shelljs/shelljs/pull/410) ([nfischer](https://github.com/nfischer)) + +## [v0.7.0](https://github.com/shelljs/shelljs/tree/v0.7.0) (2016-04-25) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.6.0...v0.7.0) + +**Closed issues:** + +- exec\('nohup node some.js &'\) [\#426](https://github.com/shelljs/shelljs/issues/426) +- cp copy to symlinked folder [\#414](https://github.com/shelljs/shelljs/issues/414) +- Invalid version number \(0.0.1alpha1\) [\#399](https://github.com/shelljs/shelljs/issues/399) +- shelljs Breaks SemVer for Alpha and Pre-Release Versions [\#390](https://github.com/shelljs/shelljs/issues/390) +- Copy not accepting source end with wildcards \* when using -r on v0.6.0 [\#389](https://github.com/shelljs/shelljs/issues/389) +- Support globbing in `shjs` [\#388](https://github.com/shelljs/shelljs/issues/388) +- Refactor more commands to return ShellString [\#373](https://github.com/shelljs/shelljs/issues/373) +- ln\('-sf', './', '\'\) is not linking the right folder [\#363](https://github.com/shelljs/shelljs/issues/363) +- v0.6.0 - shell.cp\('r', '/foo/\*, '/bar'\) fails with /foo/\* no such file or directory [\#342](https://github.com/shelljs/shelljs/issues/342) +- Add documentup as a webhook [\#327](https://github.com/shelljs/shelljs/issues/327) +- Dir glob breaks when in the middle of path [\#245](https://github.com/shelljs/shelljs/issues/245) +- could you switch off wiki page? [\#233](https://github.com/shelljs/shelljs/issues/233) +- ls globbing does not behave like shell, consider using glob.sync [\#225](https://github.com/shelljs/shelljs/issues/225) +- Cannot run shell.exec\('heroku config:push'\) -- just hangs [\#218](https://github.com/shelljs/shelljs/issues/218) +- `cp` does not overwrite files by default [\#210](https://github.com/shelljs/shelljs/issues/210) +- exec failed to return [\#208](https://github.com/shelljs/shelljs/issues/208) +- CLI Version [\#202](https://github.com/shelljs/shelljs/issues/202) +- Bracket expansion not working [\#176](https://github.com/shelljs/shelljs/issues/176) +- "exec" causes LiveScript interpreter \(lsc\) to hang [\#160](https://github.com/shelljs/shelljs/issues/160) +- Don't modify string prototype [\#159](https://github.com/shelljs/shelljs/issues/159) +- `exec\(...\).to\(file\)` should work [\#154](https://github.com/shelljs/shelljs/issues/154) +- Would like to see more async variants for cp/rm etc [\#144](https://github.com/shelljs/shelljs/issues/144) +- Can't install shelljs locally instead of globally [\#136](https://github.com/shelljs/shelljs/issues/136) +- shelljs and node 0.10.28 [\#125](https://github.com/shelljs/shelljs/issues/125) +- Use case for global installed shelljs [\#123](https://github.com/shelljs/shelljs/issues/123) +- Only get stdout from `exec` [\#92](https://github.com/shelljs/shelljs/issues/92) +- What about other commands? [\#90](https://github.com/shelljs/shelljs/issues/90) +- Flesh out example of exit\(\) [\#73](https://github.com/shelljs/shelljs/issues/73) +- exec doesn't work with qualified paths on windows [\#41](https://github.com/shelljs/shelljs/issues/41) +- exec does not working in mingw bash in windows [\#17](https://github.com/shelljs/shelljs/issues/17) +- Add support for cp -P option [\#413](https://github.com/shelljs/shelljs/issues/413) +- cp -L: Incorrect behavior for symlinks to regular files [\#407](https://github.com/shelljs/shelljs/issues/407) +- Edit the docs to emphasize ShellStrings and Pipes [\#398](https://github.com/shelljs/shelljs/issues/398) +- Error message isn't always printed [\#372](https://github.com/shelljs/shelljs/issues/372) +- Standardize command output [\#356](https://github.com/shelljs/shelljs/issues/356) +- exec\(\) doesn't clean up all temp files [\#353](https://github.com/shelljs/shelljs/issues/353) +- Document that exec\(\) options don't work on early versions of node [\#350](https://github.com/shelljs/shelljs/issues/350) +- Add -f option to set\(\) [\#344](https://github.com/shelljs/shelljs/issues/344) +- Glob commands by default [\#343](https://github.com/shelljs/shelljs/issues/343) +- rm -rf incorrect behaviour [\#332](https://github.com/shelljs/shelljs/issues/332) +- Switch `exec\(\)` to use bash by default [\#281](https://github.com/shelljs/shelljs/issues/281) +- pipe to proc [\#148](https://github.com/shelljs/shelljs/issues/148) +- shell builtin [\#138](https://github.com/shelljs/shelljs/issues/138) +- add timeout option for exec [\#132](https://github.com/shelljs/shelljs/issues/132) +- shelljs cp handling symlinks badly [\#69](https://github.com/shelljs/shelljs/issues/69) + +**Merged pull requests:** + +- chore: add "Team" section to README [\#423](https://github.com/shelljs/shelljs/pull/423) ([nfischer](https://github.com/nfischer)) +- Contributing guidelines [\#422](https://github.com/shelljs/shelljs/pull/422) ([nfischer](https://github.com/nfischer)) +- feat\(glob\): expose config.globOptions. [\#400](https://github.com/shelljs/shelljs/pull/400) ([nfischer](https://github.com/nfischer)) +- Add shelljs as a keyword in package.json [\#393](https://github.com/shelljs/shelljs/pull/393) ([nfischer](https://github.com/nfischer)) +- docs: add link to wiki page [\#392](https://github.com/shelljs/shelljs/pull/392) ([nfischer](https://github.com/nfischer)) +- refactor\(cd\): use process.env.OLDPWD to store previous dir [\#383](https://github.com/shelljs/shelljs/pull/383) ([nfischer](https://github.com/nfischer)) +- chore\(appveyor\): add in node 4 for appveyor [\#381](https://github.com/shelljs/shelljs/pull/381) ([nfischer](https://github.com/nfischer)) +- Add Cash cross-reference [\#375](https://github.com/shelljs/shelljs/pull/375) ([dthree](https://github.com/dthree)) +- Ignore gitattributes from npm package [\#361](https://github.com/shelljs/shelljs/pull/361) ([nfischer](https://github.com/nfischer)) +- Consistently use LF line endings [\#355](https://github.com/shelljs/shelljs/pull/355) ([TimothyGu](https://github.com/TimothyGu)) +- Release v0.7.0 [\#429](https://github.com/shelljs/shelljs/pull/429) ([nfischer](https://github.com/nfischer)) +- fix: null is no longer confused for an object [\#428](https://github.com/shelljs/shelljs/pull/428) ([nfischer](https://github.com/nfischer)) +- fix\(ls\): no trailing newline for empty directories [\#425](https://github.com/shelljs/shelljs/pull/425) ([nfischer](https://github.com/nfischer)) +- feat\(cp\): -P option, plus better handling of symlinks [\#421](https://github.com/shelljs/shelljs/pull/421) ([nfischer](https://github.com/nfischer)) +- docs\(exec\): fix docs about exec return type [\#419](https://github.com/shelljs/shelljs/pull/419) ([nfischer](https://github.com/nfischer)) +- docs\(error\): deprecate relying on string value [\#418](https://github.com/shelljs/shelljs/pull/418) ([nfischer](https://github.com/nfischer)) +- fix: error message now printed for fatal failures [\#417](https://github.com/shelljs/shelljs/pull/417) ([nfischer](https://github.com/nfischer)) +- issue-407: Add regular files unit tests and fix symlink copy behavior [\#409](https://github.com/shelljs/shelljs/pull/409) ([charlesverge](https://github.com/charlesverge)) +- refactor\(rm\): Remove duplicate code [\#408](https://github.com/shelljs/shelljs/pull/408) ([nfischer](https://github.com/nfischer)) +- docs: wildcards for all commands, other docs cleanups [\#404](https://github.com/shelljs/shelljs/pull/404) ([nfischer](https://github.com/nfischer)) +- test\(rm\): add tests to prevent a future regression [\#403](https://github.com/shelljs/shelljs/pull/403) ([nfischer](https://github.com/nfischer)) +- refactor\(string\): modify string protoype, but only for shelljs/global [\#401](https://github.com/shelljs/shelljs/pull/401) ([nfischer](https://github.com/nfischer)) +- feat: adding error codes to ShellJS [\#394](https://github.com/shelljs/shelljs/pull/394) ([nfischer](https://github.com/nfischer)) +- feature: use rechoir [\#384](https://github.com/shelljs/shelljs/pull/384) ([nfischer](https://github.com/nfischer)) +- refactor\(cp\): clean up code and fix \#376 [\#380](https://github.com/shelljs/shelljs/pull/380) ([nfischer](https://github.com/nfischer)) +- New commands: sort\(\), head\(\), and tail\(\) [\#379](https://github.com/shelljs/shelljs/pull/379) ([nfischer](https://github.com/nfischer)) +- Add unit tests to prevent regression \(see \#376\) [\#378](https://github.com/shelljs/shelljs/pull/378) ([nfischer](https://github.com/nfischer)) +- feat\(pipe\): add support for pipes between commands [\#370](https://github.com/shelljs/shelljs/pull/370) ([nfischer](https://github.com/nfischer)) +- refactor\(ls\): greatly simplify ls implimentation [\#369](https://github.com/shelljs/shelljs/pull/369) ([ariporad](https://github.com/ariporad)) +- chore: drop node v0.10 support [\#368](https://github.com/shelljs/shelljs/pull/368) ([ariporad](https://github.com/ariporad)) +- perf\(cd\): only run `stat` once [\#367](https://github.com/shelljs/shelljs/pull/367) ([ariporad](https://github.com/ariporad)) +- fix\(exec\): properly handles paths with spaces and quotes [\#365](https://github.com/shelljs/shelljs/pull/365) ([nfischer](https://github.com/nfischer)) +- test\(ln\): add tests for linking to cwd [\#364](https://github.com/shelljs/shelljs/pull/364) ([nfischer](https://github.com/nfischer)) +- fix\(verbose\): verbose-style logging is consistent [\#362](https://github.com/shelljs/shelljs/pull/362) ([nfischer](https://github.com/nfischer)) +- Refactor shellstring [\#360](https://github.com/shelljs/shelljs/pull/360) ([nfischer](https://github.com/nfischer)) +- feat\(glob\): use glob module for globbing [\#359](https://github.com/shelljs/shelljs/pull/359) ([nfischer](https://github.com/nfischer)) +- feat\(set\): add -f option to disable globbing [\#358](https://github.com/shelljs/shelljs/pull/358) ([nfischer](https://github.com/nfischer)) +- config.fatal now throws an exception [\#357](https://github.com/shelljs/shelljs/pull/357) ([jrmclaurin](https://github.com/jrmclaurin)) +- fix\(exec\): temp files are now cleaned up [\#354](https://github.com/shelljs/shelljs/pull/354) ([nfischer](https://github.com/nfischer)) +- feat\(glob\): glob support for \(almost\) all commands [\#352](https://github.com/shelljs/shelljs/pull/352) ([nfischer](https://github.com/nfischer)) +- feat\(grep\): add -l option [\#349](https://github.com/shelljs/shelljs/pull/349) ([nfischer](https://github.com/nfischer)) +- fix\(exec\): now actually supports shell option [\#348](https://github.com/shelljs/shelljs/pull/348) ([nfischer](https://github.com/nfischer)) +- feat\(touch\): supports multiple files [\#346](https://github.com/shelljs/shelljs/pull/346) ([nfischer](https://github.com/nfischer)) + +## [v0.6.0](https://github.com/shelljs/shelljs/tree/v0.6.0) (2016-02-05) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.3...v0.6.0) + +**Closed issues:** + +- option not recognized [\#334](https://github.com/shelljs/shelljs/issues/334) +- Feature request: Metadata with `ls` [\#323](https://github.com/shelljs/shelljs/issues/323) +- Gen-docs is broken [\#309](https://github.com/shelljs/shelljs/issues/309) +- `link -s` is broken for files on Windows [\#301](https://github.com/shelljs/shelljs/issues/301) +- Shelljs quits unexpectedly: [\#300](https://github.com/shelljs/shelljs/issues/300) +- Failing tests on Windows [\#296](https://github.com/shelljs/shelljs/issues/296) +- run-tests.js is broken for cmd.exe [\#294](https://github.com/shelljs/shelljs/issues/294) +- Support echo-ing environment variables [\#291](https://github.com/shelljs/shelljs/issues/291) +- Add Windows CI [\#287](https://github.com/shelljs/shelljs/issues/287) +- Add tests for the shjs utility [\#280](https://github.com/shelljs/shelljs/issues/280) +- Allow shjs utility to infer the extension for "filename." [\#278](https://github.com/shelljs/shelljs/issues/278) +- Ability to read the stdout buffer line-by-line [\#277](https://github.com/shelljs/shelljs/issues/277) +- Poor output for commands with multiple errors [\#267](https://github.com/shelljs/shelljs/issues/267) +- Travis ci build status says "unknown" [\#266](https://github.com/shelljs/shelljs/issues/266) +- wild card characters in filename not working as expected [\#262](https://github.com/shelljs/shelljs/issues/262) +- shell.exec - read internal variable [\#260](https://github.com/shelljs/shelljs/issues/260) +- cp and rename directory with -r doesn't match unix behavior [\#256](https://github.com/shelljs/shelljs/issues/256) +- console.log.apply throwing TypeError: Illegal Invocation [\#255](https://github.com/shelljs/shelljs/issues/255) +- How to exit on first error [\#253](https://github.com/shelljs/shelljs/issues/253) +- why not support set 'cwd' when invoke execAsync ? [\#250](https://github.com/shelljs/shelljs/issues/250) +- Not possible to check the failure of cd? [\#247](https://github.com/shelljs/shelljs/issues/247) +- By default shelljs runs command in root [\#246](https://github.com/shelljs/shelljs/issues/246) +- /usr/bin/env: node: No such file or directory [\#243](https://github.com/shelljs/shelljs/issues/243) +- "Which" command not working properly on Windows Platform. [\#238](https://github.com/shelljs/shelljs/issues/238) +- Arguments [\#237](https://github.com/shelljs/shelljs/issues/237) +- sed\(\) should accept multiple file arguments [\#231](https://github.com/shelljs/shelljs/issues/231) +- shelljs.exec\('aaa && bbb'\) blocks [\#229](https://github.com/shelljs/shelljs/issues/229) +- Consider creating a GitHub Organization with more maintainers [\#223](https://github.com/shelljs/shelljs/issues/223) +- Doesn't work inside Electron [\#220](https://github.com/shelljs/shelljs/issues/220) +- \[idea\] Add chmodr function. [\#219](https://github.com/shelljs/shelljs/issues/219) +- Execute a file [\#211](https://github.com/shelljs/shelljs/issues/211) +- Where is standard error going to? [\#209](https://github.com/shelljs/shelljs/issues/209) +- boolean return value for string.to\(\) [\#205](https://github.com/shelljs/shelljs/issues/205) +- `common.error` doesn't throw [\#199](https://github.com/shelljs/shelljs/issues/199) +- Problems with exec \(sync\) on 0.12/io.js [\#197](https://github.com/shelljs/shelljs/issues/197) +- cp --update flag [\#172](https://github.com/shelljs/shelljs/issues/172) +- Is there a way to suppress pushd/popd output? [\#171](https://github.com/shelljs/shelljs/issues/171) +- Cannot recursively list all \*.js files [\#162](https://github.com/shelljs/shelljs/issues/162) +- exec\(\) breaks if executed in a deleted directory [\#157](https://github.com/shelljs/shelljs/issues/157) +- shjs command always exits with zero code [\#133](https://github.com/shelljs/shelljs/issues/133) +- Windows failing tests [\#127](https://github.com/shelljs/shelljs/issues/127) +- touch command [\#122](https://github.com/shelljs/shelljs/issues/122) +- Symbolic links are broken! [\#100](https://github.com/shelljs/shelljs/issues/100) +- interpret `--` as stdin [\#55](https://github.com/shelljs/shelljs/issues/55) +- Error ENOTEMPTY when deleting a directory recursively. [\#49](https://github.com/shelljs/shelljs/issues/49) +- Cross-platform way to add to PATH [\#32](https://github.com/shelljs/shelljs/issues/32) +- `mv` fails on block, character, fifo [\#25](https://github.com/shelljs/shelljs/issues/25) +- ls -l [\#22](https://github.com/shelljs/shelljs/issues/22) + +**Merged pull requests:** + +- feat\(set\): add new set\(\) command [\#329](https://github.com/shelljs/shelljs/pull/329) ([nfischer](https://github.com/nfischer)) +- Fix symlinking on Windows [\#322](https://github.com/shelljs/shelljs/pull/322) ([BYK](https://github.com/BYK)) +- Rewrite .gitignore to be more comprehensive [\#321](https://github.com/shelljs/shelljs/pull/321) ([BYK](https://github.com/BYK)) +- chore\(gitter/travis\): add gitter webhook to travis [\#313](https://github.com/shelljs/shelljs/pull/313) ([ariporad](https://github.com/ariporad)) +- chore\(LGTM\): add LGTM config files [\#312](https://github.com/shelljs/shelljs/pull/312) ([ariporad](https://github.com/ariporad)) +- feat\(ls\): add -d flag to ls\(\) [\#311](https://github.com/shelljs/shelljs/pull/311) ([nfischer](https://github.com/nfischer)) +- fix\(gen-docs\): fix issue where docs are generated wrong [\#310](https://github.com/shelljs/shelljs/pull/310) ([nfischer](https://github.com/nfischer)) +- chore\(package\): remove v0.8 from engines list [\#308](https://github.com/shelljs/shelljs/pull/308) ([nfischer](https://github.com/nfischer)) +- travis: Mark as not using `sudo` and do not test 0.11 [\#307](https://github.com/shelljs/shelljs/pull/307) ([TimothyGu](https://github.com/TimothyGu)) +- fix: jshint works on Windows [\#295](https://github.com/shelljs/shelljs/pull/295) ([nfischer](https://github.com/nfischer)) +- feat: add tilde expansion to expand\(\) [\#293](https://github.com/shelljs/shelljs/pull/293) ([nfischer](https://github.com/nfischer)) +- style: make docs more consistent [\#292](https://github.com/shelljs/shelljs/pull/292) ([nfischer](https://github.com/nfischer)) +- update `exec` docs to match implemented behaviour [\#289](https://github.com/shelljs/shelljs/pull/289) ([vise890](https://github.com/vise890)) +- chore: update github URL in package.json [\#288](https://github.com/shelljs/shelljs/pull/288) ([nfischer](https://github.com/nfischer)) +- docs\(spelling\): fix typo in source comment [\#285](https://github.com/shelljs/shelljs/pull/285) ([nfischer](https://github.com/nfischer)) +- chore\(travis\): add OS X to Travis CI [\#283](https://github.com/shelljs/shelljs/pull/283) ([nfischer](https://github.com/nfischer)) +- Don't do `console.log.apply\(this, ...\)`. [\#274](https://github.com/shelljs/shelljs/pull/274) ([ariporad](https://github.com/ariporad)) +- Implementing cd\('-'\) to behave like Bash's "cd -" [\#273](https://github.com/shelljs/shelljs/pull/273) ([nfischer](https://github.com/nfischer)) +- Fix cp to match unix behavior [\#271](https://github.com/shelljs/shelljs/pull/271) ([freitagbr](https://github.com/freitagbr)) +- Commands that have multiple errors now produce cleaner log output [\#268](https://github.com/shelljs/shelljs/pull/268) ([nfischer](https://github.com/nfischer)) +- Support exit code in shjs. [\#252](https://github.com/shelljs/shelljs/pull/252) ([bryce-gibson](https://github.com/bryce-gibson)) +- add touch\(1\) [\#249](https://github.com/shelljs/shelljs/pull/249) ([blockloop](https://github.com/blockloop)) +- Fix `os.tmpdir` bug [\#240](https://github.com/shelljs/shelljs/pull/240) ([BYK](https://github.com/BYK)) +- Make sure Which\(\) on Windows platform always return the command with … [\#239](https://github.com/shelljs/shelljs/pull/239) ([TingluoHuang](https://github.com/TingluoHuang)) +- Add target node.js \(iojs v1, v2, v3\) [\#230](https://github.com/shelljs/shelljs/pull/230) ([sanemat](https://github.com/sanemat)) +- feat-multisymbolic + Support for directory entry \(capital X in chmod terms\) [\#228](https://github.com/shelljs/shelljs/pull/228) ([rezonant](https://github.com/rezonant)) +- Fixes an issue with multi-symbolic mode specification \(ie a-rwx,u+rw\) [\#227](https://github.com/shelljs/shelljs/pull/227) ([rezonant](https://github.com/rezonant)) +- Memoized the result of target invocation [\#216](https://github.com/shelljs/shelljs/pull/216) ([rizowski](https://github.com/rizowski)) +- remove empty for loop and leaked i var [\#166](https://github.com/shelljs/shelljs/pull/166) ([ratbeard](https://github.com/ratbeard)) +- Wrap script name in double quotes [\#135](https://github.com/shelljs/shelljs/pull/135) ([ndelitski](https://github.com/ndelitski)) +- Fixed coffeescript syntax in top example [\#99](https://github.com/shelljs/shelljs/pull/99) ([maxnordlund](https://github.com/maxnordlund)) +- fix\(touch\): enhance parseOptions and fix touch's -r flag [\#341](https://github.com/shelljs/shelljs/pull/341) ([nfischer](https://github.com/nfischer)) +- chore\(.npmignore\): update npmignore [\#339](https://github.com/shelljs/shelljs/pull/339) ([ariporad](https://github.com/ariporad)) +- Release v0.6.0 [\#338](https://github.com/shelljs/shelljs/pull/338) ([ariporad](https://github.com/ariporad)) +- docs\(README\): remove coffeescript from README [\#337](https://github.com/shelljs/shelljs/pull/337) ([ariporad](https://github.com/ariporad)) +- fix\(cp\): add -n option, make -f default behavior [\#336](https://github.com/shelljs/shelljs/pull/336) ([nfischer](https://github.com/nfischer)) +- feat\(exec\): allow all exec options to pass through [\#335](https://github.com/shelljs/shelljs/pull/335) ([nfischer](https://github.com/nfischer)) +- fix\(mv\): add -n option, make -f default behavior [\#328](https://github.com/shelljs/shelljs/pull/328) ([nfischer](https://github.com/nfischer)) +- fix\(cat\): make behavior more like unix [\#326](https://github.com/shelljs/shelljs/pull/326) ([nfischer](https://github.com/nfischer)) +- feat\(ls\): add -l option [\#324](https://github.com/shelljs/shelljs/pull/324) ([nfischer](https://github.com/nfischer)) +- style\(test/which\): make test/which.js conform to the style guidelines [\#320](https://github.com/shelljs/shelljs/pull/320) ([ariporad](https://github.com/ariporad)) +- chore\(appveyor\): add badge [\#316](https://github.com/shelljs/shelljs/pull/316) ([nfischer](https://github.com/nfischer)) +- fix\(windows\): fix shjs commands for windows [\#315](https://github.com/shelljs/shelljs/pull/315) ([nfischer](https://github.com/nfischer)) +- feat\(sed\): support multiple file names [\#314](https://github.com/shelljs/shelljs/pull/314) ([nfischer](https://github.com/nfischer)) +- feat\(cd\): cd\(\) \(no args\) changes to home directory [\#306](https://github.com/shelljs/shelljs/pull/306) ([nfischer](https://github.com/nfischer)) +- test\(shjs\): add tests for shjs [\#304](https://github.com/shelljs/shelljs/pull/304) ([ariporad](https://github.com/ariporad)) +- fix: regexes are more consistent with sed and grep [\#303](https://github.com/shelljs/shelljs/pull/303) ([nfischer](https://github.com/nfischer)) +- Add appveyor.yml config file [\#299](https://github.com/shelljs/shelljs/pull/299) ([nfischer](https://github.com/nfischer)) +- Fix tests on Windows [\#297](https://github.com/shelljs/shelljs/pull/297) ([BYK](https://github.com/BYK)) +- Search PATHEXT instead of 3 hardcoded values [\#290](https://github.com/shelljs/shelljs/pull/290) ([isiahmeadows](https://github.com/isiahmeadows)) +- Fix relative symlinks [\#282](https://github.com/shelljs/shelljs/pull/282) ([freitagbr](https://github.com/freitagbr)) +- Make to and toEnd chainable [\#276](https://github.com/shelljs/shelljs/pull/276) ([TimothyGu](https://github.com/TimothyGu)) + +## [v0.5.3](https://github.com/shelljs/shelljs/tree/v0.5.3) (2015-08-11) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.2...v0.5.3) + +**Merged pull requests:** + +- Manually closing streams [\#222](https://github.com/shelljs/shelljs/pull/222) ([JulianLaval](https://github.com/JulianLaval)) + +## [v0.5.2](https://github.com/shelljs/shelljs/tree/v0.5.2) (2015-08-10) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.1...v0.5.2) + +**Closed issues:** + +- Cannot run shell.exec [\#217](https://github.com/shelljs/shelljs/issues/217) +- write after end: internal error [\#206](https://github.com/shelljs/shelljs/issues/206) + +**Merged pull requests:** + +- Update README.md [\#221](https://github.com/shelljs/shelljs/pull/221) ([giosh94mhz](https://github.com/giosh94mhz)) +- prevent internal error: write after end [\#214](https://github.com/shelljs/shelljs/pull/214) ([charlierudolph](https://github.com/charlierudolph)) + +## [v0.5.1](https://github.com/shelljs/shelljs/tree/v0.5.1) (2015-06-05) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.0...v0.5.1) + +**Closed issues:** + +- cd into home directory [\#9](https://github.com/shelljs/shelljs/issues/9) + +**Merged pull requests:** + +- Fix issue \#49: Retry rmdirSync on Windows for up to 1 second if files still exist. [\#179](https://github.com/shelljs/shelljs/pull/179) ([andreialecu](https://github.com/andreialecu)) + +## [v0.5.0](https://github.com/shelljs/shelljs/tree/v0.5.0) (2015-05-19) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.3.0...v0.5.0) + +**Closed issues:** + +- Enter text to prompt [\#203](https://github.com/shelljs/shelljs/issues/203) +- Find which shell is being used [\#195](https://github.com/shelljs/shelljs/issues/195) +- Pass command line params to the make tool [\#188](https://github.com/shelljs/shelljs/issues/188) +- Is it possible to call exec with a command containing new lines ? [\#177](https://github.com/shelljs/shelljs/issues/177) +- The installation would break on Windows 7 [\#161](https://github.com/shelljs/shelljs/issues/161) +- Q.ninvoke\(\) returns undefined [\#153](https://github.com/shelljs/shelljs/issues/153) +- installed shelljs on osx but reported error: npm ERR! 404 '%5B-g%5D' is not in the npm registry. [\#124](https://github.com/shelljs/shelljs/issues/124) +- "ln" not found \(OS X\) [\#106](https://github.com/shelljs/shelljs/issues/106) +- Using shelljs in a CLI app. [\#91](https://github.com/shelljs/shelljs/issues/91) + +**Merged pull requests:** + +- Breaking: Allow -- as args separators \(fixes \#188\) [\#207](https://github.com/shelljs/shelljs/pull/207) ([nzakas](https://github.com/nzakas)) +- Update .travis.yml [\#190](https://github.com/shelljs/shelljs/pull/190) ([arturadib](https://github.com/arturadib)) +- Use new child\_process.execSync instead of busywaiting [\#189](https://github.com/shelljs/shelljs/pull/189) ([devTristan](https://github.com/devTristan)) +- Update README.md: explains how to access "config" [\#145](https://github.com/shelljs/shelljs/pull/145) ([kerphi](https://github.com/kerphi)) +- Fix to set state.error before throw the exception [\#120](https://github.com/shelljs/shelljs/pull/120) ([abdul-martinez](https://github.com/abdul-martinez)) +- Add -l and -s support to grep. [\#116](https://github.com/shelljs/shelljs/pull/116) ([idearat](https://github.com/idearat)) + +## [v0.3.0](https://github.com/shelljs/shelljs/tree/v0.3.0) (2014-05-08) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.6...v0.3.0) + +**Closed issues:** + +- grep\(\) should fully support globing [\#118](https://github.com/shelljs/shelljs/issues/118) +- sed\(\) could support replacement function [\#115](https://github.com/shelljs/shelljs/issues/115) +- How would you close an exec process that runs indefinitely? [\#113](https://github.com/shelljs/shelljs/issues/113) +- listen for intermittent output of a long-running child process [\#111](https://github.com/shelljs/shelljs/issues/111) +- Cannot find module 'shelljs' after installing shelljs with npm [\#109](https://github.com/shelljs/shelljs/issues/109) +- Massive CPU usage on exec\(\) windows [\#108](https://github.com/shelljs/shelljs/issues/108) +- cp skipping dot files? [\#79](https://github.com/shelljs/shelljs/issues/79) +- $variables in exec\(\) aren't handled correctly [\#11](https://github.com/shelljs/shelljs/issues/11) +- debug flag that prints commands instead of executing [\#8](https://github.com/shelljs/shelljs/issues/8) + +**Merged pull requests:** + +- grep\(\) support for globing, fixes \#118 [\#119](https://github.com/shelljs/shelljs/pull/119) ([utensil](https://github.com/utensil)) +- make sed\(\) support replacement function, fixes \#115 [\#117](https://github.com/shelljs/shelljs/pull/117) ([utensil](https://github.com/utensil)) +- which\(\) should only find files, not directories [\#110](https://github.com/shelljs/shelljs/pull/110) ([panrafal](https://github.com/panrafal)) +- Added the New BSD license to the package.json. [\#105](https://github.com/shelljs/shelljs/pull/105) ([keskival](https://github.com/keskival)) +- Added win32 support to ln [\#104](https://github.com/shelljs/shelljs/pull/104) ([jamon](https://github.com/jamon)) +- Fix ln using bad paths when given abspaths. [\#89](https://github.com/shelljs/shelljs/pull/89) ([Schoonology](https://github.com/Schoonology)) +- Add ln support, including both -s and -f options. [\#88](https://github.com/shelljs/shelljs/pull/88) ([Schoonology](https://github.com/Schoonology)) +- add support for symlinking \(junctions\) on win32 [\#87](https://github.com/shelljs/shelljs/pull/87) ([jamon](https://github.com/jamon)) + +## [v0.2.6](https://github.com/shelljs/shelljs/tree/v0.2.6) (2013-09-22) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.5...v0.2.6) + +**Closed issues:** + +- Versions 0.2.4 and 0.2.3 keep throwing strange errors [\#82](https://github.com/shelljs/shelljs/issues/82) +- Add global pollution tests [\#33](https://github.com/shelljs/shelljs/issues/33) + +## [v0.2.5](https://github.com/shelljs/shelljs/tree/v0.2.5) (2013-09-11) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.4...v0.2.5) + +**Closed issues:** + +- shelljs.exec stalls on Red Hat when script is invoked with 'sudo -u username' [\#72](https://github.com/shelljs/shelljs/issues/72) + +## [v0.2.4](https://github.com/shelljs/shelljs/tree/v0.2.4) (2013-09-11) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.3...v0.2.4) + +## [v0.2.3](https://github.com/shelljs/shelljs/tree/v0.2.3) (2013-09-09) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.2...v0.2.3) + +**Merged pull requests:** + +- Make shell.exec\(\) treat process error return codes as shelljs errors [\#80](https://github.com/shelljs/shelljs/pull/80) ([nilsbunger](https://github.com/nilsbunger)) + +## [v0.2.2](https://github.com/shelljs/shelljs/tree/v0.2.2) (2013-09-02) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.4...v0.2.2) + +**Closed issues:** + +- which and node\_modules [\#63](https://github.com/shelljs/shelljs/issues/63) +- cannot install with nodejs 0.10.2 [\#57](https://github.com/shelljs/shelljs/issues/57) + +**Merged pull requests:** + +- Addition of a toEnd\(\) function modeled after the Unix \>\> pipe. [\#78](https://github.com/shelljs/shelljs/pull/78) ([andreweduffy](https://github.com/andreweduffy)) +- Added appendTo\(\) function to imitate '\>\>' redirect-and-append pipe. [\#75](https://github.com/shelljs/shelljs/pull/75) ([andreweduffy](https://github.com/andreweduffy)) +- Fix a small typo in README.md [\#71](https://github.com/shelljs/shelljs/pull/71) ([asmblah](https://github.com/asmblah)) +- adding an `.npmignore` file [\#70](https://github.com/shelljs/shelljs/pull/70) ([stephenmathieson](https://github.com/stephenmathieson)) +- tempdir: use `os.tmpDir` when possible [\#67](https://github.com/shelljs/shelljs/pull/67) ([stephenmathieson](https://github.com/stephenmathieson)) + +## [v0.1.4](https://github.com/shelljs/shelljs/tree/v0.1.4) (2013-05-10) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.3...v0.1.4) + +**Merged pull requests:** + +- removing extra fs calls [\#62](https://github.com/shelljs/shelljs/pull/62) ([stephenmathieson](https://github.com/stephenmathieson)) +- moving \_jshint\_ to a development dependency [\#61](https://github.com/shelljs/shelljs/pull/61) ([stephenmathieson](https://github.com/stephenmathieson)) +- Make the maximum buffersize 20 MB. [\#59](https://github.com/shelljs/shelljs/pull/59) ([waddlesplash](https://github.com/waddlesplash)) + +## [v0.1.3](https://github.com/shelljs/shelljs/tree/v0.1.3) (2013-04-21) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.2...v0.1.3) + +**Merged pull requests:** + +- test\('-L', badlink\) should return true [\#56](https://github.com/shelljs/shelljs/pull/56) ([lge88](https://github.com/lge88)) +- exec options now allows `silent:true` with callback. [\#54](https://github.com/shelljs/shelljs/pull/54) ([iapain](https://github.com/iapain)) +- Add Zepto to README [\#53](https://github.com/shelljs/shelljs/pull/53) ([madrobby](https://github.com/madrobby)) + +## [v0.1.2](https://github.com/shelljs/shelljs/tree/v0.1.2) (2013-01-08) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.1...v0.1.2) + +**Closed issues:** + +- pushd/popd [\#24](https://github.com/shelljs/shelljs/issues/24) + +**Merged pull requests:** + +- Implemented chmod command. Github issue 35 [\#48](https://github.com/shelljs/shelljs/pull/48) ([brandonramirez](https://github.com/brandonramirez)) + +## [v0.1.1](https://github.com/shelljs/shelljs/tree/v0.1.1) (2013-01-01) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.0...v0.1.1) + +**Merged pull requests:** + +- Work in progress: pushd/popd/dirs [\#47](https://github.com/shelljs/shelljs/pull/47) ([mstade](https://github.com/mstade)) + +## [v0.1.0](https://github.com/shelljs/shelljs/tree/v0.1.0) (2012-12-26) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.9...v0.1.0) + +**Closed issues:** + +- test\(\) for binary file? [\#45](https://github.com/shelljs/shelljs/issues/45) +- Inconsistent behaviour of cp command with directories. [\#44](https://github.com/shelljs/shelljs/issues/44) +- Executing SSH with ShellJs [\#43](https://github.com/shelljs/shelljs/issues/43) + +**Merged pull requests:** + +- Fix for \#44 [\#46](https://github.com/shelljs/shelljs/pull/46) ([mstade](https://github.com/mstade)) +- Fix single/double quotes in exec [\#42](https://github.com/shelljs/shelljs/pull/42) ([danielepolencic](https://github.com/danielepolencic)) + +## [v0.0.9](https://github.com/shelljs/shelljs/tree/v0.0.9) (2012-12-01) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.8...v0.0.9) + +**Closed issues:** + +- silent output [\#40](https://github.com/shelljs/shelljs/issues/40) +- asynchronous exec [\#34](https://github.com/shelljs/shelljs/issues/34) + +**Merged pull requests:** + +- Passed process arguments to executable script [\#36](https://github.com/shelljs/shelljs/pull/36) ([Zanisimo](https://github.com/Zanisimo)) + +## [v0.0.8](https://github.com/shelljs/shelljs/tree/v0.0.8) (2012-10-11) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.7...v0.0.8) + +**Closed issues:** + +- exec with callback should automatically be async [\#31](https://github.com/shelljs/shelljs/issues/31) +- Exporting variables. [\#30](https://github.com/shelljs/shelljs/issues/30) +- Detecting shelljs/node [\#27](https://github.com/shelljs/shelljs/issues/27) + +**Merged pull requests:** + +- fix: global leak 'stats' [\#29](https://github.com/shelljs/shelljs/pull/29) ([ando-takahiro](https://github.com/ando-takahiro)) +- -a includes . and ..; -A does not [\#28](https://github.com/shelljs/shelljs/pull/28) ([aeosynth](https://github.com/aeosynth)) + +## [v0.0.7](https://github.com/shelljs/shelljs/tree/v0.0.7) (2012-09-23) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6...v0.0.7) + +**Closed issues:** + +- gh-pages: clicking 'fork me' just reloads the page [\#26](https://github.com/shelljs/shelljs/issues/26) +- Not declared local var implies possible memory leak [\#21](https://github.com/shelljs/shelljs/issues/21) +- Cannot echo a string that starts with - [\#20](https://github.com/shelljs/shelljs/issues/20) +- Unexpected cp behaviour with directories [\#15](https://github.com/shelljs/shelljs/issues/15) + +**Merged pull requests:** + +- add primaries to \_test [\#23](https://github.com/shelljs/shelljs/pull/23) ([aeosynth](https://github.com/aeosynth)) + +## [v0.0.6](https://github.com/shelljs/shelljs/tree/v0.0.6) (2012-08-07) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6pre2...v0.0.6) + +**Merged pull requests:** + +- Fixed a global variable leak [\#16](https://github.com/shelljs/shelljs/pull/16) ([dallonf](https://github.com/dallonf)) + +## [v0.0.6pre2](https://github.com/shelljs/shelljs/tree/v0.0.6pre2) (2012-05-25) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6pre1...v0.0.6pre2) + +## [v0.0.6pre1](https://github.com/shelljs/shelljs/tree/v0.0.6pre1) (2012-05-25) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5...v0.0.6pre1) + +## [v0.0.5](https://github.com/shelljs/shelljs/tree/v0.0.5) (2012-05-24) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre4...v0.0.5) + +**Closed issues:** + +- global.key assigned value 'async' as a result of shell.exec\(...\) [\#12](https://github.com/shelljs/shelljs/issues/12) + +**Merged pull requests:** + +- Add support for grep option -v. [\#13](https://github.com/shelljs/shelljs/pull/13) ([kkujala](https://github.com/kkujala)) + +## [v0.0.5pre4](https://github.com/shelljs/shelljs/tree/v0.0.5pre4) (2012-03-27) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre3...v0.0.5pre4) + +## [v0.0.5pre3](https://github.com/shelljs/shelljs/tree/v0.0.5pre3) (2012-03-27) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre2...v0.0.5pre3) + +## [v0.0.5pre2](https://github.com/shelljs/shelljs/tree/v0.0.5pre2) (2012-03-26) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre1...v0.0.5pre2) + +## [v0.0.5pre1](https://github.com/shelljs/shelljs/tree/v0.0.5pre1) (2012-03-26) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.4...v0.0.5pre1) + +**Closed issues:** + +- rm\(\) does not respect read/write modes [\#6](https://github.com/shelljs/shelljs/issues/6) + +## [v0.0.4](https://github.com/shelljs/shelljs/tree/v0.0.4) (2012-03-22) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.3...v0.0.4) + +**Closed issues:** + +- "For convenient iteration via `for in`, ..."? [\#4](https://github.com/shelljs/shelljs/issues/4) + +## [v0.0.3](https://github.com/shelljs/shelljs/tree/v0.0.3) (2012-03-21) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.2...v0.0.3) + +## [v0.0.2](https://github.com/shelljs/shelljs/tree/v0.0.2) (2012-03-15) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.2pre1...v0.0.2) + +## [v0.0.2pre1](https://github.com/shelljs/shelljs/tree/v0.0.2pre1) (2012-03-03) + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file From 2134bd3da11f1423a2a41042d7bf747b1d3fd59f Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Fri, 13 Jan 2017 16:28:04 -0800 Subject: [PATCH 097/338] docs(release): use bulleted list (#643) --- RELEASE.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index c78d364f4..90802c33c 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -4,10 +4,9 @@ 2. `npm run gendocs` 3. Bump version, create tags, push, and release: - `$ npm run ` - - >`major` - breaking API changes - >`minor` - backwards-compatible features - >`patch` - backwards-compatible bug fixes + - `major` - breaking API changes + - `minor` - backwards-compatible features + - `patch` - backwards-compatible bug fixes 4. Update CHANGELOG.md - `$ npm run changelog` - `$ git push` From 84ffb386eb7c3f22633f3a18f85a1f43257d48f8 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 16 Jan 2017 12:45:14 -0800 Subject: [PATCH 098/338] chore(lint): Enforce a trailing comma for multi-line (#646) --- .eslintrc.json | 2 +- src/chmod.js | 6 +++--- src/common.js | 4 ++-- src/dirs.js | 6 +++--- src/exec.js | 6 +++--- src/set.js | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 411b11ae0..e712eeab2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,7 +4,7 @@ }, "extends": "airbnb-base/legacy", "rules": { - "comma-dangle": 0, + "comma-dangle": [2, "always-multiline"], "global-require": 0, "vars-on-top": 0, "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], diff --git a/src/chmod.js b/src/chmod.js index a1afd90e7..a494cefb2 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -21,12 +21,12 @@ var PERMS = (function (base) { SETGID: parseInt('02000', 8), SETUID: parseInt('04000', 8), - TYPE_MASK: parseInt('0770000', 8) + TYPE_MASK: parseInt('0770000', 8), }; }({ EXEC: 1, WRITE: 2, - READ: 4 + READ: 4, })); common.register('chmod', _chmod, { @@ -73,7 +73,7 @@ function _chmod(options, mode, filePattern) { options = common.parseOptions(options, { 'R': 'recursive', 'c': 'changes', - 'v': 'verbose' + 'v': 'verbose', }); filePattern = [].slice.call(arguments, 2); diff --git a/src/common.js b/src/common.js index 66b541a1e..8b07421a9 100644 --- a/src/common.js +++ b/src/common.js @@ -60,7 +60,7 @@ var state = { error: null, errorCode: 0, currentCmd: 'shell.js', - tempDir: null + tempDir: null, }; exports.state = state; @@ -115,7 +115,7 @@ function error(msg, _code, options) { if (!options.continue) { throw { msg: 'earlyExit', - retValue: (new ShellString('', state.error, state.errorCode)) + retValue: (new ShellString('', state.error, state.errorCode)), }; } } diff --git a/src/dirs.js b/src/dirs.js index cf5fe02f5..3806c14f7 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -63,7 +63,7 @@ function _pushd(options, dir) { } options = common.parseOptions(options, { - 'n': 'no-cd' + 'n': 'no-cd', }); var dirs = _actualDirStack(); @@ -129,7 +129,7 @@ function _popd(options, index) { } options = common.parseOptions(options, { - 'n': 'no-cd' + 'n': 'no-cd', }); if (!_dirStack.length) { @@ -172,7 +172,7 @@ function _dirs(options, index) { } options = common.parseOptions(options, { - 'c': 'clear' + 'c': 'clear', }); if (options.clear) { diff --git a/src/exec.js b/src/exec.js index 9c9128fea..aade0228c 100644 --- a/src/exec.js +++ b/src/exec.js @@ -34,7 +34,7 @@ function execSync(cmd, opts, pipe) { silent: common.config.silent, cwd: _pwd().toString(), env: process.env, - maxBuffer: DEFAULT_MAXBUFFER_SIZE + maxBuffer: DEFAULT_MAXBUFFER_SIZE, }, opts); var previousStdoutContent = ''; @@ -190,7 +190,7 @@ function execAsync(cmd, opts, pipe, callback) { silent: common.config.silent, cwd: _pwd().toString(), env: process.env, - maxBuffer: DEFAULT_MAXBUFFER_SIZE + maxBuffer: DEFAULT_MAXBUFFER_SIZE, }, opts); var c = child.exec(cmd, opts, function (err) { @@ -279,7 +279,7 @@ function _exec(command, options, callback) { options = common.extend({ silent: common.config.silent, - async: false + async: false, }, options); try { diff --git a/src/set.js b/src/set.js index 3402cd660..238e23e4a 100644 --- a/src/set.js +++ b/src/set.js @@ -34,7 +34,7 @@ function _set(options) { options = common.parseOptions(options, { 'e': 'fatal', 'v': 'verbose', - 'f': 'noglob' + 'f': 'noglob', }); if (negate) { From 055156f7f597ca5a5ddfe49f5004678d227849ef Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Thu, 2 Feb 2017 15:21:58 -0800 Subject: [PATCH 099/338] Fix find ENOENT (#654) * Add find: nonexistant path test * Catch statSync errors, return shell error --- src/find.js | 9 ++++++++- test/find.js | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/find.js b/src/find.js index f96a51e78..625aa2972 100644 --- a/src/find.js +++ b/src/find.js @@ -40,9 +40,16 @@ function _find(options, paths) { // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory paths.forEach(function (file) { + var stat; + try { + stat = fs.statSync(file); + } catch (e) { + common.error('no such file or directory: ' + file); + } + pushFile(file); - if (fs.statSync(file).isDirectory()) { + if (stat.isDirectory()) { _ls({ recursive: true, all: true }, file).forEach(function (subfile) { pushFile(path.join(file, subfile)); }); diff --git a/test/find.js b/test/find.js index 5e65bd9ec..a37dcd314 100644 --- a/test/find.js +++ b/test/find.js @@ -60,3 +60,9 @@ test('multiple paths - array', t => { t.truthy(result.indexOf('resources/find/dir2/a_dir1') > -1); t.is(result.length, 6); }); + +test('nonexistent path', t => { + const result = shell.find('resources/find/nonexistent'); + t.is(shell.error(), 'find: no such file or directory: resources/find/nonexistent'); + t.is(result.code, 1); +}); From 8dd2488ec54ec56e18b5a72ee3ecc7d9c11668fb Mon Sep 17 00:00:00 2001 From: Stanislav Termosa Date: Fri, 10 Feb 2017 21:32:22 +0300 Subject: [PATCH 100/338] feature: add -a option for which command (#655) * feature: add -a option for which command * chore(test): test which -a with unexisting name * chore(test): check which -a has same result as regular one * chord(test): fix errors mentioned by eslint --- src/which.js | 43 +++++++++++++++++++++++++++++++------------ test/which.js | 25 +++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/which.js b/src/which.js index ef5d185eb..2f3f12147 100644 --- a/src/which.js +++ b/src/which.js @@ -4,6 +4,9 @@ var path = require('path'); common.register('which', _which, { allowGlobbing: false, + cmdOptions: { + 'a': 'all', + }, }); // XP's system default value for PATHEXT system variable, just in case it's not @@ -42,13 +45,14 @@ function _which(options, cmd) { var pathEnv = process.env.path || process.env.Path || process.env.PATH; var pathArray = splitPath(pathEnv); - var where = null; + var all = options.all; + var where = all ? [] : null; // No relative/absolute paths provided? if (cmd.search(/\//) === -1) { // Search for command in PATH pathArray.forEach(function (dir) { - if (where) return; // already found it + if (!all && where) return; // already found it var attempt = path.resolve(dir, cmd); @@ -65,8 +69,12 @@ function _which(options, cmd) { for (i = 0; i < pathExtArray.length; i++) { var ext = pathExtArray[i]; if (attempt.slice(-ext.length) === ext && checkPath(attempt)) { - where = attempt; - return; + if (all) { + where.push(attempt); + } else { + where = attempt; + return; + } } } @@ -75,25 +83,36 @@ function _which(options, cmd) { for (i = 0; i < pathExtArray.length; i++) { attempt = baseAttempt + pathExtArray[i]; if (checkPath(attempt)) { - where = attempt; - return; + if (all) { + where.push(attempt); + } else { + where = attempt; + return; + } } } } else { // Assume it's Unix-like if (checkPath(attempt)) { - where = attempt; - return; + if (all) { + where.push(attempt); + } else { + where = attempt; + return; + } } } }); } - // Command not found anywhere? - if (!checkPath(cmd) && !where) return null; - - where = where || path.resolve(cmd); + if (all && where.length) return where; + if (!all && where) return where; + // Command not found anywhere? + if (checkPath(cmd)) { + where = path.resolve(cmd); + if (all) where = [where]; + } return where; } module.exports = _which; diff --git a/test/which.js b/test/which.js index 13b92c7bf..705fda311 100644 --- a/test/which.js +++ b/test/which.js @@ -45,3 +45,28 @@ test('Windows can search with or without a .exe extension', t => { t.is(node.toString(), nodeExe.toString()); } }); + +test('Searching with -a flag returns an array', t => { + const commandName = 'node'; // Should be an existing command + const result = shell.which('-a', commandName); + t.falsy(shell.error()); + t.truthy(result); + t.not(result.length, 0); +}); + +test('Searching with -a flag for not existing command returns an empty array', t => { + const notExist = '6ef25c13209cb28ae465852508cc3a8f3dcdc71bc7bcf8c38379ba38me'; + const result = shell.which('-a', notExist); + t.falsy(shell.error()); + t.is(result.length, 0); +}); + +test('Searching with -a flag returns an array with first item equals to the regular search', t => { + const commandName = 'node'; // Should be an existing command + const resultForWhich = shell.which(commandName); + const resultForWhichA = shell.which('-a', commandName); + t.falsy(shell.error()); + t.truthy(resultForWhich); + t.truthy(resultForWhichA); + t.is(resultForWhich.toString(), resultForWhichA[0].toString()); +}); From fdcc789882642ba43322d0e4cb162bae7b0ad2b1 Mon Sep 17 00:00:00 2001 From: Faheel Ahmad Date: Sat, 11 Feb 2017 13:47:46 +0530 Subject: [PATCH 101/338] Fix typo (#660) battled-tested -> battle-tested --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf5a0dd77..84afca5c9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Node projects - say goodbye to those gnarly Bash scripts! ShellJS is proudly tested on every node release since `v0.11`! -The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battled-tested in projects like: +The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-tested in projects like: + [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader + [Firebug](http://getfirebug.com/) - Firefox's infamous debugger From 434ed592de7c0e85592a1dcb8cbb772a3c3189d7 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Tue, 21 Feb 2017 01:45:46 +0200 Subject: [PATCH 102/338] docs(chmod): document `options` argument (#663) --- README.md | 5 +++-- src/chmod.js | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 84afca5c9..f0884bb27 100644 --- a/README.md +++ b/README.md @@ -177,8 +177,8 @@ Changes to directory `dir` for the duration of the script. Changes to home directory if no argument is supplied. -### chmod(octal_mode || octal_string, file) -### chmod(symbolic_mode, file) +### chmod([options,] octal_mode || octal_string, file) +### chmod([options,] symbolic_mode, file) Available options: @@ -192,6 +192,7 @@ Examples: chmod(755, '/Users/brandon'); chmod('755', '/Users/brandon'); // same as above chmod('u+x', '/Users/brandon'); +chmod('-R', 'a-w', '/Users/brandon'); ``` Alters the permissions of a file or directory by either specifying the diff --git a/src/chmod.js b/src/chmod.js index a494cefb2..ce5659e35 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -33,8 +33,8 @@ common.register('chmod', _chmod, { }); //@ -//@ ### chmod(octal_mode || octal_string, file) -//@ ### chmod(symbolic_mode, file) +//@ ### chmod([options,] octal_mode || octal_string, file) +//@ ### chmod([options,] symbolic_mode, file) //@ //@ Available options: //@ @@ -48,6 +48,7 @@ common.register('chmod', _chmod, { //@ chmod(755, '/Users/brandon'); //@ chmod('755', '/Users/brandon'); // same as above //@ chmod('u+x', '/Users/brandon'); +//@ chmod('-R', 'a-w', '/Users/brandon'); //@ ``` //@ //@ Alters the permissions of a file or directory by either specifying the From 006b8c2460b6f31296cdc941d8dbaddbce3d50c4 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 27 Feb 2017 13:23:30 -0800 Subject: [PATCH 103/338] docs: clean up RELEASE.md (#662) Miscellaneous changes. --- RELEASE.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 90802c33c..80aae7f7b 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,14 +1,14 @@ # Release steps 1. Ensure master passes CI tests -2. `npm run gendocs` -3. Bump version, create tags, push, and release: +2. Bump version, create tags, push, and release: - `$ npm run ` - `major` - breaking API changes - `minor` - backwards-compatible features - `patch` - backwards-compatible bug fixes -4. Update CHANGELOG.md +3. Update `CHANGELOG.md` - `$ npm run changelog` + - Manually verify that the changelog makes sense - `$ git push` -5. Generate the documentup website by visiting - [http://documentup.com/shelljs/shelljs/__recompile] in your browser +4. Generate the documentup website by visiting + http://documentup.com/shelljs/shelljs/__recompile in your browser From df06ac4a8a011b38f701b3fbc852cefa3e964091 Mon Sep 17 00:00:00 2001 From: Fran Dios Date: Tue, 28 Feb 2017 13:53:32 +0900 Subject: [PATCH 104/338] ls -L (follow symlinks) (#665) * feat: -L (follow symlinks) option for ls * test: ls -L option * docs: Add ls -L option to readme * fix: ls -L ternary operator * Revert "test: ls -L option" This reverts commit dbb057ac087b23aa2c1358018d3c832dd546c5f2. * test: ls -L option * test: Remove duplicate test --- README.md | 1 + src/ls.js | 8 +++++--- test/ls.js | 32 +++++++++++++++++++++++--------- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index f0884bb27..b0fee0346 100644 --- a/README.md +++ b/README.md @@ -418,6 +418,7 @@ Available options: + `-R`: recursive + `-A`: all files (include files beginning with `.`, except for `.` and `..`) ++ `-L`: follow symlinks + `-d`: list directories themselves, not their contents + `-l`: list objects representing each file, each with fields containing `ls -l` output fields. See diff --git a/src/ls.js b/src/ls.js index 7f25056cd..cd2d9202e 100644 --- a/src/ls.js +++ b/src/ls.js @@ -9,6 +9,7 @@ common.register('ls', _ls, { cmdOptions: { 'R': 'recursive', 'A': 'all', + 'L': 'link', 'a': 'all_deprecated', 'd': 'directory', 'l': 'long', @@ -22,6 +23,7 @@ common.register('ls', _ls, { //@ //@ + `-R`: recursive //@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) +//@ + `-L`: follow symlinks //@ + `-d`: list directories themselves, not their contents //@ + `-l`: list objects representing each file, each with fields containing `ls //@ -l` output fields. See @@ -60,7 +62,7 @@ function _ls(options, paths) { relName = relName.replace(/\\/g, '/'); } if (options.long) { - stat = stat || fs.lstatSync(abs); + stat = stat || (options.link ? fs.statSync(abs) : fs.lstatSync(abs)); list.push(addLsAttributes(relName, stat)); } else { // list.push(path.relative(rel || '.', file)); @@ -72,7 +74,7 @@ function _ls(options, paths) { var stat; try { - stat = fs.lstatSync(p); + stat = options.link ? fs.statSync(p) : fs.lstatSync(p); } catch (e) { common.error('no such file or directory: ' + p, 2, { continue: true }); return; @@ -82,7 +84,7 @@ function _ls(options, paths) { if (stat.isDirectory() && !options.directory) { if (options.recursive) { // use glob, because it's simple - glob.sync(p + globPatternRecursive, { dot: options.all }) + glob.sync(p + globPatternRecursive, { dot: options.all, follow: options.link }) .forEach(function (item) { pushFile(item, path.relative(p, item)); }); diff --git a/test/ls.js b/test/ls.js index a50f27006..05d24763f 100644 --- a/test/ls.js +++ b/test/ls.js @@ -271,7 +271,7 @@ test('recursive, no path', t => { t.is(result.length, 9); }); -test('recusive, path given', t => { +test('recursive, path given', t => { const result = shell.ls('-R', 'resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); @@ -292,14 +292,28 @@ test('-RA flag, path given', t => { t.is(result.length, 14); }); -test('recursive, wildcard', t => { - const result = shell.ls('-R', 'resources/ls'); - t.falsy(shell.error()); - t.is(result.code, 0); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir/z') > -1); - t.is(result.length, 9); +test('-RAL flag, path given', t => { + if (process.platform !== 'win32') { + const result = shell.ls('-RAL', 'resources/rm'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('a_dir/a_file') > -1); + t.truthy(result.indexOf('link_to_a_dir') > -1); + t.truthy(result.indexOf('link_to_a_dir/a_file') > -1); + t.truthy(result.indexOf('fake.lnk') > -1); + t.is(result.length, 5); + } +}); + +test('-L flag, path is symlink', t => { + if (process.platform !== 'win32') { + const result = shell.ls('-L', 'resources/rm/link_to_a_dir'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_file') > -1); + t.is(result.length, 1); + } }); test('-Rd works like -d', t => { From 2d0428b1c9810ca8ca25c73737ee3035874da34c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 28 Feb 2017 01:34:51 -0800 Subject: [PATCH 105/338] Switch commands.json -> commands.js (#668) WebPack has issues with importing JSON directly and using JavaScript methods on it. For this reason, using the `.forEach()` method on the imported JSON array caused a method-not-found error. Instead, we can make this a real JavaScript array by keeping it in a JavaScript file and exporting it as a field. It should be noted that exporting it as `exports = [...]` does not work, because Node won't actually interpret it as a JavaScript array (with the required methods). So instead we can export it as `exports.list = [...]` and access the `list` field to get the real JavaScript array of command names. Fixes #667 --- commands.js | 29 +++++++++++++++++++++++++++++ commands.json | 29 ----------------------------- package.json | 2 +- scripts/generate-docs.js | 2 +- shell.js | 2 +- 5 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 commands.js delete mode 100644 commands.json diff --git a/commands.js b/commands.js new file mode 100644 index 000000000..f31adb214 --- /dev/null +++ b/commands.js @@ -0,0 +1,29 @@ +module.exports = [ + 'cat', + 'cd', + 'chmod', + 'cp', + 'dirs', + 'echo', + 'exec', + 'find', + 'grep', + 'head', + 'ln', + 'ls', + 'mkdir', + 'mv', + 'pwd', + 'rm', + 'sed', + 'set', + 'sort', + 'tail', + 'tempdir', + 'test', + 'to', + 'toEnd', + 'touch', + 'uniq', + 'which', +]; diff --git a/commands.json b/commands.json deleted file mode 100644 index 9254e92dd..000000000 --- a/commands.json +++ /dev/null @@ -1,29 +0,0 @@ -[ - "cat", - "cd", - "chmod", - "cp", - "dirs", - "echo", - "exec", - "find", - "grep", - "head", - "ln", - "ls", - "mkdir", - "mv", - "pwd", - "rm", - "sed", - "set", - "sort", - "tail", - "tempdir", - "test", - "to", - "toEnd", - "touch", - "uniq", - "which" -] diff --git a/package.json b/package.json index af41a52bd..950d695fe 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "homepage": "http://github.com/shelljs/shelljs", "main": "./shell.js", "files": [ - "commands.json", + "commands.js", "global.js", "make.js", "plugin.js", diff --git a/scripts/generate-docs.js b/scripts/generate-docs.js index 9b31f1701..6f6b36de3 100755 --- a/scripts/generate-docs.js +++ b/scripts/generate-docs.js @@ -11,7 +11,7 @@ var docs = grep('^//@', 'shell.js'); // Insert the docs for all the registered commands docs = docs.replace(/\/\/@commands\n/g, function () { - return require('../commands.json').map(function (commandName) { + return require('../commands').map(function (commandName) { var file = './src/' + commandName + '.js'; return grep('^//@', file) + '\n'; }).join(''); diff --git a/shell.js b/shell.js index 44bfbdc78..f155f3d3a 100644 --- a/shell.js +++ b/shell.js @@ -21,7 +21,7 @@ var common = require('./src/common'); //@commands // Load all default commands -require('./commands.json').forEach(function (command) { +require('./commands').forEach(function (command) { require('./src/' + command); }); From 172d0f15432a236438f2b239eeaa1cf7ce44fc93 Mon Sep 17 00:00:00 2001 From: Fran Dios Date: Wed, 1 Mar 2017 10:32:02 +0900 Subject: [PATCH 106/338] Modified glob pattern. Fixes #666 (#676) --- src/ls.js | 7 +++++-- test/ls.js | 14 +++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/ls.js b/src/ls.js index cd2d9202e..bb1b6a7bd 100644 --- a/src/ls.js +++ b/src/ls.js @@ -3,7 +3,7 @@ var fs = require('fs'); var common = require('./common'); var glob = require('glob'); -var globPatternRecursive = path.sep + '**' + path.sep + '*'; +var globPatternRecursive = path.sep + '**'; common.register('ls', _ls, { cmdOptions: { @@ -86,7 +86,10 @@ function _ls(options, paths) { // use glob, because it's simple glob.sync(p + globPatternRecursive, { dot: options.all, follow: options.link }) .forEach(function (item) { - pushFile(item, path.relative(p, item)); + // Glob pattern returns the directory itself and needs to be filtered out. + if (path.relative(p, item)) { + pushFile(item, path.relative(p, item)); + } }); } else if (options.all) { // use fs.readdirSync, because it's fast diff --git a/test/ls.js b/test/ls.js index 05d24763f..4285ea0a6 100644 --- a/test/ls.js +++ b/test/ls.js @@ -292,7 +292,19 @@ test('-RA flag, path given', t => { t.is(result.length, 14); }); -test('-RAL flag, path given', t => { +test('-RA flag, symlinks are not followed', t => { + const result = shell.ls('-RA', 'resources/rm'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.indexOf('a_dir/a_file') > -1); + t.truthy(result.indexOf('link_to_a_dir') > -1); + t.is(result.indexOf('link_to_a_dir/a_file'), -1); + t.truthy(result.indexOf('fake.lnk') > -1); + t.is(result.length, 4); +}); + +test('-RAL flag, follows symlinks', t => { if (process.platform !== 'win32') { const result = shell.ls('-RAL', 'resources/rm'); t.falsy(shell.error()); From 3cd4470be3bd33692f339c8800f1b340cfac11fc Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 4 Mar 2017 00:14:20 -0800 Subject: [PATCH 107/338] refactor: reduce repeated code in which() (#659) Use path.delimiter instead of explicit conditional. Try to reuse repeated code blocks. Fixes #656 --- src/which.js | 102 +++++++++++++++++++++------------------------------ 1 file changed, 41 insertions(+), 61 deletions(-) diff --git a/src/which.js b/src/which.js index 2f3f12147..03db57bcd 100644 --- a/src/which.js +++ b/src/which.js @@ -15,13 +15,7 @@ var XP_DEFAULT_PATHEXT = '.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh'; // Cross-platform method for splitting environment PATH variables function splitPath(p) { - if (!p) return []; - - if (common.platform === 'win') { - return p.split(';'); - } else { - return p.split(':'); - } + return p ? p.split(path.delimiter) : []; } function checkPath(pathName) { @@ -45,74 +39,60 @@ function _which(options, cmd) { var pathEnv = process.env.path || process.env.Path || process.env.PATH; var pathArray = splitPath(pathEnv); - var all = options.all; - var where = all ? [] : null; + + var queryMatches = []; // No relative/absolute paths provided? - if (cmd.search(/\//) === -1) { + if (cmd.indexOf('/') === -1) { + // Assume that there are no extensions to append to queries (this is the + // case for unix) + var pathExtArray = ['']; + if (common.platform === 'win') { + // In case the PATHEXT variable is somehow not set (e.g. + // child_process.spawn with an empty environment), use the XP default. + var pathExtEnv = process.env.PATHEXT || XP_DEFAULT_PATHEXT; + pathExtArray = splitPath(pathExtEnv.toUpperCase()); + } + // Search for command in PATH - pathArray.forEach(function (dir) { - if (!all && where) return; // already found it + for (var k = 0; k < pathArray.length; k++) { + // already found it + if (queryMatches.length > 0 && !options.all) break; - var attempt = path.resolve(dir, cmd); + var attempt = path.resolve(pathArray[k], cmd); if (common.platform === 'win') { attempt = attempt.toUpperCase(); + } - // In case the PATHEXT variable is somehow not set (e.g. - // child_process.spawn with an empty environment), use the XP default. - var pathExtEnv = process.env.PATHEXT || XP_DEFAULT_PATHEXT; - var pathExtArray = splitPath(pathExtEnv.toUpperCase()); - var i; - - // If the extension is already in PATHEXT, just return that. - for (i = 0; i < pathExtArray.length; i++) { - var ext = pathExtArray[i]; - if (attempt.slice(-ext.length) === ext && checkPath(attempt)) { - if (all) { - where.push(attempt); - } else { - where = attempt; - return; - } - } - } - - // Cycle through the PATHEXT variable - var baseAttempt = attempt; - for (i = 0; i < pathExtArray.length; i++) { - attempt = baseAttempt + pathExtArray[i]; - if (checkPath(attempt)) { - if (all) { - where.push(attempt); - } else { - where = attempt; - return; - } - } - } - } else { - // Assume it's Unix-like + var match = attempt.match(/\.[^<>:"/\|?*.]+$/); + if (match && pathExtArray.indexOf(match[0]) >= 0) { // this is Windows-only + // The user typed a query with the file extension, like + // `which('node.exe')` if (checkPath(attempt)) { - if (all) { - where.push(attempt); - } else { - where = attempt; - return; + queryMatches.push(attempt); + break; + } + } else { // All-platforms + // Cycle through the PATHEXT array, and check each extension + // Note: the array is always [''] on Unix + for (var i = 0; i < pathExtArray.length; i++) { + var ext = pathExtArray[i]; + var newAttempt = attempt + ext; + if (checkPath(newAttempt)) { + queryMatches.push(newAttempt); + break; } } } - }); + } + } else if (checkPath(cmd)) { // a valid absolute or relative path + queryMatches.push(path.resolve(cmd)); } - if (all && where.length) return where; - if (!all && where) return where; - - // Command not found anywhere? - if (checkPath(cmd)) { - where = path.resolve(cmd); - if (all) where = [where]; + if (queryMatches.length > 0) { + return options.all ? queryMatches : queryMatches[0]; } - return where; + return options.all ? [] : null; } module.exports = _which; From 5318fdc43a56a5f13655f105c7e2e1146452506d Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 4 Mar 2017 01:07:23 -0800 Subject: [PATCH 108/338] docs: miscellaneous README changes (#661) - Add @freitagbr to the bottom of the README - Remove docs about shjs (it's not well supported) - Remove docs about coffeescript (we don't do anything special for coffeescript anyway) - Modify the section about shelljs/global, since we strongly recommend avoiding this now - Rewrite the code example to use `require('shelljs')` instead of shelljs/global - Mention ESLint next to JSHint - Reformat sections with long lines to be 80 columns --- README.md | 99 +++++++++++++++++------------------------------------ src/exec.js | 2 +- 2 files changed, 33 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index b0fee0346..e8d8a0100 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,11 @@ [![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) [![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) -ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the -Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping -its familiar and powerful commands. You can also install it globally so you can run it from outside -Node projects - say goodbye to those gnarly Bash scripts! +ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell +commands on top of the Node.js API. You can use it to eliminate your shell +script's dependency on Unix while still keeping its familiar and powerful +commands. You can also install it globally so you can run it from outside Node +projects - say goodbye to those gnarly Bash scripts! ShellJS is proudly tested on every node release since `v0.11`! @@ -17,17 +18,17 @@ The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-te + [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader + [Firebug](http://getfirebug.com/) - Firefox's infamous debugger -+ [JSHint](http://jshint.com) - Most popular JavaScript linter ++ [JSHint](http://jshint.com) & [ESLint](http://eslint.org/) - popular JavaScript linters + [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers + [Yeoman](http://yeoman.io/) - Web application stack and development tool + [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation + And [many more](https://npmjs.org/browse/depended/shelljs). -If you have feedback, suggestions, or need help, feel free to post in our [issue tracker](https://github.com/shelljs/shelljs/issues). +If you have feedback, suggestions, or need help, feel free to post in our [issue +tracker](https://github.com/shelljs/shelljs/issues). -Think ShellJS is cool? Check out some related projects (like -[cash](https://github.com/dthree/cash)--a javascript-based POSIX shell) -in our [Wiki page](https://github.com/shelljs/shelljs/wiki)! +Think ShellJS is cool? Check out some related projects in our [Wiki +page](https://github.com/shelljs/shelljs/wiki)! Upgrading from an older version? Check out our [breaking changes](https://github.com/shelljs/shelljs/wiki/Breaking-Changes) page to see @@ -63,79 +64,43 @@ Via npm: $ npm install [-g] shelljs ``` -If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to -run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: - -```bash -$ shjs my_script -``` - ## Examples -### JavaScript - ```javascript -require('shelljs/global'); +var shell = require('shelljs'); -if (!which('git')) { - echo('Sorry, this script requires git'); - exit(1); +if (!shell.which('git')) { + shell.echo('Sorry, this script requires git'); + shell.exit(1); } // Copy files to release dir -rm('-rf', 'out/Release'); -cp('-R', 'stuff/', 'out/Release'); +shell.rm('-rf', 'out/Release'); +shell.cp('-R', 'stuff/', 'out/Release'); // Replace macros in each .js file -cd('lib'); -ls('*.js').forEach(function(file) { - sed('-i', 'BUILD_VERSION', 'v0.1.2', file); - sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file); - sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); +shell.cd('lib'); +shell.ls('*.js').forEach(function (file) { + shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file); + shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file); + shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file); }); -cd('..'); +shell.cd('..'); // Run external tool synchronously -if (exec('git commit -am "Auto-commit"').code !== 0) { - echo('Error: Git commit failed'); - exit(1); +if (shell.exec('git commit -am "Auto-commit"').code !== 0) { + shell.echo('Error: Git commit failed'); + shell.exit(1); } ``` -### CoffeeScript - -CoffeeScript is also supported automatically: - -```coffeescript -require 'shelljs/global' - -if not which 'git' - echo 'Sorry, this script requires git' - exit 1 - -# Copy files to release dir -rm '-rf', 'out/Release' -cp '-R', 'stuff/', 'out/Release' - -# Replace macros in each .js file -cd 'lib' -for file in ls '*.js' - sed '-i', 'BUILD_VERSION', 'v0.1.2', file - sed '-i', /^.*REMOVE_THIS_LINE.*$/, '', file - sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file -cd '..' - -# Run external tool synchronously -if (exec 'git commit -am "Auto-commit"').code != 0 - echo 'Error: Git commit failed' - exit 1 -``` - ## Global vs. Local -The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. +We no longer recommend using a global-import for ShellJS (i.e. +`require('shelljs/global')`). While still supported for convenience, this +pollutes the global namespace, and should therefore only be used with caution. -Example: +Instead, we recommend a local import (standard for npm packages): ```javascript var shell = require('shelljs'); @@ -311,7 +276,7 @@ Available options (all `false` by default): + `async`: Asynchronous execution. If a callback is provided, it will be set to `true`, regardless of the passed value. + `silent`: Do not echo program output to console. -+ and any option available to NodeJS's ++ and any option available to Node.js's [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) Examples: @@ -814,6 +779,6 @@ Reset shell.config to the defaults: ## Team -| [![Nate Fischer](https://avatars.githubusercontent.com/u/5801521?s=130)](https://github.com/nfischer) | [![Ari Porad](https://avatars1.githubusercontent.com/u/1817508?v=3&s=130)](http://github.com/ariporad) | +| [![Nate Fischer](https://avatars.githubusercontent.com/u/5801521?s=130)](https://github.com/nfischer) | [![Brandon Freitag](https://avatars1.githubusercontent.com/u/5988055?v=3&s=130)](http://github.com/freitagbr) | |:---:|:---:| -| [Nate Fischer](https://github.com/nfischer) | [Ari Porad](http://github.com/ariporad) | +| [Nate Fischer](https://github.com/nfischer) | [Brandon Freitag](http://github.com/freitagbr) | diff --git a/src/exec.js b/src/exec.js index aade0228c..5d360e868 100644 --- a/src/exec.js +++ b/src/exec.js @@ -228,7 +228,7 @@ function execAsync(cmd, opts, pipe, callback) { //@ + `async`: Asynchronous execution. If a callback is provided, it will be set to //@ `true`, regardless of the passed value. //@ + `silent`: Do not echo program output to console. -//@ + and any option available to NodeJS's +//@ + and any option available to Node.js's //@ [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) //@ //@ Examples: From eb5230a53c997cde3c74043f926c0f51de62d7fb Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 4 Mar 2017 17:53:37 -0800 Subject: [PATCH 109/338] chore: add codecov (#682) * chore: add codecov Add codecov to ShellJS Partial fix for #671 * Add codecov badge to README --- .travis.yml | 2 ++ README.md | 1 + package.json | 1 + 3 files changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 49666f084..afd8f5603 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,8 @@ script: # make sure when the docs are generated nothing changes (a.k.a. the docs have already been generated) - npm run gendocs - npm run after-travis "Make sure to generate docs!" +after_success: + - codecov # Gitter notifications: diff --git a/README.md b/README.md index e8d8a0100..91f110ff4 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/shelljs/shelljs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Travis](https://img.shields.io/travis/shelljs/shelljs/master.svg?style=flat-square&label=unix)](https://travis-ci.org/shelljs/shelljs) [![AppVeyor](https://img.shields.io/appveyor/ci/shelljs/shelljs/master.svg?style=flat-square&label=windows)](https://ci.appveyor.com/project/shelljs/shelljs/branch/master) +[![Codecov](https://img.shields.io/codecov/c/github/shelljs/shelljs/master.svg?style=flat-square&label=coverage)](https://codecov.io/gh/shelljs/shelljs) [![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) [![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) diff --git a/package.json b/package.json index 950d695fe..e7194c734 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ }, "devDependencies": { "ava": "^0.16.0", + "codecov": "^1.0.1", "coffee-script": "^1.10.0", "eslint": "^2.0.0", "eslint-config-airbnb-base": "^3.0.0", From 346fca4cb62a01c1d00a5a7d3485b170fe24d143 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 4 Mar 2017 17:54:43 -0800 Subject: [PATCH 110/338] test: don't count hard-to-test lines for coverage (#672) No change in logic. Add `/* istanbul ignore next */` lines for hard-to-test lines so that they don't count against us during code coverage. I've also adjusted comments that I found confusing, and changed some formatting. Partial fix for #671 --- src/common.js | 4 ++++ src/cp.js | 3 +++ src/mkdir.js | 1 + src/mv.js | 10 +++++++--- src/rm.js | 6 +++++- src/tempdir.js | 1 + src/test.js | 3 +++ src/to.js | 1 + src/toEnd.js | 1 + 9 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/common.js b/src/common.js index 8b07421a9..d8d403a3f 100644 --- a/src/common.js +++ b/src/common.js @@ -73,6 +73,7 @@ exports.platform = platform; var pipeMethods = []; function log() { + /* istanbul ignore next */ if (!config.silent) { console.error.apply(console, arguments); } @@ -259,6 +260,7 @@ function unlinkSync(file) { fs.unlinkSync(file); } catch (e) { // Try to override file permission + /* istanbul ignore next */ if (e.code === 'EPERM') { fs.chmodSync(file, '0666'); fs.unlinkSync(file); @@ -364,6 +366,7 @@ function wrap(cmd, fn, options) { retValue = fn.apply(this, args); } catch (e) { + /* istanbul ignore else */ if (e.msg === 'earlyExit') { retValue = e.retValue; } else { @@ -372,6 +375,7 @@ function wrap(cmd, fn, options) { } } } catch (e) { + /* istanbul ignore next */ if (!state.error) { // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug... console.error('ShellJS: internal error'); diff --git a/src/cp.js b/src/cp.js index 111e031c9..d1f56334b 100644 --- a/src/cp.js +++ b/src/cp.js @@ -54,12 +54,14 @@ function copyFileSync(srcFile, destFile, options) { try { fdr = fs.openSync(srcFile, 'r'); } catch (e) { + /* istanbul ignore next */ common.error('copyFileSync: could not read src file (' + srcFile + ')'); } try { fdw = fs.openSync(destFile, 'w'); } catch (e) { + /* istanbul ignore next */ common.error('copyFileSync: could not write to dest file (code=' + e.code + '):' + destFile); } @@ -243,6 +245,7 @@ function _cp(options, sources, dest) { fs.statSync(path.dirname(dest)); cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink }); } catch (e) { + /* istanbul ignore next */ common.error("cannot create directory '" + dest + "': No such file or directory"); } } diff --git a/src/mkdir.js b/src/mkdir.js index 0b8c6fe53..115f75ca4 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -83,6 +83,7 @@ function _mkdir(options, dirs) { if (e.code === 'EACCES') { common.error('cannot create directory ' + dir + ': Permission denied'); } else { + /* istanbul ignore next */ throw e; } } diff --git a/src/mv.js b/src/mv.js index c09bbbc76..7fc7cf04c 100644 --- a/src/mv.js +++ b/src/mv.js @@ -38,6 +38,7 @@ function _mv(options, sources, dest) { } else if (typeof sources === 'string') { sources = [sources]; } else { + // TODO(nate): figure out if we actually need this line common.error('invalid arguments'); } @@ -82,9 +83,12 @@ function _mv(options, sources, dest) { try { fs.renameSync(src, thisDest); } catch (e) { - if (e.code === 'EXDEV') { // external partition - // if either of these fails, the appropriate error message will bubble - // up to the top level automatically + /* istanbul ignore next */ + if (e.code === 'EXDEV') { + // If we're trying to `mv` to an external partition, we'll actually need + // to perform a copy and then clean up the original file. If either the + // copy or the rm fails with an exception, we should allow this + // exception to pass up to the top level. cp('-r', src, thisDest); rm('-rf', src); } diff --git a/src/rm.js b/src/rm.js index 803adbc5e..6ce6719a4 100644 --- a/src/rm.js +++ b/src/rm.js @@ -34,7 +34,10 @@ function rmdirSyncRecursive(dir, force) { try { common.unlinkSync(file); } catch (e) { - common.error('could not remove file (code ' + e.code + '): ' + file, { continue: true }); + /* istanbul ignore next */ + common.error('could not remove file (code ' + e.code + '): ' + file, { + continue: true, + }); } } } @@ -55,6 +58,7 @@ function rmdirSyncRecursive(dir, force) { if (fs.existsSync(dir)) throw { code: 'EAGAIN' }; break; } catch (er) { + /* istanbul ignore next */ // In addition to error codes, also check if the directory still exists and loop again if true if (process.platform === 'win32' && (er.code === 'ENOTEMPTY' || er.code === 'EBUSY' || er.code === 'EPERM' || er.code === 'EAGAIN')) { if (Date.now() - start > 1000) throw er; diff --git a/src/tempdir.js b/src/tempdir.js index cfd56b379..a2d15be36 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -19,6 +19,7 @@ function writeableDir(dir) { common.unlinkSync(testFile); return dir; } catch (e) { + /* istanbul ignore next */ return false; } } diff --git a/src/test.js b/src/test.js index 3fb38aec4..d3d9c07a0 100644 --- a/src/test.js +++ b/src/test.js @@ -72,10 +72,13 @@ function _test(options, path) { if (options.file) return stats.isFile(); + /* istanbul ignore next */ if (options.pipe) return stats.isFIFO(); + /* istanbul ignore next */ if (options.socket) return stats.isSocket(); + /* istanbul ignore next */ return false; // fallback } // test module.exports = _test; diff --git a/src/to.js b/src/to.js index 99f194e68..d3d9e37be 100644 --- a/src/to.js +++ b/src/to.js @@ -30,6 +30,7 @@ function _to(options, file) { fs.writeFileSync(file, this.stdout || this.toString(), 'utf8'); return this; } catch (e) { + /* istanbul ignore next */ common.error('could not write to file (code ' + e.code + '): ' + file, { continue: true }); } } diff --git a/src/toEnd.js b/src/toEnd.js index cf91c9401..dc165fe8d 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -29,6 +29,7 @@ function _toEnd(options, file) { fs.appendFileSync(file, this.stdout || this.toString(), 'utf8'); return this; } catch (e) { + /* istanbul ignore next */ common.error('could not append to file (code ' + e.code + '): ' + file, { continue: true }); } } From 35016ce1e7cb2a9be4ba3d5ea141cb89a9eae2d2 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 5 Mar 2017 02:28:47 -0800 Subject: [PATCH 111/338] test: add misc. tests to improve coverage (#673) No change in production logic. This adds missing tests to improve test coverage. This does not change ShellJS behavior at all--all test cases are testing already-working functionality. One test case has been renamed for clarity. For the "omit directory if missing recursive flag" case, we were actually already testing that in another case, but we were testing multiple things in that test case. It's better to test this one error condition explicitly in its own case. When adding real tests for `parseOptions()`, we need to explicitly clear `common.state.error` because we're testing an internal function, not a wrapped command. Partial fix for #671 --- test/common.js | 25 +++++++++++++++++++++++++ test/cp.js | 37 ++++++++++++++++++++++++++++++++++++- test/mv.js | 21 ++++++++++++--------- test/rm.js | 7 +++++++ test/toEnd.js | 6 ++++++ 5 files changed, 86 insertions(+), 10 deletions(-) diff --git a/test/common.js b/test/common.js index 2bb4a7600..bc2c4da89 100644 --- a/test/common.js +++ b/test/common.js @@ -6,6 +6,11 @@ import utils from './utils/utils'; shell.config.silent = true; +test.beforeEach(() => { + common.state.error = null; + common.state.errorCode = 0; +}); + // // Invalids // @@ -22,6 +27,26 @@ test('should be a list', t => { }, TypeError); }); +test('parseOptions (invalid option in options object)', t => { + t.throws(() => { + common.parseOptions({ q: 'some string value' }, { + R: 'recursive', + f: 'force', + r: 'reverse', + }); + }); +}); + +test('parseOptions (invalid type)', t => { + t.throws(() => { + common.parseOptions(12, { + R: 'recursive', + f: 'force', + r: 'reverse', + }); + }); +}); + // // Valids // diff --git a/test/cp.js b/test/cp.js index 4cb16e500..74c8dd836 100644 --- a/test/cp.js +++ b/test/cp.js @@ -71,7 +71,7 @@ test('source does not exist', t => { t.is(result.stderr, 'cp: no such file or directory: asdfasdf'); }); -test('sources does not exist', t => { +test('multiple sources do not exist', t => { const result = shell.cp('asdfasdf1', 'asdfasdf2', t.context.tmp); t.truthy(shell.error()); t.is(result.code, 1); @@ -112,6 +112,32 @@ test('dest already exists', t => { t.is(shell.cat('resources/file2').toString(), oldContents); }); +test('-nR does not overwrite an existing file at the destination', t => { + // Create tmp/new/cp/a + const dest = `${t.context.tmp}/new/cp`; + shell.mkdir('-p', dest); + const oldContents = 'original content'; + shell.ShellString(oldContents).to(`${dest}/a`); + + // Attempt to overwrite /tmp/new/cp/ with resources/cp/ + const result = shell.cp('-nR', 'resources/cp/', `${t.context.tmp}/new/`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(result.stderr); + t.is(shell.cat(`${dest}/a`).toString(), oldContents); +}); + +test('-n does not overwrite an existing file if the destination is a directory', t => { + const oldContents = 'original content'; + shell.cp('resources/file1', `${t.context.tmp}`); + new common.ShellString(oldContents).to(`${t.context.tmp}/file1`); + const result = shell.cp('-n', 'resources/file1', `${t.context.tmp}`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.falsy(result.stderr); + t.is(shell.cat(`${t.context.tmp}/file1`).toString(), oldContents); +}); + test('-f by default', t => { shell.cp('resources/file2', 'resources/copyfile2'); const result = shell.cp('resources/file1', 'resources/file2'); // dest already exists @@ -215,6 +241,15 @@ test('recursive, with regular files', t => { t.truthy(fs.existsSync(`${t.context.tmp}/file2`)); }); +test('omit directory if missing recursive flag', t => { + const result = shell.cp('resources/cp', t.context.tmp); + t.is(shell.error(), "cp: omitting directory 'resources/cp'"); + t.is(result.stderr, "cp: omitting directory 'resources/cp'"); + t.is(result.code, 1); + t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); + t.falsy(fs.existsSync(`${t.context.tmp}/file2`)); +}); + test('recursive, nothing exists', t => { const result = shell.cp('-R', 'resources/cp', t.context.tmp); t.falsy(shell.error()); diff --git a/test/mv.js b/test/mv.js index dcf1e22f2..9d3fbaf92 100644 --- a/test/mv.js +++ b/test/mv.js @@ -91,6 +91,15 @@ test('-n is no-force/no-clobber', t => { t.is(result.stderr, 'mv: dest file already exists: file2'); }); +test('-n option with a directory as the destination', t => { + shell.cp('file1', 'cp'); // copy it so we're sure it's already there + const result = shell.mv('-n', 'file1', 'cp'); + t.truthy(shell.error()); + t.is(result.code, 1); + // TODO(nate): make this an equals comparison once issue #681 is resolved + t.regex(result.stderr, /mv: dest file already exists: cp.file1/); +}); + test('-f is the default behavior', t => { const result = shell.mv('file1', 'file2'); // dest already exists (but that's ok) t.falsy(shell.error()); @@ -153,19 +162,13 @@ test('one source', t => { }); test('two sources', t => { - shell.rm('-rf', 't'); - shell.mkdir('-p', 't'); - let result = shell.mv('file1', 'file2', 't'); + const result = shell.mv('file1', 'file2', 'cp'); t.falsy(shell.error()); t.is(result.code, 0); t.falsy(fs.existsSync('file1')); t.falsy(fs.existsSync('file2')); - t.truthy(fs.existsSync('t/file1')); - t.truthy(fs.existsSync('t/file2')); - result = shell.mv('t/*', '.'); // revert - t.is(result.code, 0); - t.truthy(fs.existsSync('file1')); - t.truthy(fs.existsSync('file2')); + t.truthy(fs.existsSync('cp/file1')); + t.truthy(fs.existsSync('cp/file2')); }); test('two sources, array style', t => { diff --git a/test/rm.js b/test/rm.js index cdb3e925f..1d88a882f 100644 --- a/test/rm.js +++ b/test/rm.js @@ -35,6 +35,13 @@ test('file does not exist', t => { t.is(result.stderr, 'rm: no such file or directory: asdfasdf'); }); +test('cannot delete a directoy without recursive flag', t => { + const result = shell.rm(`${t.context.tmp}/rm`); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'rm: path is a directory'); +}); + test('only an option', t => { const result = shell.rm('-f'); t.truthy(shell.error()); diff --git a/test/toEnd.js b/test/toEnd.js index 323e4a857..cdb7fb68c 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -30,6 +30,12 @@ test('missing file argument', t => { t.truthy(shell.error()); }); +test('cannot write to a non-existent directory', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + shell.ShellString('hello world').toEnd('/asdfasdf/file'); + t.truthy(shell.error()); +}); + // // Valids // From 7a94b1bbba2417439d2416c2ec27aa70feb85f36 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 5 Mar 2017 10:24:09 -0800 Subject: [PATCH 112/338] Refactor tests to improve readability (#685) No change in production logic. --- test/common.js | 2 +- test/ls.js | 28 ++++++++++++++++++---------- test/pipe.js | 4 ++-- test/to.js | 2 +- test/toEnd.js | 2 +- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/test/common.js b/test/common.js index bc2c4da89..f53b3d7d5 100644 --- a/test/common.js +++ b/test/common.js @@ -143,7 +143,7 @@ test('Some basic tests on the ShellString type', t => { const result = shell.ShellString('foo'); t.is(result.toString(), 'foo'); t.is(result.stdout, 'foo'); - t.is(typeof result.stderr, 'undefined'); + t.is(result.stderr, undefined); t.truthy(result.to); t.truthy(result.toEnd); }); diff --git a/test/ls.js b/test/ls.js index 4285ea0a6..89497039e 100644 --- a/test/ls.js +++ b/test/ls.js @@ -382,8 +382,10 @@ test('long option, single file', t => { t.is(result.nlink, 1); t.is(result.size, 5); t.truthy(result.mode); // check that these keys exist - t.truthy(process.platform === 'win32' || result.uid); // only on unix - t.truthy(process.platform === 'win32' || result.gid); // only on unix + if (process.platform !== 'win32') { + t.truthy(result.uid); + t.truthy(result.gid); + } t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist @@ -399,8 +401,10 @@ test('long option, glob files', t => { t.is(result.nlink, 1); t.is(result.size, 5); t.truthy(result.mode); // check that these keys exist - t.truthy(process.platform === 'win32' || result.uid); // only on unix - t.truthy(process.platform === 'win32' || result.gid); // only on unix + if (process.platform !== 'win32') { + t.truthy(result.uid); + t.truthy(result.gid); + } t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist @@ -419,8 +423,10 @@ test('long option, directory', t => { t.is(result.nlink, 1); t.is(result.size, 5); t.truthy(result.mode); // check that these keys exist - t.truthy(process.platform === 'win32' || result.uid); // only on unix - t.truthy(process.platform === 'win32' || result.gid); // only on unix + if (process.platform !== 'win32') { + t.truthy(result.uid); + t.truthy(result.gid); + } t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist @@ -437,11 +443,13 @@ test('long option, directory, recursive (and windows converts slashes)', t => { result = result[idx]; t.is(result.name, result.name); t.truthy(fs.statSync('resources/ls/a_dir/b_dir').isDirectory()); - t.truthy(typeof result.nlink === 'number'); // This can vary between the local machine and travis - t.truthy(typeof result.size === 'number'); // This can vary between different file systems + t.is(typeof result.nlink, 'number'); // This can vary between the local machine and travis + t.is(typeof result.size, 'number'); // This can vary between different file systems t.truthy(result.mode); // check that these keys exist - t.truthy(process.platform === 'win32' || result.uid); // only on unix - t.truthy(process.platform === 'win32' || result.gid); // only on unix + if (process.platform !== 'win32') { + t.truthy(result.uid); + t.truthy(result.gid); + } t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist diff --git a/test/pipe.js b/test/pipe.js index dbb2cc5fd..cc71e0cf0 100644 --- a/test/pipe.js +++ b/test/pipe.js @@ -9,8 +9,8 @@ shell.config.silent = true; // test('commands like `rm` cannot be on the right side of pipes', t => { - t.is(typeof shell.ls('.').rm, 'undefined'); - t.is(typeof shell.cat('resources/file1.txt').rm, 'undefined'); + t.is(shell.ls('.').rm, undefined); + t.is(shell.cat('resources/file1.txt').rm, undefined); }); // diff --git a/test/to.js b/test/to.js index db3ce2450..9774b8331 100644 --- a/test/to.js +++ b/test/to.js @@ -22,7 +22,7 @@ test.afterEach.always(t => { test('Normal strings don\'t have \'.to()\' anymore', t => { const str = 'hello world'; - t.is(typeof str.to, 'undefined'); + t.is(str.to, undefined); }); test('no file argument', t => { diff --git a/test/toEnd.js b/test/toEnd.js index cdb7fb68c..cf3aec4f9 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -22,7 +22,7 @@ test.afterEach.always(t => { test('Normal strings don\'t have \'.toEnd()\' anymore', t => { const str = 'hello world'; - t.is(typeof str.toEnd, 'undefined'); + t.is(str.toEnd, undefined); }); test('missing file argument', t => { From fb09c6aab88dfe193e5eb5fdb1d05f622029d919 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 5 Mar 2017 10:25:44 -0800 Subject: [PATCH 113/338] chore: add codecov script to appveyor CI (#686) Invoke codecov on appveyor builds too, so that we can get coverage for Windows-specific lines of code. Partial fix for #671 --- appveyor.yml | 3 +++ package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index bbde9e705..a081ad22e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,3 +24,6 @@ build: off test_script: - npm test + +on_success: + - npm run codecov -- -f coverage/lcov.info diff --git a/package.json b/package.json index e7194c734..01633f8fe 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "lint": "eslint .", "after-travis": "travis-check-changes", "changelog": "shelljs-changelog", + "codecov": "codecov", "release:major": "shelljs-release major", "release:minor": "shelljs-release minor", "release:patch": "shelljs-release patch" From b6b2cd84ef7ece7d3ebec21957eb23c51c034908 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 6 Mar 2017 00:54:26 -0800 Subject: [PATCH 114/338] fix: convert error output to be consistent cross-platform (#684) * fix: convert error output to be consistent cross-platform The error output produced by `shell.error()` or `result.stderr` should not be inconsistent between platforms. This ensures that path separators are always printed by ShellJS as `/` instead of as `\` on Windows. This should allow scripts using ShellJS to be more consistent cross-platform. We were not previously relying on error output to always be consistent-- only checking its truthiness. Since this was not part of our tested API, it should be reasonable to change this and release in a patch. Fixes #681 * Fix broken pushd test case * Fix TODO in a test case --- src/common.js | 13 ++++++++++++- test/common.js | 40 ++++++++++++++++++++++++++++++++++++++++ test/mv.js | 3 +-- test/pushd.js | 3 ++- 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/common.js b/src/common.js index d8d403a3f..cc8274a20 100644 --- a/src/common.js +++ b/src/common.js @@ -80,6 +80,17 @@ function log() { } exports.log = log; +// Converts strings to be equivalent across all platforms. Primarily responsible +// for making sure we use '/' instead of '\' as path separators, but this may be +// expanded in the future if necessary +function convertErrorOutput(msg) { + if (typeof msg !== 'string') { + throw new TypeError('input must be a string'); + } + return msg.replace(/\\/g, '/'); +} +exports.convertErrorOutput = convertErrorOutput; + // Shows error message. Throws if config.fatal is true function error(msg, _code, options) { // Validate input @@ -105,7 +116,7 @@ function error(msg, _code, options) { if (!state.errorCode) state.errorCode = options.code; - var logEntry = options.prefix + msg; + var logEntry = convertErrorOutput(options.prefix + msg); state.error = state.error ? state.error + '\n' : ''; state.error += logEntry; diff --git a/test/common.js b/test/common.js index f53b3d7d5..1bbcbd7e9 100644 --- a/test/common.js +++ b/test/common.js @@ -47,10 +47,50 @@ test('parseOptions (invalid type)', t => { }); }); +test('convertErrorOutput: no args', t => { + t.throws(() => { + common.convertErrorOutput(); + }, TypeError); +}); + +test('convertErrorOutput: input must be a vanilla string', t => { + t.throws(() => { + common.convertErrorOutput(3); + }, TypeError); + + t.throws(() => { + common.convertErrorOutput({}); + }, TypeError); +}); + // // Valids // +// +// common.convertErrorOutput() +// +test('convertErrorOutput: nothing to convert', t => { + const input = 'hello world'; + const result = common.convertErrorOutput(input); + t.is(result, input); +}); + +test('convertErrorOutput: does not change forward slash', t => { + const input = 'dir/sub/file.txt'; + const result = common.convertErrorOutput(input); + t.is(result, input); +}); + +test('convertErrorOutput: changes backslashes to forward slashes', t => { + const input = 'dir\\sub\\file.txt'; + const result = common.convertErrorOutput(input); + t.is(result, 'dir/sub/file.txt'); +}); + +// +// common.expand() +// test('single file, array syntax', t => { const result = common.expand(['resources/file1.txt']); t.falsy(shell.error()); diff --git a/test/mv.js b/test/mv.js index 9d3fbaf92..9bf1bb954 100644 --- a/test/mv.js +++ b/test/mv.js @@ -96,8 +96,7 @@ test('-n option with a directory as the destination', t => { const result = shell.mv('-n', 'file1', 'cp'); t.truthy(shell.error()); t.is(result.code, 1); - // TODO(nate): make this an equals comparison once issue #681 is resolved - t.regex(result.stderr, /mv: dest file already exists: cp.file1/); + t.is(result.stderr, 'mv: dest file already exists: cp/file1'); }); test('-f is the default behavior', t => { diff --git a/test/pushd.js b/test/pushd.js index 96bfe47ee..68d266849 100644 --- a/test/pushd.js +++ b/test/pushd.js @@ -273,7 +273,8 @@ test('Push invalid directory', t => { shell.pushd('does/not/exist'); t.is( shell.error(), - 'pushd: no such file or directory: ' + path.resolve('.', 'does/not/exist') + `pushd: no such file or directory: ${path.resolve('.', 'does/not/exist') + .replace(/\\/g, '/')}` ); t.is(process.cwd(), oldCwd); }); From 5b5a28d2de28859f835f9dbc704c5aa636462184 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 7 Mar 2017 22:18:43 -0800 Subject: [PATCH 115/338] Fix cp overwriting identical files (#679) * Implement fix for cp with identical files * Implement tests for cp with identical files * Change error message * Use common.error immediately if the file is identical * Add test for copying to exact same path --- src/cp.js | 7 +++++++ test/cp.js | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/cp.js b/src/cp.js index d1f56334b..04c4e57ef 100644 --- a/src/cp.js +++ b/src/cp.js @@ -263,9 +263,16 @@ function _cp(options, sources, dest) { return; // skip file } + if (path.relative(src, thisDest) === '') { + // a file cannot be copied to itself, but we want to continue copying other files + common.error("'" + thisDest + "' and '" + src + "' are the same file", { continue: true }); + return; + } + copyFileSync(src, thisDest, options); } }); // forEach(src) + return new common.ShellString('', common.state.error, common.state.errorCode); } module.exports = _cp; diff --git a/test/cp.js b/test/cp.js index 74c8dd836..76525f09a 100644 --- a/test/cp.js +++ b/test/cp.js @@ -688,3 +688,28 @@ test('recursive, with a non-normalized path', t => { t.falsy(result.stderr); t.is(result.code, 0); }); + +test('copy file to same path', t => { + const result = shell.cp('resources/file1', 'resources/file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, "cp: 'resources/file1' and 'resources/file1' are the same file"); +}); + +test('copy file to same directory', t => { + const result = shell.cp('resources/file1', 'resources'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, "cp: 'resources/file1' and 'resources/file1' are the same file"); +}); + +test('copy mutliple files to same location', t => { + const result = shell.cp('resources/file1', 'resources/file2', 'resources'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is( + result.stderr, + "cp: 'resources/file1' and 'resources/file1' are the same file\n" + + "cp: 'resources/file2' and 'resources/file2' are the same file" + ); +}); From 79497594633b4af663e7b137350b841de0ed5343 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 8 Mar 2017 07:33:41 -0800 Subject: [PATCH 116/338] Add support for removing fifos (#687) * Add support for removing fifos in rm * Add test for removing fifo * Add mkfifo util for testing * Use ES5 syntax in utils --- src/rm.js | 2 +- test/rm.js | 9 +++++++++ test/utils/utils.js | 10 ++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/rm.js b/src/rm.js index 6ce6719a4..595368114 100644 --- a/src/rm.js +++ b/src/rm.js @@ -141,7 +141,7 @@ function _rm(options, files) { } else { common.error('path is a directory', { continue: true }); } - } else if (stats.isSymbolicLink()) { + } else if (stats.isSymbolicLink() || stats.isFIFO()) { common.unlinkSync(file); } }); // forEach(file) diff --git a/test/rm.js b/test/rm.js index 1d88a882f..5156edd6c 100644 --- a/test/rm.js +++ b/test/rm.js @@ -298,3 +298,12 @@ test('recursive dir removal, for non-normalized path', t => { t.is(result.code, 0); t.falsy(fs.existsSync(`${t.context.tmp}/a`)); }); + +test('remove fifo', t => { + if (process.platform !== 'win32') { + const fifo = utils.mkfifo(t.context.tmp); + const result = shell.rm(fifo); + t.falsy(shell.error()); + t.is(result.code, 0); + } +}); diff --git a/test/utils/utils.js b/test/utils/utils.js index 814f82b87..a1d313143 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -36,3 +36,13 @@ function sleep(time) { child.execFileSync(common.config.execPath, ['resources/exec/slow.js', time.toString()]); } exports.sleep = sleep; + +function mkfifo(dir) { + if (process.platform !== 'win32') { + const fifo = dir + 'fifo'; + child.execFileSync('mkfifo', [fifo]); + return fifo; + } + return null; +} +exports.mkfifo = mkfifo; From 54c1befe94fe4d5bc4c912590d3e4ab63594d624 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 8 Mar 2017 19:30:56 -0800 Subject: [PATCH 117/338] refactor(parseOptions): better handle errors (#674) * refactor(parseOptions): better handle errors For the case where `parseOptions()` is passed a string that does not start with a hyphen, we should reject this string instead of returning the same value. This has no change on any other test cases, and should not affect any commands since we are careful about what input we pass to `parseOptions()` This also adjust how we were handling error cases in the function. We were previously using two different calls to `common.error()`, one for if `errorOptions` is passed, and one without. This hurts readability, because it reads like "if we have errorOptions, then this is an error, and if we don't then it's also an error," instead of the more appropriate, "we reached an error case and should use errorOptions if it's available, otherwise we should signal an error without using it." We do not need to use `errorOptions` for the added call to `error()`, since this is an error which indicates misuse, and should not be recoverable. This adds a test case as well, for a line which was not previously covered in our tests. Partial fix for #671 * Refactor parseOptions() This validates input at the top of `parseOptions()` for type correctness. This changes `typeof x === 'object'` to `x instanceOf Object` to improve robustness. Now we can safely use `errorOptions` knowing that if it has a truthy value, it will be an object, otherwise we should use defaults instead. The new tests ensure that we have 100% unit test coverage for this function. * Use exceptions, not common.error()s, for internal misuse * Add common.isObject() helper function The `isObject()` helper is used throughout common.js to reliably test if variables are JavaScript objects. --- src/common.js | 53 +++++++++++++++++++++++++++----------------------- test/common.js | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/common.js b/src/common.js index cc8274a20..f5197d8ec 100644 --- a/src/common.js +++ b/src/common.js @@ -72,6 +72,12 @@ exports.platform = platform; // This is populated by calls to commonl.wrap() var pipeMethods = []; +// Reliably test if something is any sort of javascript object +function isObject(a) { + return typeof a === 'object' && a !== null; +} +exports.isObject = isObject; + function log() { /* istanbul ignore next */ if (!config.silent) { @@ -103,9 +109,9 @@ function error(msg, _code, options) { silent: false, }; - if (typeof _code === 'number' && typeof options === 'object') { + if (typeof _code === 'number' && isObject(options)) { options.code = _code; - } else if (typeof _code === 'object') { // no 'code' + } else if (isObject(_code)) { // no 'code' options = _code; } else if (typeof _code === 'number') { // no 'options' options = { code: _code }; @@ -184,22 +190,29 @@ exports.getUserHome = getUserHome; // Returns {'reference': 'string-value', 'bob': false} when passed two dictionaries of the form: // parseOptions({'-r': 'string-value'}, {'r':'reference', 'b':'bob'}); function parseOptions(opt, map, errorOptions) { - if (!map) error('parseOptions() internal error: no map given'); + // Validate input + if (typeof opt !== 'string' && !isObject(opt)) { + throw new Error('options must be strings or key-value pairs'); + } else if (!isObject(map)) { + throw new Error('parseOptions() internal error: map must be an object'); + } else if (errorOptions && !isObject(errorOptions)) { + throw new Error('parseOptions() internal error: errorOptions must be object'); + } // All options are false by default var options = {}; Object.keys(map).forEach(function (letter) { - if (map[letter][0] !== '!') { - options[map[letter]] = false; + var optName = map[letter]; + if (optName[0] !== '!') { + options[optName] = false; } }); - if (!opt) return options; // defaults + if (opt === '') return options; // defaults - var optionName; if (typeof opt === 'string') { if (opt[0] !== '-') { - return options; + error("Options string must start with a '-'", errorOptions || {}); } // e.g. chars = ['R', 'f'] @@ -207,35 +220,27 @@ function parseOptions(opt, map, errorOptions) { chars.forEach(function (c) { if (c in map) { - optionName = map[c]; + var optionName = map[c]; if (optionName[0] === '!') { options[optionName.slice(1)] = false; } else { options[optionName] = true; } - } else if (typeof errorOptions === 'object') { - error('option not recognized: ' + c, errorOptions); } else { - error('option not recognized: ' + c); + error('option not recognized: ' + c, errorOptions || {}); } }); - } else if (typeof opt === 'object') { + } else { // opt is an Object Object.keys(opt).forEach(function (key) { // key is a string of the form '-r', '-d', etc. var c = key[1]; if (c in map) { - optionName = map[c]; + var optionName = map[c]; options[optionName] = opt[key]; // assign the given value - } else if (typeof errorOptions === 'object') { - error('option not recognized: ' + c, errorOptions); } else { - error('option not recognized: ' + c); + error('option not recognized: ' + c, errorOptions || {}); } }); - } else if (typeof errorOptions === 'object') { - error('options must be strings or key-value pairs', errorOptions); - } else { - error('options must be strings or key-value pairs'); } return options; } @@ -328,7 +333,7 @@ function wrap(cmd, fn, options) { if (options.unix === false) { // this branch is for exec() retValue = fn.apply(this, args); } else { // and this branch is for everything else - if (args[0] instanceof Object && args[0].constructor.name === 'Object') { + if (isObject(args[0]) && args[0].constructor.name === 'Object') { // a no-op, allowing the syntax `touch({'-r': file}, ...)` } else if (args.length === 0 || typeof args[0] !== 'string' || args[0].length <= 1 || args[0][0] !== '-') { args.unshift(''); // only add dummy option if '-option' not already present @@ -348,7 +353,7 @@ function wrap(cmd, fn, options) { // Convert ShellStrings (basically just String objects) to regular strings args = args.map(function (arg) { - if (arg instanceof Object && arg.constructor.name === 'String') { + if (isObject(arg) && arg.constructor.name === 'String') { return arg.toString(); } return arg; @@ -371,7 +376,7 @@ function wrap(cmd, fn, options) { try { // parse options if options are provided - if (typeof options.cmdOptions === 'object') { + if (isObject(options.cmdOptions)) { args[0] = parseOptions(args[0], options.cmdOptions); } diff --git a/test/common.js b/test/common.js index 1bbcbd7e9..fb3103bf8 100644 --- a/test/common.js +++ b/test/common.js @@ -37,6 +37,52 @@ test('parseOptions (invalid option in options object)', t => { }); }); +test('parseOptions (without a hyphen in the string)', t => { + t.throws(() => { + common.parseOptions('f', { + f: 'force', + }); + }); +}); + +test('parseOptions (opt is not a string/object)', t => { + t.throws(() => { + common.parseOptions(1, { + f: 'force', + }); + }); +}); + +test('parseOptions (map is not an object)', t => { + t.throws(() => { + common.parseOptions('-f', 27); + }); +}); + +test('parseOptions (errorOptions is not an object)', t => { + t.throws(() => { + common.parseOptions('-f', { + f: 'force', + }, 'not a valid errorOptions'); + }); +}); + +test('parseOptions (unrecognized string option)', t => { + t.throws(() => { + common.parseOptions('-z', { + f: 'force', + }); + }); +}); + +test('parseOptions (unrecognized option in Object)', t => { + t.throws(() => { + common.parseOptions({ '-c': 7 }, { + f: 'force', + }); + }); +}); + test('parseOptions (invalid type)', t => { t.throws(() => { common.parseOptions(12, { From 95638cc773390920a446e383c40ed8104c7d211d Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 8 Mar 2017 22:37:03 -0800 Subject: [PATCH 118/338] 0.7.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 01633f8fe..fb1c75428 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.6", + "version": "0.7.7", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From b9201eba0f0032940bcfb987a59de84c74e561c3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 8 Mar 2017 22:38:36 -0800 Subject: [PATCH 119/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e66d72cf9..6de319e18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,52 @@ # Change Log +## [v0.7.7](https://github.com/shelljs/shelljs/tree/v0.7.7) (2017-03-09) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.6...v0.7.7) + +**Closed issues:** + +- Error output should be consistent across all platforms. [\#681](https://github.com/shelljs/shelljs/issues/681) +- \*CRITICAL data loss\* shell.cp\(\) Content of file is erased when trying to copy it to the folder it already belongs to [\#678](https://github.com/shelljs/shelljs/issues/678) +- Use with webpack broken in 0.7.6 [\#667](https://github.com/shelljs/shelljs/issues/667) +- Difference between bash ls -R and ShellJS ls -R with symlinks [\#666](https://github.com/shelljs/shelljs/issues/666) +- Refactor which\(\) \(too many repeated code blocks\) [\#656](https://github.com/shelljs/shelljs/issues/656) +- find\(\) raises error when unable to find any files matching, expected to return empty array. [\#653](https://github.com/shelljs/shelljs/issues/653) +- Drop support for v0.12 [\#647](https://github.com/shelljs/shelljs/issues/647) +- Reformat the markdown in RELEASE.md [\#642](https://github.com/shelljs/shelljs/issues/642) +- rm -rf doesn't work if the directory contains an asar archive in Electron [\#618](https://github.com/shelljs/shelljs/issues/618) +- Add support for other file types in rm [\#617](https://github.com/shelljs/shelljs/issues/617) +- Feature request: ls -L option [\#563](https://github.com/shelljs/shelljs/issues/563) +- How to send SIGINT signal to child process launched with exec [\#518](https://github.com/shelljs/shelljs/issues/518) +- exec doesnt seem to be working [\#480](https://github.com/shelljs/shelljs/issues/480) +- feature request: option to add node\_modules to the path for shelljs scripts [\#469](https://github.com/shelljs/shelljs/issues/469) +- high cpu usage during synchronous exec [\#167](https://github.com/shelljs/shelljs/issues/167) + +**Merged pull requests:** + +- Add support for removing fifos [\#687](https://github.com/shelljs/shelljs/pull/687) ([freitagbr](https://github.com/freitagbr)) +- chore: add codecov script to appveyor CI [\#686](https://github.com/shelljs/shelljs/pull/686) ([nfischer](https://github.com/nfischer)) +- Refactor tests to improve readability [\#685](https://github.com/shelljs/shelljs/pull/685) ([nfischer](https://github.com/nfischer)) +- fix: convert error output to be consistent cross-platform [\#684](https://github.com/shelljs/shelljs/pull/684) ([nfischer](https://github.com/nfischer)) +- chore: add codecov [\#682](https://github.com/shelljs/shelljs/pull/682) ([nfischer](https://github.com/nfischer)) +- Fix cp overwriting identical files [\#679](https://github.com/shelljs/shelljs/pull/679) ([freitagbr](https://github.com/freitagbr)) +- Modified glob pattern. Fixes \#666 [\#676](https://github.com/shelljs/shelljs/pull/676) ([frandiox](https://github.com/frandiox)) +- refactor\(parseOptions\): better handle errors [\#674](https://github.com/shelljs/shelljs/pull/674) ([nfischer](https://github.com/nfischer)) +- test: add misc. tests to improve coverage [\#673](https://github.com/shelljs/shelljs/pull/673) ([nfischer](https://github.com/nfischer)) +- test: don't count hard-to-test lines for coverage [\#672](https://github.com/shelljs/shelljs/pull/672) ([nfischer](https://github.com/nfischer)) +- fix: switch commands.json -\> commands.js [\#668](https://github.com/shelljs/shelljs/pull/668) ([nfischer](https://github.com/nfischer)) +- ls -L \(follow symlinks\) [\#665](https://github.com/shelljs/shelljs/pull/665) ([frandiox](https://github.com/frandiox)) +- docs\(chmod\): document `options` argument [\#663](https://github.com/shelljs/shelljs/pull/663) ([gkalpak](https://github.com/gkalpak)) +- docs: clean up RELEASE.md [\#662](https://github.com/shelljs/shelljs/pull/662) ([nfischer](https://github.com/nfischer)) +- docs: miscellaneous README changes [\#661](https://github.com/shelljs/shelljs/pull/661) ([nfischer](https://github.com/nfischer)) +- Fix typo in README [\#660](https://github.com/shelljs/shelljs/pull/660) ([faheel](https://github.com/faheel)) +- refactor: reduce repeated code in which\(\) [\#659](https://github.com/shelljs/shelljs/pull/659) ([nfischer](https://github.com/nfischer)) +- feature: add -a option for which command [\#655](https://github.com/shelljs/shelljs/pull/655) ([termosa](https://github.com/termosa)) +- Fix find ENOENT [\#654](https://github.com/shelljs/shelljs/pull/654) ([freitagbr](https://github.com/freitagbr)) +- Safely exit by throwing an error [\#649](https://github.com/shelljs/shelljs/pull/649) ([freitagbr](https://github.com/freitagbr)) +- Chore drop 0.12 [\#648](https://github.com/shelljs/shelljs/pull/648) ([nfischer](https://github.com/nfischer)) +- chore\(lint\): Enforce a trailing comma for multi-line [\#646](https://github.com/shelljs/shelljs/pull/646) ([nfischer](https://github.com/nfischer)) +- docs\(release\): use bulleted list [\#643](https://github.com/shelljs/shelljs/pull/643) ([freitagbr](https://github.com/freitagbr)) + ## [v0.7.6](https://github.com/shelljs/shelljs/tree/v0.7.6) (2017-01-08) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.5...v0.7.6) @@ -553,8 +600,8 @@ **Merged pull requests:** -- Addition of a toEnd\(\) function modeled after the Unix \>\> pipe. [\#78](https://github.com/shelljs/shelljs/pull/78) ([andreweduffy](https://github.com/andreweduffy)) -- Added appendTo\(\) function to imitate '\>\>' redirect-and-append pipe. [\#75](https://github.com/shelljs/shelljs/pull/75) ([andreweduffy](https://github.com/andreweduffy)) +- Addition of a toEnd\(\) function modeled after the Unix \>\> pipe. [\#78](https://github.com/shelljs/shelljs/pull/78) ([a10y](https://github.com/a10y)) +- Added appendTo\(\) function to imitate '\>\>' redirect-and-append pipe. [\#75](https://github.com/shelljs/shelljs/pull/75) ([a10y](https://github.com/a10y)) - Fix a small typo in README.md [\#71](https://github.com/shelljs/shelljs/pull/71) ([asmblah](https://github.com/asmblah)) - adding an `.npmignore` file [\#70](https://github.com/shelljs/shelljs/pull/70) ([stephenmathieson](https://github.com/stephenmathieson)) - tempdir: use `os.tmpDir` when possible [\#67](https://github.com/shelljs/shelljs/pull/67) ([stephenmathieson](https://github.com/stephenmathieson)) From 80d590ec0575e1dc8a83268f8fedd310c7c7e43d Mon Sep 17 00:00:00 2001 From: Christian Zommerfelds Date: Thu, 30 Mar 2017 23:30:30 -0400 Subject: [PATCH 120/338] Small clarification of verbose flag (#691) * small clarification of verbose flag * nfischer's documentation suggestion * verbose flag documentation in source file --- README.md | 6 ++++-- shell.js | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 91f110ff4..1f3e6ec0f 100644 --- a/README.md +++ b/README.md @@ -732,14 +732,16 @@ Example: ```javascript config.verbose = true; // or set('-v'); cd('dir/'); -ls('subdir/'); +rm('-rf', 'foo.txt', 'bar.txt'); +exec('echo hello'); ``` Will print each command as follows: ``` cd dir/ -ls subdir/ +rm -rf foo.txt bar.txt +exec echo hello ``` ### config.globOptions diff --git a/shell.js b/shell.js index f155f3d3a..2541a2036 100644 --- a/shell.js +++ b/shell.js @@ -103,14 +103,16 @@ exports.config = common.config; //@ ```javascript //@ config.verbose = true; // or set('-v'); //@ cd('dir/'); -//@ ls('subdir/'); +//@ rm('-rf', 'foo.txt', 'bar.txt'); +//@ exec('echo hello'); //@ ``` //@ //@ Will print each command as follows: //@ //@ ``` //@ cd dir/ -//@ ls subdir/ +//@ rm -rf foo.txt bar.txt +//@ exec echo hello //@ ``` //@ From e12da9d888c03b0b7cc6c75bcf9a3251fa2322fd Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Fri, 14 Apr 2017 23:04:21 -0700 Subject: [PATCH 121/338] Refactor: Use process.platform across codebase (#689) * Use process.platform across codebase * Use process.platform in tests --- src/common.js | 3 --- src/cp.js | 11 +++++++---- src/find.js | 2 +- src/ln.js | 2 +- src/which.js | 5 +++-- test/cp.js | 2 +- test/test.js | 11 +++++------ 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/common.js b/src/common.js index f5197d8ec..e0d343b8c 100644 --- a/src/common.js +++ b/src/common.js @@ -66,9 +66,6 @@ exports.state = state; delete process.env.OLDPWD; // initially, there's no previous directory -var platform = os.type().match(/^Win/) ? 'win' : 'unix'; -exports.platform = platform; - // This is populated by calls to commonl.wrap() var pipeMethods = []; diff --git a/src/cp.js b/src/cp.js index 04c4e57ef..52af77be0 100644 --- a/src/cp.js +++ b/src/cp.js @@ -1,7 +1,6 @@ var fs = require('fs'); var path = require('path'); var common = require('./common'); -var os = require('os'); common.register('cp', _cp, { cmdOptions: { @@ -24,6 +23,8 @@ function copyFileSync(srcFile, destFile, options) { common.error('copyFileSync: no such file or directory: ' + srcFile); } + var isWindows = process.platform === 'win32'; + // Check the mtimes of the files if the '-u' flag is provided try { if (options.update && fs.statSync(srcFile).mtime < fs.statSync(destFile).mtime) { @@ -42,7 +43,7 @@ function copyFileSync(srcFile, destFile, options) { } var symlinkFull = fs.readlinkSync(srcFile); - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); + fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); } else { var BUF_LENGTH = 64 * 1024; var buf = new Buffer(BUF_LENGTH); @@ -93,6 +94,8 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { if (currentDepth >= common.config.maxdepth) return; currentDepth++; + var isWindows = process.platform === 'win32'; + // Create the directory where all our junk is moving to; read the mode of the // source directory and mirror it try { @@ -116,7 +119,7 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { // Cycle link found. console.error('Cycle link found.'); symlinkFull = fs.readlinkSync(srcFile); - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); + fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); continue; } } @@ -131,7 +134,7 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { } catch (e) { // it doesn't exist, so no work needs to be done } - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); + fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); } else if (srcFileStat.isSymbolicLink() && opts.followsymlink) { srcFileStat = fs.statSync(srcFile); if (srcFileStat.isDirectory()) { diff --git a/src/find.js b/src/find.js index 625aa2972..76a16c4ee 100644 --- a/src/find.js +++ b/src/find.js @@ -30,7 +30,7 @@ function _find(options, paths) { var list = []; function pushFile(file) { - if (common.platform === 'win') { + if (process.platform === 'win32') { file = file.replace(/\\/g, '/'); } list.push(file); diff --git a/src/ln.js b/src/ln.js index 7393d9fcd..9b8beb9ec 100644 --- a/src/ln.js +++ b/src/ln.js @@ -43,7 +43,7 @@ function _ln(options, source, dest) { } if (options.symlink) { - var isWindows = common.platform === 'win'; + var isWindows = process.platform === 'win32'; var linkType = isWindows ? 'file' : null; var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source); if (!fs.existsSync(resolvedSourcePath)) { diff --git a/src/which.js b/src/which.js index 03db57bcd..a5f9e15eb 100644 --- a/src/which.js +++ b/src/which.js @@ -37,6 +37,7 @@ function checkPath(pathName) { function _which(options, cmd) { if (!cmd) common.error('must specify command'); + var isWindows = process.platform === 'win32'; var pathEnv = process.env.path || process.env.Path || process.env.PATH; var pathArray = splitPath(pathEnv); @@ -47,7 +48,7 @@ function _which(options, cmd) { // Assume that there are no extensions to append to queries (this is the // case for unix) var pathExtArray = ['']; - if (common.platform === 'win') { + if (isWindows) { // In case the PATHEXT variable is somehow not set (e.g. // child_process.spawn with an empty environment), use the XP default. var pathExtEnv = process.env.PATHEXT || XP_DEFAULT_PATHEXT; @@ -61,7 +62,7 @@ function _which(options, cmd) { var attempt = path.resolve(pathArray[k], cmd); - if (common.platform === 'win') { + if (isWindows) { attempt = attempt.toUpperCase(); } diff --git a/test/cp.js b/test/cp.js index 76525f09a..94f0e23a2 100644 --- a/test/cp.js +++ b/test/cp.js @@ -405,7 +405,7 @@ test('recursive, with trailing slash, does the exact same', t => { test( 'On Windows, permission bits are quite different so skip those tests for now', t => { - if (common.platform !== 'win') { + if (process.platform !== 'win32') { // preserve mode bits const execBit = parseInt('001', 8); t.is(fs.statSync('resources/cp-mode-bits/executable').mode & execBit, execBit); diff --git a/test/test.js b/test/test.js index 498bbea6d..39f25795e 100644 --- a/test/test.js +++ b/test/test.js @@ -1,7 +1,6 @@ import test from 'ava'; import shell from '..'; -import common from '../src/common'; shell.config.silent = true; @@ -91,7 +90,7 @@ test('test command is not globbed', t => { // TODO(nate): figure out a way to test links on Windows test('-d option fails for a link', t => { - if (common.platform !== 'win') { + if (process.platform !== 'win32') { const result = shell.test('-d', 'resources/link'); t.falsy(shell.error()); t.falsy(result); @@ -99,7 +98,7 @@ test('-d option fails for a link', t => { }); test('-f option succeeds for a link', t => { - if (common.platform !== 'win') { + if (process.platform !== 'win32') { const result = shell.test('-f', 'resources/link'); t.falsy(shell.error()); t.truthy(result); @@ -107,7 +106,7 @@ test('-f option succeeds for a link', t => { }); test('-L option succeeds for a symlink', t => { - if (common.platform !== 'win') { + if (process.platform !== 'win32') { const result = shell.test('-L', 'resources/link'); t.falsy(shell.error()); t.truthy(result); @@ -115,7 +114,7 @@ test('-L option succeeds for a symlink', t => { }); test('-L option works for broken symlinks', t => { - if (common.platform !== 'win') { + if (process.platform !== 'win32') { const result = shell.test('-L', 'resources/badlink'); t.falsy(shell.error()); t.truthy(result); @@ -123,7 +122,7 @@ test('-L option works for broken symlinks', t => { }); test('-L option fails for missing files', t => { - if (common.platform !== 'win') { + if (process.platform !== 'win32') { const result = shell.test('-L', 'resources/404'); t.falsy(shell.error()); t.falsy(result); From 7feabda0d65e18324d16c1657351568ab26b6626 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Sat, 15 Apr 2017 00:49:10 -0700 Subject: [PATCH 122/338] Remove contents of symlink to dir with rm -rf (#688) * rm -rf on a symlink to a dir deletes contents * Fix comment typo * Clarify comments * Pass symlink directly to rmdirSync * Skip rm -rf symlink test on windows --- src/rm.js | 88 ++++++++++++++++++++++++++++++++++++++++++------------ test/rm.js | 21 ++++++------- 2 files changed, 80 insertions(+), 29 deletions(-) diff --git a/src/rm.js b/src/rm.js index 595368114..2ad6914b4 100644 --- a/src/rm.js +++ b/src/rm.js @@ -17,7 +17,7 @@ common.register('rm', _rm, { // // Licensed under the MIT License // http://www.opensource.org/licenses/mit-license.php -function rmdirSyncRecursive(dir, force) { +function rmdirSyncRecursive(dir, force, fromSymlink) { var files; files = fs.readdirSync(dir); @@ -43,6 +43,10 @@ function rmdirSyncRecursive(dir, force) { } } + // if was directory was referenced through a symbolic link, + // the contents should be removed, but not the directory itself + if (fromSymlink) return; + // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. // Huzzah for the shopkeep. @@ -91,6 +95,57 @@ function isWriteable(file) { return writePermission; } +function handleFile(file, options) { + if (options.force || isWriteable(file)) { + // -f was passed, or file is writable, so it can be removed + common.unlinkSync(file); + } else { + common.error('permission denied: ' + file, { continue: true }); + } +} + +function handleDirectory(file, options) { + if (options.recursive) { + // -r was passed, so directory can be removed + rmdirSyncRecursive(file, options.force); + } else { + common.error('path is a directory', { continue: true }); + } +} + +function handleSymbolicLink(file, options) { + var stats; + try { + stats = fs.statSync(file); + } catch (e) { + // symlink is broken, so remove the symlink itself + common.unlinkSync(file); + return; + } + + if (stats.isFile()) { + common.unlinkSync(file); + } else if (stats.isDirectory()) { + if (file[file.length - 1] === '/') { + // trailing separator, so remove the contents, not the link + if (options.recursive) { + // -r was passed, so directory can be removed + var fromSymlink = true; + rmdirSyncRecursive(file, options.force, fromSymlink); + } else { + common.error('path is a directory', { continue: true }); + } + } else { + // no trailing separator, so remove the link + common.unlinkSync(file); + } + } +} + +function handleFIFO(file) { + common.unlinkSync(file); +} + //@ //@ ### rm([options,] file [, file ...]) //@ ### rm([options,] file_array) @@ -115,9 +170,12 @@ function _rm(options, files) { files = [].slice.call(arguments, 1); files.forEach(function (file) { - var stats; + var lstats; try { - stats = fs.lstatSync(file); // test for existence + var filepath = (file[file.length - 1] === '/') + ? file.slice(0, -1) // remove the '/' so lstatSync can detect symlinks + : file; + lstats = fs.lstatSync(filepath); // test for existence } catch (e) { // Path does not exist, no force flag given if (!options.force) { @@ -127,22 +185,14 @@ function _rm(options, files) { } // If here, path exists - if (stats.isFile()) { - if (options.force || isWriteable(file)) { - // -f was passed, or file is writable, so it can be removed - common.unlinkSync(file); - } else { - common.error('permission denied: ' + file, { continue: true }); - } - } else if (stats.isDirectory()) { - if (options.recursive) { - // -r was passed, so directory can be removed - rmdirSyncRecursive(file, options.force); - } else { - common.error('path is a directory', { continue: true }); - } - } else if (stats.isSymbolicLink() || stats.isFIFO()) { - common.unlinkSync(file); + if (lstats.isFile()) { + handleFile(file, options); + } else if (lstats.isDirectory()) { + handleDirectory(file, options); + } else if (lstats.isSymbolicLink()) { + handleSymbolicLink(file, options); + } else if (lstats.isFIFO()) { + handleFIFO(file); } }); // forEach(file) return ''; diff --git a/test/rm.js b/test/rm.js index 5156edd6c..e729d2d13 100644 --- a/test/rm.js +++ b/test/rm.js @@ -150,7 +150,7 @@ test('recursive dir removal', t => { t.is(result.code, 0); const contents = fs.readdirSync(t.context.tmp); t.is(contents.length, 1); - t.is(contents[0], '.hidden'); // shouldn't remove hiddden if no .* given + t.is(contents[0], '.hidden'); // shouldn't remove hidden if no .* given }); test('recursive dir removal #2', t => { @@ -267,16 +267,17 @@ test('remove symbolic link to a dir', t => { t.truthy(fs.existsSync(`${t.context.tmp}/rm/a_dir`)); }); -// TODO(nfischer): fix this behavior in rm -test.skip('rm -rf on a symbolic link to a dir deletes its contents', t => { - const result = shell.rm('-rf', `${t.context.tmp}/rm/link_to_a_dir/`); - t.falsy(shell.error()); - t.is(result.code, 0); +test('rm -rf on a symbolic link to a dir deletes its contents', t => { + if (process.platform !== 'win32') { + const result = shell.rm('-rf', `${t.context.tmp}/rm/link_to_a_dir/`); + t.falsy(shell.error()); + t.is(result.code, 0); - // Both the link and original dir should remain, but contents are deleted - t.truthy(fs.existsSync(`${t.context.tmp}/rm/link_to_a_dir`)); - t.truthy(fs.existsSync(`${t.context.tmp}/rm/a_dir`)); - t.falsy(fs.existsSync(`${t.context.tmp}/rm/a_dir/a_file`)); + // Both the link and original dir should remain, but contents are deleted + t.truthy(fs.existsSync(`${t.context.tmp}/rm/link_to_a_dir`)); + t.truthy(fs.existsSync(`${t.context.tmp}/rm/a_dir`)); + t.falsy(fs.existsSync(`${t.context.tmp}/rm/a_dir/a_file`)); + } }); test('remove broken symbolic link', t => { From d8ac4d3f028a3ae09e5632dfbcf8bfa9580af50f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 15 Apr 2017 00:51:29 -0700 Subject: [PATCH 123/338] refactor: remove unnecessary common.js imports (#703) No change in logic. This removes unnecessary imports of `common.js` in favor of the `shell` package. --- test/common.js | 10 +++++----- test/cp.js | 3 +-- test/exec.js | 31 +++++++++++++++---------------- test/set.js | 11 +++++------ test/shjs.js | 3 +-- 5 files changed, 27 insertions(+), 31 deletions(-) diff --git a/test/common.js b/test/common.js index fb3103bf8..68051b7c6 100644 --- a/test/common.js +++ b/test/common.js @@ -248,11 +248,11 @@ test.cb('Commands that fail will still output error messages to stderr', t => { test('execPath value makes sense', t => { // TODO(nate): change this test if we add electron support in the unit tests - t.is(common.config.execPath, process.execPath); - t.is(typeof common.config.execPath, 'string'); + t.is(shell.config.execPath, process.execPath); + t.is(typeof shell.config.execPath, 'string'); }); -test('Changing common.config.execPath does not modify process', t => { - common.config.execPath = 'foo'; - t.not(common.config.execPath, process.execPath); +test('Changing shell.config.execPath does not modify process', t => { + shell.config.execPath = 'foo'; + t.not(shell.config.execPath, process.execPath); }); diff --git a/test/cp.js b/test/cp.js index 94f0e23a2..8b5b98d33 100644 --- a/test/cp.js +++ b/test/cp.js @@ -3,7 +3,6 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; -import common from '../src/common'; import utils from './utils/utils'; const oldMaxDepth = shell.config.maxdepth; @@ -130,7 +129,7 @@ test('-nR does not overwrite an existing file at the destination', t => { test('-n does not overwrite an existing file if the destination is a directory', t => { const oldContents = 'original content'; shell.cp('resources/file1', `${t.context.tmp}`); - new common.ShellString(oldContents).to(`${t.context.tmp}/file1`); + new shell.ShellString(oldContents).to(`${t.context.tmp}/file1`); const result = shell.cp('-n', 'resources/file1', `${t.context.tmp}`); t.falsy(shell.error()); t.is(result.code, 0); diff --git a/test/exec.js b/test/exec.js index bf41d7a08..7110e34f9 100644 --- a/test/exec.js +++ b/test/exec.js @@ -5,15 +5,14 @@ import util from 'util'; import test from 'ava'; import shell from '..'; -import common from '../src/common'; const CWD = process.cwd(); -const ORIG_EXEC_PATH = common.config.execPath; +const ORIG_EXEC_PATH = shell.config.execPath; shell.config.silent = true; test.afterEach.always(() => { process.chdir(CWD); - common.config.execPath = ORIG_EXEC_PATH; + shell.config.execPath = ORIG_EXEC_PATH; }); // @@ -40,7 +39,7 @@ test('config.fatal and unknown command', t => { }); test('exec exits gracefully if we cannot find the execPath', t => { - common.config.execPath = null; + shell.config.execPath = null; shell.exec('echo foo'); t.regex( shell.error(), @@ -57,14 +56,14 @@ test('exec exits gracefully if we cannot find the execPath', t => { // test('check if stdout goes to output', t => { - const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(1234);"`); + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(1234);"`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, '1234\n'); }); test('check if stderr goes to output', t => { - const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.error(1234);"`); + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.error(1234);"`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, ''); @@ -72,7 +71,7 @@ test('check if stderr goes to output', t => { }); test('check if stdout + stderr go to output', t => { - const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.error(1234); console.log(666);"`); + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.error(1234); console.log(666);"`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, '666\n'); @@ -80,21 +79,21 @@ test('check if stdout + stderr go to output', t => { }); test('check exit code', t => { - const result = shell.exec(`${JSON.stringify(common.config.execPath)} -e "process.exit(12);"`); + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "process.exit(12);"`); t.truthy(shell.error()); t.is(result.code, 12); }); test('interaction with cd', t => { shell.cd('resources/external'); - const result = shell.exec(`${JSON.stringify(common.config.execPath)} node_script.js`); + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} node_script.js`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, 'node_script_1234\n'); }); test('check quotes escaping', t => { - const result = shell.exec(util.format(JSON.stringify(common.config.execPath) + ' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"")); + const result = shell.exec(util.format(JSON.stringify(shell.config.execPath) + ' -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"")); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, "'+'_'+'\n"); @@ -120,12 +119,12 @@ test('set maxBuffer (very small)', t => { }); test('set timeout option', t => { - const result = shell.exec(`${JSON.stringify(common.config.execPath)} resources/exec/slow.js 100`); // default timeout is ok + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} resources/exec/slow.js 100`); // default timeout is ok t.falsy(shell.error()); t.is(result.code, 0); if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - shell.exec(`${JSON.stringify(common.config.execPath)} resources/exec/slow.js 100`, { timeout: 10 }); // times out + shell.exec(`${JSON.stringify(shell.config.execPath)} resources/exec/slow.js 100`, { timeout: 10 }); // times out t.truthy(shell.error()); } @@ -171,14 +170,14 @@ test('exec returns a ShellString', t => { // test.cb('no callback', t => { - const c = shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(1234)"`, { async: true }); + const c = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(1234)"`, { async: true }); t.falsy(shell.error()); t.truthy('stdout' in c, 'async exec returns child process object'); t.end(); }); test.cb('callback as 2nd argument', t => { - shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(5678);"`, (code, stdout, stderr) => { + shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5678);"`, (code, stdout, stderr) => { t.is(code, 0); t.is(stdout, '5678\n'); t.is(stderr, ''); @@ -187,7 +186,7 @@ test.cb('callback as 2nd argument', t => { }); test.cb('callback as end argument', t => { - shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(5566);"`, { async: true }, (code, stdout, stderr) => { + shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5566);"`, { async: true }, (code, stdout, stderr) => { t.is(code, 0); t.is(stdout, '5566\n'); t.is(stderr, ''); @@ -196,7 +195,7 @@ test.cb('callback as end argument', t => { }); test.cb('callback as 3rd argument (silent:true)', t => { - shell.exec(`${JSON.stringify(common.config.execPath)} -e "console.log(5678);"`, { silent: true }, (code, stdout, stderr) => { + shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5678);"`, { silent: true }, (code, stdout, stderr) => { t.is(code, 0); t.is(stdout, '5678\n'); t.is(stderr, ''); diff --git a/test/set.js b/test/set.js index 446d52ed8..957e168d9 100644 --- a/test/set.js +++ b/test/set.js @@ -1,7 +1,6 @@ import test from 'ava'; import shell from '..'; -import common from '../src/common'; import utils from './utils/utils'; const oldConfigSilent = shell.config.silent; @@ -29,21 +28,21 @@ test('initial values', t => { }); test('default behavior', t => { - const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); }); test('set -e', t => { - const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); }); test('set -v', t => { - const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is( @@ -53,7 +52,7 @@ test('set -v', t => { }); test('set -ev', t => { - const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); @@ -62,7 +61,7 @@ test('set -ev', t => { }); test('set -e, set +e', t => { - const result = shell.exec(JSON.stringify(common.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); diff --git a/test/shjs.js b/test/shjs.js index 9a4221a5d..4df91666d 100644 --- a/test/shjs.js +++ b/test/shjs.js @@ -3,13 +3,12 @@ import path from 'path'; import test from 'ava'; import shell from '..'; -import common from '../src/common'; function runWithShjs(name) { // prefix with 'node ' for Windows, don't prefix for unix const binPath = path.resolve(__dirname, '../bin/shjs'); const execPath = process.platform === 'win32' - ? `${JSON.stringify(common.config.execPath)} ` + ? `${JSON.stringify(shell.config.execPath)} ` : ''; const script = path.resolve(__dirname, 'resources', 'shjs', name); return shell.exec(`${execPath}${binPath} ${script}`, { silent: true }); From bbe521b57dfeda64954bc9a4eff99890fa85cce4 Mon Sep 17 00:00:00 2001 From: Kumar Uttpal Date: Sat, 15 Apr 2017 14:31:58 +0530 Subject: [PATCH 124/338] Fix #631 throw error when overwriting recently created file (#702) * cp: add error to not overwrite recently created files #631 * cp: add tests for errors not overwrite recently created files #631 * mv: show error when overwriting recently created file #631 * mv: add tests for error on recently created files #631 * mv: test remove unnecessary steps #631 --- src/cp.js | 21 +++++++++++++++++++-- src/mv.js | 20 +++++++++++++++++++- test/cp.js | 36 ++++++++++++++++++++++++++++++++++++ test/mv.js | 27 +++++++++++++++++++++++++++ test/resources/cp/file1 | 1 + 5 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 test/resources/cp/file1 diff --git a/src/cp.js b/src/cp.js index 52af77be0..25b895e06 100644 --- a/src/cp.js +++ b/src/cp.js @@ -153,6 +153,14 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { } // for files } // cpdirSyncRecursive +// Checks if cureent file was created recently +function checkRecentCreated(sources, index) { + var lookedSource = sources[index]; + return sources.slice(0, index).some(function (src) { + return path.basename(src) === path.basename(lookedSource); + }); +} + function cpcheckcycle(sourceDir, srcFile) { var srcFileStat = fs.lstatSync(srcFile); if (srcFileStat.isSymbolicLink()) { @@ -227,7 +235,7 @@ function _cp(options, sources, dest) { return new common.ShellString('', '', 0); } - sources.forEach(function (src) { + sources.forEach(function (src, srcIndex) { if (!fs.existsSync(src)) { common.error('no such file or directory: ' + src, { continue: true }); return; // skip file @@ -262,7 +270,16 @@ function _cp(options, sources, dest) { thisDest = path.normalize(dest + '/' + path.basename(src)); } - if (fs.existsSync(thisDest) && options.no_force) { + var thisDestExists = fs.existsSync(thisDest); + if (thisDestExists && checkRecentCreated(sources, srcIndex)) { + // cannot overwrite file created recently in current execution, but we want to continue copying other files + if (!options.no_force) { + common.error("will not overwrite just-created '" + thisDest + "' with '" + src + "'", { continue: true }); + } + return; + } + + if (thisDestExists && options.no_force) { return; // skip file } diff --git a/src/mv.js b/src/mv.js index 7fc7cf04c..6ebaa8a03 100644 --- a/src/mv.js +++ b/src/mv.js @@ -11,6 +11,14 @@ common.register('mv', _mv, { }, }); +// Checks if cureent file was created recently +function checkRecentCreated(sources, index) { + var lookedSource = sources[index]; + return sources.slice(0, index).some(function (src) { + return path.basename(src) === path.basename(lookedSource); + }); +} + //@ //@ ### mv([options ,] source [, source ...], dest') //@ ### mv([options ,] source_array, dest') @@ -55,7 +63,7 @@ function _mv(options, sources, dest) { common.error('dest file already exists: ' + dest); } - sources.forEach(function (src) { + sources.forEach(function (src, srcIndex) { if (!fs.existsSync(src)) { common.error('no such file or directory: ' + src, { continue: true }); return; // skip file @@ -70,6 +78,16 @@ function _mv(options, sources, dest) { thisDest = path.normalize(dest + '/' + path.basename(src)); } + var thisDestExists = fs.existsSync(thisDest); + + if (thisDestExists && checkRecentCreated(sources, srcIndex)) { + // cannot overwrite file created recently in current execution, but we want to continue copying other files + if (!options.no_force) { + common.error("will not overwrite just-created '" + thisDest + "' with '" + src + "'", { continue: true }); + } + return; + } + if (fs.existsSync(thisDest) && options.no_force) { common.error('dest file already exists: ' + thisDest, { continue: true }); return; // skip file diff --git a/test/cp.js b/test/cp.js index 8b5b98d33..d8ec03462 100644 --- a/test/cp.js +++ b/test/cp.js @@ -712,3 +712,39 @@ test('copy mutliple files to same location', t => { "cp: 'resources/file2' and 'resources/file2' are the same file" ); }); + +test('should not overwrite recently created files', t => { + const result = shell.cp('resources/file1', 'resources/cp/file1', t.context.tmp); + t.truthy(shell.error()); + t.is(result.code, 1); + + // Ensure First file is copied + t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'test1'); + t.is( + result.stderr, + `cp: will not overwrite just-created '${t.context.tmp}/file1' with 'resources/cp/file1'` + ); +}); + + +test('should not overwrite recently created files (in recursive Mode)', t => { + const result = shell.cp('-R', 'resources/file1', 'resources/cp/file1', t.context.tmp); + t.truthy(shell.error()); + t.is(result.code, 1); + + // Ensure First file is copied + t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'test1'); + t.is( + result.stderr, + `cp: will not overwrite just-created '${t.context.tmp}/file1' with 'resources/cp/file1'` + ); +}); + +test('should not overwrite recently created files (not give error no-force mode)', t => { + const result = shell.cp('-n', 'resources/file1', 'resources/cp/file1', t.context.tmp); + t.falsy(shell.error()); + t.is(result.code, 0); + + // Ensure First file is copied + t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'test1'); +}); diff --git a/test/mv.js b/test/mv.js index 9bf1bb954..32bc80ef8 100644 --- a/test/mv.js +++ b/test/mv.js @@ -206,3 +206,30 @@ test('dest exists, but -f given', t => { t.falsy(fs.existsSync('file1')); t.truthy(fs.existsSync('file2')); }); + +test('should not overwrite recently created files', t => { + shell.mkdir('-p', 't'); + const result = shell.mv('file1', 'cp/file1', 't/'); + t.truthy(shell.error()); + t.is(result.code, 1); + + // Ensure First file is copied + t.is(shell.cat('t/file1').toString(), 'test1'); + t.is( + result.stderr, + "mv: will not overwrite just-created 't/file1' with 'cp/file1'" + ); + t.truthy(fs.existsSync('cp/file1')); +}); + + +test('should not overwrite recently created files (not give error no-force mode)', t => { + shell.mkdir('-p', 't'); + const result = shell.mv('-n', 'file1', 'cp/file1', 't/'); + t.falsy(shell.error()); + t.is(result.code, 0); + + // Ensure First file is moved + t.is(shell.cat('t/file1').toString(), 'test1'); + t.truthy(fs.existsSync('cp/file1')); +}); diff --git a/test/resources/cp/file1 b/test/resources/cp/file1 new file mode 100644 index 000000000..180cf8328 --- /dev/null +++ b/test/resources/cp/file1 @@ -0,0 +1 @@ +test2 From 92d3f3982e05b6c6f69ebef08858ee6ceebc8eaf Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 2 May 2017 19:54:56 -0700 Subject: [PATCH 125/338] Fix common.expand error (#709) * When glob.sync errors, return original array element * Add test for cp with empty string --- src/common.js | 13 ++++++++++--- src/cp.js | 1 + test/common.js | 18 ++++++++++++++++++ test/cp.js | 7 +++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/common.js b/src/common.js index e0d343b8c..30b166dd2 100644 --- a/src/common.js +++ b/src/common.js @@ -257,9 +257,16 @@ function expand(list) { if (typeof listEl !== 'string') { expanded.push(listEl); } else { - var ret = glob.sync(listEl, config.globOptions); - // if glob fails, interpret the string literally - expanded = expanded.concat(ret.length > 0 ? ret : [listEl]); + var ret; + try { + ret = glob.sync(listEl, config.globOptions); + // if nothing matched, interpret the string literally + ret = ret.length > 0 ? ret : [listEl]; + } catch (e) { + // if glob fails, interpret the string literally + ret = [listEl]; + } + expanded = expanded.concat(ret); } }); return expanded; diff --git a/src/cp.js b/src/cp.js index 25b895e06..500df2ba7 100644 --- a/src/cp.js +++ b/src/cp.js @@ -237,6 +237,7 @@ function _cp(options, sources, dest) { sources.forEach(function (src, srcIndex) { if (!fs.existsSync(src)) { + if (src === '') src = "''"; // if src was empty string, display empty string common.error('no such file or directory: ' + src, { continue: true }); return; // skip file } diff --git a/test/common.js b/test/common.js index 68051b7c6..024af6f9e 100644 --- a/test/common.js +++ b/test/common.js @@ -170,6 +170,24 @@ test('broken links still expand', t => { t.deepEqual(result, ['resources/badlink']); }); +test('empty array', t => { + const result = common.expand([]); + t.falsy(shell.error()); + t.deepEqual(result, []); +}); + +test('empty string', t => { + const result = common.expand(['']); + t.falsy(shell.error()); + t.deepEqual(result, ['']); +}); + +test('non-string', t => { + const result = common.expand([5]); + t.falsy(shell.error()); + t.deepEqual(result, [5]); +}); + test('common.parseOptions (normal case)', t => { const result = common.parseOptions('-Rf', { R: 'recursive', diff --git a/test/cp.js b/test/cp.js index d8ec03462..e8cece026 100644 --- a/test/cp.js +++ b/test/cp.js @@ -98,6 +98,13 @@ test('too many sources #2', t => { t.is(result.stderr, 'cp: dest is not a directory (too many sources)'); }); +test('empty string source', t => { + const result = shell.cp('', 'dest'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, "cp: no such file or directory: ''"); +}); + // // Valids // From 951ff22671b90032b653ee7ccac21e226919ee15 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 2 May 2017 23:04:56 -0700 Subject: [PATCH 126/338] Add common.buffer (#710) * Add common.buffer * Fix comment --- src/common.js | 12 ++++++++++++ src/cp.js | 10 +++++----- src/head.js | 10 +++++----- test/common.js | 26 ++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/common.js b/src/common.js index 30b166dd2..4a1f43456 100644 --- a/src/common.js +++ b/src/common.js @@ -38,6 +38,7 @@ var DEFAULT_CONFIG = { silent: false, verbose: false, execPath: null, + bufLength: 64 * 1024, // 64KB }; var config = { @@ -273,6 +274,17 @@ function expand(list) { } exports.expand = expand; +// Normalizes Buffer creation, using Buffer.alloc if possible. +// Also provides a good default buffer length for most use cases. +var buffer = typeof Buffer.alloc === 'function' ? + function (len) { + return Buffer.alloc(len || config.bufLength); + } : + function (len) { + return new Buffer(len || config.bufLength); + }; +exports.buffer = buffer; + // Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. // file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006 function unlinkSync(file) { diff --git a/src/cp.js b/src/cp.js index 500df2ba7..99c97b2eb 100644 --- a/src/cp.js +++ b/src/cp.js @@ -45,9 +45,9 @@ function copyFileSync(srcFile, destFile, options) { var symlinkFull = fs.readlinkSync(srcFile); fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); } else { - var BUF_LENGTH = 64 * 1024; - var buf = new Buffer(BUF_LENGTH); - var bytesRead = BUF_LENGTH; + var buf = common.buffer(); + var bufLength = buf.length; + var bytesRead = bufLength; var pos = 0; var fdr = null; var fdw = null; @@ -66,8 +66,8 @@ function copyFileSync(srcFile, destFile, options) { common.error('copyFileSync: could not write to dest file (code=' + e.code + '):' + destFile); } - while (bytesRead === BUF_LENGTH) { - bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); + while (bytesRead === bufLength) { + bytesRead = fs.readSync(fdr, buf, 0, bufLength, pos); fs.writeSync(fdw, buf, 0, bytesRead); pos += bytesRead; } diff --git a/src/head.js b/src/head.js index 13d582977..db5592e76 100644 --- a/src/head.js +++ b/src/head.js @@ -10,9 +10,9 @@ common.register('head', _head, { // This reads n or more lines, or the entire file, whichever is less. function readSomeLines(file, numLines) { - var BUF_LENGTH = 64 * 1024; - var buf = new Buffer(BUF_LENGTH); - var bytesRead = BUF_LENGTH; + var buf = common.buffer(); + var bufLength = buf.length; + var bytesRead = bufLength; var pos = 0; var fdr = null; @@ -24,8 +24,8 @@ function readSomeLines(file, numLines) { var numLinesRead = 0; var ret = ''; - while (bytesRead === BUF_LENGTH && numLinesRead < numLines) { - bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); + while (bytesRead === bufLength && numLinesRead < numLines) { + bytesRead = fs.readSync(fdr, buf, 0, bufLength, pos); var bufStr = buf.toString('utf8', 0, bytesRead); numLinesRead += bufStr.split('\n').length - 1; ret += bufStr; diff --git a/test/common.js b/test/common.js index 024af6f9e..a6f1e9f52 100644 --- a/test/common.js +++ b/test/common.js @@ -188,6 +188,32 @@ test('non-string', t => { t.deepEqual(result, [5]); }); +// +// common.buffer() +// +test('common.buffer returns buffer', t => { + const buf = common.buffer(); + t.falsy(shell.error()); + t.truthy(buf instanceof Buffer); + t.is(buf.length, 64 * 1024); +}); + +test('common.buffer with explicit length', t => { + const buf = common.buffer(20); + t.falsy(shell.error()); + t.truthy(buf instanceof Buffer); + t.is(buf.length, 20); +}); + +test('common.buffer with different config.bufLength', t => { + common.config.bufLength = 20; + const buf = common.buffer(); + t.falsy(shell.error()); + t.truthy(buf instanceof Buffer); + t.is(buf.length, 20); + common.config.reset(); +}); + test('common.parseOptions (normal case)', t => { const result = common.parseOptions('-Rf', { R: 'recursive', From a2e13b62dce776f7a3de7ad05d466cf24f4e5248 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 8 May 2017 22:57:58 -0700 Subject: [PATCH 127/338] Properly handle directories as arguments (#713) * fix(cat): do not cat directories Fixes #707 * fix(head): do not let head() read directories Also fixes a typo * fix(sort): do not sort directories Also fixes a typo * fix(tail): do not let tail() read directories Also fixes a typo * fix(uniq): do not let uniq() read directories We also had a test which called sort() instead of uniq(), so we never actually tested the missing-file case. This fixes that as well. This also throws an error for using a directory as output. * fix(pipe): fix breakages with piped commands --- src/cat.js | 2 ++ src/head.js | 13 ++++++++++--- src/sort.js | 13 ++++++++++--- src/tail.js | 13 ++++++++++--- src/uniq.js | 13 ++++++++++++- test/cat.js | 7 +++++++ test/head.js | 11 ++++++++++- test/sort.js | 10 +++++++++- test/tail.js | 10 +++++++++- test/uniq.js | 25 ++++++++++++++++++++++++- 10 files changed, 103 insertions(+), 14 deletions(-) diff --git a/src/cat.js b/src/cat.js index a74a25c84..af1ad1d4d 100644 --- a/src/cat.js +++ b/src/cat.js @@ -30,6 +30,8 @@ function _cat(options, files) { files.forEach(function (file) { if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file); + } else if (fs.statSync(file).isDirectory()) { + common.error(file + ': Is a directory'); } cat += fs.readFileSync(file, 'utf8'); diff --git a/src/head.js b/src/head.js index db5592e76..e112e49e1 100644 --- a/src/head.js +++ b/src/head.js @@ -72,9 +72,16 @@ function _head(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, { continue: true }); - return; + if (file !== '-') { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, { continue: true }); + return; + } else if (fs.statSync(file).isDirectory()) { + common.error("error reading '" + file + "': Is a directory", { + continue: true, + }); + return; + } } var contents; diff --git a/src/sort.js b/src/sort.js index 041b03772..2ebccd7f4 100644 --- a/src/sort.js +++ b/src/sort.js @@ -69,9 +69,16 @@ function _sort(options, files) { var lines = []; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - // exit upon any sort of error - common.error('no such file or directory: ' + file); + if (file !== '-') { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, { continue: true }); + return; + } else if (fs.statSync(file).isDirectory()) { + common.error('read failed: ' + file + ': Is a directory', { + continue: true, + }); + return; + } } var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); diff --git a/src/tail.js b/src/tail.js index 7ece654b1..e5a88055c 100644 --- a/src/tail.js +++ b/src/tail.js @@ -46,9 +46,16 @@ function _tail(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, { continue: true }); - return; + if (file !== '-') { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, { continue: true }); + return; + } else if (fs.statSync(file).isDirectory()) { + common.error("error reading '" + file + "': Is a directory", { + continue: true, + }); + return; + } } var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); diff --git a/src/uniq.js b/src/uniq.js index 8f5da0028..30121616a 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -40,7 +40,18 @@ function _uniq(options, input, output) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); - if (!input && !pipe) common.error('no input given'); + if (!pipe) { + if (!input) common.error('no input given'); + + if (!fs.existsSync(input)) { + common.error(input + ': No such file or directory'); + } else if (fs.statSync(input).isDirectory()) { + common.error("error reading '" + input + "'"); + } + } + if (output && fs.existsSync(output) && fs.statSync(output).isDirectory()) { + common.error(output + ': Is a directory'); + } var lines = (input ? fs.readFileSync(input, 'utf8') : pipe). trimRight(). diff --git a/test/cat.js b/test/cat.js index 654b304cd..53bd52257 100644 --- a/test/cat.js +++ b/test/cat.js @@ -25,6 +25,13 @@ test('nonexistent file', t => { t.is(result.stderr, 'cat: no such file or directory: /asdfasdf'); }); +test('directory', t => { + const result = shell.cat('resources/cat'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'cat: resources/cat: Is a directory'); +}); + // // Valids // diff --git a/test/head.js b/test/head.js index 19ee9e459..5d3beb3b2 100644 --- a/test/head.js +++ b/test/head.js @@ -18,9 +18,18 @@ test('no args', t => { test('file does not exist', t => { t.falsy(fs.existsSync('/asdfasdf')); // sanity check - const result = shell.head('/adsfasdf'); // file does not exist + const result = shell.head('/asdfasdf'); // file does not exist t.truthy(shell.error()); t.is(result.code, 1); + t.is(result.stderr, 'head: no such file or directory: /asdfasdf'); +}); + +test('directory', t => { + t.truthy(fs.statSync('resources/').isDirectory()); // sanity check + const result = shell.head('resources/'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, "head: error reading 'resources/': Is a directory"); }); // diff --git a/test/sort.js b/test/sort.js index 23109d24e..ecba45447 100644 --- a/test/sort.js +++ b/test/sort.js @@ -25,11 +25,19 @@ test('no args', t => { test('file does not exist', t => { t.falsy(fs.existsSync('/asdfasdf')); // sanity check - const result = shell.sort('/adsfasdf'); + const result = shell.sort('/asdfasdf'); t.truthy(shell.error()); t.truthy(result.code); }); +test('directory', t => { + t.truthy(fs.statSync('resources/').isDirectory()); // sanity check + const result = shell.sort('resources/'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'sort: read failed: resources/: Is a directory'); +}); + // // Valids // diff --git a/test/tail.js b/test/tail.js index 1ec7dd80f..8d3eba261 100644 --- a/test/tail.js +++ b/test/tail.js @@ -18,11 +18,19 @@ test('no args', t => { test('file does not exist', t => { t.falsy(fs.existsSync('/asdfasdf')); // sanity check - const result = shell.tail('/adsfasdf'); + const result = shell.tail('/asdfasdf'); t.truthy(shell.error()); t.is(result.code, 1); }); +test('directory', t => { + t.truthy(fs.statSync('resources/').isDirectory()); // sanity check + const result = shell.tail('resources/'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, "tail: error reading 'resources/': Is a directory"); +}); + // // Valids // diff --git a/test/uniq.js b/test/uniq.js index ef4fad70f..751522561 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -18,11 +18,34 @@ test('no args', t => { test('file does not exist', t => { t.falsy(fs.existsSync('/asdfasdf')); // sanity check - const result = shell.sort('/adsfasdf'); + const result = shell.uniq('/asdfasdf'); t.truthy(shell.error()); t.truthy(result.code); }); +test('directory', t => { + t.truthy(fs.statSync('resources/').isDirectory()); // sanity check + const result = shell.uniq('resources/'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, "uniq: error reading 'resources/'"); +}); + +test('output directory', t => { + t.truthy(fs.statSync('resources/').isDirectory()); // sanity check + const result = shell.uniq('resources/file1.txt', 'resources/'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'uniq: resources/: Is a directory'); +}); + +test('file does not exist with output directory', t => { + t.falsy(fs.existsSync('/asdfasdf')); // sanity check + const result = shell.uniq('/asdfasdf', 'resources/'); + t.is(result.code, 1); + t.truthy(shell.error()); +}); + // // Valids // From 15558cf67ad1d5da43e2bedcd2990c5878f09c35 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 16 May 2017 00:30:11 -0700 Subject: [PATCH 128/338] fix(mkdir): improve error handling around files (#721) * fix(mkdir): improve error handling around files In particular, this fixes: - if we try to overwrite a file with a mkdir - if we try to create a subdirectory of a file - adds `continue: true` in spots where we missed it Fixes #720 * Fixing tests on Windows --- src/mkdir.js | 10 ++++++++-- test/mkdir.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/mkdir.js b/src/mkdir.js index 115f75ca4..44b1b2162 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -57,9 +57,11 @@ function _mkdir(options, dirs) { dirs.forEach(function (dir) { try { - fs.lstatSync(dir); + var stat = fs.lstatSync(dir); if (!options.fullpath) { common.error('path already exists: ' + dir, { continue: true }); + } else if (stat.isFile()) { + common.error('cannot create directory ' + dir + ': File exists', { continue: true }); } return; // skip dir } catch (e) { @@ -80,12 +82,16 @@ function _mkdir(options, dirs) { fs.mkdirSync(dir, parseInt('0777', 8)); } } catch (e) { + var reason; if (e.code === 'EACCES') { - common.error('cannot create directory ' + dir + ': Permission denied'); + reason = 'Permission denied'; + } else if (e.code === 'ENOTDIR' || e.code === 'ENOENT') { + reason = 'Not a directory'; } else { /* istanbul ignore next */ throw e; } + common.error('cannot create directory ' + dir + ': ' + reason, { continue: true }); } }); return ''; diff --git a/test/mkdir.js b/test/mkdir.js index 9c0c57e0d..4093155d4 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -55,6 +55,34 @@ test('root path does not exist', t => { t.falsy(fs.existsSync('/asdfasdf/foobar')); }); +test('try to overwrite file', t => { + t.truthy(fs.statSync('resources/file1').isFile()); + const result = shell.mkdir('resources/file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mkdir: path already exists: resources/file1'); + t.truthy(fs.statSync('resources/file1').isFile()); +}); + +test('try to overwrite file, with -p', t => { + t.truthy(fs.statSync('resources/file1').isFile()); + const result = shell.mkdir('-p', 'resources/file1'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mkdir: cannot create directory resources/file1: File exists'); + t.truthy(fs.statSync('resources/file1').isFile()); +}); + +test('try to make a subdirectory of a file', t => { + t.truthy(fs.statSync('resources/file1').isFile()); + const result = shell.mkdir('resources/file1/subdir'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stderr, 'mkdir: cannot create directory resources/file1/subdir: Not a directory'); + t.truthy(fs.statSync('resources/file1').isFile()); + t.falsy(fs.existsSync('resources/file1/subdir')); +}); + test('Check for invalid permissions', t => { if (process.platform !== 'win32') { // This test case only works on unix, but should work on Windows as well From bbd8178cbaa56926759d1b7451a2171a21b24e3e Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Sat, 3 Jun 2017 22:26:10 -0700 Subject: [PATCH 129/338] Add node 8 to CI (#730) --- .travis.yml | 1 + appveyor.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index afd8f5603..02eb8bf81 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,7 @@ env: - NODE_VERSION="5" - NODE_VERSION="6" - NODE_VERSION="7" + - NODE_VERSION="8" # keep this blank to make sure there are no before_install steps before_install: diff --git a/appveyor.yml b/appveyor.yml index a081ad22e..ad698e448 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,6 @@ environment: matrix: + - nodejs_version: '8' - nodejs_version: '7' - nodejs_version: '6' - nodejs_version: '5' From a66e338b5fbcb4ede9d20ac7206d5d831c56af75 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 6 Jun 2017 20:58:14 -0700 Subject: [PATCH 130/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6de319e18..5e0355bf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ # Change Log +## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) + +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.7...HEAD) + +**Closed issues:** + +- Add node v8 to CI [\#729](https://github.com/shelljs/shelljs/issues/729) +- Exec not working in Electron ! [\#726](https://github.com/shelljs/shelljs/issues/726) +- is rechoir used anywhere? [\#723](https://github.com/shelljs/shelljs/issues/723) +- ShellJS: internal error on shelljs.mkdir\('myFile/myDir'\) [\#720](https://github.com/shelljs/shelljs/issues/720) +- Can't make sed perform global replace [\#719](https://github.com/shelljs/shelljs/issues/719) +- grep: option not recognized: l [\#717](https://github.com/shelljs/shelljs/issues/717) +- Problems getting code, stdout, stderr [\#715](https://github.com/shelljs/shelljs/issues/715) +- Copying hidden files fails on Windows 10 [\#711](https://github.com/shelljs/shelljs/issues/711) +- How am I suppose to handle errors with ShellJS? [\#707](https://github.com/shelljs/shelljs/issues/707) +- use cp\('-r', './src', './dist'\) bug [\#705](https://github.com/shelljs/shelljs/issues/705) +- Way to ignore files in globs. [\#699](https://github.com/shelljs/shelljs/issues/699) +- Buffer constructor is deprecated [\#694](https://github.com/shelljs/shelljs/issues/694) +- source command not working via exec method. [\#693](https://github.com/shelljs/shelljs/issues/693) +- Would you be interested in a PR for `open`? [\#692](https://github.com/shelljs/shelljs/issues/692) +- Get rid of common.platform in favor of process.platform [\#670](https://github.com/shelljs/shelljs/issues/670) +- Passing empty string to cp throws internal error [\#664](https://github.com/shelljs/shelljs/issues/664) +- Why does sed split files into an array, call replace on each line and rejoin? [\#645](https://github.com/shelljs/shelljs/issues/645) +- feat: cp & mv should not overwrite recently created files [\#631](https://github.com/shelljs/shelljs/issues/631) +- Echo tests unnecessarily run tests in own process [\#622](https://github.com/shelljs/shelljs/issues/622) +- rm -rf on a symbolic link to a dir deletes its contents [\#587](https://github.com/shelljs/shelljs/issues/587) +- "Cannot extract package" with node-webkit [\#181](https://github.com/shelljs/shelljs/issues/181) +- EBADF, bad file descriptor [\#180](https://github.com/shelljs/shelljs/issues/180) + +**Merged pull requests:** + +- Add node 8 to CI [\#730](https://github.com/shelljs/shelljs/pull/730) ([freitagbr](https://github.com/freitagbr)) +- Deprecate common.getUserHome, advise using os.homedir instead [\#725](https://github.com/shelljs/shelljs/pull/725) ([freitagbr](https://github.com/freitagbr)) +- fix\(mkdir\): improve error handling around files [\#721](https://github.com/shelljs/shelljs/pull/721) ([nfischer](https://github.com/nfischer)) +- Properly handle directories as arguments [\#713](https://github.com/shelljs/shelljs/pull/713) ([nfischer](https://github.com/nfischer)) +- Add common.buffer [\#710](https://github.com/shelljs/shelljs/pull/710) ([freitagbr](https://github.com/freitagbr)) +- Fix common.expand error [\#709](https://github.com/shelljs/shelljs/pull/709) ([freitagbr](https://github.com/freitagbr)) +- Echo test mocks [\#708](https://github.com/shelljs/shelljs/pull/708) ([freitagbr](https://github.com/freitagbr)) +- refactor: remove unnecessary common.js imports [\#703](https://github.com/shelljs/shelljs/pull/703) ([nfischer](https://github.com/nfischer)) +- Fix \#631 throw error when overwriting recently created file [\#702](https://github.com/shelljs/shelljs/pull/702) ([uttpal](https://github.com/uttpal)) +- Small clarification of verbose flag [\#691](https://github.com/shelljs/shelljs/pull/691) ([zommerfelds](https://github.com/zommerfelds)) +- fix\(grep, sed, sort, uniq\): Split only on newline characters [\#690](https://github.com/shelljs/shelljs/pull/690) ([freitagbr](https://github.com/freitagbr)) +- Refactor: Use process.platform across codebase [\#689](https://github.com/shelljs/shelljs/pull/689) ([freitagbr](https://github.com/freitagbr)) +- Remove contents of symlink to dir with rm -rf [\#688](https://github.com/shelljs/shelljs/pull/688) ([freitagbr](https://github.com/freitagbr)) +- Echo stdout [\#677](https://github.com/shelljs/shelljs/pull/677) ([nfischer](https://github.com/nfischer)) + ## [v0.7.7](https://github.com/shelljs/shelljs/tree/v0.7.7) (2017-03-09) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.6...v0.7.7) From 38645675f18b6369ffc161f2a6317e9ceab937c0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 6 Jun 2017 21:01:21 -0700 Subject: [PATCH 131/338] 0.7.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb1c75428..c93e33420 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.7", + "version": "0.7.8", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 0ad6252f2e4d063cbd4a35b3d2ab299d4e91585f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 6 Jun 2017 21:02:26 -0700 Subject: [PATCH 132/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e0355bf6..f7427c2ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,7 @@ # Change Log -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) - -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.7...HEAD) +## [v0.7.8](https://github.com/shelljs/shelljs/tree/v0.7.8) (2017-06-07) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.7...v0.7.8) **Closed issues:** From 5acb353bc5aaf1ff1e2d633d37a494e162b2a246 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Sun, 27 Nov 2016 13:12:26 -0800 Subject: [PATCH 133/338] Add newline to output of echo (#557) * Add newline to output of echo * Add test --- src/echo.js | 2 +- test/echo.js | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/echo.js b/src/echo.js index 2b0e7d919..045c35eda 100644 --- a/src/echo.js +++ b/src/echo.js @@ -29,6 +29,6 @@ function _echo(opts, messages) { } console.log.apply(console, messages); - return messages.join(' '); + return messages.join(' ') + '\n'; } module.exports = _echo; diff --git a/test/echo.js b/test/echo.js index 7887d88ee..87c48e24f 100644 --- a/test/echo.js +++ b/test/echo.js @@ -5,6 +5,14 @@ import utils from './utils/utils'; shell.config.silent = true; +test.beforeEach(t => { + t.context.tmp = utils.getTempDir(); +}); + +test.afterEach.always(t => { + shell.rm('-rf', t.context.tmp); +}); + // // Valids // @@ -57,3 +65,17 @@ test.cb('-e option', t => { t.end(); }); }); + +test.cb('piping to a file', t => { + // see issue #476 + shell.mkdir(t.context.tmp); + const tmp = `${t.context.tmp}/echo.txt`; + const script = `require('../global.js'); echo('A').toEnd('${tmp}'); echo('B').toEnd('${tmp}');`; + utils.runScript(script, (err, stdout) => { + const result = shell.cat(tmp); + t.falsy(err); + t.is(stdout, 'A\nB\n'); + t.is(result.toString(), 'A\nB\n'); + t.end(); + }); +}); From 5d05d2710836816903ab9103b60172be6004b85d Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Mon, 16 Jan 2017 19:36:46 -0800 Subject: [PATCH 134/338] Safely exit by throwing an error (#649) --- src/common.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/common.js b/src/common.js index 4a1f43456..b5acde1f4 100644 --- a/src/common.js +++ b/src/common.js @@ -410,9 +410,8 @@ function wrap(cmd, fn, options) { /* istanbul ignore next */ if (!state.error) { // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug... - console.error('ShellJS: internal error'); - console.error(e.stack || e); - process.exit(1); + e.name = 'ShellJSInternalError'; + throw e; } if (config.fatal) throw e; } From f74e783890f72399aa7d4d64e248ec0d76b06193 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 17 Jan 2017 16:43:38 -0800 Subject: [PATCH 135/338] chore: remove v0.12 and iojs support (#648) Fixes #647 --- .travis.yml | 5 -- README.md | 2 +- package.json | 3 +- src/common.js | 23 ++------ src/exec.js | 152 +++++++++++++++---------------------------------- src/tempdir.js | 1 - test/exec.js | 11 ++-- 7 files changed, 55 insertions(+), 142 deletions(-) diff --git a/.travis.yml b/.travis.yml index 02eb8bf81..90f780524 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,6 @@ language: c++ sudo: false env: - - NODE_VERSION="0.11" - - NODE_VERSION="0.12" - - NODE_VERSION="iojs-v1" - - NODE_VERSION="iojs-v2" - - NODE_VERSION="iojs-v3" - NODE_VERSION="4" - NODE_VERSION="5" - NODE_VERSION="6" diff --git a/README.md b/README.md index 1f3e6ec0f..a74829108 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! -ShellJS is proudly tested on every node release since `v0.11`! +ShellJS is proudly tested on every node release since `v4`! The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-tested in projects like: diff --git a/package.json b/package.json index c93e33420..b8ae2a37b 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,6 @@ }, "optionalDependencies": {}, "engines": { - "node": ">=0.11.0", - "iojs": "*" + "node": ">=4" } } diff --git a/src/common.js b/src/common.js index b5acde1f4..f553fd0e9 100644 --- a/src/common.js +++ b/src/common.js @@ -9,22 +9,7 @@ var shell = require('..'); var shellMethods = Object.create(shell); -// objectAssign(target_obj, source_obj1 [, source_obj2 ...]) -// "Ponyfill" for Object.assign -// objectAssign({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} -var objectAssign = typeof Object.assign === 'function' ? - Object.assign : - function objectAssign(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function (source) { - Object.keys(source).forEach(function (key) { - target[key] = source[key]; - }); - }); - - return target; - }; -exports.extend = objectAssign; +exports.extend = Object.assign; // Check if we're running under electron var isElectron = Boolean(process.versions.electron); @@ -43,7 +28,7 @@ var DEFAULT_CONFIG = { var config = { reset: function () { - objectAssign(this, DEFAULT_CONFIG); + Object.assign(this, DEFAULT_CONFIG); if (!isElectron) { this.execPath = process.execPath; } @@ -116,7 +101,7 @@ function error(msg, _code, options) { } else if (typeof _code !== 'number') { // only 'msg' options = {}; } - options = objectAssign({}, DEFAULT_OPTIONS, options); + options = Object.assign({}, DEFAULT_OPTIONS, options); if (!state.errorCode) state.errorCode = options.code; @@ -449,7 +434,7 @@ var DEFAULT_WRAP_OPTIONS = { function _register(name, implementation, wrapOptions) { wrapOptions = wrapOptions || {}; // If an option isn't specified, use the default - wrapOptions = objectAssign({}, DEFAULT_WRAP_OPTIONS, wrapOptions); + wrapOptions = Object.assign({}, DEFAULT_WRAP_OPTIONS, wrapOptions); if (shell[name] && !wrapOptions.overWrite) { throw new Error('unable to overwrite `' + name + '` command'); diff --git a/src/exec.js b/src/exec.js index 5d360e868..16066382e 100644 --- a/src/exec.js +++ b/src/exec.js @@ -28,7 +28,6 @@ function execSync(cmd, opts, pipe) { var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); var codeFile = path.resolve(tempDir + '/' + common.randomFileName()); var scriptFile = path.resolve(tempDir + '/' + common.randomFileName()); - var sleepFile = path.resolve(tempDir + '/' + common.randomFileName()); opts = common.extend({ silent: common.config.silent, @@ -37,34 +36,6 @@ function execSync(cmd, opts, pipe) { maxBuffer: DEFAULT_MAXBUFFER_SIZE, }, opts); - var previousStdoutContent = ''; - var previousStderrContent = ''; - // Echoes stdout and stderr changes from running process, if not silent - function updateStream(streamFile) { - if (opts.silent || !fs.existsSync(streamFile)) { - return; - } - - var previousStreamContent; - var procStream; - if (streamFile === stdoutFile) { - previousStreamContent = previousStdoutContent; - procStream = process.stdout; - } else { // assume stderr - previousStreamContent = previousStderrContent; - procStream = process.stderr; - } - - var streamContent = fs.readFileSync(streamFile, 'utf8'); - // No changes since last time? - if (streamContent.length <= previousStreamContent.length) { - return; - } - - procStream.write(streamContent.substr(previousStreamContent.length)); - previousStreamContent = streamContent; - } - if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); @@ -76,86 +47,53 @@ function execSync(cmd, opts, pipe) { opts.cwd = path.resolve(opts.cwd); var optString = JSON.stringify(opts); - if (typeof child.execSync === 'function') { - script = [ - "var child = require('child_process')", - " , fs = require('fs');", - 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', - ' var fname = ' + JSON.stringify(codeFile) + ';', - ' if (!err) {', - ' fs.writeFileSync(fname, "0");', - ' } else if (err.code === undefined) {', - ' fs.writeFileSync(fname, "1");', - ' } else {', - ' fs.writeFileSync(fname, err.code.toString());', - ' }', - '});', - 'var stdoutStream = fs.createWriteStream(' + JSON.stringify(stdoutFile) + ');', - 'var stderrStream = fs.createWriteStream(' + JSON.stringify(stderrFile) + ');', - 'childProcess.stdout.pipe(stdoutStream, {end: false});', - 'childProcess.stderr.pipe(stderrStream, {end: false});', - 'childProcess.stdout.pipe(process.stdout);', - 'childProcess.stderr.pipe(process.stderr);', - ].join('\n') + - (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n') + - [ - 'var stdoutEnded = false, stderrEnded = false;', - 'function tryClosingStdout(){ if(stdoutEnded){ stdoutStream.end(); } }', - 'function tryClosingStderr(){ if(stderrEnded){ stderrStream.end(); } }', - "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosingStdout(); });", - "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosingStderr(); });", - ].join('\n'); - - fs.writeFileSync(scriptFile, script); - - if (opts.silent) { - opts.stdio = 'ignore'; - } else { - opts.stdio = [0, 1, 2]; - } - - // Welcome to the future - try { - child.execSync(execCommand, opts); - } catch (e) { - // Clean up immediately if we have an exception - try { common.unlinkSync(scriptFile); } catch (e2) {} - try { common.unlinkSync(stdoutFile); } catch (e2) {} - try { common.unlinkSync(stderrFile); } catch (e2) {} - try { common.unlinkSync(codeFile); } catch (e2) {} - throw e; - } + script = [ + "var child = require('child_process')", + " , fs = require('fs');", + 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', + ' var fname = ' + JSON.stringify(codeFile) + ';', + ' if (!err) {', + ' fs.writeFileSync(fname, "0");', + ' } else if (err.code === undefined) {', + ' fs.writeFileSync(fname, "1");', + ' } else {', + ' fs.writeFileSync(fname, err.code.toString());', + ' }', + '});', + 'var stdoutStream = fs.createWriteStream(' + JSON.stringify(stdoutFile) + ');', + 'var stderrStream = fs.createWriteStream(' + JSON.stringify(stderrFile) + ');', + 'childProcess.stdout.pipe(stdoutStream, {end: false});', + 'childProcess.stderr.pipe(stderrStream, {end: false});', + 'childProcess.stdout.pipe(process.stdout);', + 'childProcess.stderr.pipe(process.stderr);', + ].join('\n') + + (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n') + + [ + 'var stdoutEnded = false, stderrEnded = false;', + 'function tryClosingStdout(){ if(stdoutEnded){ stdoutStream.end(); } }', + 'function tryClosingStderr(){ if(stderrEnded){ stderrStream.end(); } }', + "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosingStdout(); });", + "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosingStderr(); });", + ].join('\n'); + + fs.writeFileSync(scriptFile, script); + + if (opts.silent) { + opts.stdio = 'ignore'; } else { - cmd += ' > ' + stdoutFile + ' 2> ' + stderrFile; // works on both win/unix - - script = [ - "var child = require('child_process')", - " , fs = require('fs');", - 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', - ' var fname = ' + JSON.stringify(codeFile) + ';', - ' if (!err) {', - ' fs.writeFileSync(fname, "0");', - ' } else if (err.code === undefined) {', - ' fs.writeFileSync(fname, "1");', - ' } else {', - ' fs.writeFileSync(fname, err.code.toString());', - ' }', - '});', - ].join('\n') + - (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n'); - - fs.writeFileSync(scriptFile, script); - - child.exec(execCommand, opts); + opts.stdio = [0, 1, 2]; + } - // The wait loop - // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage - // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing - // CPU usage, though apparently not so much on Windows) - while (!fs.existsSync(codeFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stdoutFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stderrFile)) { updateStream(stderrFile); fs.writeFileSync(sleepFile, 'a'); } - try { common.unlinkSync(sleepFile); } catch (e) {} + // Welcome to the future + try { + child.execSync(execCommand, opts); + } catch (e) { + // Clean up immediately if we have an exception + try { common.unlinkSync(scriptFile); } catch (e2) {} + try { common.unlinkSync(stdoutFile); } catch (e2) {} + try { common.unlinkSync(stderrFile); } catch (e2) {} + try { common.unlinkSync(codeFile); } catch (e2) {} + throw e; } // At this point codeFile exists, but it's not necessarily flushed yet. diff --git a/src/tempdir.js b/src/tempdir.js index a2d15be36..b3a6cca38 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -41,7 +41,6 @@ function _tempDir() { if (state.tempDir) return state.tempDir; // from cache state.tempDir = writeableDir(os.tmpdir && os.tmpdir()) || // node 0.10+ - writeableDir(os.tmpDir && os.tmpDir()) || // node 0.8+ writeableDir(process.env.TMPDIR) || writeableDir(process.env.TEMP) || writeableDir(process.env.TMP) || diff --git a/test/exec.js b/test/exec.js index 7110e34f9..6a7b44377 100644 --- a/test/exec.js +++ b/test/exec.js @@ -112,10 +112,8 @@ test('set maxBuffer (very small)', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, '1234567890' + os.EOL); - if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - shell.exec('echo 1234567890', { maxBuffer: 6 }); - t.truthy(shell.error()); - } + shell.exec('echo 1234567890', { maxBuffer: 6 }); + t.truthy(shell.error()); }); test('set timeout option', t => { @@ -125,9 +123,8 @@ test('set timeout option', t => { if (process.version >= 'v0.11') { // this option doesn't work on v0.10 shell.exec(`${JSON.stringify(shell.config.execPath)} resources/exec/slow.js 100`, { timeout: 10 }); // times out - - t.truthy(shell.error()); } + t.truthy(shell.error()); }); test('check process.env works', t => { @@ -148,7 +145,7 @@ test('set shell option (TODO: add tests for Windows)', t => { t.is(result.stdout, '/bin/sh\n'); // sh by default const bashPath = shell.which('bash').trim(); // this option doesn't work on v0.10 - if (bashPath && process.version >= 'v0.11') { + if (bashPath) { result = shell.exec('echo $0', { shell: '/bin/bash' }); t.falsy(shell.error()); t.is(result.code, 0); From 97a8c1969a757bd0b3ed0b4f212eef9d8ad5e1f8 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Thu, 16 Mar 2017 01:08:48 -0700 Subject: [PATCH 136/338] fix(grep, sed, sort, uniq): Split only on newline characters (#690) * Split on newlines only * Only split lines if need be * Clarify code by making use of Array.prototype.reduce --- src/grep.js | 2 +- src/sed.js | 2 +- src/sort.js | 14 ++++++-------- src/uniq.js | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/grep.js b/src/grep.js index 30842bcb8..8cf53b157 100644 --- a/src/grep.js +++ b/src/grep.js @@ -47,12 +47,12 @@ function _grep(options, regex, files) { } var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); - var lines = contents.split(/\r*\n/); if (options.nameOnly) { if (contents.match(regex)) { grep.push(file); } } else { + var lines = contents.split('\n'); lines.forEach(function (line) { var matched = line.match(regex); if ((options.inverse && !matched) || (!options.inverse && matched)) { diff --git a/src/sed.js b/src/sed.js index dfdc0a747..7d396e7e9 100644 --- a/src/sed.js +++ b/src/sed.js @@ -69,7 +69,7 @@ function _sed(options, regex, replacement, files) { } var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); - var lines = contents.split(/\r*\n/); + var lines = contents.split('\n'); var result = lines.map(function (line) { return line.replace(regex, replacement); }).join('\n'); diff --git a/src/sort.js b/src/sort.js index 2ebccd7f4..5dd8d75fc 100644 --- a/src/sort.js +++ b/src/sort.js @@ -67,26 +67,24 @@ function _sort(options, files) { files.unshift('-'); } - var lines = []; - files.forEach(function (file) { + var lines = files.reduce(function (accum, file) { if (file !== '-') { if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file, { continue: true }); - return; + return accum; } else if (fs.statSync(file).isDirectory()) { common.error('read failed: ' + file + ': Is a directory', { continue: true, }); - return; + return accum; } } var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); - lines = lines.concat(contents.trimRight().split(/\r*\n/)); - }); + return accum.concat(contents.trimRight().split('\n')); + }, []); - var sorted; - sorted = lines.sort(options.numerical ? numericalCmp : unixCmp); + var sorted = lines.sort(options.numerical ? numericalCmp : unixCmp); if (options.reverse) { sorted = sorted.reverse(); diff --git a/src/uniq.js b/src/uniq.js index 30121616a..8c0f04010 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -55,7 +55,7 @@ function _uniq(options, input, output) { var lines = (input ? fs.readFileSync(input, 'utf8') : pipe). trimRight(). - split(/\r*\n/); + split('\n'); var compare = function (a, b) { return options.ignoreCase ? From 18034486a51a206b4dfcef14f504528a98b67207 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 16 Mar 2017 10:10:53 -0700 Subject: [PATCH 137/338] Echo stdout (#677) * Add newline to output of echo (#557) * Add newline to output of echo * Add test * Throw an error if the options string does not start with '-' (#615) * Throw an error if the options string does not start with '-' * Add test * Change message grammar * Add -n option to echo * Fix null argument issue * Add -n tests * Add documentation * Add -en escaped character test * Add function to parse options for echo * Use parseOptions to parse echo options * Simplify control flow * parseOptions throws now * Allow null to be echoed * Prevent echo stderr on unrecognized option * Add test to check stderr of returned value * Use consistent variable name * Change test message, leave TODO about console output --- README.md | 2 ++ src/common.js | 2 ++ src/echo.js | 42 ++++++++++++++++++++++++++++++------- test/common.js | 6 ++++++ test/echo.js | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a74829108..b59c8c821 100644 --- a/README.md +++ b/README.md @@ -259,12 +259,14 @@ See also: pushd, popd Available options: + `-e`: interpret backslash escapes (default) ++ `-n`: remove trailing newline from output Examples: ```javascript echo('hello world'); var str = echo('hello world'); +echo('-n', 'no newline at end'); ``` Prints string to stdout, and returns string with additional utility methods diff --git a/src/common.js b/src/common.js index f553fd0e9..2b48ae030 100644 --- a/src/common.js +++ b/src/common.js @@ -172,6 +172,8 @@ exports.getUserHome = getUserHome; // parseOptions('-a', {'a':'alice', 'b':'bob'}); // Returns {'reference': 'string-value', 'bob': false} when passed two dictionaries of the form: // parseOptions({'-r': 'string-value'}, {'r':'reference', 'b':'bob'}); +// Throws an error when passed a string that does not start with '-': +// parseOptions('a', {'a':'alice'}); // throws function parseOptions(opt, map, errorOptions) { // Validate input if (typeof opt !== 'string' && !isObject(opt)) { diff --git a/src/echo.js b/src/echo.js index 045c35eda..13cce3999 100644 --- a/src/echo.js +++ b/src/echo.js @@ -1,3 +1,5 @@ +var format = require('util').format; + var common = require('./common'); common.register('echo', _echo, { @@ -9,26 +11,52 @@ common.register('echo', _echo, { //@ Available options: //@ //@ + `-e`: interpret backslash escapes (default) +//@ + `-n`: remove trailing newline from output //@ //@ Examples: //@ //@ ```javascript //@ echo('hello world'); //@ var str = echo('hello world'); +//@ echo('-n', 'no newline at end'); //@ ``` //@ //@ Prints string to stdout, and returns string with additional utility methods //@ like `.to()`. -function _echo(opts, messages) { +function _echo(opts) { // allow strings starting with '-', see issue #20 - messages = [].slice.call(arguments, opts ? 0 : 1); + var messages = [].slice.call(arguments, opts ? 0 : 1); + var options = {}; + + // If the first argument starts with '-', parse it as options string. + // If parseOptions throws, it wasn't an options string. + try { + options = common.parseOptions(messages[0], { + 'e': 'escapes', + 'n': 'no_newline' + }, { + silent: true + }); - if (messages[0] === '-e') { - // ignore -e - messages.shift(); + // Allow null to be echoed + if (messages[0]) { + messages.shift(); + } + } catch (_) { + // Clear out error if an error occurred + common.state.error = null; } - console.log.apply(console, messages); - return messages.join(' ') + '\n'; + var output = format.apply(null, messages); + + // Add newline if -n is not passed. + if (!options.no_newline) { + output += '\n'; + } + + process.stdout.write(output); + + return output; } + module.exports = _echo; diff --git a/test/common.js b/test/common.js index a6f1e9f52..2f5450790 100644 --- a/test/common.js +++ b/test/common.js @@ -269,6 +269,12 @@ test('common.parseOptions using an object to hold options', t => { t.false(result.reverse); }); +test('common.parseOptions throws when passed a string not starting with "-"', t => { + t.throws(() => { + common.parseOptions('a', { '-a': 'throws' }); + }, 'Options string must start with "-"'); +}); + test('Some basic tests on the ShellString type', t => { const result = shell.ShellString('foo'); t.is(result.toString(), 'foo'); diff --git a/test/echo.js b/test/echo.js index 87c48e24f..97d031ca6 100644 --- a/test/echo.js +++ b/test/echo.js @@ -79,3 +79,60 @@ test.cb('piping to a file', t => { t.end(); }); }); + +test.cb('-n option', t => { + const script = "require('../global.js'); echo('-n', 'message');"; + utils.runScript(script, (err, stdout) => { + t.falsy(err); + t.is(stdout, 'message'); + t.end(); + }); +}); + +test.cb('-ne option', t => { + const script = "require('../global.js'); echo('-ne', 'message');"; + utils.runScript(script, (err, stdout) => { + t.falsy(err); + t.is(stdout, 'message'); + t.end(); + }); +}); + +test.cb('-en option', t => { + const script = "require('../global.js'); echo('-en', 'message');"; + utils.runScript(script, (err, stdout) => { + t.falsy(err); + t.is(stdout, 'message'); + t.end(); + }); +}); + +test.cb('-en option with escaped characters', t => { + const script = "require('../global.js'); echo('-en', '\\tmessage\\n');"; + utils.runScript(script, (err, stdout) => { + t.falsy(err); + t.is(stdout, '\tmessage\n'); + t.end(); + }); +}); + +test.cb('piping to a file with -n', t => { + // see issue #476 + shell.mkdir(t.context.tmp); + const tmp = `${t.context.tmp}/echo.txt`; + const script = `require('../global.js'); echo('-n', 'A').toEnd('${tmp}'); echo('-n', 'B').toEnd('${tmp}');`; + utils.runScript(script, (err, stdout) => { + const result = shell.cat(tmp); + t.falsy(err); + t.is(stdout, 'AB'); + t.is(result.toString(), 'AB'); + t.end(); + }); +}); + +test('stderr with unrecognized options is empty', t => { + // TODO: console output here needs to be muted + const result = shell.echo('-asdf'); + t.falsy(result.stderr); + t.is(result.stdout, '-asdf\n'); +}); From c1d8fecc565b51788baa714450f6c7cb03851517 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 9 Apr 2017 19:31:47 -0700 Subject: [PATCH 138/338] Fix broken test --- src/common.js | 2 +- test/common.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common.js b/src/common.js index 2b48ae030..40b0600f0 100644 --- a/src/common.js +++ b/src/common.js @@ -197,7 +197,7 @@ function parseOptions(opt, map, errorOptions) { if (typeof opt === 'string') { if (opt[0] !== '-') { - error("Options string must start with a '-'", errorOptions || {}); + throw new Error("Options string must start with a '-'"); } // e.g. chars = ['R', 'f'] diff --git a/test/common.js b/test/common.js index 2f5450790..b59f7a267 100644 --- a/test/common.js +++ b/test/common.js @@ -272,7 +272,7 @@ test('common.parseOptions using an object to hold options', t => { test('common.parseOptions throws when passed a string not starting with "-"', t => { t.throws(() => { common.parseOptions('a', { '-a': 'throws' }); - }, 'Options string must start with "-"'); + }, Error, "Options string must start with a '-'"); }); test('Some basic tests on the ShellString type', t => { From e8ec60bc2fb54d024403b916f0b2b093661cffa5 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Fri, 5 May 2017 19:12:21 -0700 Subject: [PATCH 139/338] Echo test mocks (#708) * Add stdout/stderr test mocks * Mock stdout/stderr during echo tests * Fix lint issues * Use 'use strict' * Re-implement mocks as a prototype * Implement mocks as a single-instance * Remove redundant test * Create mocked stdout/stderr.write methods once --- src/echo.js | 4 +- test/echo.js | 189 +++++++++++++++++++++++--------------------- test/utils/mocks.js | 44 +++++++++++ 3 files changed, 147 insertions(+), 90 deletions(-) create mode 100644 test/utils/mocks.js diff --git a/src/echo.js b/src/echo.js index 13cce3999..7229ce7f2 100644 --- a/src/echo.js +++ b/src/echo.js @@ -33,9 +33,9 @@ function _echo(opts) { try { options = common.parseOptions(messages[0], { 'e': 'escapes', - 'n': 'no_newline' + 'n': 'no_newline', }, { - silent: true + silent: true, }); // Allow null to be echoed diff --git a/test/echo.js b/test/echo.js index 97d031ca6..f8afbee26 100644 --- a/test/echo.js +++ b/test/echo.js @@ -2,137 +2,150 @@ import test from 'ava'; import shell from '..'; import utils from './utils/utils'; +import mocks from './utils/mocks'; shell.config.silent = true; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); + mocks.init(); }); test.afterEach.always(t => { shell.rm('-rf', t.context.tmp); + mocks.restore(); }); // // Valids // -test.cb('simple test with defaults', t => { - const script = 'require(\'../global.js\'); echo("hello", "world");'; - utils.runScript(script, (err, stdout, stderr) => { - t.falsy(err); - t.is(stdout, 'hello world\n'); - t.is(stderr, ''); - t.end(); - }); +test('simple test with defaults', t => { + const result = shell.echo('hello', 'world'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(stdout, 'hello world\n'); + t.is(stderr, ''); }); -test.cb('allow arguments to begin with a hyphen', t => { +test('allow arguments to begin with a hyphen', t => { // see issue #20 - const script = 'require(\'../global.js\'); echo("-asdf", "111");'; - utils.runScript(script, (err, stdout, stderr) => { - t.falsy(err); - t.is(stdout, '-asdf 111\n'); - t.is(stderr, ''); - t.end(); - }); + const result = shell.echo('-asdf', '111'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 1); + t.is(stdout, '-asdf 111\n'); + t.is(stderr, ''); }); -test.cb("using null as an explicit argument doesn't crash the function", t => { - const script = 'require(\'../global.js\'); echo(null);'; - utils.runScript(script, (err, stdout, stderr) => { - t.falsy(err); - t.is(stdout, 'null\n'); - t.is(stderr, ''); - t.end(); - }); +test("using null as an explicit argument doesn't crash the function", t => { + const result = shell.echo(null); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(stdout, 'null\n'); + t.is(stderr, ''); }); -test.cb('simple test with silent(true)', t => { - const script = 'require(\'../global.js\'); config.silent=true; echo(555);'; - utils.runScript(script, (err, stdout) => { - t.falsy(err); - t.is(stdout, '555\n'); - t.end(); - }); +test('-e option', t => { + const result = shell.echo('-e', '\tmessage'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(stdout, '\tmessage\n'); + t.is(stderr, ''); }); -test.cb('-e option', t => { - const script = "require('../global.js'); echo('-e', '\\tmessage');"; - utils.runScript(script, (err, stdout) => { - t.falsy(err); - t.is(stdout, '\tmessage\n'); - t.end(); - }); -}); - -test.cb('piping to a file', t => { +test('piping to a file', t => { // see issue #476 shell.mkdir(t.context.tmp); const tmp = `${t.context.tmp}/echo.txt`; - const script = `require('../global.js'); echo('A').toEnd('${tmp}'); echo('B').toEnd('${tmp}');`; - utils.runScript(script, (err, stdout) => { - const result = shell.cat(tmp); - t.falsy(err); - t.is(stdout, 'A\nB\n'); - t.is(result.toString(), 'A\nB\n'); - t.end(); - }); + const resultA = shell.echo('A').toEnd(tmp); + t.falsy(shell.error()); + t.is(resultA.code, 0); + const resultB = shell.echo('B').toEnd(tmp); + t.falsy(shell.error()); + t.is(resultB.code, 0); + const result = shell.cat(tmp); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(stdout, 'A\nB\n'); + t.is(stderr, ''); + t.is(result.toString(), 'A\nB\n'); }); -test.cb('-n option', t => { - const script = "require('../global.js'); echo('-n', 'message');"; - utils.runScript(script, (err, stdout) => { - t.falsy(err); - t.is(stdout, 'message'); - t.end(); - }); +test('-n option', t => { + const result = shell.echo('-n', 'message'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(stdout, 'message'); + t.is(stderr, ''); }); -test.cb('-ne option', t => { - const script = "require('../global.js'); echo('-ne', 'message');"; - utils.runScript(script, (err, stdout) => { - t.falsy(err); - t.is(stdout, 'message'); - t.end(); - }); +test('-ne option', t => { + const result = shell.echo('-ne', 'message'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(stdout, 'message'); + t.is(stderr, ''); }); -test.cb('-en option', t => { - const script = "require('../global.js'); echo('-en', 'message');"; - utils.runScript(script, (err, stdout) => { - t.falsy(err); - t.is(stdout, 'message'); - t.end(); - }); +test('-en option', t => { + const result = shell.echo('-en', 'message'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(stdout, 'message'); + t.is(stderr, ''); }); -test.cb('-en option with escaped characters', t => { - const script = "require('../global.js'); echo('-en', '\\tmessage\\n');"; - utils.runScript(script, (err, stdout) => { - t.falsy(err); - t.is(stdout, '\tmessage\n'); - t.end(); - }); +test('-en option with escaped characters', t => { + const result = shell.echo('-en', '\tmessage\n'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(stdout, '\tmessage\n'); + t.is(stderr, ''); }); -test.cb('piping to a file with -n', t => { +test('piping to a file with -n', t => { // see issue #476 shell.mkdir(t.context.tmp); const tmp = `${t.context.tmp}/echo.txt`; - const script = `require('../global.js'); echo('-n', 'A').toEnd('${tmp}'); echo('-n', 'B').toEnd('${tmp}');`; - utils.runScript(script, (err, stdout) => { - const result = shell.cat(tmp); - t.falsy(err); - t.is(stdout, 'AB'); - t.is(result.toString(), 'AB'); - t.end(); - }); + const resultA = shell.echo('-n', 'A').toEnd(tmp); + t.falsy(shell.error()); + t.is(resultA.code, 0); + const resultB = shell.echo('-n', 'B').toEnd(tmp); + t.falsy(shell.error()); + t.is(resultB.code, 0); + const result = shell.cat(tmp); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(stdout, 'AB'); + t.is(stderr, ''); + t.is(result.toString(), 'AB'); }); test('stderr with unrecognized options is empty', t => { - // TODO: console output here needs to be muted const result = shell.echo('-asdf'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(result.code, 1); t.falsy(result.stderr); - t.is(result.stdout, '-asdf\n'); + t.is(stdout, '-asdf\n'); + t.is(stderr, ''); }); diff --git a/test/utils/mocks.js b/test/utils/mocks.js new file mode 100644 index 000000000..79dc55087 --- /dev/null +++ b/test/utils/mocks.js @@ -0,0 +1,44 @@ +function addToString(str, val) { + if (Buffer.isBuffer(val)) { + return str + val.toString(); + } + return str + val; +} + +function joinData(data) { + return data.reduce(addToString, ''); +} + +function wrapWrite(target) { + return function write(val) { + target.push(val); + return true; + }; +} + +const _processStdoutWrite = process.stdout.write; +const _processStderrWrite = process.stderr.write; +const _stdout = []; +const _stderr = []; +const _stdoutWrite = wrapWrite(_stdout); +const _stderrWrite = wrapWrite(_stderr); + +exports.stdout = function stdout() { + return joinData(_stdout); +}; + +exports.stderr = function stderr() { + return joinData(_stderr); +}; + +exports.init = function init() { + process.stdout.write = _stdoutWrite; + process.stderr.write = _stderrWrite; +}; + +exports.restore = function restore() { + process.stdout.write = _processStdoutWrite; + process.stderr.write = _processStderrWrite; + _stdout.splice(0); + _stderr.splice(0); +}; From 522a46dcf4c2846829826b7e546a10d806bce3bd Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 31 May 2017 16:03:13 -0700 Subject: [PATCH 140/338] Deprecate common.getUserHome, advise using os.homedir instead (#725) * Deprecate common.getUserHome, advise using os.homedir instead * Remove common.getUserHome --- src/cd.js | 3 ++- src/common.js | 15 +-------------- test/cd.js | 10 +++++----- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/cd.js b/src/cd.js index 634ed835c..c6f1ada33 100644 --- a/src/cd.js +++ b/src/cd.js @@ -1,4 +1,5 @@ var fs = require('fs'); +var os = require('os'); var common = require('./common'); common.register('cd', _cd, {}); @@ -8,7 +9,7 @@ common.register('cd', _cd, {}); //@ Changes to directory `dir` for the duration of the script. Changes to home //@ directory if no argument is supplied. function _cd(options, dir) { - if (!dir) dir = common.getUserHome(); + if (!dir) dir = os.homedir(); if (dir === '-') { if (!process.env.OLDPWD) { diff --git a/src/common.js b/src/common.js index 40b0600f0..13753a12f 100644 --- a/src/common.js +++ b/src/common.js @@ -155,19 +155,6 @@ function ShellString(stdout, stderr, code) { exports.ShellString = ShellString; -// Return the home directory in a platform-agnostic way, with consideration for -// older versions of node -function getUserHome() { - var result; - if (os.homedir) { - result = os.homedir(); // node 3+ - } else { - result = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME']; - } - return result; -} -exports.getUserHome = getUserHome; - // Returns {'alice': true, 'bob': false} when passed a string and dictionary as follows: // parseOptions('-a', {'a':'alice', 'b':'bob'}); // Returns {'reference': 'string-value', 'bob': false} when passed two dictionaries of the form: @@ -363,7 +350,7 @@ function wrap(cmd, fn, options) { }); // Expand the '~' if appropriate - var homeDir = getUserHome(); + var homeDir = os.homedir(); args = args.map(function (arg) { if (typeof arg === 'string' && arg.slice(0, 2) === '~/' || arg === '~') { return arg.replace(/^~/, homeDir); diff --git a/test/cd.js b/test/cd.js index ca9e88910..3c15b1a3d 100644 --- a/test/cd.js +++ b/test/cd.js @@ -1,10 +1,10 @@ import fs from 'fs'; +import os from 'os'; import path from 'path'; import test from 'ava'; import shell from '..'; -import common from '../src/common'; import utils from './utils/utils'; const cur = shell.pwd().toString(); @@ -90,16 +90,16 @@ test('cd + other commands', t => { test('Tilde expansion', t => { shell.cd('~'); - t.is(process.cwd(), common.getUserHome()); + t.is(process.cwd(), os.homedir()); shell.cd('..'); - t.not(process.cwd(), common.getUserHome()); + t.not(process.cwd(), os.homedir()); shell.cd('~'); // Change back to home - t.is(process.cwd(), common.getUserHome()); + t.is(process.cwd(), os.homedir()); }); test('Goes to home directory if no arguments are passed', t => { const result = shell.cd(); t.falsy(shell.error()); t.is(result.code, 0); - t.is(process.cwd(), common.getUserHome()); + t.is(process.cwd(), os.homedir()); }); From c16fb7dac9dfec6cec29cfe633daece83a127d47 Mon Sep 17 00:00:00 2001 From: Vojtech Jasny Date: Sat, 17 Jun 2017 00:55:25 +0200 Subject: [PATCH 141/338] Remove PDF.js mention from README.md (#738) Fixes #737. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index b59c8c821..51082f47c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ ShellJS is proudly tested on every node release since `v4`! The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-tested in projects like: -+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader + [Firebug](http://getfirebug.com/) - Firefox's infamous debugger + [JSHint](http://jshint.com) & [ESLint](http://eslint.org/) - popular JavaScript linters + [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers From 291241811f27963a663350d5aefa5a76b2a9d719 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 17 Jun 2017 18:31:24 -0700 Subject: [PATCH 142/338] test(head): improve coverage (#743) This adds a test for `head()` on the right-hand side of a pipe. This also removes the try-catch surrounding `fs.openSync()`, because it was unreachable code. `fs.existsSync()` guarantees that the file exists, and `fs.openSync()` only throws if the file does not exist, according to official documentation. Fixes #671 --- src/head.js | 11 +++-------- test/head.js | 7 +++++++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/head.js b/src/head.js index e112e49e1..2640b13b4 100644 --- a/src/head.js +++ b/src/head.js @@ -8,20 +8,14 @@ common.register('head', _head, { }, }); -// This reads n or more lines, or the entire file, whichever is less. +// Reads |numLines| lines or the entire file, whichever is less. function readSomeLines(file, numLines) { var buf = common.buffer(); var bufLength = buf.length; var bytesRead = bufLength; var pos = 0; - var fdr = null; - - try { - fdr = fs.openSync(file, 'r'); - } catch (e) { - common.error('cannot read file: ' + file); - } + var fdr = fs.openSync(file, 'r'); var numLinesRead = 0; var ret = ''; while (bytesRead === bufLength && numLinesRead < numLines) { @@ -35,6 +29,7 @@ function readSomeLines(file, numLines) { fs.closeSync(fdr); return ret; } + //@ //@ ### head([{'-n': \},] file [, file ...]) //@ ### head([{'-n': \},] file_array) diff --git a/test/head.js b/test/head.js index 5d3beb3b2..0f976e543 100644 --- a/test/head.js +++ b/test/head.js @@ -127,3 +127,10 @@ test('negative values (-num) are the same as (numLines - num)', t => { t.is(result.code, 0); t.is(result.toString(), 'file1 1\nfile1 2\nfile1 3\nfile1 4\n'); }); + +test('right-hand side of a pipe', t => { + const result = shell.cat('resources/head/file1.txt').head(); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), topOfFile1.slice(0, 10).join('\n') + '\n'); +}); From 5823ab18bbbf6f020b294a69027b7b0adc7528da Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 17 Jun 2017 19:09:01 -0700 Subject: [PATCH 143/338] test(exec): add tests for coverage (#744) * test(exec): add tests for coverage No logic change. This adds one test to cover some missing lines, and adds some `istanbul ignore` directives. I see 100% line coverage for `src/exec.js` when running: ```sh $ nyc --reporter=text --reporter=lcov ava --serial test/exec.js` ``` Fixes #742 * Fix lint --- src/exec.js | 2 ++ test/exec.js | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/src/exec.js b/src/exec.js index 16066382e..6a2e1261a 100644 --- a/src/exec.js +++ b/src/exec.js @@ -78,6 +78,7 @@ function execSync(cmd, opts, pipe) { fs.writeFileSync(scriptFile, script); + /* istanbul ignore else */ if (opts.silent) { opts.stdio = 'ignore'; } else { @@ -137,6 +138,7 @@ function execAsync(cmd, opts, pipe, callback) { callback(0, stdout, stderr); } else if (err.code === undefined) { // See issue #536 + /* istanbul ignore next */ callback(1, stdout, stderr); } else { callback(err.code, stdout, stderr); diff --git a/test/exec.js b/test/exec.js index 6a7b44377..f22c73120 100644 --- a/test/exec.js +++ b/test/exec.js @@ -199,3 +199,12 @@ test.cb('callback as 3rd argument (silent:true)', t => { t.end(); }); }); + +test.cb('command that fails', t => { + shell.exec('shx cp onlyOneCpArgument.txt', { silent: true }, (code, stdout, stderr) => { + t.is(code, 1); + t.is(stdout, ''); + t.is(stderr, 'cp: missing and/or \n'); + t.end(); + }); +}); From 38b57c8942e68a8bff35fb9177a856dd6f62222a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 18 Jun 2017 11:51:01 -0700 Subject: [PATCH 144/338] chore: add skipOnWin and skipOnUnix test helpers (#746) This adds `skipOnWin` and `skipOnUnix` to help us manage our platform-dependent tests. These methods give a nice warning message when we skip tests. We may also consider adding warnings when running platform-dependent tests. Part of the motivation for this is if we ever update to AVA v0.19. This version requires at least one assertion per test case. While this could be disabled with an AVA setting, we instead benefit from warnings for any case when we unintentionally skip assertions. This adds chalk as a dev dependency to enable colored messages. --- package.json | 1 + test/chmod.js | 56 ++++++++++++++++++++++----------------------- test/cp.js | 32 +++++++++++++------------- test/exec.js | 5 ++-- test/ls.js | 24 +++++++++---------- test/mkdir.js | 4 ++-- test/rm.js | 12 +++++----- test/test.js | 21 +++++++++-------- test/touch.js | 4 ++-- test/utils/utils.js | 24 ++++++++++++++++++- test/which.js | 5 ++-- 11 files changed, 107 insertions(+), 81 deletions(-) diff --git a/package.json b/package.json index b8ae2a37b..eab128b74 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ }, "devDependencies": { "ava": "^0.16.0", + "chalk": "^1.1.3", "codecov": "^1.0.1", "coffee-script": "^1.10.0", "eslint": "^2.0.0", diff --git a/test/chmod.js b/test/chmod.js index 3ed210e5b..60e09ff14 100644 --- a/test/chmod.js +++ b/test/chmod.js @@ -32,7 +32,7 @@ test('invalid permissions', t => { }); test('Basic usage with octal codes', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('755', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( @@ -45,11 +45,11 @@ test('Basic usage with octal codes', t => { fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('644', 8) ); - } + }); }); test('symbolic mode', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('o+x', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( @@ -58,11 +58,11 @@ test('symbolic mode', t => { ); result = shell.chmod('644', `${TMP}/chmod/file1`); t.is(result.code, 0); - } + }); }); test('symbolic mode, without group', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('+x', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( @@ -71,11 +71,11 @@ test('symbolic mode, without group', t => { ); result = shell.chmod('644', `${TMP}/chmod/file1`); t.is(result.code, 0); - } + }); }); test('Test setuid', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('u+s', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( @@ -102,11 +102,11 @@ test('Test setuid', t => { ); result = shell.chmod('u-s', `${TMP}/chmod/c`); t.is(result.code, 0); - } + }); }); test('Test setgid', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('g+s', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( @@ -119,11 +119,11 @@ test('Test setgid', t => { fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('644', 8) ); - } + }); }); test('Test sticky bit', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('+t', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( @@ -137,11 +137,11 @@ test('Test sticky bit', t => { parseInt('644', 8) ); t.is(fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('1000', 8), 0); - } + }); }); test('Test directories', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('a-w', `${TMP}/chmod/b/a/b`); t.is(result.code, 0); t.is( @@ -150,11 +150,11 @@ test('Test directories', t => { ); result = shell.chmod('755', `${TMP}/chmod/b/a/b`); t.is(result.code, 0); - } + }); }); test('Test recursion', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('-R', 'a+w', `${TMP}/chmod/b`); t.is(result.code, 0); t.is( @@ -167,11 +167,11 @@ test('Test recursion', t => { fs.statSync(`${TMP}/chmod/b/a/b`).mode & BITMASK, parseInt('755', 8) ); - } + }); }); test('Test symbolic links w/ recursion - WARNING: *nix only', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { fs.symlinkSync(`${TMP}/chmod/b/a`, `${TMP}/chmod/a/b/c/link`, 'dir'); let result = shell.chmod('-R', 'u-w', `${TMP}/chmod/a/b`); t.is(result.code, 0); @@ -186,7 +186,7 @@ test('Test symbolic links w/ recursion - WARNING: *nix only', t => { result = shell.chmod('-R', 'u+w', `${TMP}/chmod/a/b`); t.is(result.code, 0); fs.unlinkSync(`${TMP}/chmod/a/b/c/link`); - } + }); }); test('Test combinations', t => { @@ -223,7 +223,7 @@ test('multiple symbolic modes #2', t => { }); test('multiple symbolic modes #3', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('a-rwx,u+rwx', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( @@ -232,7 +232,7 @@ test('multiple symbolic modes #3', t => { ); result = shell.chmod('644', `${TMP}/chmod/file1`); t.is(result.code, 0); - } + }); }); test('u+rw', t => { @@ -249,7 +249,7 @@ test('u+rw', t => { }); test('u+wx', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('000', `${TMP}/chmod/file1`); t.is(result.code, 0); result = shell.chmod('u+wx', `${TMP}/chmod/file1`); @@ -260,11 +260,11 @@ test('u+wx', t => { ); result = shell.chmod('644', `${TMP}/chmod/file1`); t.is(result.code, 0); - } + }); }); test('Multiple symbolic modes at once', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('000', `${TMP}/chmod/file1`); t.is(result.code, 0); result = shell.chmod('u+r,g+w,o+x', `${TMP}/chmod/file1`); @@ -275,11 +275,11 @@ test('Multiple symbolic modes at once', t => { ); result = shell.chmod('644', `${TMP}/chmod/file1`); t.is(result.code, 0); - } + }); }); test('u+rw,g+wx', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.chmod('000', `${TMP}/chmod/file1`); t.is(result.code, 0); result = shell.chmod('u+rw,g+wx', `${TMP}/chmod/file1`); @@ -290,7 +290,7 @@ test('u+rw,g+wx', t => { ); result = shell.chmod('644', `${TMP}/chmod/file1`); t.is(result.code, 0); - } + }); }); test('u-x,g+rw', t => { @@ -337,7 +337,7 @@ test('Numeric modes', t => { }); test('Make sure chmod succeeds for a variety of octal codes', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { t.is( fs.statSync(`${TMP}/chmod/xdir`).mode & parseInt('755', 8), parseInt('755', 8) @@ -354,5 +354,5 @@ test('Make sure chmod succeeds for a variety of octal codes', t => { fs.statSync(`${TMP}/chmod/xdir/deep/file`).mode & parseInt('644', 8), parseInt('644', 8) ); - } + }); }); diff --git a/test/cp.js b/test/cp.js index e8cece026..f898e71dd 100644 --- a/test/cp.js +++ b/test/cp.js @@ -307,7 +307,7 @@ test('recursive, everything exists, no force flag', t => { }); test('-R implies to not follow links', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { shell.cp('-R', 'resources/cp/*', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link t.falsy((fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't @@ -325,11 +325,11 @@ test('-R implies to not follow links', t => { shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() ); - } + }); }); test('Missing -R implies -L', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { // Recursive, everything exists, overwrite a real file *by following a link* // Because missing the -R implies -L. shell.cp('-R', 'resources/cp/*', t.context.tmp); @@ -350,7 +350,7 @@ test('Missing -R implies -L', t => { shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() ); - } + }); }); test('recursive, everything exists, with force flag', t => { @@ -411,7 +411,7 @@ test('recursive, with trailing slash, does the exact same', t => { test( 'On Windows, permission bits are quite different so skip those tests for now', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { // preserve mode bits const execBit = parseInt('001', 8); t.is(fs.statSync('resources/cp-mode-bits/executable').mode & execBit, execBit); @@ -420,7 +420,7 @@ test( fs.statSync('resources/cp-mode-bits/executable').mode, fs.statSync(`${t.context.tmp}/executable`).mode ); - } + }); } ); @@ -457,42 +457,42 @@ test('no-recursive will copy regular files only', t => { }); test('-R implies -P', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { shell.cp('-R', 'resources/cp/links/sym.lnk', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); - } + }); }); test('using -P explicitly works', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { shell.cp('-P', 'resources/cp/links/sym.lnk', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); - } + }); }); test('using -PR on a link to a folder does not follow the link', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { shell.cp('-PR', 'resources/cp/symFolder', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); - } + }); }); test('-L overrides -P for copying directory', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { shell.cp('-LPR', 'resources/cp/symFolder', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder/sym.lnk`).isSymbolicLink()); - } + }); }); test('Recursive, copies entire directory with no symlinks and -L option does not cause change in behavior', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.cp('-rL', 'resources/cp/dir_a', `${t.context.tmp}/dest`); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); t.truthy(fs.existsSync(`${t.context.tmp}/dest/z`)); - } + }); }); test('-u flag won\'t overwrite newer files', t => { diff --git a/test/exec.js b/test/exec.js index f22c73120..07df5ac5b 100644 --- a/test/exec.js +++ b/test/exec.js @@ -5,6 +5,7 @@ import util from 'util'; import test from 'ava'; import shell from '..'; +import utils from './utils/utils'; const CWD = process.cwd(); const ORIG_EXEC_PATH = shell.config.execPath; @@ -138,7 +139,7 @@ test('check process.env works', t => { }); test('set shell option (TODO: add tests for Windows)', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { let result = shell.exec('echo $0'); t.falsy(shell.error()); t.is(result.code, 0); @@ -151,7 +152,7 @@ test('set shell option (TODO: add tests for Windows)', t => { t.is(result.code, 0); t.is(result.stdout, '/bin/bash\n'); } - } + }); }); test('exec returns a ShellString', t => { diff --git a/test/ls.js b/test/ls.js index 89497039e..d2c09a23c 100644 --- a/test/ls.js +++ b/test/ls.js @@ -305,7 +305,7 @@ test('-RA flag, symlinks are not followed', t => { }); test('-RAL flag, follows symlinks', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.ls('-RAL', 'resources/rm'); t.falsy(shell.error()); t.is(result.code, 0); @@ -315,17 +315,17 @@ test('-RAL flag, follows symlinks', t => { t.truthy(result.indexOf('link_to_a_dir/a_file') > -1); t.truthy(result.indexOf('fake.lnk') > -1); t.is(result.length, 5); - } + }); }); test('-L flag, path is symlink', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.ls('-L', 'resources/rm/link_to_a_dir'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('a_file') > -1); t.is(result.length, 1); - } + }); }); test('-Rd works like -d', t => { @@ -382,10 +382,10 @@ test('long option, single file', t => { t.is(result.nlink, 1); t.is(result.size, 5); t.truthy(result.mode); // check that these keys exist - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { t.truthy(result.uid); t.truthy(result.gid); - } + }); t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist @@ -401,10 +401,10 @@ test('long option, glob files', t => { t.is(result.nlink, 1); t.is(result.size, 5); t.truthy(result.mode); // check that these keys exist - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { t.truthy(result.uid); t.truthy(result.gid); - } + }); t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist @@ -423,10 +423,10 @@ test('long option, directory', t => { t.is(result.nlink, 1); t.is(result.size, 5); t.truthy(result.mode); // check that these keys exist - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { t.truthy(result.uid); t.truthy(result.gid); - } + }); t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist @@ -446,10 +446,10 @@ test('long option, directory, recursive (and windows converts slashes)', t => { t.is(typeof result.nlink, 'number'); // This can vary between the local machine and travis t.is(typeof result.size, 'number'); // This can vary between different file systems t.truthy(result.mode); // check that these keys exist - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { t.truthy(result.uid); t.truthy(result.gid); - } + }); t.truthy(result.mtime); // check that these keys exist t.truthy(result.atime); // check that these keys exist t.truthy(result.ctime); // check that these keys exist diff --git a/test/mkdir.js b/test/mkdir.js index 4093155d4..f49089a35 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -84,7 +84,7 @@ test('try to make a subdirectory of a file', t => { }); test('Check for invalid permissions', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { // This test case only works on unix, but should work on Windows as well const dirName = 'nowritedir'; shell.mkdir(dirName); @@ -99,7 +99,7 @@ test('Check for invalid permissions', t => { t.truthy(shell.error()); t.falsy(fs.existsSync(dirName + '/foo')); shell.rm('-rf', dirName); // clean up - } + }); }); // diff --git a/test/rm.js b/test/rm.js index e729d2d13..d3228c7e1 100644 --- a/test/rm.js +++ b/test/rm.js @@ -268,7 +268,7 @@ test('remove symbolic link to a dir', t => { }); test('rm -rf on a symbolic link to a dir deletes its contents', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.rm('-rf', `${t.context.tmp}/rm/link_to_a_dir/`); t.falsy(shell.error()); t.is(result.code, 0); @@ -277,18 +277,18 @@ test('rm -rf on a symbolic link to a dir deletes its contents', t => { t.truthy(fs.existsSync(`${t.context.tmp}/rm/link_to_a_dir`)); t.truthy(fs.existsSync(`${t.context.tmp}/rm/a_dir`)); t.falsy(fs.existsSync(`${t.context.tmp}/rm/a_dir/a_file`)); - } + }); }); test('remove broken symbolic link', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { t.truthy(shell.test('-L', `${t.context.tmp}/rm/fake.lnk`)); const result = shell.rm(`${t.context.tmp}/rm/fake.lnk`); t.falsy(shell.error()); t.is(result.code, 0); t.falsy(shell.test('-L', `${t.context.tmp}/rm/fake.lnk`)); t.falsy(fs.existsSync(`${t.context.tmp}/rm/fake.lnk`)); - } + }); }); test('recursive dir removal, for non-normalized path', t => { @@ -301,10 +301,10 @@ test('recursive dir removal, for non-normalized path', t => { }); test('remove fifo', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const fifo = utils.mkfifo(t.context.tmp); const result = shell.rm(fifo); t.falsy(shell.error()); t.is(result.code, 0); - } + }); }); diff --git a/test/test.js b/test/test.js index 39f25795e..cea2094ed 100644 --- a/test/test.js +++ b/test/test.js @@ -1,6 +1,7 @@ import test from 'ava'; import shell from '..'; +import utils from './utils/utils'; shell.config.silent = true; @@ -90,41 +91,41 @@ test('test command is not globbed', t => { // TODO(nate): figure out a way to test links on Windows test('-d option fails for a link', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.test('-d', 'resources/link'); t.falsy(shell.error()); t.falsy(result); - } + }); }); test('-f option succeeds for a link', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.test('-f', 'resources/link'); t.falsy(shell.error()); t.truthy(result); - } + }); }); test('-L option succeeds for a symlink', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.test('-L', 'resources/link'); t.falsy(shell.error()); t.truthy(result); - } + }); }); test('-L option works for broken symlinks', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.test('-L', 'resources/badlink'); t.falsy(shell.error()); t.truthy(result); - } + }); }); test('-L option fails for missing files', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.test('-L', 'resources/404'); t.falsy(shell.error()); t.falsy(result); - } + }); }); diff --git a/test/touch.js b/test/touch.js index ad5dbfd72..70566ea69 100644 --- a/test/touch.js +++ b/test/touch.js @@ -164,11 +164,11 @@ test('file array', t => { }); test('touching broken link creates a new file', t => { - if (process.platform !== 'win32') { + utils.skipOnWin(t, () => { const result = shell.touch('resources/badlink'); t.is(result.code, 0); t.falsy(shell.error()); t.truthy(fs.existsSync('resources/not_existed_file')); shell.rm('resources/not_existed_file'); - } + }); }); diff --git a/test/utils/utils.js b/test/utils/utils.js index a1d313143..aae5cdefb 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -1,4 +1,7 @@ const child = require('child_process'); +const path = require('path'); + +const chalk = require('chalk'); const common = require('../../src/common'); @@ -33,7 +36,11 @@ function runScript(script, cb) { exports.runScript = runScript; function sleep(time) { - child.execFileSync(common.config.execPath, ['resources/exec/slow.js', time.toString()]); + const testDirectoryPath = path.dirname(__dirname); + child.execFileSync(common.config.execPath, [ + path.join(testDirectoryPath, 'resources', 'exec', 'slow.js'), + time.toString(), + ]); } exports.sleep = sleep; @@ -46,3 +53,18 @@ function mkfifo(dir) { return null; } exports.mkfifo = mkfifo; + +function skipIfTrue(booleanValue, t, closure) { + if (booleanValue) { + console.warn( + chalk.yellow('Warning: skipping platform-dependent test ') + + chalk.bold.white(`'${t._test.title}'`) + ); + t.truthy(true); // dummy assertion to satisfy ava v0.19+ + } else { + closure(); + } +} + +exports.skipOnUnix = skipIfTrue.bind(module.exports, process.platform !== 'win32'); +exports.skipOnWin = skipIfTrue.bind(module.exports, process.platform === 'win32'); diff --git a/test/which.js b/test/which.js index 705fda311..530fcd2ca 100644 --- a/test/which.js +++ b/test/which.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import utils from './utils/utils'; shell.config.silent = true; @@ -35,7 +36,7 @@ test('basic usage', t => { }); test('Windows can search with or without a .exe extension', t => { - if (process.platform === 'win32') { + utils.skipOnUnix(t, () => { // This should be equivalent on Windows const node = shell.which('node'); const nodeExe = shell.which('node.exe'); @@ -43,7 +44,7 @@ test('Windows can search with or without a .exe extension', t => { // If the paths are equal, then this file *should* exist, since that's // already been checked. t.is(node.toString(), nodeExe.toString()); - } + }); }); test('Searching with -a flag returns an array', t => { From 2ee83ebf7440b695ac78694cbec8a3302d8896ec Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 11 Aug 2017 11:03:13 -0700 Subject: [PATCH 145/338] refactor(test): update AVA and refactor tests (#760) This updates tests for `AVA` 19.0.0+. `AVA` 0.18.0 has a breaking change which changes the current working directory for tests. As a result, we need to change 'resources' -> 'test/resources' (and similar path changes). `AVA` 0.19.0 has a breaking change that all tests must run at least one assert. This breaking change was already resolved by #746, so no change was necessary in this PR. This updates to `AVA` 0.21.0, since there are no other breaking changes. --- package.json | 2 +- test/cat.js | 12 ++-- test/cd.js | 12 ++-- test/chmod.js | 2 +- test/common.js | 24 +++---- test/config.js | 26 +++---- test/cp.js | 186 ++++++++++++++++++++++++------------------------- test/dirs.js | 6 +- test/exec.js | 6 +- test/find.js | 24 +++---- test/global.js | 4 +- test/grep.js | 34 ++++----- test/head.js | 36 +++++----- test/ln.js | 2 +- test/ls.js | 168 ++++++++++++++++++++++---------------------- test/mkdir.js | 34 ++++----- test/mv.js | 2 +- test/pipe.js | 24 +++---- test/plugin.js | 4 +- test/popd.js | 32 ++++----- test/pushd.js | 162 +++++++++++++++++++++--------------------- test/rm.js | 6 +- test/sed.js | 10 +-- test/set.js | 12 ++-- test/sort.js | 34 ++++----- test/tail.js | 30 ++++---- test/test.js | 30 ++++---- test/touch.js | 6 +- test/uniq.js | 44 ++++++------ 29 files changed, 487 insertions(+), 487 deletions(-) diff --git a/package.json b/package.json index eab128b74..6303ffe1c 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "rechoir": "^0.6.2" }, "devDependencies": { - "ava": "^0.16.0", + "ava": "^0.21.0", "chalk": "^1.1.3", "codecov": "^1.0.1", "coffee-script": "^1.10.0", diff --git a/test/cat.js b/test/cat.js index 53bd52257..c61905f6a 100644 --- a/test/cat.js +++ b/test/cat.js @@ -26,10 +26,10 @@ test('nonexistent file', t => { }); test('directory', t => { - const result = shell.cat('resources/cat'); + const result = shell.cat('test/resources/cat'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'cat: resources/cat: Is a directory'); + t.is(result.stderr, 'cat: test/resources/cat: Is a directory'); }); // @@ -37,28 +37,28 @@ test('directory', t => { // test('simple', t => { - const result = shell.cat('resources/cat/file1'); + const result = shell.cat('test/resources/cat/file1'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'test1\n'); }); test('multiple files', t => { - const result = shell.cat('resources/cat/file2', 'resources/cat/file1'); + const result = shell.cat('test/resources/cat/file2', 'test/resources/cat/file1'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'test2\ntest1\n'); }); test('multiple files, array syntax', t => { - const result = shell.cat(['resources/cat/file2', 'resources/cat/file1']); + const result = shell.cat(['test/resources/cat/file2', 'test/resources/cat/file1']); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'test2\ntest1\n'); }); test('glob', t => { - const result = shell.cat('resources/file*.txt'); + const result = shell.cat('test/resources/file*.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.search('test1') > -1); // file order might be random diff --git a/test/cd.js b/test/cd.js index 3c15b1a3d..c472973da 100644 --- a/test/cd.js +++ b/test/cd.js @@ -34,11 +34,11 @@ test('nonexistent directory', t => { }); test('file not dir', t => { - t.truthy(fs.existsSync('resources/file1')); // sanity check - const result = shell.cd('resources/file1'); // file, not dir + t.truthy(fs.existsSync('test/resources/file1')); // sanity check + const result = shell.cd('test/resources/file1'); // file, not dir t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'cd: not a directory: resources/file1'); + t.is(result.stderr, 'cd: not a directory: test/resources/file1'); }); test('no previous dir', t => { @@ -76,13 +76,13 @@ test('previous directory (-)', t => { test('cd + other commands', t => { t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); - let result = shell.cd('resources'); + let result = shell.cd('test/resources'); t.falsy(shell.error()); t.is(result.code, 0); - result = shell.cp('file1', `../${t.context.tmp}`); + result = shell.cp('file1', `../../${t.context.tmp}`); t.falsy(shell.error()); t.is(result.code, 0); - result = shell.cd(`../${t.context.tmp}`); + result = shell.cd(`../../${t.context.tmp}`); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(fs.existsSync('file1')); diff --git a/test/chmod.js b/test/chmod.js index 60e09ff14..7b617ab3a 100644 --- a/test/chmod.js +++ b/test/chmod.js @@ -10,7 +10,7 @@ const BITMASK = parseInt('777', 8); test.before(() => { TMP = utils.getTempDir(); - shell.cp('-r', 'resources', TMP); + shell.cp('-r', 'test/resources', TMP); shell.config.silent = true; }); diff --git a/test/common.js b/test/common.js index b59f7a267..7f8fb1364 100644 --- a/test/common.js +++ b/test/common.js @@ -23,7 +23,7 @@ test('too few args', t => { test('should be a list', t => { t.throws(() => { - common.expand('resources'); + common.expand('test/resources'); }, TypeError); }); @@ -138,36 +138,36 @@ test('convertErrorOutput: changes backslashes to forward slashes', t => { // common.expand() // test('single file, array syntax', t => { - const result = common.expand(['resources/file1.txt']); + const result = common.expand(['test/resources/file1.txt']); t.falsy(shell.error()); - t.deepEqual(result, ['resources/file1.txt']); + t.deepEqual(result, ['test/resources/file1.txt']); }); test('multiple file, glob syntax, * for file name', t => { - const result = common.expand(['resources/file*.txt']); + const result = common.expand(['test/resources/file*.txt']); t.falsy(shell.error()); - t.deepEqual(result.sort(), ['resources/file1.txt', 'resources/file2.txt'].sort()); + t.deepEqual(result.sort(), ['test/resources/file1.txt', 'test/resources/file2.txt'].sort()); }); test('multiple file, glob syntax, * for directory name', t => { - const result = common.expand(['r*/file*.txt']); + const result = common.expand(['test/r*/file*.txt']); t.falsy(shell.error()); - t.deepEqual(result.sort(), ['resources/file1.txt', 'resources/file2.txt'].sort()); + t.deepEqual(result.sort(), ['test/resources/file1.txt', 'test/resources/file2.txt'].sort()); }); test('multiple file, glob syntax, ** for directory name', t => { - const result = common.expand(['resources/**/file*.js']); + const result = common.expand(['test/resources/**/file*.js']); t.falsy(shell.error()); t.deepEqual( result.sort(), - ['resources/file1.js', 'resources/file2.js', 'resources/ls/file1.js', 'resources/ls/file2.js'].sort() + ['test/resources/file1.js', 'test/resources/file2.js', 'test/resources/ls/file1.js', 'test/resources/ls/file2.js'].sort() ); }); test('broken links still expand', t => { - const result = common.expand(['resources/b*dlink']); + const result = common.expand(['test/resources/b*dlink']); t.falsy(shell.error()); - t.deepEqual(result, ['resources/badlink']); + t.deepEqual(result, ['test/resources/badlink']); }); test('empty array', t => { @@ -285,7 +285,7 @@ test('Some basic tests on the ShellString type', t => { }); test.cb('Commands that fail will still output error messages to stderr', t => { - const script = 'require(\'../global\'); ls(\'noexist\'); cd(\'noexist\');'; + const script = 'require(\'./global\'); ls(\'noexist\'); cd(\'noexist\');'; utils.runScript(script, (err, stdout, stderr) => { t.is(stdout, ''); t.is( diff --git a/test/config.js b/test/config.js index 83c45ffda..743df3561 100644 --- a/test/config.js +++ b/test/config.js @@ -32,7 +32,7 @@ test('config.silent can be set to false', t => { test.cb('config.fatal = false', t => { t.falsy(shell.config.fatal); - const script = 'require(\'../global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; + const script = 'require(\'./global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; utils.runScript(script, (err, stdout) => { t.truthy(stdout.match('got here')); t.end(); @@ -40,7 +40,7 @@ test.cb('config.fatal = false', t => { }); test.cb('config.fatal = true', t => { - const script = 'require(\'../global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; + const script = 'require(\'./global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; utils.runScript(script, (err, stdout) => { t.falsy(stdout.match('got here')); t.end(); @@ -52,24 +52,24 @@ test.cb('config.fatal = true', t => { // test('Expands to directories by default', t => { - const result = common.expand(['resources/*a*']); + const result = common.expand(['test/resources/*a*']); t.is(result.length, 5); - t.truthy(result.indexOf('resources/a.txt') > -1); - t.truthy(result.indexOf('resources/badlink') > -1); - t.truthy(result.indexOf('resources/cat') > -1); - t.truthy(result.indexOf('resources/head') > -1); - t.truthy(result.indexOf('resources/external') > -1); + t.truthy(result.indexOf('test/resources/a.txt') > -1); + t.truthy(result.indexOf('test/resources/badlink') > -1); + t.truthy(result.indexOf('test/resources/cat') > -1); + t.truthy(result.indexOf('test/resources/head') > -1); + t.truthy(result.indexOf('test/resources/external') > -1); }); test( 'Check to make sure options get passed through (nodir is an example)', t => { shell.config.globOptions = { nodir: true }; - const result = common.expand(['resources/*a*']); + const result = common.expand(['test/resources/*a*']); t.is(result.length, 2); - t.truthy(result.indexOf('resources/a.txt') > -1); - t.truthy(result.indexOf('resources/badlink') > -1); - t.truthy(result.indexOf('resources/cat') < 0); - t.truthy(result.indexOf('resources/external') < 0); + t.truthy(result.indexOf('test/resources/a.txt') > -1); + t.truthy(result.indexOf('test/resources/badlink') > -1); + t.truthy(result.indexOf('test/resources/cat') < 0); + t.truthy(result.indexOf('test/resources/external') < 0); } ); diff --git a/test/cp.js b/test/cp.js index f898e71dd..34b81c7e9 100644 --- a/test/cp.js +++ b/test/cp.js @@ -46,7 +46,7 @@ test('only an option', t => { }); test('invalid option', t => { - const result = shell.cp('-@', 'resources/file1', `${t.context.tmp}/file1`); + const result = shell.cp('-@', 'test/resources/file1', `${t.context.tmp}/file1`); t.truthy(shell.error()); t.is(result.code, 1); t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); @@ -84,14 +84,14 @@ test('multiple sources do not exist', t => { }); test('too many sources', t => { - const result = shell.cp('asdfasdf1', 'asdfasdf2', 'resources/file1'); + const result = shell.cp('asdfasdf1', 'asdfasdf2', 'test/resources/file1'); t.truthy(shell.error()); t.is(result.code, 1); t.is(result.stderr, 'cp: dest is not a directory (too many sources)'); }); test('too many sources #2', t => { - const result = shell.cp('resources/file1', 'resources/file2', `${t.context.tmp}/a_file`); + const result = shell.cp('test/resources/file1', 'test/resources/file2', `${t.context.tmp}/a_file`); t.truthy(shell.error()); t.is(result.code, 1); t.falsy(fs.existsSync(`${t.context.tmp}/a_file`)); @@ -110,12 +110,12 @@ test('empty string source', t => { // test('dest already exists', t => { - const oldContents = shell.cat('resources/file2').toString(); - const result = shell.cp('-n', 'resources/file1', 'resources/file2'); + const oldContents = shell.cat('test/resources/file2').toString(); + const result = shell.cp('-n', 'test/resources/file1', 'test/resources/file2'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stderr, ''); - t.is(shell.cat('resources/file2').toString(), oldContents); + t.is(shell.cat('test/resources/file2').toString(), oldContents); }); test('-nR does not overwrite an existing file at the destination', t => { @@ -125,8 +125,8 @@ test('-nR does not overwrite an existing file at the destination', t => { const oldContents = 'original content'; shell.ShellString(oldContents).to(`${dest}/a`); - // Attempt to overwrite /tmp/new/cp/ with resources/cp/ - const result = shell.cp('-nR', 'resources/cp/', `${t.context.tmp}/new/`); + // Attempt to overwrite /tmp/new/cp/ with test/resources/cp/ + const result = shell.cp('-nR', 'test/resources/cp/', `${t.context.tmp}/new/`); t.falsy(shell.error()); t.is(result.code, 0); t.falsy(result.stderr); @@ -135,9 +135,9 @@ test('-nR does not overwrite an existing file at the destination', t => { test('-n does not overwrite an existing file if the destination is a directory', t => { const oldContents = 'original content'; - shell.cp('resources/file1', `${t.context.tmp}`); + shell.cp('test/resources/file1', `${t.context.tmp}`); new shell.ShellString(oldContents).to(`${t.context.tmp}/file1`); - const result = shell.cp('-n', 'resources/file1', `${t.context.tmp}`); + const result = shell.cp('-n', 'test/resources/file1', `${t.context.tmp}`); t.falsy(shell.error()); t.is(result.code, 0); t.falsy(result.stderr); @@ -145,30 +145,30 @@ test('-n does not overwrite an existing file if the destination is a directory', }); test('-f by default', t => { - shell.cp('resources/file2', 'resources/copyfile2'); - const result = shell.cp('resources/file1', 'resources/file2'); // dest already exists + shell.cp('test/resources/file2', 'test/resources/copyfile2'); + const result = shell.cp('test/resources/file1', 'test/resources/file2'); // dest already exists t.falsy(shell.error()); t.is(result.code, 0); t.falsy(result.stderr); - t.is(shell.cat('resources/file1').toString(), shell.cat('resources/file2').toString()); // after cp - shell.mv('resources/copyfile2', 'resources/file2'); // restore + t.is(shell.cat('test/resources/file1').toString(), shell.cat('test/resources/file2').toString()); // after cp + shell.mv('test/resources/copyfile2', 'test/resources/file2'); // restore t.falsy(shell.error()); }); test('-f (explicitly)', t => { - shell.cp('resources/file2', 'resources/copyfile2'); - const result = shell.cp('-f', 'resources/file1', 'resources/file2'); // dest already exists + shell.cp('test/resources/file2', 'test/resources/copyfile2'); + const result = shell.cp('-f', 'test/resources/file1', 'test/resources/file2'); // dest already exists t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); - t.is(shell.cat('resources/file1').toString(), shell.cat('resources/file2').toString()); // after cp - shell.mv('resources/copyfile2', 'resources/file2'); // restore + t.is(shell.cat('test/resources/file1').toString(), shell.cat('test/resources/file2').toString()); // after cp + shell.mv('test/resources/copyfile2', 'test/resources/file2'); // restore t.falsy(shell.error()); t.is(result.code, 0); }); test('simple - to dir', t => { - const result = shell.cp('resources/file1', t.context.tmp); + const result = shell.cp('test/resources/file1', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -176,7 +176,7 @@ test('simple - to dir', t => { }); test('simple - to file', t => { - const result = shell.cp('resources/file2', `${t.context.tmp}/file2`); + const result = shell.cp('test/resources/file2', `${t.context.tmp}/file2`); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -184,7 +184,7 @@ test('simple - to file', t => { }); test('simple - file list', t => { - const result = shell.cp('resources/file1', 'resources/file2', t.context.tmp); + const result = shell.cp('test/resources/file1', 'test/resources/file2', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -193,7 +193,7 @@ test('simple - file list', t => { }); test('simple - file list, array syntax', t => { - const result = shell.cp(['resources/file1', 'resources/file2'], t.context.tmp); + const result = shell.cp(['test/resources/file1', 'test/resources/file2'], t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -202,9 +202,9 @@ test('simple - file list, array syntax', t => { }); test('-f option', t => { - shell.cp('resources/file2', `${t.context.tmp}/file3`); + shell.cp('test/resources/file2', `${t.context.tmp}/file3`); t.truthy(fs.existsSync(`${t.context.tmp}/file3`)); - const result = shell.cp('-f', 'resources/file2', `${t.context.tmp}/file3`); // file exists, but -f specified + const result = shell.cp('-f', 'test/resources/file2', `${t.context.tmp}/file3`); // file exists, but -f specified t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -212,7 +212,7 @@ test('-f option', t => { }); test('glob', t => { - const result = shell.cp('resources/file?', t.context.tmp); + const result = shell.cp('test/resources/file?', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -226,7 +226,7 @@ test('glob', t => { test('wildcard', t => { shell.rm(`${t.context.tmp}/file1`, `${t.context.tmp}/file2`); - const result = shell.cp('resources/file*', t.context.tmp); + const result = shell.cp('test/resources/file*', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -239,7 +239,7 @@ test('wildcard', t => { }); test('recursive, with regular files', t => { - const result = shell.cp('-R', 'resources/file1', 'resources/file2', t.context.tmp); + const result = shell.cp('-R', 'test/resources/file1', 'test/resources/file2', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -248,37 +248,37 @@ test('recursive, with regular files', t => { }); test('omit directory if missing recursive flag', t => { - const result = shell.cp('resources/cp', t.context.tmp); - t.is(shell.error(), "cp: omitting directory 'resources/cp'"); - t.is(result.stderr, "cp: omitting directory 'resources/cp'"); + const result = shell.cp('test/resources/cp', t.context.tmp); + t.is(shell.error(), "cp: omitting directory 'test/resources/cp'"); + t.is(result.stderr, "cp: omitting directory 'test/resources/cp'"); t.is(result.code, 1); t.falsy(fs.existsSync(`${t.context.tmp}/file1`)); t.falsy(fs.existsSync(`${t.context.tmp}/file2`)); }); test('recursive, nothing exists', t => { - const result = shell.cp('-R', 'resources/cp', t.context.tmp); + const result = shell.cp('-R', 'test/resources/cp', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); - t.is(shell.ls('-R', 'resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); + t.is(shell.ls('-R', 'test/resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); }); test( 'recursive, nothing exists, source ends in \'/\' (see Github issue #15)', t => { - const result = shell.cp('-R', 'resources/cp/', `${t.context.tmp}/`); + const result = shell.cp('-R', 'test/resources/cp/', `${t.context.tmp}/`); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); - t.is(shell.ls('-R', 'resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); + t.is(shell.ls('-R', 'test/resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); } ); test( 'recursive, globbing regular files with extension (see Github issue #376)', t => { - const result = shell.cp('-R', 'resources/file*.txt', t.context.tmp); + const result = shell.cp('-R', 'test/resources/file*.txt', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -290,7 +290,7 @@ test( test( 'recursive, copying one regular file (also related to Github issue #376)', t => { - const result = shell.cp('-R', 'resources/file1.txt', t.context.tmp); + const result = shell.cp('-R', 'test/resources/file1.txt', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -300,7 +300,7 @@ test( ); test('recursive, everything exists, no force flag', t => { - const result = shell.cp('-R', 'resources/cp', t.context.tmp); + const result = shell.cp('-R', 'test/resources/cp', t.context.tmp); t.falsy(shell.error()); // crash test only t.falsy(result.stderr); t.is(result.code, 0); @@ -308,7 +308,7 @@ test('recursive, everything exists, no force flag', t => { test('-R implies to not follow links', t => { utils.skipOnWin(t, () => { - shell.cp('-R', 'resources/cp/*', t.context.tmp); + shell.cp('-R', 'test/resources/cp/*', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link t.falsy((fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't t.not( @@ -332,7 +332,7 @@ test('Missing -R implies -L', t => { utils.skipOnWin(t, () => { // Recursive, everything exists, overwrite a real file *by following a link* // Because missing the -R implies -L. - shell.cp('-R', 'resources/cp/*', t.context.tmp); + shell.cp('-R', 'test/resources/cp/*', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link t.falsy((fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't t.not( @@ -354,26 +354,26 @@ test('Missing -R implies -L', t => { }); test('recursive, everything exists, with force flag', t => { - let result = shell.cp('-R', 'resources/cp', t.context.tmp); + let result = shell.cp('-R', 'test/resources/cp', t.context.tmp); shell.ShellString('changing things around').to(`${t.context.tmp}/cp/dir_a/z`); - t.not(shell.cat('resources/cp/dir_a/z').toString(), shell.cat(`${t.context.tmp}/cp/dir_a/z`).toString()); // before cp - result = shell.cp('-Rf', 'resources/cp', t.context.tmp); + t.not(shell.cat('test/resources/cp/dir_a/z').toString(), shell.cat(`${t.context.tmp}/cp/dir_a/z`).toString()); // before cp + result = shell.cp('-Rf', 'test/resources/cp', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); - t.is(shell.cat('resources/cp/dir_a/z').toString(), shell.cat(`${t.context.tmp}/cp/dir_a/z`).toString()); // after cp + t.is(shell.cat('test/resources/cp/dir_a/z').toString(), shell.cat(`${t.context.tmp}/cp/dir_a/z`).toString()); // after cp }); test( 'recursive, creates dest dir since it\'s only one level deep (see Github issue #44)', t => { - const result = shell.cp('-r', 'resources/issue44', `${t.context.tmp}/dir2`); + const result = shell.cp('-r', 'test/resources/issue44', `${t.context.tmp}/dir2`); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); - t.is(shell.ls('-R', 'resources/issue44').toString(), shell.ls('-R', `${t.context.tmp}/dir2`).toString()); + t.is(shell.ls('-R', 'test/resources/issue44').toString(), shell.ls('-R', `${t.context.tmp}/dir2`).toString()); t.is( - shell.cat('resources/issue44/main.js').toString(), + shell.cat('test/resources/issue44/main.js').toString(), shell.cat(`${t.context.tmp}/dir2/main.js`).toString() ); } @@ -382,7 +382,7 @@ test( test( 'recursive, does *not* create dest dir since it\'s too deep (see Github issue #44)', t => { - const result = shell.cp('-r', 'resources/issue44', `${t.context.tmp}/dir2/dir3`); + const result = shell.cp('-r', 'test/resources/issue44', `${t.context.tmp}/dir2/dir3`); t.truthy(shell.error()); t.is( result.stderr, @@ -394,7 +394,7 @@ test( ); test('recursive, copies entire directory', t => { - const result = shell.cp('-r', 'resources/cp/dir_a', `${t.context.tmp}/dest`); + const result = shell.cp('-r', 'test/resources/cp/dir_a', `${t.context.tmp}/dest`); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -402,7 +402,7 @@ test('recursive, copies entire directory', t => { }); test('recursive, with trailing slash, does the exact same', t => { - const result = shell.cp('-r', 'resources/cp/dir_a/', `${t.context.tmp}/dest`); + const result = shell.cp('-r', 'test/resources/cp/dir_a/', `${t.context.tmp}/dest`); t.is(result.code, 0); t.falsy(shell.error()); t.truthy(fs.existsSync(`${t.context.tmp}/dest/z`)); @@ -414,10 +414,10 @@ test( utils.skipOnWin(t, () => { // preserve mode bits const execBit = parseInt('001', 8); - t.is(fs.statSync('resources/cp-mode-bits/executable').mode & execBit, execBit); - shell.cp('resources/cp-mode-bits/executable', `${t.context.tmp}/executable`); + t.is(fs.statSync('test/resources/cp-mode-bits/executable').mode & execBit, execBit); + shell.cp('test/resources/cp-mode-bits/executable', `${t.context.tmp}/executable`); t.is( - fs.statSync('resources/cp-mode-bits/executable').mode, + fs.statSync('test/resources/cp-mode-bits/executable').mode, fs.statSync(`${t.context.tmp}/executable`).mode ); }); @@ -426,7 +426,7 @@ test( test('Make sure hidden files are copied recursively', t => { shell.rm('-rf', t.context.tmp); - const result = shell.cp('-r', 'resources/ls/', t.context.tmp); + const result = shell.cp('-r', 'test/resources/ls/', t.context.tmp); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -434,7 +434,7 @@ test('Make sure hidden files are copied recursively', t => { }); test('no-recursive will copy regular files only', t => { - const result = shell.cp('resources/file1.txt', 'resources/ls/', t.context.tmp); + const result = shell.cp('test/resources/file1.txt', 'test/resources/ls/', t.context.tmp); t.is(result.code, 1); t.truthy(shell.error()); t.falsy(fs.existsSync(`${t.context.tmp}/.hidden_file`)); // doesn't copy dir contents @@ -443,8 +443,8 @@ test('no-recursive will copy regular files only', t => { }); test('no-recursive will copy regular files only', t => { - const result = shell.cp('resources/file1.txt', 'resources/file2.txt', 'resources/cp', - 'resources/ls/', t.context.tmp); + const result = shell.cp('test/resources/file1.txt', 'test/resources/file2.txt', 'test/resources/cp', + 'test/resources/ls/', t.context.tmp); t.is(result.code, 1); t.truthy(shell.error()); @@ -458,28 +458,28 @@ test('no-recursive will copy regular files only', t => { test('-R implies -P', t => { utils.skipOnWin(t, () => { - shell.cp('-R', 'resources/cp/links/sym.lnk', t.context.tmp); + shell.cp('-R', 'test/resources/cp/links/sym.lnk', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); }); test('using -P explicitly works', t => { utils.skipOnWin(t, () => { - shell.cp('-P', 'resources/cp/links/sym.lnk', t.context.tmp); + shell.cp('-P', 'test/resources/cp/links/sym.lnk', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); }); test('using -PR on a link to a folder does not follow the link', t => { utils.skipOnWin(t, () => { - shell.cp('-PR', 'resources/cp/symFolder', t.context.tmp); + shell.cp('-PR', 'test/resources/cp/symFolder', t.context.tmp); t.truthy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); }); }); test('-L overrides -P for copying directory', t => { utils.skipOnWin(t, () => { - shell.cp('-LPR', 'resources/cp/symFolder', t.context.tmp); + shell.cp('-LPR', 'test/resources/cp/symFolder', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder/sym.lnk`).isSymbolicLink()); }); @@ -487,7 +487,7 @@ test('-L overrides -P for copying directory', t => { test('Recursive, copies entire directory with no symlinks and -L option does not cause change in behavior', t => { utils.skipOnWin(t, () => { - const result = shell.cp('-rL', 'resources/cp/dir_a', `${t.context.tmp}/dest`); + const result = shell.cp('-rL', 'test/resources/cp/dir_a', `${t.context.tmp}/dest`); t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); @@ -497,23 +497,23 @@ test('Recursive, copies entire directory with no symlinks and -L option does not test('-u flag won\'t overwrite newer files', t => { shell.touch(`${t.context.tmp}/file1.js`); - shell.cp('-u', 'resources/file1.js', t.context.tmp); + shell.cp('-u', 'test/resources/file1.js', t.context.tmp); t.falsy(shell.error()); - t.not(shell.cat('resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); + t.not(shell.cat('test/resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); }); test('-u flag does overwrite older files', t => { shell.touch({ '-d': new Date(10) }, `${t.context.tmp}/file1.js`); // really old file - shell.cp('-u', 'resources/file1.js', t.context.tmp); + shell.cp('-u', 'test/resources/file1.js', t.context.tmp); t.falsy(shell.error()); - t.is(shell.cat('resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); + t.is(shell.cat('test/resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); }); test('-u flag works even if it\'s not overwriting a file', t => { t.falsy(fs.existsSync(`${t.context.tmp}/file1.js`)); - shell.cp('-u', 'resources/file1.js', t.context.tmp); + shell.cp('-u', 'test/resources/file1.js', t.context.tmp); t.falsy(shell.error()); - t.is(shell.cat('resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); + t.is(shell.cat('test/resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); }); test('-u flag works correctly recursively', t => { @@ -536,34 +536,34 @@ test('-u flag works correctly recursively', t => { }); test('using -R on a link to a folder *does* follow the link', t => { - shell.cp('-R', 'resources/cp/symFolder', t.context.tmp); + shell.cp('-R', 'test/resources/cp/symFolder', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); }); test('Without -R, -L is implied', t => { - shell.cp('resources/cp/links/sym.lnk', t.context.tmp); + shell.cp('test/resources/cp/links/sym.lnk', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); test('-L explicitly works', t => { - shell.cp('-L', 'resources/cp/links/sym.lnk', t.context.tmp); + shell.cp('-L', 'test/resources/cp/links/sym.lnk', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); test('using -LR does not imply -P', t => { - shell.cp('-LR', 'resources/cp/links/sym.lnk', t.context.tmp); + shell.cp('-LR', 'test/resources/cp/links/sym.lnk', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); test('using -LR also works recursively on directories containing links', t => { - shell.cp('-LR', 'resources/cp/links', t.context.tmp); + shell.cp('-LR', 'test/resources/cp/links', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); }); test('-L always overrides a -P', t => { - shell.cp('-LP', 'resources/cp/links/sym.lnk', t.context.tmp); + shell.cp('-LP', 'test/resources/cp/links/sym.lnk', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); - shell.cp('-LPR', 'resources/cp/links/sym.lnk', t.context.tmp); + shell.cp('-LPR', 'test/resources/cp/links/sym.lnk', t.context.tmp); t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); @@ -623,7 +623,7 @@ test('cp -L follows symlinks', t => { utils.skipOnWinForEPERM(shell.ln.bind(shell, '-s', `${t.context.tmp}/0`, `${t.context.tmp}/symlinktest`), () => { shell.mkdir('-p', `${t.context.tmp}/sub`); shell.mkdir('-p', `${t.context.tmp}/new`); - shell.cp('-f', 'resources/file1.txt', `${t.context.tmp}/sub/file.txt`); + shell.cp('-f', 'test/resources/file1.txt', `${t.context.tmp}/sub/file.txt`); shell.cd(`${t.context.tmp}/sub`); shell.ln('-s', 'file.txt', 'foo.lnk'); shell.ln('-s', 'file.txt', 'sym.lnk'); @@ -631,7 +631,7 @@ test('cp -L follows symlinks', t => { shell.cp('-L', 'sub/*', 'new/'); shell.cd('new'); - shell.cp('-f', '../../resources/file2.txt', 'file.txt'); + shell.cp('-f', '../../test/resources/file2.txt', 'file.txt'); t.is(shell.cat('file.txt').toString(), 'test2\n'); // Ensure other files have not changed. t.is(shell.cat('foo.lnk').toString(), 'test1\n'); @@ -645,8 +645,8 @@ test('cp -L follows symlinks', t => { test('Test with recursive option and symlinks.', t => { utils.skipOnWinForEPERM(shell.ln.bind(shell, '-s', `${t.context.tmp}/0`, `${t.context.tmp}/symlinktest`), () => { shell.mkdir('-p', `${t.context.tmp}/sub/sub1`); - shell.cp('-f', 'resources/file1.txt', `${t.context.tmp}/sub/file.txt`); - shell.cp('-f', 'resources/file1.txt', `${t.context.tmp}/sub/sub1/file.txt`); + shell.cp('-f', 'test/resources/file1.txt', `${t.context.tmp}/sub/file.txt`); + shell.cp('-f', 'test/resources/file1.txt', `${t.context.tmp}/sub/sub1/file.txt`); shell.cd(`${t.context.tmp}/sub`); shell.ln('-s', 'file.txt', 'foo.lnk'); shell.ln('-s', 'file.txt', 'sym.lnk'); @@ -665,7 +665,7 @@ test('Test with recursive option and symlinks.', t => { shell.cd('new'); // Ensure copies of files are symlinks by updating file contents. - shell.cp('-f', '../../resources/file2.txt', 'file.txt'); + shell.cp('-f', '../../test/resources/file2.txt', 'file.txt'); t.is(shell.cat('file.txt').toString(), 'test2\n'); // Ensure other files have not changed. t.is(shell.cat('foo.lnk').toString(), 'test1\n'); @@ -677,7 +677,7 @@ test('Test with recursive option and symlinks.', t => { // Ensure other files have not changed. shell.cd('sub1'); - shell.cp('-f', '../../../resources/file2.txt', 'file.txt'); + shell.cp('-f', '../../../test/resources/file2.txt', 'file.txt'); t.is(shell.cat('file.txt').toString(), 'test2\n'); t.is(shell.cat('foo.lnk').toString(), 'test1\n'); t.is(shell.cat('sym.lnk').toString(), 'test1\n'); @@ -689,39 +689,39 @@ test('Test with recursive option and symlinks.', t => { }); test('recursive, with a non-normalized path', t => { - const result = shell.cp('-R', 'resources/../resources/./cp', t.context.tmp); + const result = shell.cp('-R', 'test/resources/../resources/./cp', t.context.tmp); t.falsy(shell.error()); // crash test only t.falsy(result.stderr); t.is(result.code, 0); }); test('copy file to same path', t => { - const result = shell.cp('resources/file1', 'resources/file1'); + const result = shell.cp('test/resources/file1', 'test/resources/file1'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, "cp: 'resources/file1' and 'resources/file1' are the same file"); + t.is(result.stderr, "cp: 'test/resources/file1' and 'test/resources/file1' are the same file"); }); test('copy file to same directory', t => { - const result = shell.cp('resources/file1', 'resources'); + const result = shell.cp('test/resources/file1', 'test/resources'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, "cp: 'resources/file1' and 'resources/file1' are the same file"); + t.is(result.stderr, "cp: 'test/resources/file1' and 'test/resources/file1' are the same file"); }); test('copy mutliple files to same location', t => { - const result = shell.cp('resources/file1', 'resources/file2', 'resources'); + const result = shell.cp('test/resources/file1', 'test/resources/file2', 'test/resources'); t.truthy(shell.error()); t.is(result.code, 1); t.is( result.stderr, - "cp: 'resources/file1' and 'resources/file1' are the same file\n" + - "cp: 'resources/file2' and 'resources/file2' are the same file" + "cp: 'test/resources/file1' and 'test/resources/file1' are the same file\n" + + "cp: 'test/resources/file2' and 'test/resources/file2' are the same file" ); }); test('should not overwrite recently created files', t => { - const result = shell.cp('resources/file1', 'resources/cp/file1', t.context.tmp); + const result = shell.cp('test/resources/file1', 'test/resources/cp/file1', t.context.tmp); t.truthy(shell.error()); t.is(result.code, 1); @@ -729,13 +729,13 @@ test('should not overwrite recently created files', t => { t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'test1'); t.is( result.stderr, - `cp: will not overwrite just-created '${t.context.tmp}/file1' with 'resources/cp/file1'` + `cp: will not overwrite just-created '${t.context.tmp}/file1' with 'test/resources/cp/file1'` ); }); test('should not overwrite recently created files (in recursive Mode)', t => { - const result = shell.cp('-R', 'resources/file1', 'resources/cp/file1', t.context.tmp); + const result = shell.cp('-R', 'test/resources/file1', 'test/resources/cp/file1', t.context.tmp); t.truthy(shell.error()); t.is(result.code, 1); @@ -743,12 +743,12 @@ test('should not overwrite recently created files (in recursive Mode)', t => { t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'test1'); t.is( result.stderr, - `cp: will not overwrite just-created '${t.context.tmp}/file1' with 'resources/cp/file1'` + `cp: will not overwrite just-created '${t.context.tmp}/file1' with 'test/resources/cp/file1'` ); }); test('should not overwrite recently created files (not give error no-force mode)', t => { - const result = shell.cp('-n', 'resources/file1', 'resources/cp/file1', t.context.tmp); + const result = shell.cp('-n', 'test/resources/file1', 'test/resources/cp/file1', t.context.tmp); t.falsy(shell.error()); t.is(result.code, 0); diff --git a/test/dirs.js b/test/dirs.js index 085a1294f..10d6e4d7f 100644 --- a/test/dirs.js +++ b/test/dirs.js @@ -6,7 +6,7 @@ import shell from '..'; test.beforeEach(() => { shell.config.resetForTesting(); - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); }); @@ -15,8 +15,8 @@ test.beforeEach(() => { // const trail = [ - path.resolve(path.resolve(), 'resources/pushd/a'), - path.resolve(path.resolve(), 'resources/pushd'), + path.resolve(path.resolve(), 'test/resources/pushd/a'), + path.resolve(path.resolve(), 'test/resources/pushd'), path.resolve(), ]; diff --git a/test/exec.js b/test/exec.js index 07df5ac5b..e2e8bd1cf 100644 --- a/test/exec.js +++ b/test/exec.js @@ -86,7 +86,7 @@ test('check exit code', t => { }); test('interaction with cd', t => { - shell.cd('resources/external'); + shell.cd('test/resources/external'); const result = shell.exec(`${JSON.stringify(shell.config.execPath)} node_script.js`); t.falsy(shell.error()); t.is(result.code, 0); @@ -118,12 +118,12 @@ test('set maxBuffer (very small)', t => { }); test('set timeout option', t => { - const result = shell.exec(`${JSON.stringify(shell.config.execPath)} resources/exec/slow.js 100`); // default timeout is ok + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`); // default timeout is ok t.falsy(shell.error()); t.is(result.code, 0); if (process.version >= 'v0.11') { // this option doesn't work on v0.10 - shell.exec(`${JSON.stringify(shell.config.execPath)} resources/exec/slow.js 100`, { timeout: 10 }); // times out + shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`, { timeout: 10 }); // times out } t.truthy(shell.error()); }); diff --git a/test/find.js b/test/find.js index a37dcd314..2f9e0aa6c 100644 --- a/test/find.js +++ b/test/find.js @@ -24,7 +24,7 @@ test('no args', t => { // test('current path', t => { - shell.cd('resources/find'); + shell.cd('test/resources/find'); const result = shell.find('.'); t.falsy(shell.error()); t.is(result.code, 0); @@ -35,34 +35,34 @@ test('current path', t => { }); test('simple path', t => { - const result = shell.find('resources/find'); + const result = shell.find('test/resources/find'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/find/.hidden') > -1); - t.truthy(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1); + t.truthy(result.indexOf('test/resources/find/.hidden') > -1); + t.truthy(result.indexOf('test/resources/find/dir1/dir11/a_dir11') > -1); t.is(result.length, 11); }); test('multiple paths - comma', t => { - const result = shell.find('resources/find/dir1', 'resources/find/dir2'); + const result = shell.find('test/resources/find/dir1', 'test/resources/find/dir2'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1); - t.truthy(result.indexOf('resources/find/dir2/a_dir1') > -1); + t.truthy(result.indexOf('test/resources/find/dir1/dir11/a_dir11') > -1); + t.truthy(result.indexOf('test/resources/find/dir2/a_dir1') > -1); t.is(result.length, 6); }); test('multiple paths - array', t => { - const result = shell.find(['resources/find/dir1', 'resources/find/dir2']); + const result = shell.find(['test/resources/find/dir1', 'test/resources/find/dir2']); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1); - t.truthy(result.indexOf('resources/find/dir2/a_dir1') > -1); + t.truthy(result.indexOf('test/resources/find/dir1/dir11/a_dir11') > -1); + t.truthy(result.indexOf('test/resources/find/dir2/a_dir1') > -1); t.is(result.length, 6); }); test('nonexistent path', t => { - const result = shell.find('resources/find/nonexistent'); - t.is(shell.error(), 'find: no such file or directory: resources/find/nonexistent'); + const result = shell.find('test/resources/find/nonexistent'); + t.is(shell.error(), 'find: no such file or directory: test/resources/find/nonexistent'); t.is(result.code, 1); }); diff --git a/test/global.js b/test/global.js index 3f339e2b6..b11251c3f 100644 --- a/test/global.js +++ b/test/global.js @@ -26,14 +26,14 @@ test('env is exported', t => { }); test('cat', t => { - const result = cat('resources/cat/file1'); + const result = cat('test/resources/cat/file1'); t.falsy(error()); t.is(result.code, 0); t.is(result.toString(), 'test1\n'); }); test('rm', t => { - cp('-f', 'resources/file1', `${t.context.tmp}/file1`); + cp('-f', 'test/resources/file1', `${t.context.tmp}/file1`); t.truthy(fs.existsSync(`${t.context.tmp}/file1`)); const result = rm(`${t.context.tmp}/file1`); t.falsy(error()); diff --git a/test/grep.js b/test/grep.js index 3d9dc2335..2fc62f50e 100644 --- a/test/grep.js +++ b/test/grep.js @@ -8,7 +8,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); shell.config.resetForTesting(); - shell.cp('-r', 'resources', t.context.tmp); + shell.cp('-r', 'test/resources', t.context.tmp); }); test.afterEach.always(t => { @@ -54,82 +54,82 @@ test('if at least one file is missing, this should be an error', t => { // test('basic', t => { - const result = shell.grep('line', 'resources/a.txt'); + const result = shell.grep('line', 'test/resources/a.txt'); t.falsy(shell.error()); t.is(result.split('\n').length - 1, 4); }); test('-v option', t => { - const result = shell.grep('-v', 'line', 'resources/a.txt'); + const result = shell.grep('-v', 'line', 'test/resources/a.txt'); t.falsy(shell.error()); t.is(result.split('\n').length - 1, 8); }); test('matches one line', t => { - const result = shell.grep('line one', 'resources/a.txt'); + const result = shell.grep('line one', 'test/resources/a.txt'); t.falsy(shell.error()); t.is(result.toString(), 'This is line one\n'); }); test('multiple files', t => { - const result = shell.grep(/test/, 'resources/file1.txt', - 'resources/file2.txt'); + const result = shell.grep(/test/, 'test/resources/file1.txt', + 'test/resources/file2.txt'); t.falsy(shell.error()); t.is(result.toString(), 'test1\ntest2\n'); }); test('multiple files, array syntax', t => { - const result = shell.grep(/test/, ['resources/file1.txt', - 'resources/file2.txt']); + const result = shell.grep(/test/, ['test/resources/file1.txt', + 'test/resources/file2.txt']); t.falsy(shell.error()); t.is(result.toString(), 'test1\ntest2\n'); }); test('multiple files, glob syntax, * for file name', t => { - const result = shell.grep(/test/, 'resources/file*.txt'); + const result = shell.grep(/test/, 'test/resources/file*.txt'); t.falsy(shell.error()); t.truthy(result.toString(), 'test1\ntest2\n'); }); test('multiple files, glob syntax, * for directory name', t => { - const result = shell.grep(/test/, 'r*/file*.txt'); + const result = shell.grep(/test/, 'test/r*/file*.txt'); t.falsy(shell.error()); t.is(result.toString(), 'test1\ntest2\n'); }); test('multiple files, double-star glob', t => { - const result = shell.grep(/test/, 'resources/**/file*.js'); + const result = shell.grep(/test/, 'test/resources/**/file*.js'); t.falsy(shell.error()); t.is(result.toString(), 'test\ntest\ntest\ntest\n'); }); test('one file, * in regex', t => { - const result = shell.grep(/alpha*beta/, 'resources/grep/file'); + const result = shell.grep(/alpha*beta/, 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); }); test('one file, * in string-regex', t => { - const result = shell.grep('alpha*beta', 'resources/grep/file'); + const result = shell.grep('alpha*beta', 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); }); test('one file, * in regex, make sure * is not globbed', t => { - const result = shell.grep(/l*\.js/, 'resources/grep/file'); + const result = shell.grep(/l*\.js/, 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.toString(), 'this line ends in.js\nlllllllllllllllll.js\n'); }); test('one file, * in string-regex, make sure * is not globbed', t => { - const result = shell.grep('l*\\.js', 'resources/grep/file'); + const result = shell.grep('l*\\.js', 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.toString(), 'this line ends in.js\nlllllllllllllllll.js\n'); }); test('-l option', t => { - const result = shell.grep('-l', 'test1', 'resources/file1', 'resources/file2', - 'resources/file1.txt'); + const result = shell.grep('-l', 'test1', 'test/resources/file1', 'test/resources/file2', + 'test/resources/file1.txt'); t.falsy(shell.error()); t.truthy(result.match(/file1(\n|$)/)); t.truthy(result.match(/file1.txt/)); diff --git a/test/head.js b/test/head.js index 0f976e543..9d85aca6a 100644 --- a/test/head.js +++ b/test/head.js @@ -25,11 +25,11 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('resources/').isDirectory()); // sanity check - const result = shell.head('resources/'); + t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + const result = shell.head('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, "head: error reading 'resources/': Is a directory"); + t.is(result.stderr, "head: error reading 'test/resources/': Is a directory"); }); // @@ -46,15 +46,15 @@ const topOfFile2 = ['file2 1', 'file2 2', 'file2 3', 'file2 4', 'file2 5', 'file2 16', 'file2 17', 'file2 18', 'file2 19', 'file2 20']; test('simple', t => { - const result = shell.head('resources/head/file1.txt'); + const result = shell.head('test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), topOfFile1.slice(0, 10).join('\n') + '\n'); }); test('multiple files', t => { - const result = shell.head('resources/head/file2.txt', - 'resources/head/file1.txt'); + const result = shell.head('test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), topOfFile2 @@ -64,8 +64,8 @@ test('multiple files', t => { }); test('multiple files, array syntax', t => { - const result = shell.head(['resources/head/file2.txt', - 'resources/head/file1.txt']); + const result = shell.head(['test/resources/head/file2.txt', + 'test/resources/head/file1.txt']); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), topOfFile2 @@ -75,22 +75,22 @@ test('multiple files, array syntax', t => { }); test('reading more lines than are in the file (no trailing newline)', t => { - const result = shell.head('resources/file2', 'resources/file1'); + const result = shell.head('test/resources/file2', 'test/resources/file1'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'test2\ntest1'); // these files only have one line (no \n) }); test('reading more lines than are in the file (with trailing newline)', t => { - const result = shell.head('resources/head/shortfile2', - 'resources/head/shortfile1'); + const result = shell.head('test/resources/head/shortfile2', + 'test/resources/head/shortfile1'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'short2\nshort1\n'); // these files only have one line (with \n) }); test('Globbed file', t => { - const result = shell.head('resources/head/file?.txt'); + const result = shell.head('test/resources/head/file?.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), topOfFile1 @@ -100,8 +100,8 @@ test('Globbed file', t => { }); test('With `\'-n\' ` option', t => { - const result = shell.head('-n', 4, 'resources/head/file2.txt', - 'resources/head/file1.txt'); + const result = shell.head('-n', 4, 'test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), topOfFile2 @@ -111,8 +111,8 @@ test('With `\'-n\' ` option', t => { }); test('With `{\'-n\': }` option', t => { - const result = shell.head({ '-n': 4 }, 'resources/head/file2.txt', - 'resources/head/file1.txt'); + const result = shell.head({ '-n': 4 }, 'test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), topOfFile2 @@ -122,14 +122,14 @@ test('With `{\'-n\': }` option', t => { }); test('negative values (-num) are the same as (numLines - num)', t => { - const result = shell.head('-n', -46, 'resources/head/file1.txt'); + const result = shell.head('-n', -46, 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'file1 1\nfile1 2\nfile1 3\nfile1 4\n'); }); test('right-hand side of a pipe', t => { - const result = shell.cat('resources/head/file1.txt').head(); + const result = shell.cat('test/resources/head/file1.txt').head(); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), topOfFile1.slice(0, 10).join('\n') + '\n'); diff --git a/test/ln.js b/test/ln.js index 836be4e48..b16820584 100644 --- a/test/ln.js +++ b/test/ln.js @@ -11,7 +11,7 @@ const CWD = process.cwd(); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); shell.config.resetForTesting(); - shell.cp('-r', 'resources', t.context.tmp); + shell.cp('-r', 'test/resources', t.context.tmp); process.chdir(CWD); }); diff --git a/test/ls.js b/test/ls.js index d2c09a23c..2131aff3b 100644 --- a/test/ls.js +++ b/test/ls.js @@ -48,7 +48,7 @@ test('root directory', t => { }); test('no args provides the correct result', t => { - shell.cd('resources/ls'); + shell.cd('test/resources/ls'); const result = shell.ls(); t.falsy(shell.error()); t.is(result.code, 0); @@ -62,7 +62,7 @@ test('no args provides the correct result', t => { }); test('simple arg', t => { - const result = shell.ls('resources/ls'); + const result = shell.ls('test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('file1') > -1); @@ -75,7 +75,7 @@ test('simple arg', t => { }); test('simple arg, with a trailing slash', t => { - const result = shell.ls('resources/ls/'); + const result = shell.ls('test/resources/ls/'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('file1') > -1); @@ -88,7 +88,7 @@ test('simple arg, with a trailing slash', t => { }); test('no args, -A option', t => { - shell.cd('resources/ls'); + shell.cd('test/resources/ls'); const result = shell.ls('-A'); t.falsy(shell.error()); t.is(result.code, 0); @@ -104,7 +104,7 @@ test('no args, -A option', t => { }); test('no args, deprecated -a option', t => { - shell.cd('resources/ls'); + shell.cd('test/resources/ls'); const result = shell.ls('-a'); // (deprecated) backwards compatibility test t.falsy(shell.error()); t.is(result.code, 0); @@ -120,148 +120,148 @@ test('no args, deprecated -a option', t => { }); test('wildcard, very simple', t => { - const result = shell.ls('resources/cat/*'); + const result = shell.ls('test/resources/cat/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/cat/file1') > -1); - t.truthy(result.indexOf('resources/cat/file2') > -1); + t.truthy(result.indexOf('test/resources/cat/file1') > -1); + t.truthy(result.indexOf('test/resources/cat/file2') > -1); t.is(result.length, 2); }); test('wildcard, simple', t => { - const result = shell.ls('resources/ls/*'); + const result = shell.ls('test/resources/ls/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/ls/file1') > -1); - t.truthy(result.indexOf('resources/ls/file2') > -1); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1') > -1); + t.truthy(result.indexOf('test/resources/ls/file2') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); t.truthy( - result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 ); - t.is(result.indexOf('resources/ls/a_dir'), -1); // this shouldn't be there + t.is(result.indexOf('test/resources/ls/a_dir'), -1); // this shouldn't be there t.truthy(result.indexOf('nada') > -1); t.truthy(result.indexOf('b_dir') > -1); t.is(result.length, 7); }); test('wildcard, simple, with -d', t => { - const result = shell.ls('-d', 'resources/ls/*'); + const result = shell.ls('-d', 'test/resources/ls/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/ls/file1') > -1); - t.truthy(result.indexOf('resources/ls/file2') > -1); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1') > -1); + t.truthy(result.indexOf('test/resources/ls/file2') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); t.truthy( - result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 ); - t.truthy(result.indexOf('resources/ls/a_dir') > -1); + t.truthy(result.indexOf('test/resources/ls/a_dir') > -1); t.is(result.length, 6); }); test('wildcard, hidden only', t => { - const result = shell.ls('-d', 'resources/ls/.*'); + const result = shell.ls('-d', 'test/resources/ls/.*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/ls/.hidden_file') > -1); - t.truthy(result.indexOf('resources/ls/.hidden_dir') > -1); + t.truthy(result.indexOf('test/resources/ls/.hidden_file') > -1); + t.truthy(result.indexOf('test/resources/ls/.hidden_dir') > -1); t.is(result.length, 2); }); test('wildcard, mid-file', t => { - const result = shell.ls('resources/ls/f*le*'); + const result = shell.ls('test/resources/ls/f*le*'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 5); - t.truthy(result.indexOf('resources/ls/file1') > -1); - t.truthy(result.indexOf('resources/ls/file2') > -1); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1') > -1); + t.truthy(result.indexOf('test/resources/ls/file2') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); t.truthy( - result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 ); }); test('wildcard, mid-file with dot (should escape dot for regex)', t => { - const result = shell.ls('resources/ls/f*le*.js'); + const result = shell.ls('test/resources/ls/f*le*.js'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 2); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); }); test('one file that exists, one that doesn\'t', t => { - const result = shell.ls('resources/ls/file1.js', 'resources/ls/thisdoesntexist'); + const result = shell.ls('test/resources/ls/file1.js', 'test/resources/ls/thisdoesntexist'); t.truthy(shell.error()); t.is(result.code, 2); t.is(result.length, 1); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); }); test('one file that exists, one that doesn\'t (other order)', t => { - const result = shell.ls('resources/ls/thisdoesntexist', 'resources/ls/file1.js'); + const result = shell.ls('test/resources/ls/thisdoesntexist', 'test/resources/ls/file1.js'); t.truthy(shell.error()); t.is(result.code, 2); t.is(result.length, 1); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); }); test('wildcard, should not do partial matches', t => { - const result = shell.ls('resources/ls/*.j'); // shouldn't get .js + const result = shell.ls('test/resources/ls/*.j'); // shouldn't get .js t.truthy(shell.error()); t.is(result.code, 2); t.is(result.length, 0); }); test('wildcard, all files with extension', t => { - const result = shell.ls('resources/ls/*.*'); + const result = shell.ls('test/resources/ls/*.*'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 3); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); t.truthy( - result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 ); }); test('wildcard, with additional path', t => { - const result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir'); + const result = shell.ls('test/resources/ls/f*le*.js', 'test/resources/ls/a_dir'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 4); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); t.truthy(result.indexOf('b_dir') > -1); // no wildcard == no path prefix t.truthy(result.indexOf('nada') > -1); // no wildcard == no path prefix }); test('wildcard for both paths', t => { - const result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir/*'); + const result = shell.ls('test/resources/ls/f*le*.js', 'test/resources/ls/a_dir/*'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 4); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); t.truthy(result.indexOf('z') > -1); - t.truthy(result.indexOf('resources/ls/a_dir/nada') > -1); + t.truthy(result.indexOf('test/resources/ls/a_dir/nada') > -1); }); test('wildcard for both paths, array', t => { - const result = shell.ls(['resources/ls/f*le*.js', 'resources/ls/a_dir/*']); + const result = shell.ls(['test/resources/ls/f*le*.js', 'test/resources/ls/a_dir/*']); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 4); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); t.truthy(result.indexOf('z') > -1); - t.truthy(result.indexOf('resources/ls/a_dir/nada') > -1); + t.truthy(result.indexOf('test/resources/ls/a_dir/nada') > -1); }); test('recursive, no path', t => { - shell.cd('resources/ls'); + shell.cd('test/resources/ls'); const result = shell.ls('-R'); t.falsy(shell.error()); t.is(result.code, 0); @@ -272,7 +272,7 @@ test('recursive, no path', t => { }); test('recursive, path given', t => { - const result = shell.ls('-R', 'resources/ls'); + const result = shell.ls('-R', 'test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('a_dir') > -1); @@ -282,7 +282,7 @@ test('recursive, path given', t => { }); test('-RA flag, path given', t => { - const result = shell.ls('-RA', 'resources/ls'); + const result = shell.ls('-RA', 'test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('a_dir') > -1); @@ -293,7 +293,7 @@ test('-RA flag, path given', t => { }); test('-RA flag, symlinks are not followed', t => { - const result = shell.ls('-RA', 'resources/rm'); + const result = shell.ls('-RA', 'test/resources/rm'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('a_dir') > -1); @@ -306,7 +306,7 @@ test('-RA flag, symlinks are not followed', t => { test('-RAL flag, follows symlinks', t => { utils.skipOnWin(t, () => { - const result = shell.ls('-RAL', 'resources/rm'); + const result = shell.ls('-RAL', 'test/resources/rm'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('a_dir') > -1); @@ -320,7 +320,7 @@ test('-RAL flag, follows symlinks', t => { test('-L flag, path is symlink', t => { utils.skipOnWin(t, () => { - const result = shell.ls('-L', 'resources/rm/link_to_a_dir'); + const result = shell.ls('-L', 'test/resources/rm/link_to_a_dir'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('a_file') > -1); @@ -329,52 +329,52 @@ test('-L flag, path is symlink', t => { }); test('-Rd works like -d', t => { - const result = shell.ls('-Rd', 'resources/ls'); + const result = shell.ls('-Rd', 'test/resources/ls'); t.falsy(shell.error()); t.is(result.length, 1); }); test('directory option, single arg', t => { - const result = shell.ls('-d', 'resources/ls'); + const result = shell.ls('-d', 'test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 1); }); test('directory option, single arg with trailing \'/\'', t => { - const result = shell.ls('-d', 'resources/ls/'); + const result = shell.ls('-d', 'test/resources/ls/'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 1); }); test('directory option, multiple args', t => { - const result = shell.ls('-d', 'resources/ls/a_dir', 'resources/ls/file1'); + const result = shell.ls('-d', 'test/resources/ls/a_dir', 'test/resources/ls/file1'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/ls/a_dir') > -1); - t.truthy(result.indexOf('resources/ls/file1') > -1); + t.truthy(result.indexOf('test/resources/ls/a_dir') > -1); + t.truthy(result.indexOf('test/resources/ls/file1') > -1); t.is(result.length, 2); }); test('directory option, globbed arg', t => { - const result = shell.ls('-d', 'resources/ls/*'); + const result = shell.ls('-d', 'test/resources/ls/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/ls/a_dir') > -1); - t.truthy(result.indexOf('resources/ls/file1') > -1); - t.truthy(result.indexOf('resources/ls/file1.js') > -1); - t.truthy(result.indexOf('resources/ls/file2') > -1); - t.truthy(result.indexOf('resources/ls/file2.js') > -1); - t.truthy(result.indexOf('resources/ls/file2') > -1); + t.truthy(result.indexOf('test/resources/ls/a_dir') > -1); + t.truthy(result.indexOf('test/resources/ls/file1') > -1); + t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2') > -1); + t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); + t.truthy(result.indexOf('test/resources/ls/file2') > -1); t.truthy( - result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 ); t.is(result.length, 6); }); test('long option, single file', t => { - let result = shell.ls('-l', 'resources/ls/file1'); + let result = shell.ls('-l', 'test/resources/ls/file1'); t.is(result.length, 1); result = result[0]; t.falsy(shell.error()); @@ -393,7 +393,7 @@ test('long option, single file', t => { }); test('long option, glob files', t => { - let result = shell.ls('-l', 'resources/ls/f*le1'); + let result = shell.ls('-l', 'test/resources/ls/f*le1'); t.is(result.length, 1); result = result[0]; t.falsy(shell.error()); @@ -412,7 +412,7 @@ test('long option, glob files', t => { }); test('long option, directory', t => { - let result = shell.ls('-l', 'resources/ls'); + let result = shell.ls('-l', 'test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); const idx = result.map(r => r.name).indexOf('file1'); @@ -434,7 +434,7 @@ test('long option, directory', t => { }); test('long option, directory, recursive (and windows converts slashes)', t => { - let result = shell.ls('-lR', 'resources/ls/'); + let result = shell.ls('-lR', 'test/resources/ls/'); t.falsy(shell.error()); t.is(result.code, 0); const idx = result.map(r => r.name).indexOf('a_dir/b_dir'); @@ -442,7 +442,7 @@ test('long option, directory, recursive (and windows converts slashes)', t => { t.truthy(idx >= 0); result = result[idx]; t.is(result.name, result.name); - t.truthy(fs.statSync('resources/ls/a_dir/b_dir').isDirectory()); + t.truthy(fs.statSync('test/resources/ls/a_dir/b_dir').isDirectory()); t.is(typeof result.nlink, 'number'); // This can vary between the local machine and travis t.is(typeof result.size, 'number'); // This can vary between different file systems t.truthy(result.mode); // check that these keys exist @@ -457,15 +457,15 @@ test('long option, directory, recursive (and windows converts slashes)', t => { }); test('still lists broken links', t => { - const result = shell.ls('resources/badlink'); + const result = shell.ls('test/resources/badlink'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('resources/badlink') > -1); + t.truthy(result.indexOf('test/resources/badlink') > -1); t.is(result.length, 1); }); test('Test new ShellString-like attributes', t => { - const result = shell.ls('resources/ls'); + const result = shell.ls('test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.stdout.indexOf('file1') > -1); @@ -496,13 +496,13 @@ test('No trailing newline for ls() on empty directories', t => { test('Check stderr field', t => { t.falsy(fs.existsSync('/asdfasdf')); // sanity check - const result = shell.ls('resources/ls/file1', '/asdfasdf'); + const result = shell.ls('test/resources/ls/file1', '/asdfasdf'); t.truthy(shell.error()); t.is('ls: no such file or directory: /asdfasdf', result.stderr); }); test('non-normalized paths are still ok with -R', t => { - const result = shell.ls('-R', 'resources/./ls/../ls'); + const result = shell.ls('-R', 'test/resources/./ls/../ls'); t.falsy(shell.error()); t.is(result.code, 0); t.truthy(result.indexOf('a_dir') > -1); diff --git a/test/mkdir.js b/test/mkdir.js index f49089a35..3827c2d38 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -37,12 +37,12 @@ test('dir already exists', t => { }); test('Can\'t overwrite a broken link', t => { - const mtime = fs.lstatSync('resources/badlink').mtime.toString(); - const result = shell.mkdir('resources/badlink'); + const mtime = fs.lstatSync('test/resources/badlink').mtime.toString(); + const result = shell.mkdir('test/resources/badlink'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'mkdir: path already exists: resources/badlink'); - t.is(fs.lstatSync('resources/badlink').mtime.toString(), mtime); // didn't mess with file + t.is(result.stderr, 'mkdir: path already exists: test/resources/badlink'); + t.is(fs.lstatSync('test/resources/badlink').mtime.toString(), mtime); // didn't mess with file }); test('root path does not exist', t => { @@ -56,31 +56,31 @@ test('root path does not exist', t => { }); test('try to overwrite file', t => { - t.truthy(fs.statSync('resources/file1').isFile()); - const result = shell.mkdir('resources/file1'); + t.truthy(fs.statSync('test/resources/file1').isFile()); + const result = shell.mkdir('test/resources/file1'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'mkdir: path already exists: resources/file1'); - t.truthy(fs.statSync('resources/file1').isFile()); + t.is(result.stderr, 'mkdir: path already exists: test/resources/file1'); + t.truthy(fs.statSync('test/resources/file1').isFile()); }); test('try to overwrite file, with -p', t => { - t.truthy(fs.statSync('resources/file1').isFile()); - const result = shell.mkdir('-p', 'resources/file1'); + t.truthy(fs.statSync('test/resources/file1').isFile()); + const result = shell.mkdir('-p', 'test/resources/file1'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'mkdir: cannot create directory resources/file1: File exists'); - t.truthy(fs.statSync('resources/file1').isFile()); + t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1: File exists'); + t.truthy(fs.statSync('test/resources/file1').isFile()); }); test('try to make a subdirectory of a file', t => { - t.truthy(fs.statSync('resources/file1').isFile()); - const result = shell.mkdir('resources/file1/subdir'); + t.truthy(fs.statSync('test/resources/file1').isFile()); + const result = shell.mkdir('test/resources/file1/subdir'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'mkdir: cannot create directory resources/file1/subdir: Not a directory'); - t.truthy(fs.statSync('resources/file1').isFile()); - t.falsy(fs.existsSync('resources/file1/subdir')); + t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1/subdir: Not a directory'); + t.truthy(fs.statSync('test/resources/file1').isFile()); + t.falsy(fs.existsSync('test/resources/file1/subdir')); }); test('Check for invalid permissions', t => { diff --git a/test/mv.js b/test/mv.js index 32bc80ef8..eb68bd708 100644 --- a/test/mv.js +++ b/test/mv.js @@ -11,7 +11,7 @@ const numLines = utils.numLines; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); shell.config.resetForTesting(); - shell.cp('-r', 'resources', t.context.tmp); + shell.cp('-r', 'test/resources', t.context.tmp); shell.cd(t.context.tmp); }); diff --git a/test/pipe.js b/test/pipe.js index cc71e0cf0..ab75d944a 100644 --- a/test/pipe.js +++ b/test/pipe.js @@ -10,7 +10,7 @@ shell.config.silent = true; test('commands like `rm` cannot be on the right side of pipes', t => { t.is(shell.ls('.').rm, undefined); - t.is(shell.cat('resources/file1.txt').rm, undefined); + t.is(shell.cat('test/resources/file1.txt').rm, undefined); }); // @@ -19,33 +19,33 @@ test('commands like `rm` cannot be on the right side of pipes', t => { test('piping to cat() should return roughly the same thing', t => { t.is( - shell.cat('resources/file1.txt').cat().toString(), - shell.cat('resources/file1.txt').toString() + shell.cat('test/resources/file1.txt').cat().toString(), + shell.cat('test/resources/file1.txt').toString() ); }); test('piping ls() into cat() converts to a string-like object', t => { - t.is(shell.ls('resources/').cat().toString(), shell.ls('resources/').stdout); + t.is(shell.ls('test/resources/').cat().toString(), shell.ls('test/resources/').stdout); }); test('grep works in a pipe', t => { - const result = shell.ls('resources/').grep('file1'); + const result = shell.ls('test/resources/').grep('file1'); t.is(result.toString(), 'file1\nfile1.js\nfile1.txt\n'); }); test('multiple pipes work', t => { - const result = shell.ls('resources/').cat().grep('file1'); + const result = shell.ls('test/resources/').cat().grep('file1'); t.is(result.toString(), 'file1\nfile1.js\nfile1.txt\n'); }); test('Equivalent to a simple grep() test case', t => { - const result = shell.cat('resources/grep/file').grep(/alpha*beta/); + const result = shell.cat('test/resources/grep/file').grep(/alpha*beta/); t.falsy(shell.error()); t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); }); test('Equivalent to a simple sed() test case', t => { - const result = shell.cat('resources/grep/file').sed(/l*\.js/, ''); + const result = shell.cat('test/resources/grep/file').sed(/l*\.js/, ''); t.falsy(shell.error()); t.is( result.toString(), @@ -54,19 +54,19 @@ test('Equivalent to a simple sed() test case', t => { }); test('Sort a file by frequency of each line', t => { - const result = shell.sort('resources/uniq/pipe').uniq('-c').sort('-n'); + const result = shell.sort('test/resources/uniq/pipe').uniq('-c').sort('-n'); t.falsy(shell.error()); - t.is(result.toString(), shell.cat('resources/uniq/pipeSorted').toString()); + t.is(result.toString(), shell.cat('test/resources/uniq/pipeSorted').toString()); }); test('Synchronous exec', t => { - const result = shell.cat('resources/grep/file').exec('shx grep "alpha*beta"'); + const result = shell.cat('test/resources/grep/file').exec('shx grep "alpha*beta"'); t.falsy(shell.error()); t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); }); test.cb('Asynchronous exec', t => { - shell.cat('resources/grep/file').exec('shx grep "alpha*beta"', (code, stdout) => { + shell.cat('test/resources/grep/file').exec('shx grep "alpha*beta"', (code, stdout) => { t.is(code, 0); t.is(stdout, 'alphaaaaaaabeta\nalphbeta\n'); t.end(); diff --git a/test/plugin.js b/test/plugin.js index 7b7594bfd..e8a2bbc4f 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -95,9 +95,9 @@ test('The command parses options', t => { }); test('The command supports globbing by default', t => { - shell.foo('-f', 're*u?ces'); + shell.foo('-f', 'test/re*u?ces'); t.is(data, 12); - t.is(fname, 'resources'); + t.is(fname, 'test/resources'); }); test('Plugins are also compatible with shelljs/global', t => { diff --git a/test/popd.js b/test/popd.js index 0ac1447c8..0e83a7cfa 100644 --- a/test/popd.js +++ b/test/popd.js @@ -26,7 +26,7 @@ test.after.always(() => { // test('basic usage', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); const trail = shell.popd(); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); @@ -34,33 +34,33 @@ test('basic usage', t => { }); test('two directories on the stack', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); const trail = shell.popd(); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('three directories on the stack', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('b'); shell.pushd('c'); const trail = shell.popd(); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('Valid by index', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); const trail = shell.popd('+0'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); @@ -68,23 +68,23 @@ test('Valid by index', t => { }); test('Using +1 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); const trail = shell.popd('+1'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); - t.deepEqual(trail, [path.resolve(rootDir, 'resources/pushd')]); + t.deepEqual(trail, [path.resolve(rootDir, 'test/resources/pushd')]); }); test('Using -0 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); const trail = shell.popd('-0'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); - t.deepEqual(trail, [path.resolve(rootDir, 'resources/pushd')]); + t.deepEqual(trail, [path.resolve(rootDir, 'test/resources/pushd')]); }); test('Using -1 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); const trail = shell.popd('-1'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); @@ -92,11 +92,11 @@ test('Using -1 option', t => { }); test('Using -n option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); const trail = shell.popd('-n'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); - t.deepEqual(trail, [path.resolve(rootDir, 'resources/pushd')]); + t.deepEqual(trail, [path.resolve(rootDir, 'test/resources/pushd')]); }); test('Popping an empty stack', t => { @@ -105,11 +105,11 @@ test('Popping an empty stack', t => { }); test('Test that rootDir is not stored', t => { - shell.cd('resources/pushd'); + shell.cd('test/resources/pushd'); shell.pushd('b'); const trail = shell.popd(); t.falsy(shell.error()); - t.is(trail[0], path.resolve(rootDir, 'resources/pushd')); + t.is(trail[0], path.resolve(rootDir, 'test/resources/pushd')); t.is(process.cwd(), trail[0]); shell.popd(); // no more in the stack t.truthy(shell.error()); diff --git a/test/pushd.js b/test/pushd.js index 68d266849..9ca0f76b0 100644 --- a/test/pushd.js +++ b/test/pushd.js @@ -25,59 +25,59 @@ test.after.always(() => { // test('Push valid directories', t => { - const trail = shell.pushd('resources/pushd'); + const trail = shell.pushd('test/resources/pushd'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('Two directories', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); const trail = shell.pushd('a'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('Three directories', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); const trail = shell.pushd('../b'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('Four directories', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); const trail = shell.pushd('c'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('Push stuff around with positive indices', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -85,16 +85,16 @@ test('Push stuff around with positive indices', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('+1 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -102,16 +102,16 @@ test('+1 option', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), ]); }); test('+2 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -119,16 +119,16 @@ test('+2 option', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), ]); }); test('+3 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -136,16 +136,16 @@ test('+3 option', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), ]); }); test('+4 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -154,15 +154,15 @@ test('+4 option', t => { t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), ]); }); test('Push stuff around with negative indices', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -171,15 +171,15 @@ test('Push stuff around with negative indices', t => { t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), ]); }); test('-1 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -187,16 +187,16 @@ test('-1 option', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), ]); }); test('-2 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -204,16 +204,16 @@ test('-2 option', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), ]); }); test('-3 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -221,16 +221,16 @@ test('-3 option', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, - path.resolve(rootDir, 'resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), ]); }); test('-4 option', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd('a'); shell.pushd('../b'); shell.pushd('c'); @@ -238,33 +238,33 @@ test('-4 option', t => { t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ - path.resolve(rootDir, 'resources/pushd/b/c'), - path.resolve(rootDir, 'resources/pushd/b'), - path.resolve(rootDir, 'resources/pushd/a'), - path.resolve(rootDir, 'resources/pushd'), + path.resolve(rootDir, 'test/resources/pushd/b/c'), + path.resolve(rootDir, 'test/resources/pushd/b'), + path.resolve(rootDir, 'test/resources/pushd/a'), + path.resolve(rootDir, 'test/resources/pushd'), rootDir, ]); }); test('Push without changing directory or resolving paths', t => { - const trail = shell.pushd('-n', 'resources/pushd'); + const trail = shell.pushd('-n', 'test/resources/pushd'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ rootDir, - 'resources/pushd', + 'test/resources/pushd', ]); }); test('Using the -n option with a non-empty stack', t => { - shell.pushd('-n', 'resources/pushd'); - const trail = shell.pushd('-n', 'resources/pushd/a'); + shell.pushd('-n', 'test/resources/pushd'); + const trail = shell.pushd('-n', 'test/resources/pushd/a'); t.falsy(shell.error()); t.is(process.cwd(), trail[0]); t.deepEqual(trail, [ rootDir, - 'resources/pushd/a', - 'resources/pushd', + 'test/resources/pushd/a', + 'test/resources/pushd', ]); }); @@ -282,17 +282,17 @@ test('Push invalid directory', t => { test( 'Push without args swaps top two directories when stack length is 2', t => { - let trail = shell.pushd('resources/pushd'); + let trail = shell.pushd('test/resources/pushd'); t.falsy(shell.error()); t.is(trail.length, 2); - t.is(path.relative(rootDir, trail[0]), path.join('resources', 'pushd')); + t.is(path.relative(rootDir, trail[0]), path.join('test/resources', 'pushd')); t.is(trail[1], rootDir); t.is(process.cwd(), trail[0]); trail = shell.pushd(); t.falsy(shell.error()); t.is(trail.length, 2); t.is(trail[0], rootDir); - t.is(path.relative(rootDir, trail[1]), path.join('resources', 'pushd')); + t.is(path.relative(rootDir, trail[1]), path.join('test/resources', 'pushd')); t.is(process.cwd(), trail[0]); } ); @@ -300,27 +300,27 @@ test( test( 'Push without args swaps top two directories for larger stacks', t => { - shell.pushd('resources/pushd'); + shell.pushd('test/resources/pushd'); shell.pushd(); - const trail = shell.pushd('resources/pushd/a'); + const trail = shell.pushd('test/resources/pushd/a'); t.falsy(shell.error()); t.is(trail.length, 3); - t.is(path.relative(rootDir, trail[0]), path.join('resources', 'pushd', 'a')); + t.is(path.relative(rootDir, trail[0]), path.join('test/resources', 'pushd', 'a')); t.is(trail[1], rootDir); - t.is(path.relative(rootDir, trail[2]), path.join('resources', 'pushd')); + t.is(path.relative(rootDir, trail[2]), path.join('test/resources', 'pushd')); t.is(process.cwd(), trail[0]); } ); test('Pushing with no args', t => { - shell.pushd('-n', 'resources/pushd'); - shell.pushd('resources/pushd/a'); + shell.pushd('-n', 'test/resources/pushd'); + shell.pushd('test/resources/pushd/a'); const trail = shell.pushd(); t.falsy(shell.error()); t.is(trail.length, 3); t.is(trail[0], rootDir); - t.is(path.relative(rootDir, trail[1]), path.join('resources', 'pushd', 'a')); - t.is(path.relative(rootDir, trail[2]), path.join('resources', 'pushd')); + t.is(path.relative(rootDir, trail[1]), path.join('test/resources', 'pushd', 'a')); + t.is(path.relative(rootDir, trail[2]), path.join('test/resources', 'pushd')); t.is(process.cwd(), trail[0]); }); diff --git a/test/rm.js b/test/rm.js index d3228c7e1..ccd2c6ba6 100644 --- a/test/rm.js +++ b/test/rm.js @@ -9,7 +9,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); shell.config.resetForTesting(); - shell.cp('-r', 'resources', t.context.tmp); + shell.cp('-r', 'test/resources', t.context.tmp); }); test.afterEach.always(t => { @@ -50,10 +50,10 @@ test('only an option', t => { }); test('invalid option', t => { - const result = shell.rm('-@', 'resources/file1'); + const result = shell.rm('-@', 'test/resources/file1'); t.truthy(shell.error()); t.is(result.code, 1); - t.truthy(fs.existsSync('resources/file1')); + t.truthy(fs.existsSync('test/resources/file1')); t.is(result.stderr, 'rm: option not recognized: @'); }); diff --git a/test/sed.js b/test/sed.js index c8342c13d..fc65c5412 100644 --- a/test/sed.js +++ b/test/sed.js @@ -8,7 +8,7 @@ import utils from './utils/utils'; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); shell.config.resetForTesting(); - shell.cp('-r', 'resources', t.context.tmp); + shell.cp('-r', 'test/resources', t.context.tmp); }); test.afterEach.always(t => { @@ -99,7 +99,7 @@ test('-i option', t => { }); test('make sure * in regex is not globbed', t => { - const result = shell.sed(/alpha*beta/, 'hello', 'resources/grep/file'); + const result = shell.sed(/alpha*beta/, 'hello', 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.code, 0); t.is( @@ -109,7 +109,7 @@ test('make sure * in regex is not globbed', t => { }); test('make sure * in string-regex is not globbed', t => { - const result = shell.sed('alpha*beta', 'hello', 'resources/grep/file'); + const result = shell.sed('alpha*beta', 'hello', 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.code, 0); t.is( @@ -119,7 +119,7 @@ test('make sure * in string-regex is not globbed', t => { }); test('make sure * in regex is not globbed (matches something)', t => { - const result = shell.sed(/l*\.js/, '', 'resources/grep/file'); + const result = shell.sed(/l*\.js/, '', 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.code, 0); t.is( @@ -129,7 +129,7 @@ test('make sure * in regex is not globbed (matches something)', t => { }); test('make sure * in string-regex is not globbed (matches something)', t => { - const result = shell.sed('l*\\.js', '', 'resources/grep/file'); + const result = shell.sed('l*\\.js', '', 'test/resources/grep/file'); t.falsy(shell.error()); t.is(result.code, 0); t.is( diff --git a/test/set.js b/test/set.js index 957e168d9..55337c1e5 100644 --- a/test/set.js +++ b/test/set.js @@ -9,7 +9,7 @@ const uncaughtErrorExitCode = 1; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); shell.config.resetForTesting(); - shell.cp('-r', 'resources', t.context.tmp); + shell.cp('-r', 'test/resources', t.context.tmp); }); test.afterEach.always(t => { @@ -28,21 +28,21 @@ test('initial values', t => { }); test('default behavior', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); }); test('set -e', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); }); test('set -v', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is( @@ -52,7 +52,7 @@ test('set -v', t => { }); test('set -ev', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); @@ -61,7 +61,7 @@ test('set -ev', t => { }); test('set -e, set +e', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); diff --git a/test/sort.js b/test/sort.js index ecba45447..6d28c1e25 100644 --- a/test/sort.js +++ b/test/sort.js @@ -6,7 +6,7 @@ import shell from '..'; shell.config.silent = true; -const doubleSorted = shell.cat('resources/sort/sorted') +const doubleSorted = shell.cat('test/resources/sort/sorted') .trimRight() .split('\n') .reduce((prev, cur) => prev.concat([cur, cur]), []) @@ -31,11 +31,11 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('resources/').isDirectory()); // sanity check - const result = shell.sort('resources/'); + t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + const result = shell.sort('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'sort: read failed: resources/: Is a directory'); + t.is(result.stderr, 'sort: read failed: test/resources/: Is a directory'); }); // @@ -43,52 +43,52 @@ test('directory', t => { // test('simple', t => { - const result = shell.sort('resources/sort/file1'); + const result = shell.sort('test/resources/sort/file1'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/sort/sorted').toString()); + t.is(result.toString(), shell.cat('test/resources/sort/sorted').toString()); }); test('simple #2', t => { - const result = shell.sort('resources/sort/file2'); + const result = shell.sort('test/resources/sort/file2'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/sort/sorted').toString()); + t.is(result.toString(), shell.cat('test/resources/sort/sorted').toString()); }); test('multiple files', t => { - const result = shell.sort('resources/sort/file2', 'resources/sort/file1'); + const result = shell.sort('test/resources/sort/file2', 'test/resources/sort/file1'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), doubleSorted); }); test('multiple files, array syntax', t => { - const result = shell.sort(['resources/sort/file2', 'resources/sort/file1']); + const result = shell.sort(['test/resources/sort/file2', 'test/resources/sort/file1']); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), doubleSorted); }); test('Globbed file', t => { - const result = shell.sort('resources/sort/file?'); + const result = shell.sort('test/resources/sort/file?'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), doubleSorted); }); test('With \'-n\' option', t => { - const result = shell.sort('-n', 'resources/sort/file2'); + const result = shell.sort('-n', 'test/resources/sort/file2'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/sort/sortedDashN').toString()); + t.is(result.toString(), shell.cat('test/resources/sort/sortedDashN').toString()); }); test('With \'-r\' option', t => { - const result = shell.sort('-r', 'resources/sort/file2'); + const result = shell.sort('-r', 'test/resources/sort/file2'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/sort/sorted') + t.is(result.toString(), shell.cat('test/resources/sort/sorted') .trimRight() .split('\n') .reverse() @@ -96,10 +96,10 @@ test('With \'-r\' option', t => { }); test('With \'-rn\' option', t => { - const result = shell.sort('-rn', 'resources/sort/file2'); + const result = shell.sort('-rn', 'test/resources/sort/file2'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/sort/sortedDashN') + t.is(result.toString(), shell.cat('test/resources/sort/sortedDashN') .trimRight() .split('\n') .reverse() diff --git a/test/tail.js b/test/tail.js index 8d3eba261..328fb22ff 100644 --- a/test/tail.js +++ b/test/tail.js @@ -24,11 +24,11 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('resources/').isDirectory()); // sanity check - const result = shell.tail('resources/'); + t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + const result = shell.tail('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, "tail: error reading 'resources/': Is a directory"); + t.is(result.stderr, "tail: error reading 'test/resources/': Is a directory"); }); // @@ -45,14 +45,14 @@ const bottomOfFile2 = ['file2 50', 'file2 49', 'file2 48', 'file2 47', 'file2 46 'file2 35', 'file2 34', 'file2 33', 'file2 32', 'file2 31']; test('simple', t => { - const result = shell.tail('resources/head/file1.txt'); + const result = shell.tail('test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), bottomOfFile1.slice(0, 10).reverse().join('\n') + '\n'); }); test('multiple files', t => { - const result = shell.tail('resources/head/file2.txt', 'resources/head/file1.txt'); + const result = shell.tail('test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), @@ -64,7 +64,7 @@ test('multiple files', t => { }); test('multiple files, array syntax', t => { - const result = shell.tail(['resources/head/file2.txt', 'resources/head/file1.txt']); + const result = shell.tail(['test/resources/head/file2.txt', 'test/resources/head/file1.txt']); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), @@ -76,21 +76,21 @@ test('multiple files, array syntax', t => { }); test('reading more lines than are in the file (no trailing newline)', t => { - const result = shell.tail('resources/file2', 'resources/file1'); + const result = shell.tail('test/resources/file2', 'test/resources/file1'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'test2\ntest1'); // these files only have one line (no \n) }); test('reading more lines than are in the file (with trailing newline)', t => { - const result = shell.tail('resources/head/shortfile2', 'resources/head/shortfile1'); + const result = shell.tail('test/resources/head/shortfile2', 'test/resources/head/shortfile1'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), 'short2\nshort1\n'); // these files only have one line (with \n) }); test('Globbed file', t => { - const result = shell.tail('resources/head/file?.txt'); + const result = shell.tail('test/resources/head/file?.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), @@ -102,8 +102,8 @@ test('Globbed file', t => { }); test('With `\'-n\' ` option', t => { - const result = shell.tail('-n', 4, 'resources/head/file2.txt', - 'resources/head/file1.txt'); + const result = shell.tail('-n', 4, 'test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), @@ -115,8 +115,8 @@ test('With `\'-n\' ` option', t => { }); test('With `{\'-n\': }` option', t => { - const result = shell.tail({ '-n': 4 }, 'resources/head/file2.txt', - 'resources/head/file1.txt'); + const result = shell.tail({ '-n': 4 }, 'test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), @@ -128,8 +128,8 @@ test('With `{\'-n\': }` option', t => { }); test('negative values are the same as positive values', t => { - const result = shell.tail('-n', -4, 'resources/head/file2.txt', - 'resources/head/file1.txt'); + const result = shell.tail('-n', -4, 'test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), diff --git a/test/test.js b/test/test.js index cea2094ed..40a1778cb 100644 --- a/test/test.js +++ b/test/test.js @@ -20,7 +20,7 @@ test('bad expression', t => { }); test('bad expression #2', t => { - shell.test('f', 'resources/file1'); + shell.test('f', 'test/resources/file1'); t.truthy(shell.error()); }); @@ -35,56 +35,56 @@ test('no file', t => { test('-e option succeeds for files', t => { - const result = shell.test('-e', 'resources/file1'); + const result = shell.test('-e', 'test/resources/file1'); t.falsy(shell.error()); t.truthy(result); }); test('-e option fails if it does not exist', t => { - const result = shell.test('-e', 'resources/404'); + const result = shell.test('-e', 'test/resources/404'); t.falsy(shell.error()); t.falsy(result); }); test('-d option succeeds for a directory', t => { - const result = shell.test('-d', 'resources'); + const result = shell.test('-d', 'test/resources'); t.falsy(shell.error()); t.truthy(result); }); test('-f option fails for a directory', t => { - const result = shell.test('-f', 'resources'); + const result = shell.test('-f', 'test/resources'); t.falsy(shell.error()); t.falsy(result); }); test('-L option fails for a directory', t => { - const result = shell.test('-L', 'resources'); + const result = shell.test('-L', 'test/resources'); t.falsy(shell.error()); t.falsy(result); }); test('-d option fails for a file', t => { - const result = shell.test('-d', 'resources/file1'); + const result = shell.test('-d', 'test/resources/file1'); t.falsy(shell.error()); t.falsy(result); }); test('-f option succeeds for a file', t => { - const result = shell.test('-f', 'resources/file1'); + const result = shell.test('-f', 'test/resources/file1'); t.falsy(shell.error()); t.truthy(result); }); test('-L option fails for a file', t => { - const result = shell.test('-L', 'resources/file1'); + const result = shell.test('-L', 'test/resources/file1'); t.falsy(shell.error()); t.falsy(result); }); test('test command is not globbed', t => { // regression #529 - const result = shell.test('-f', 'resources/**/*.js'); + const result = shell.test('-f', 'test/resources/**/*.js'); t.falsy(shell.error()); t.falsy(result); }); @@ -92,7 +92,7 @@ test('test command is not globbed', t => { // TODO(nate): figure out a way to test links on Windows test('-d option fails for a link', t => { utils.skipOnWin(t, () => { - const result = shell.test('-d', 'resources/link'); + const result = shell.test('-d', 'test/resources/link'); t.falsy(shell.error()); t.falsy(result); }); @@ -100,7 +100,7 @@ test('-d option fails for a link', t => { test('-f option succeeds for a link', t => { utils.skipOnWin(t, () => { - const result = shell.test('-f', 'resources/link'); + const result = shell.test('-f', 'test/resources/link'); t.falsy(shell.error()); t.truthy(result); }); @@ -108,7 +108,7 @@ test('-f option succeeds for a link', t => { test('-L option succeeds for a symlink', t => { utils.skipOnWin(t, () => { - const result = shell.test('-L', 'resources/link'); + const result = shell.test('-L', 'test/resources/link'); t.falsy(shell.error()); t.truthy(result); }); @@ -116,7 +116,7 @@ test('-L option succeeds for a symlink', t => { test('-L option works for broken symlinks', t => { utils.skipOnWin(t, () => { - const result = shell.test('-L', 'resources/badlink'); + const result = shell.test('-L', 'test/resources/badlink'); t.falsy(shell.error()); t.truthy(result); }); @@ -124,7 +124,7 @@ test('-L option works for broken symlinks', t => { test('-L option fails for missing files', t => { utils.skipOnWin(t, () => { - const result = shell.test('-L', 'resources/404'); + const result = shell.test('-L', 'test/resources/404'); t.falsy(shell.error()); t.falsy(result); }); diff --git a/test/touch.js b/test/touch.js index 70566ea69..0221170f5 100644 --- a/test/touch.js +++ b/test/touch.js @@ -165,10 +165,10 @@ test('file array', t => { test('touching broken link creates a new file', t => { utils.skipOnWin(t, () => { - const result = shell.touch('resources/badlink'); + const result = shell.touch('test/resources/badlink'); t.is(result.code, 0); t.falsy(shell.error()); - t.truthy(fs.existsSync('resources/not_existed_file')); - shell.rm('resources/not_existed_file'); + t.truthy(fs.existsSync('test/resources/not_existed_file')); + shell.rm('test/resources/not_existed_file'); }); }); diff --git a/test/uniq.js b/test/uniq.js index 751522561..c85df4e27 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -24,24 +24,24 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('resources/').isDirectory()); // sanity check - const result = shell.uniq('resources/'); + t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + const result = shell.uniq('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, "uniq: error reading 'resources/'"); + t.is(result.stderr, "uniq: error reading 'test/resources/'"); }); test('output directory', t => { - t.truthy(fs.statSync('resources/').isDirectory()); // sanity check - const result = shell.uniq('resources/file1.txt', 'resources/'); + t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + const result = shell.uniq('test/resources/file1.txt', 'test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); - t.is(result.stderr, 'uniq: resources/: Is a directory'); + t.is(result.stderr, 'uniq: test/resources/: Is a directory'); }); test('file does not exist with output directory', t => { t.falsy(fs.existsSync('/asdfasdf')); // sanity check - const result = shell.uniq('/asdfasdf', 'resources/'); + const result = shell.uniq('/asdfasdf', 'test/resources/'); t.is(result.code, 1); t.truthy(shell.error()); }); @@ -51,53 +51,53 @@ test('file does not exist with output directory', t => { // test('uniq file1', t => { - const result = shell.uniq('resources/uniq/file1'); + const result = shell.uniq('test/resources/uniq/file1'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/uniq/file1u').toString()); + t.is(result.toString(), shell.cat('test/resources/uniq/file1u').toString()); }); test('uniq -i file2', t => { - const result = shell.uniq('-i', 'resources/uniq/file2'); + const result = shell.uniq('-i', 'test/resources/uniq/file2'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/uniq/file2u').toString()); + t.is(result.toString(), shell.cat('test/resources/uniq/file2u').toString()); }); test('with glob character', t => { - const result = shell.uniq('-i', 'resources/uniq/fi?e2'); + const result = shell.uniq('-i', 'test/resources/uniq/fi?e2'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/uniq/file2u').toString()); + t.is(result.toString(), shell.cat('test/resources/uniq/file2u').toString()); }); test('uniq file1 file2', t => { - const result = shell.uniq('resources/uniq/file1', 'resources/uniq/file1t'); + const result = shell.uniq('test/resources/uniq/file1', 'test/resources/uniq/file1t'); t.falsy(shell.error()); t.is(result.code, 0); t.is( - shell.cat('resources/uniq/file1u').toString(), - shell.cat('resources/uniq/file1t').toString() + shell.cat('test/resources/uniq/file1u').toString(), + shell.cat('test/resources/uniq/file1t').toString() ); }); test('cat file1 |uniq', t => { - const result = shell.cat('resources/uniq/file1').uniq(); + const result = shell.cat('test/resources/uniq/file1').uniq(); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/uniq/file1u').toString()); + t.is(result.toString(), shell.cat('test/resources/uniq/file1u').toString()); }); test('uniq -c file1', t => { - const result = shell.uniq('-c', 'resources/uniq/file1'); + const result = shell.uniq('-c', 'test/resources/uniq/file1'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/uniq/file1c').toString()); + t.is(result.toString(), shell.cat('test/resources/uniq/file1c').toString()); }); test('uniq -d file1', t => { - const result = shell.uniq('-d', 'resources/uniq/file1'); + const result = shell.uniq('-d', 'test/resources/uniq/file1'); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), shell.cat('resources/uniq/file1d').toString()); + t.is(result.toString(), shell.cat('test/resources/uniq/file1d').toString()); }); From c7d65ac5907bd95294241780deba9cdfb3d2e5a1 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 23 Aug 2017 19:06:25 -0700 Subject: [PATCH 146/338] fix(ls): ls not following links to directories by default (#764) * Fix ls not following links to directories by default --- src/ls.js | 9 +++++++++ test/ls.js | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/ls.js b/src/ls.js index bb1b6a7bd..8390dc144 100644 --- a/src/ls.js +++ b/src/ls.js @@ -75,6 +75,15 @@ function _ls(options, paths) { try { stat = options.link ? fs.statSync(p) : fs.lstatSync(p); + // follow links to directories by default + if (stat.isSymbolicLink()) { + try { + var _stat = fs.statSync(p); + if (_stat.isDirectory()) { + stat = _stat; + } + } catch (_) {} // bad symlink, treat it like a file + } } catch (e) { common.error('no such file or directory: ' + p, 2, { continue: true }); return; diff --git a/test/ls.js b/test/ls.js index 2131aff3b..4c54c393b 100644 --- a/test/ls.js +++ b/test/ls.js @@ -328,6 +328,16 @@ test('-L flag, path is symlink', t => { }); }); +test('follow links to directories by default', t => { + utils.skipOnWin(t, () => { + const result = shell.ls('test/resources/rm/link_to_a_dir'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('a_file') > -1); + t.is(result.length, 1); + }); +}); + test('-Rd works like -d', t => { const result = shell.ls('-Rd', 'test/resources/ls'); t.falsy(shell.error()); From dcead1be86812e5d6498cfffbbd3ac51cfba070f Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 13 Sep 2017 16:18:28 -0700 Subject: [PATCH 147/338] Add "encoding" option to exec (#763) * Add 'encoding' option to shell.exec * Add 'encoding' option to docs * Add exec encoding option tests * Clarify use of encoding with fs.readFileSync * Add check for stderr buffer --- README.md | 8 +++++--- src/exec.js | 41 +++++++++++++++++++++++------------------ test/exec.js | 21 +++++++++++++++++++++ 3 files changed, 49 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 51082f47c..479fea71b 100644 --- a/README.md +++ b/README.md @@ -273,11 +273,13 @@ like `.to()`. ### exec(command [, options] [, callback]) -Available options (all `false` by default): +Available options: + `async`: Asynchronous execution. If a callback is provided, it will be set to - `true`, regardless of the passed value. -+ `silent`: Do not echo program output to console. + `true`, regardless of the passed value (default: `false`). ++ `silent`: Do not echo program output to console (default: `false`). ++ `encoding`: Character encoding to use. Affects the returned stdout and stderr values, and + what is written to stdout and stderr when not in silent mode (default: `'utf8'`). + and any option available to Node.js's [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) diff --git a/src/exec.js b/src/exec.js index 6a2e1261a..d425b5b21 100644 --- a/src/exec.js +++ b/src/exec.js @@ -34,6 +34,7 @@ function execSync(cmd, opts, pipe) { cwd: _pwd().toString(), env: process.env, maxBuffer: DEFAULT_MAXBUFFER_SIZE, + encoding: 'utf8', }, opts); if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); @@ -104,8 +105,17 @@ function execSync(cmd, opts, pipe) { code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); } - var stdout = fs.readFileSync(stdoutFile, 'utf8'); - var stderr = fs.readFileSync(stderrFile, 'utf8'); + // fs.readFileSync uses buffer encoding by default, so call + // it without the encoding option if the encoding is 'buffer' + var stdout; + var stderr; + if (opts.encoding === 'buffer') { + stdout = fs.readFileSync(stdoutFile); + stderr = fs.readFileSync(stderrFile); + } else { + stdout = fs.readFileSync(stdoutFile, opts.encoding); + stderr = fs.readFileSync(stderrFile, opts.encoding); + } // No biggie if we can't erase the files now -- they're in a temp dir anyway try { common.unlinkSync(scriptFile); } catch (e) {} @@ -122,17 +132,15 @@ function execSync(cmd, opts, pipe) { // Wrapper around exec() to enable echoing output to console in real time function execAsync(cmd, opts, pipe, callback) { - var stdout = ''; - var stderr = ''; - opts = common.extend({ silent: common.config.silent, cwd: _pwd().toString(), env: process.env, maxBuffer: DEFAULT_MAXBUFFER_SIZE, + encoding: 'utf8', }, opts); - var c = child.exec(cmd, opts, function (err) { + var c = child.exec(cmd, opts, function (err, stdout, stderr) { if (callback) { if (!err) { callback(0, stdout, stderr); @@ -148,26 +156,23 @@ function execAsync(cmd, opts, pipe, callback) { if (pipe) c.stdin.end(pipe); - c.stdout.on('data', function (data) { - stdout += data; - if (!opts.silent) process.stdout.write(data); - }); - - c.stderr.on('data', function (data) { - stderr += data; - if (!opts.silent) process.stderr.write(data); - }); + if (!opts.silent) { + c.stdout.pipe(process.stdout); + c.stderr.pipe(process.stderr); + } return c; } //@ //@ ### exec(command [, options] [, callback]) -//@ Available options (all `false` by default): +//@ Available options: //@ //@ + `async`: Asynchronous execution. If a callback is provided, it will be set to -//@ `true`, regardless of the passed value. -//@ + `silent`: Do not echo program output to console. +//@ `true`, regardless of the passed value (default: `false`). +//@ + `silent`: Do not echo program output to console (default: `false`). +//@ + `encoding`: Character encoding to use. Affects the returned stdout and stderr values, and +//@ what is written to stdout and stderr when not in silent mode (default: `'utf8'`). //@ + and any option available to Node.js's //@ [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) //@ diff --git a/test/exec.js b/test/exec.js index e2e8bd1cf..3c73d3612 100644 --- a/test/exec.js +++ b/test/exec.js @@ -163,6 +163,16 @@ test('exec returns a ShellString', t => { t.is(result.toString(), result.stdout); }); +test('encoding option works', t => { + const result = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(1234);"`, { encoding: 'buffer' }); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(Buffer.isBuffer(result.stdout)); + t.truthy(Buffer.isBuffer(result.stderr)); + t.is(result.stdout.toString(), '1234\n'); + t.is(result.stderr.toString(), ''); +}); + // // async // @@ -209,3 +219,14 @@ test.cb('command that fails', t => { t.end(); }); }); + +test.cb('encoding option works with async', t => { + shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5566);"`, { async: true, encoding: 'buffer' }, (code, stdout, stderr) => { + t.is(code, 0); + t.truthy(Buffer.isBuffer(stdout)); + t.truthy(Buffer.isBuffer(stderr)); + t.is(stdout.toString(), '5566\n'); + t.is(stderr.toString(), ''); + t.end(); + }); +}); From c889075f783089831111b28f3bc7528bac72e866 Mon Sep 17 00:00:00 2001 From: cristHian Gz Date: Fri, 22 Sep 2017 23:27:42 -0500 Subject: [PATCH 148/338] feat(cat): number output lines (#750) (#775) --- README.md | 7 ++++-- src/cat.js | 37 ++++++++++++++++++++++++++-- test/cat.js | 53 ++++++++++++++++++++++++++++++++++++++++ test/ls.js | 5 +++- test/resources/cat/file3 | 1 + test/resources/cat/file4 | 12 +++++++++ test/resources/cat/file5 | 0 7 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 test/resources/cat/file3 create mode 100644 test/resources/cat/file4 create mode 100644 test/resources/cat/file5 diff --git a/README.md b/README.md index 479fea71b..c52c12a8e 100644 --- a/README.md +++ b/README.md @@ -121,8 +121,11 @@ For less-commonly used commands and features, please check out our [wiki page](https://github.com/shelljs/shelljs/wiki). -### cat(file [, file ...]) -### cat(file_array) +### cat([options,] file [, file ...]) +### cat([options,] file_array) +Available options: + ++ `-n`: number all output lines Examples: diff --git a/src/cat.js b/src/cat.js index af1ad1d4d..fd8ec28c6 100644 --- a/src/cat.js +++ b/src/cat.js @@ -3,11 +3,17 @@ var fs = require('fs'); common.register('cat', _cat, { canReceivePipe: true, + cmdOptions: { + 'n': 'number', + }, }); //@ -//@ ### cat(file [, file ...]) -//@ ### cat(file_array) +//@ ### cat([options,] file [, file ...]) +//@ ### cat([options,] file_array) +//@ Available options: +//@ +//@ + `-n`: number all output lines //@ //@ Examples: //@ @@ -37,6 +43,33 @@ function _cat(options, files) { cat += fs.readFileSync(file, 'utf8'); }); + if (options.number) { + cat = addNumbers(cat); + } + return cat; } module.exports = _cat; + +function addNumbers(cat) { + var lines = cat.split('\n'); + var lastLine = lines.pop(); + + lines = lines.map(function (line, i) { + return numberedLine(i + 1, line); + }); + + if (lastLine.length) { + lastLine = numberedLine(lines.length + 1, lastLine); + } + lines.push(lastLine); + + return lines.join('\n'); +} + +function numberedLine(n, line) { + // GNU cat use six pad start number + tab. See http://lingrok.org/xref/coreutils/src/cat.c#57 + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart + var number = (' ' + n).slice(-6) + '\t'; + return number + line; +} diff --git a/test/cat.js b/test/cat.js index c61905f6a..cc21ce575 100644 --- a/test/cat.js +++ b/test/cat.js @@ -64,3 +64,56 @@ test('glob', t => { t.truthy(result.search('test1') > -1); // file order might be random t.truthy(result.search('test2') > -1); }); + +test('without EOF', t => { + const result = shell.cat('test/resources/cat/file3'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), 'test3'); +}); + +test('empty', t => { + const result = shell.cat('test/resources/cat/file5'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), ''); +}); + +// +// With numbers +// + +test('simple with numbers', t => { + const result = shell.cat('-n', 'test/resources/cat/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), ' 1\ttest1\n'); +}); + +test('simple twelve lines file with numbers', t => { + const result = shell.cat('-n', 'test/resources/cat/file4'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), ' 1\ttest4-01\n 2\ttest4-02\n 3\ttest4-03\n 4\ttest4-04\n 5\ttest4-05\n 6\ttest4-06\n 7\ttest4-07\n 8\ttest4-08\n 9\ttest4-09\n 10\ttest4-10\n 11\ttest4-11\n 12\ttest4-12\n'); +}); + +test('multiple with numbers', t => { + const result = shell.cat('-n', 'test/resources/cat/file2', 'test/resources/cat/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), ' 1\ttest2\n 2\ttest1\n'); +}); + +test('simple numbers without EOF', t => { + const result = shell.cat('-n', 'test/resources/cat/file3'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), ' 1\ttest3'); +}); + +test('multiple numbers without EOF', t => { + const result = shell.cat('-n', 'test/resources/cat/file3', 'test/resources/cat/file2', 'test/resources/cat/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), ' 1\ttest3test2\n 2\ttest1\n'); +}); diff --git a/test/ls.js b/test/ls.js index 4c54c393b..dbc557679 100644 --- a/test/ls.js +++ b/test/ls.js @@ -125,7 +125,10 @@ test('wildcard, very simple', t => { t.is(result.code, 0); t.truthy(result.indexOf('test/resources/cat/file1') > -1); t.truthy(result.indexOf('test/resources/cat/file2') > -1); - t.is(result.length, 2); + t.truthy(result.indexOf('test/resources/cat/file3') > -1); + t.truthy(result.indexOf('test/resources/cat/file4') > -1); + t.truthy(result.indexOf('test/resources/cat/file5') > -1); + t.is(result.length, 5); }); test('wildcard, simple', t => { diff --git a/test/resources/cat/file3 b/test/resources/cat/file3 new file mode 100644 index 000000000..29f446afe --- /dev/null +++ b/test/resources/cat/file3 @@ -0,0 +1 @@ +test3 \ No newline at end of file diff --git a/test/resources/cat/file4 b/test/resources/cat/file4 new file mode 100644 index 000000000..f4538a5cc --- /dev/null +++ b/test/resources/cat/file4 @@ -0,0 +1,12 @@ +test4-01 +test4-02 +test4-03 +test4-04 +test4-05 +test4-06 +test4-07 +test4-08 +test4-09 +test4-10 +test4-11 +test4-12 diff --git a/test/resources/cat/file5 b/test/resources/cat/file5 new file mode 100644 index 000000000..e69de29bb From cea0e58250b357e916ecef7c4e75294632af4597 Mon Sep 17 00:00:00 2001 From: Alexander Regueiro Date: Tue, 10 Oct 2017 04:53:17 +0100 Subject: [PATCH 149/338] Added `-q` (quiet) option to `push`, `popd`, `dirs` functions. (#777) * Added `-q` (quiet) option to `push`, `popd`, `dirs` functions. * Added unit tests for pushd/popd quiet mode. * Added tests for `pushd` and `popd` with quiet mode off. * Updated docs for `pushd` and `popd` functions. * Moved preliminary `pushd` commands for `popd` tests before disabling of silent flag. --- README.md | 3 +++ src/dirs.js | 18 ++++++++++++++---- test/popd.js | 39 +++++++++++++++++++++++++++++++++++++++ test/pushd.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c52c12a8e..36087920e 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,7 @@ Copies files. Available options: + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. ++ `-q`: Supresses output to the console. Arguments: @@ -223,6 +224,7 @@ Save the current directory on the top of the directory stack and then cd to `dir Available options: + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. ++ `-q`: Supresses output to the console. Arguments: @@ -246,6 +248,7 @@ When no arguments are given, popd removes the top directory from the stack and p Available options: + `-c`: Clears the directory stack by deleting all of the elements. ++ `-q`: Supresses output to the console. Arguments: diff --git a/src/dirs.js b/src/dirs.js index 3806c14f7..3e27ac95e 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -40,6 +40,7 @@ function _actualDirStack() { //@ Available options: //@ //@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. +//@ + `-q`: Supresses output to the console. //@ //@ Arguments: //@ @@ -64,6 +65,7 @@ function _pushd(options, dir) { options = common.parseOptions(options, { 'n': 'no-cd', + 'q': 'quiet', }); var dirs = _actualDirStack(); @@ -95,7 +97,7 @@ function _pushd(options, dir) { } _dirStack = dirs; - return _dirs(''); + return _dirs(options.quiet ? '-q' : ''); } exports.pushd = _pushd; @@ -105,6 +107,7 @@ exports.pushd = _pushd; //@ Available options: //@ //@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. +//@ + `-q`: Supresses output to the console. //@ //@ Arguments: //@ @@ -130,6 +133,7 @@ function _popd(options, index) { options = common.parseOptions(options, { 'n': 'no-cd', + 'q': 'quiet', }); if (!_dirStack.length) { @@ -146,7 +150,7 @@ function _popd(options, index) { _cd('', dir); } - return _dirs(''); + return _dirs(options.quiet ? '-q' : ''); } exports.popd = _popd; @@ -156,6 +160,7 @@ exports.popd = _popd; //@ Available options: //@ //@ + `-c`: Clears the directory stack by deleting all of the elements. +//@ + `-q`: Supresses output to the console. //@ //@ Arguments: //@ @@ -173,6 +178,7 @@ function _dirs(options, index) { options = common.parseOptions(options, { 'c': 'clear', + 'q': 'quiet', }); if (options.clear) { @@ -189,11 +195,15 @@ function _dirs(options, index) { index = stack.length + index; } - common.log(stack[index]); + if (!options.quiet) { + common.log(stack[index]); + } return stack[index]; } - common.log(stack.join(' ')); + if (!options.quiet) { + common.log(stack.join(' ')); + } return stack; } diff --git a/test/popd.js b/test/popd.js index 0e83a7cfa..0626a0bec 100644 --- a/test/popd.js +++ b/test/popd.js @@ -3,6 +3,7 @@ import path from 'path'; import test from 'ava'; import shell from '..'; +import mocks from './utils/mocks'; const rootDir = path.resolve(); @@ -114,3 +115,41 @@ test('Test that rootDir is not stored', t => { shell.popd(); // no more in the stack t.truthy(shell.error()); }); + +test('quiet mode off', t => { + try { + shell.pushd('test/resources/pushd'); + shell.config.silent = false; + mocks.init(); + const trail = shell.popd(); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(stdout, ''); + t.is(stderr, `${rootDir}\n`); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [rootDir]); + } finally { + shell.config.silent = true; + mocks.restore(); + } +}); + +test('quiet mode on', t => { + try { + shell.pushd('test/resources/pushd'); + shell.config.silent = false; + mocks.init(); + const trail = shell.popd('-q'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(stdout, ''); + t.is(stderr, ''); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [rootDir]); + } finally { + shell.config.silent = true; + mocks.restore(); + } +}); diff --git a/test/pushd.js b/test/pushd.js index 9ca0f76b0..d24b321fc 100644 --- a/test/pushd.js +++ b/test/pushd.js @@ -3,6 +3,7 @@ import path from 'path'; import test from 'ava'; import shell from '..'; +import mocks from './utils/mocks'; const rootDir = path.resolve(); @@ -328,3 +329,45 @@ test('Push without arguments invalid when stack is empty', t => { shell.pushd(); t.is(shell.error(), 'pushd: no other directory'); }); + +test('quiet mode off', t => { + try { + shell.config.silent = false; + mocks.init(); + const trail = shell.pushd('test/resources/pushd'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(stdout, ''); + t.is(stderr, `${path.resolve(rootDir, 'test/resources/pushd')} ${rootDir}\n`); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'test/resources/pushd'), + rootDir, + ]); + } finally { + shell.config.silent = true; + mocks.restore(); + } +}); + +test('quiet mode on', t => { + try { + shell.config.silent = false; + mocks.init(); + const trail = shell.pushd('-q', 'test/resources/pushd'); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.falsy(shell.error()); + t.is(stdout, ''); + t.is(stderr, ''); + t.is(process.cwd(), trail[0]); + t.deepEqual(trail, [ + path.resolve(rootDir, 'test/resources/pushd'), + rootDir, + ]); + } finally { + shell.config.silent = true; + mocks.restore(); + } +}); From cd1aabab3972f55197db6b9168817175c545af6c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 12 Oct 2017 23:23:09 -0700 Subject: [PATCH 150/338] chore: set AVA options (#780) This sets 2 AVA options: * `serial`: same behavior as the CLI flag, which this replaces * `powerAssert`: if an assert fails, it will inspect all objects involved in the failed assert. This causes readability issues if `t.falsy(shell.error())` breaks, since it inspects all of `shell` (which is way too large). AVA options are a little easier to manage than CLI options (we only update one place instead of 2 in `package.json`). --- package.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6303ffe1c..eea927891 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ ], "scripts": { "posttest": "npm run lint", - "test": "nyc --reporter=text --reporter=lcov ava --serial test/*.js", - "test-no-coverage": "ava --serial test/*.js", + "test": "nyc --reporter=text --reporter=lcov ava test/*.js", + "test-no-coverage": "ava test/*.js", "gendocs": "node scripts/generate-docs", "lint": "eslint .", "after-travis": "travis-check-changes", @@ -53,6 +53,10 @@ "interpret": "^1.0.0", "rechoir": "^0.6.2" }, + "ava": { + "serial": true, + "powerAssert": false + }, "devDependencies": { "ava": "^0.21.0", "chalk": "^1.1.3", From df1460ff538483628375c2c42e98f74face17ffc Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 12 Oct 2017 23:23:23 -0700 Subject: [PATCH 151/338] chore: clean up refs to unsupported node versions (#779) Also removes unnecessary guard code leftover from old versions. --- src/tempdir.js | 2 +- test/exec.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/tempdir.js b/src/tempdir.js index b3a6cca38..fad35e924 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -40,7 +40,7 @@ function _tempDir() { var state = common.state; if (state.tempDir) return state.tempDir; // from cache - state.tempDir = writeableDir(os.tmpdir && os.tmpdir()) || // node 0.10+ + state.tempDir = writeableDir(os.tmpdir()) || writeableDir(process.env.TMPDIR) || writeableDir(process.env.TEMP) || writeableDir(process.env.TMP) || diff --git a/test/exec.js b/test/exec.js index 3c73d3612..f2a1c00f3 100644 --- a/test/exec.js +++ b/test/exec.js @@ -121,10 +121,7 @@ test('set timeout option', t => { const result = shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`); // default timeout is ok t.falsy(shell.error()); t.is(result.code, 0); - if (process.version >= 'v0.11') { - // this option doesn't work on v0.10 - shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`, { timeout: 10 }); // times out - } + shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`, { timeout: 10 }); // times out t.truthy(shell.error()); }); @@ -145,7 +142,6 @@ test('set shell option (TODO: add tests for Windows)', t => { t.is(result.code, 0); t.is(result.stdout, '/bin/sh\n'); // sh by default const bashPath = shell.which('bash').trim(); - // this option doesn't work on v0.10 if (bashPath) { result = shell.exec('echo $0', { shell: '/bin/bash' }); t.falsy(shell.error()); From 32972e0cdda0a37ba3a8277d6ca1b134ad964e7f Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Sat, 14 Oct 2017 02:38:12 -0700 Subject: [PATCH 152/338] Remove unnecessary shell.error checks from common tests (#785) --- test/common.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/test/common.js b/test/common.js index 7f8fb1364..b433f91ba 100644 --- a/test/common.js +++ b/test/common.js @@ -139,25 +139,21 @@ test('convertErrorOutput: changes backslashes to forward slashes', t => { // test('single file, array syntax', t => { const result = common.expand(['test/resources/file1.txt']); - t.falsy(shell.error()); t.deepEqual(result, ['test/resources/file1.txt']); }); test('multiple file, glob syntax, * for file name', t => { const result = common.expand(['test/resources/file*.txt']); - t.falsy(shell.error()); t.deepEqual(result.sort(), ['test/resources/file1.txt', 'test/resources/file2.txt'].sort()); }); test('multiple file, glob syntax, * for directory name', t => { const result = common.expand(['test/r*/file*.txt']); - t.falsy(shell.error()); t.deepEqual(result.sort(), ['test/resources/file1.txt', 'test/resources/file2.txt'].sort()); }); test('multiple file, glob syntax, ** for directory name', t => { const result = common.expand(['test/resources/**/file*.js']); - t.falsy(shell.error()); t.deepEqual( result.sort(), ['test/resources/file1.js', 'test/resources/file2.js', 'test/resources/ls/file1.js', 'test/resources/ls/file2.js'].sort() @@ -166,25 +162,21 @@ test('multiple file, glob syntax, ** for directory name', t => { test('broken links still expand', t => { const result = common.expand(['test/resources/b*dlink']); - t.falsy(shell.error()); t.deepEqual(result, ['test/resources/badlink']); }); test('empty array', t => { const result = common.expand([]); - t.falsy(shell.error()); t.deepEqual(result, []); }); test('empty string', t => { const result = common.expand(['']); - t.falsy(shell.error()); t.deepEqual(result, ['']); }); test('non-string', t => { const result = common.expand([5]); - t.falsy(shell.error()); t.deepEqual(result, [5]); }); @@ -193,14 +185,12 @@ test('non-string', t => { // test('common.buffer returns buffer', t => { const buf = common.buffer(); - t.falsy(shell.error()); t.truthy(buf instanceof Buffer); t.is(buf.length, 64 * 1024); }); test('common.buffer with explicit length', t => { const buf = common.buffer(20); - t.falsy(shell.error()); t.truthy(buf instanceof Buffer); t.is(buf.length, 20); }); @@ -208,7 +198,6 @@ test('common.buffer with explicit length', t => { test('common.buffer with different config.bufLength', t => { common.config.bufLength = 20; const buf = common.buffer(); - t.falsy(shell.error()); t.truthy(buf instanceof Buffer); t.is(buf.length, 20); common.config.reset(); From 7cbce889150a16f096cf1af15a88e12ef77c4f03 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 17 Oct 2017 19:22:37 -0700 Subject: [PATCH 153/338] Add a test for ls for a single file (#784) --- test/ls.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/ls.js b/test/ls.js index dbc557679..2cdc1933c 100644 --- a/test/ls.js +++ b/test/ls.js @@ -87,6 +87,14 @@ test('simple arg, with a trailing slash', t => { t.is(result.length, 6); }); +test('simple arg, a file', t => { + const result = shell.ls('test/resources/ls/file1'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('test/resources/ls/file1') > -1); + t.is(result.length, 1); +}); + test('no args, -A option', t => { shell.cd('test/resources/ls'); const result = shell.ls('-A'); From a7d6df5f6de35bdbf279b7640218856af64cc868 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Tue, 17 Oct 2017 19:25:09 -0700 Subject: [PATCH 154/338] Wrap fs.statSync and fs.lstatSync (#783) Adds two new methods to src/common.js, common.statFollowLinks and common.statNoFollowLinks, which wrap fs.statSync and fs.lstatSync, respectively. This change is meant to improve readability and clarify intent. * Add common.statFollowLinks and common.statNoFollowLinks * Replace fs.statSync and fs.lstatSync in source files --- src/cat.js | 2 +- src/cd.js | 3 +-- src/chmod.js | 10 ++++---- src/common.js | 12 ++++++++++ src/cp.js | 26 ++++++++++---------- src/find.js | 3 +-- src/head.js | 2 +- src/ln.js | 2 +- src/ls.js | 6 ++--- src/mkdir.js | 2 +- src/mv.js | 4 ++-- src/rm.js | 6 ++--- src/sort.js | 2 +- src/tail.js | 2 +- src/tempdir.js | 2 +- src/test.js | 4 ++-- src/touch.js | 2 +- src/uniq.js | 4 ++-- src/which.js | 2 +- test/chmod.js | 65 +++++++++++++++++++++++++------------------------- test/cp.js | 49 ++++++++++++++++++------------------- test/head.js | 3 ++- test/ls.js | 3 ++- test/mkdir.js | 21 ++++++++-------- test/sort.js | 3 ++- test/tail.js | 3 ++- test/touch.js | 27 +++++++++++---------- test/uniq.js | 5 ++-- 28 files changed, 147 insertions(+), 128 deletions(-) diff --git a/src/cat.js b/src/cat.js index fd8ec28c6..cdad1b0f6 100644 --- a/src/cat.js +++ b/src/cat.js @@ -36,7 +36,7 @@ function _cat(options, files) { files.forEach(function (file) { if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file); - } else if (fs.statSync(file).isDirectory()) { + } else if (common.statFollowLinks(file).isDirectory()) { common.error(file + ': Is a directory'); } diff --git a/src/cd.js b/src/cd.js index c6f1ada33..87ce9b9a7 100644 --- a/src/cd.js +++ b/src/cd.js @@ -1,4 +1,3 @@ -var fs = require('fs'); var os = require('os'); var common = require('./common'); @@ -27,7 +26,7 @@ function _cd(options, dir) { // something went wrong, let's figure out the error var err; try { - fs.statSync(dir); // if this succeeds, it must be some sort of file + common.statFollowLinks(dir); // if this succeeds, it must be some sort of file err = 'not a directory: ' + dir; } catch (e2) { err = 'no such file or directory: ' + dir; diff --git a/src/chmod.js b/src/chmod.js index ce5659e35..758c6e515 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -85,7 +85,7 @@ function _chmod(options, mode, filePattern) { if (options.recursive) { files = []; filePattern.forEach(function addFile(expandedFile) { - var stat = fs.lstatSync(expandedFile); + var stat = common.statNoFollowLinks(expandedFile); if (!stat.isSymbolicLink()) { files.push(expandedFile); @@ -108,11 +108,11 @@ function _chmod(options, mode, filePattern) { } // When recursing, don't follow symlinks. - if (options.recursive && fs.lstatSync(file).isSymbolicLink()) { + if (options.recursive && common.statNoFollowLinks(file).isSymbolicLink()) { return; } - var stat = fs.statSync(file); + var stat = common.statFollowLinks(file); var isDir = stat.isDirectory(); var perms = stat.mode; var type = perms & PERMS.TYPE_MASK; @@ -175,7 +175,7 @@ function _chmod(options, mode, filePattern) { // According to POSIX, when using = to explicitly set the // permissions, setuid and setgid can never be cleared. - if (fs.statSync(file).isDirectory()) { + if (common.statFollowLinks(file).isDirectory()) { newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; } break; @@ -204,7 +204,7 @@ function _chmod(options, mode, filePattern) { // POSIX rules are that setuid and setgid can only be added using numeric // form, but not cleared. - if (fs.statSync(file).isDirectory()) { + if (common.statFollowLinks(file).isDirectory()) { newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; } diff --git a/src/common.js b/src/common.js index 13753a12f..77e0306e4 100644 --- a/src/common.js +++ b/src/common.js @@ -277,6 +277,18 @@ function unlinkSync(file) { } exports.unlinkSync = unlinkSync; +// wrappers around common.statFollowLinks and common.statNoFollowLinks that clarify intent +// and improve readability +function statFollowLinks() { + return fs.statSync.apply(fs, arguments); +} +exports.statFollowLinks = statFollowLinks; + +function statNoFollowLinks() { + return fs.lstatSync.apply(fs, arguments); +} +exports.statNoFollowLinks = statNoFollowLinks; + // e.g. 'shelljs_a5f185d0443ca...' function randomFileName() { function randomHash(count) { diff --git a/src/cp.js b/src/cp.js index 99c97b2eb..d46a54ab5 100644 --- a/src/cp.js +++ b/src/cp.js @@ -27,16 +27,16 @@ function copyFileSync(srcFile, destFile, options) { // Check the mtimes of the files if the '-u' flag is provided try { - if (options.update && fs.statSync(srcFile).mtime < fs.statSync(destFile).mtime) { + if (options.update && common.statFollowLinks(srcFile).mtime < fs.statSync(destFile).mtime) { return; } } catch (e) { // If we're here, destFile probably doesn't exist, so just do a normal copy } - if (fs.lstatSync(srcFile).isSymbolicLink() && !options.followsymlink) { + if (common.statNoFollowLinks(srcFile).isSymbolicLink() && !options.followsymlink) { try { - fs.lstatSync(destFile); + common.statNoFollowLinks(destFile); common.unlinkSync(destFile); // re-link it } catch (e) { // it doesn't exist, so no work needs to be done @@ -75,7 +75,7 @@ function copyFileSync(srcFile, destFile, options) { fs.closeSync(fdr); fs.closeSync(fdw); - fs.chmodSync(destFile, fs.statSync(srcFile).mode); + fs.chmodSync(destFile, common.statFollowLinks(srcFile).mode); } } @@ -99,7 +99,7 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { // Create the directory where all our junk is moving to; read the mode of the // source directory and mirror it try { - var checkDir = fs.statSync(sourceDir); + var checkDir = common.statFollowLinks(sourceDir); fs.mkdirSync(destDir, checkDir.mode); } catch (e) { // if the directory already exists, that's okay @@ -111,7 +111,7 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { for (var i = 0; i < files.length; i++) { var srcFile = sourceDir + '/' + files[i]; var destFile = destDir + '/' + files[i]; - var srcFileStat = fs.lstatSync(srcFile); + var srcFileStat = common.statNoFollowLinks(srcFile); var symlinkFull; if (opts.followsymlink) { @@ -129,14 +129,14 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { } else if (srcFileStat.isSymbolicLink() && !opts.followsymlink) { symlinkFull = fs.readlinkSync(srcFile); try { - fs.lstatSync(destFile); + common.statNoFollowLinks(destFile); common.unlinkSync(destFile); // re-link it } catch (e) { // it doesn't exist, so no work needs to be done } fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); } else if (srcFileStat.isSymbolicLink() && opts.followsymlink) { - srcFileStat = fs.statSync(srcFile); + srcFileStat = common.statFollowLinks(srcFile); if (srcFileStat.isDirectory()) { cpdirSyncRecursive(srcFile, destFile, currentDepth, opts); } else { @@ -162,7 +162,7 @@ function checkRecentCreated(sources, index) { } function cpcheckcycle(sourceDir, srcFile) { - var srcFileStat = fs.lstatSync(srcFile); + var srcFileStat = common.statNoFollowLinks(srcFile); if (srcFileStat.isSymbolicLink()) { // Do cycle check. For example: // $ mkdir -p 1/2/3/4 @@ -170,7 +170,7 @@ function cpcheckcycle(sourceDir, srcFile) { // $ ln -s ../../3 link // $ cd ../../../.. // $ cp -RL 1 copy - var cyclecheck = fs.statSync(srcFile); + var cyclecheck = common.statFollowLinks(srcFile); if (cyclecheck.isDirectory()) { var sourcerealpath = fs.realpathSync(sourceDir); var symlinkrealpath = fs.realpathSync(srcFile); @@ -223,7 +223,7 @@ function _cp(options, sources, dest) { } var destExists = fs.existsSync(dest); - var destStat = destExists && fs.statSync(dest); + var destStat = destExists && common.statFollowLinks(dest); // Dest is not existing dir, but multiple sources given if ((!destExists || !destStat.isDirectory()) && sources.length > 1) { @@ -241,7 +241,7 @@ function _cp(options, sources, dest) { common.error('no such file or directory: ' + src, { continue: true }); return; // skip file } - var srcStat = fs.statSync(src); + var srcStat = common.statFollowLinks(src); if (!options.noFollowsymlink && srcStat.isDirectory()) { if (!options.recursive) { // Non-Recursive @@ -254,7 +254,7 @@ function _cp(options, sources, dest) { dest; try { - fs.statSync(path.dirname(dest)); + common.statFollowLinks(path.dirname(dest)); cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink }); } catch (e) { /* istanbul ignore next */ diff --git a/src/find.js b/src/find.js index 76a16c4ee..b28d0378e 100644 --- a/src/find.js +++ b/src/find.js @@ -1,4 +1,3 @@ -var fs = require('fs'); var path = require('path'); var common = require('./common'); var _ls = require('./ls'); @@ -42,7 +41,7 @@ function _find(options, paths) { paths.forEach(function (file) { var stat; try { - stat = fs.statSync(file); + stat = common.statFollowLinks(file); } catch (e) { common.error('no such file or directory: ' + file); } diff --git a/src/head.js b/src/head.js index 2640b13b4..c08ae9ba3 100644 --- a/src/head.js +++ b/src/head.js @@ -71,7 +71,7 @@ function _head(options, files) { if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file, { continue: true }); return; - } else if (fs.statSync(file).isDirectory()) { + } else if (common.statFollowLinks(file).isDirectory()) { common.error("error reading '" + file + "': Is a directory", { continue: true, }); diff --git a/src/ln.js b/src/ln.js index 9b8beb9ec..71f2b3916 100644 --- a/src/ln.js +++ b/src/ln.js @@ -48,7 +48,7 @@ function _ln(options, source, dest) { var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source); if (!fs.existsSync(resolvedSourcePath)) { common.error('Source file does not exist', { continue: true }); - } else if (isWindows && fs.statSync(resolvedSourcePath).isDirectory()) { + } else if (isWindows && common.statFollowLinks(resolvedSourcePath).isDirectory()) { linkType = 'junction'; } diff --git a/src/ls.js b/src/ls.js index 8390dc144..2f3ac6973 100644 --- a/src/ls.js +++ b/src/ls.js @@ -62,7 +62,7 @@ function _ls(options, paths) { relName = relName.replace(/\\/g, '/'); } if (options.long) { - stat = stat || (options.link ? fs.statSync(abs) : fs.lstatSync(abs)); + stat = stat || (options.link ? common.statFollowLinks(abs) : common.statNoFollowLinks(abs)); list.push(addLsAttributes(relName, stat)); } else { // list.push(path.relative(rel || '.', file)); @@ -74,11 +74,11 @@ function _ls(options, paths) { var stat; try { - stat = options.link ? fs.statSync(p) : fs.lstatSync(p); + stat = options.link ? common.statFollowLinks(p) : common.statNoFollowLinks(p); // follow links to directories by default if (stat.isSymbolicLink()) { try { - var _stat = fs.statSync(p); + var _stat = common.statFollowLinks(p); if (_stat.isDirectory()) { stat = _stat; } diff --git a/src/mkdir.js b/src/mkdir.js index 44b1b2162..723c137d2 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -57,7 +57,7 @@ function _mkdir(options, dirs) { dirs.forEach(function (dir) { try { - var stat = fs.lstatSync(dir); + var stat = common.statNoFollowLinks(dir); if (!options.fullpath) { common.error('path already exists: ' + dir, { continue: true }); } else if (stat.isFile()) { diff --git a/src/mv.js b/src/mv.js index 6ebaa8a03..525be06b8 100644 --- a/src/mv.js +++ b/src/mv.js @@ -51,7 +51,7 @@ function _mv(options, sources, dest) { } var exists = fs.existsSync(dest); - var stats = exists && fs.statSync(dest); + var stats = exists && common.statFollowLinks(dest); // Dest is not existing dir, but multiple sources given if ((!exists || !stats.isDirectory()) && sources.length > 1) { @@ -74,7 +74,7 @@ function _mv(options, sources, dest) { // When copying to '/path/dir': // thisDest = '/path/dir/file1' var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) { + if (fs.existsSync(dest) && common.statFollowLinks(dest).isDirectory()) { thisDest = path.normalize(dest + '/' + path.basename(src)); } diff --git a/src/rm.js b/src/rm.js index 2ad6914b4..75dcd7fa4 100644 --- a/src/rm.js +++ b/src/rm.js @@ -25,7 +25,7 @@ function rmdirSyncRecursive(dir, force, fromSymlink) { // Loop through and delete everything in the sub-tree after checking it for (var i = 0; i < files.length; i++) { var file = dir + '/' + files[i]; - var currFile = fs.lstatSync(file); + var currFile = common.statNoFollowLinks(file); if (currFile.isDirectory()) { // Recursive function back to the beginning rmdirSyncRecursive(file, force); @@ -116,7 +116,7 @@ function handleDirectory(file, options) { function handleSymbolicLink(file, options) { var stats; try { - stats = fs.statSync(file); + stats = common.statFollowLinks(file); } catch (e) { // symlink is broken, so remove the symlink itself common.unlinkSync(file); @@ -175,7 +175,7 @@ function _rm(options, files) { var filepath = (file[file.length - 1] === '/') ? file.slice(0, -1) // remove the '/' so lstatSync can detect symlinks : file; - lstats = fs.lstatSync(filepath); // test for existence + lstats = common.statNoFollowLinks(filepath); // test for existence } catch (e) { // Path does not exist, no force flag given if (!options.force) { diff --git a/src/sort.js b/src/sort.js index 5dd8d75fc..e0feed746 100644 --- a/src/sort.js +++ b/src/sort.js @@ -72,7 +72,7 @@ function _sort(options, files) { if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file, { continue: true }); return accum; - } else if (fs.statSync(file).isDirectory()) { + } else if (common.statFollowLinks(file).isDirectory()) { common.error('read failed: ' + file + ': Is a directory', { continue: true, }); diff --git a/src/tail.js b/src/tail.js index e5a88055c..5e0256e76 100644 --- a/src/tail.js +++ b/src/tail.js @@ -50,7 +50,7 @@ function _tail(options, files) { if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file, { continue: true }); return; - } else if (fs.statSync(file).isDirectory()) { + } else if (common.statFollowLinks(file).isDirectory()) { common.error("error reading '" + file + "': Is a directory", { continue: true, }); diff --git a/src/tempdir.js b/src/tempdir.js index fad35e924..6fe116fe2 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -11,7 +11,7 @@ common.register('tempdir', _tempDir, { function writeableDir(dir) { if (!dir || !fs.existsSync(dir)) return false; - if (!fs.statSync(dir).isDirectory()) return false; + if (!common.statFollowLinks(dir).isDirectory()) return false; var testFile = dir + '/' + common.randomFileName(); try { diff --git a/src/test.js b/src/test.js index d3d9c07a0..c0c6469f8 100644 --- a/src/test.js +++ b/src/test.js @@ -52,7 +52,7 @@ function _test(options, path) { if (options.link) { try { - return fs.lstatSync(path).isSymbolicLink(); + return common.statNoFollowLinks(path).isSymbolicLink(); } catch (e) { return false; } @@ -62,7 +62,7 @@ function _test(options, path) { if (options.exists) return true; - var stats = fs.statSync(path); + var stats = common.statFollowLinks(path); if (options.block) return stats.isBlockDevice(); diff --git a/src/touch.js b/src/touch.js index b672b2d25..dd6b8bc54 100644 --- a/src/touch.js +++ b/src/touch.js @@ -103,7 +103,7 @@ module.exports = _touch; function tryStatFile(filePath) { try { - return fs.statSync(filePath); + return common.statFollowLinks(filePath); } catch (e) { return null; } diff --git a/src/uniq.js b/src/uniq.js index 8c0f04010..2a287ce15 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -45,11 +45,11 @@ function _uniq(options, input, output) { if (!fs.existsSync(input)) { common.error(input + ': No such file or directory'); - } else if (fs.statSync(input).isDirectory()) { + } else if (common.statFollowLinks(input).isDirectory()) { common.error("error reading '" + input + "'"); } } - if (output && fs.existsSync(output) && fs.statSync(output).isDirectory()) { + if (output && fs.existsSync(output) && common.statFollowLinks(output).isDirectory()) { common.error(output + ': Is a directory'); } diff --git a/src/which.js b/src/which.js index a5f9e15eb..e6ae9eb58 100644 --- a/src/which.js +++ b/src/which.js @@ -19,7 +19,7 @@ function splitPath(p) { } function checkPath(pathName) { - return fs.existsSync(pathName) && !fs.statSync(pathName).isDirectory(); + return fs.existsSync(pathName) && !common.statFollowLinks(pathName).isDirectory(); } //@ diff --git a/test/chmod.js b/test/chmod.js index 7b617ab3a..5c0905e8b 100644 --- a/test/chmod.js +++ b/test/chmod.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; import utils from './utils/utils'; let TMP; @@ -36,13 +37,13 @@ test('Basic usage with octal codes', t => { let result = shell.chmod('755', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('755', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('644', 8) ); }); @@ -53,7 +54,7 @@ test('symbolic mode', t => { let result = shell.chmod('o+x', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('007', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('007', 8), parseInt('005', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -66,7 +67,7 @@ test('symbolic mode, without group', t => { let result = shell.chmod('+x', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('755', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -79,13 +80,13 @@ test('Test setuid', t => { let result = shell.chmod('u+s', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('4000', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('4000', 8), parseInt('4000', 8) ); result = shell.chmod('u-s', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('644', 8) ); @@ -97,7 +98,7 @@ test('Test setuid', t => { result = shell.chmod('755', `${TMP}/chmod/c`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/c`).mode & parseInt('4000', 8), + common.statFollowLinks(`${TMP}/chmod/c`).mode & parseInt('4000', 8), parseInt('4000', 8) ); result = shell.chmod('u-s', `${TMP}/chmod/c`); @@ -110,13 +111,13 @@ test('Test setgid', t => { let result = shell.chmod('g+s', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('2000', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('2000', 8), parseInt('2000', 8) ); result = shell.chmod('g-s', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('644', 8) ); }); @@ -127,16 +128,16 @@ test('Test sticky bit', t => { let result = shell.chmod('+t', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('1000', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('1000', 8), parseInt('1000', 8) ); result = shell.chmod('-t', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/file1`).mode & BITMASK, parseInt('644', 8) ); - t.is(fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('1000', 8), 0); + t.is(common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('1000', 8), 0); }); }); @@ -145,7 +146,7 @@ test('Test directories', t => { let result = shell.chmod('a-w', `${TMP}/chmod/b/a/b`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/b/a/b`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/b/a/b`).mode & BITMASK, parseInt('555', 8) ); result = shell.chmod('755', `${TMP}/chmod/b/a/b`); @@ -158,13 +159,13 @@ test('Test recursion', t => { let result = shell.chmod('-R', 'a+w', `${TMP}/chmod/b`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/b/a/b`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/b/a/b`).mode & BITMASK, BITMASK ); result = shell.chmod('-R', '755', `${TMP}/chmod/b`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/b/a/b`).mode & BITMASK, + common.statFollowLinks(`${TMP}/chmod/b/a/b`).mode & BITMASK, parseInt('755', 8) ); }); @@ -176,11 +177,11 @@ test('Test symbolic links w/ recursion - WARNING: *nix only', t => { let result = shell.chmod('-R', 'u-w', `${TMP}/chmod/a/b`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/a/b/c`).mode & parseInt('700', 8), + common.statFollowLinks(`${TMP}/chmod/a/b/c`).mode & parseInt('700', 8), parseInt('500', 8) ); t.is( - fs.statSync(`${TMP}/chmod/b/a`).mode & parseInt('700', 8), + common.statFollowLinks(`${TMP}/chmod/b/a`).mode & parseInt('700', 8), parseInt('700', 8) ); result = shell.chmod('-R', 'u+w', `${TMP}/chmod/a/b`); @@ -193,7 +194,7 @@ test('Test combinations', t => { let result = shell.chmod('a-rwx', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('000', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('000', 8), parseInt('000', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -204,7 +205,7 @@ test('multiple symbolic modes', t => { let result = shell.chmod('a-rwx,u+r', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('400', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('400', 8), parseInt('400', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -215,7 +216,7 @@ test('multiple symbolic modes #2', t => { let result = shell.chmod('a-rwx,u+rw', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('600', 8), parseInt('600', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -227,7 +228,7 @@ test('multiple symbolic modes #3', t => { let result = shell.chmod('a-rwx,u+rwx', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('700', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('700', 8), parseInt('700', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -241,7 +242,7 @@ test('u+rw', t => { result = shell.chmod('u+rw', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('600', 8), parseInt('600', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -255,7 +256,7 @@ test('u+wx', t => { result = shell.chmod('u+wx', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('300', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('300', 8), parseInt('300', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -270,7 +271,7 @@ test('Multiple symbolic modes at once', t => { result = shell.chmod('u+r,g+w,o+x', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('421', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('421', 8), parseInt('421', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -285,7 +286,7 @@ test('u+rw,g+wx', t => { result = shell.chmod('u+rw,g+wx', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('630', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('630', 8), parseInt('630', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -299,7 +300,7 @@ test('u-x,g+rw', t => { result = shell.chmod('u-x,g+rw', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('660', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('660', 8), parseInt('660', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -310,13 +311,13 @@ test('a-rwx,u+rw', t => { let result = shell.chmod('a-rwx,u+rw', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('600', 8), parseInt('600', 8) ); result = shell.chmod('a-rwx,u+rw', `${TMP}/chmod/file1`); t.is(result.code, 0); t.is( - fs.statSync(`${TMP}/chmod/file1`).mode & parseInt('600', 8), + common.statFollowLinks(`${TMP}/chmod/file1`).mode & parseInt('600', 8), parseInt('600', 8) ); result = shell.chmod('644', `${TMP}/chmod/file1`); @@ -339,19 +340,19 @@ test('Numeric modes', t => { test('Make sure chmod succeeds for a variety of octal codes', t => { utils.skipOnWin(t, () => { t.is( - fs.statSync(`${TMP}/chmod/xdir`).mode & parseInt('755', 8), + common.statFollowLinks(`${TMP}/chmod/xdir`).mode & parseInt('755', 8), parseInt('755', 8) ); t.is( - fs.statSync(`${TMP}/chmod/xdir/file`).mode & parseInt('644', 8), + common.statFollowLinks(`${TMP}/chmod/xdir/file`).mode & parseInt('644', 8), parseInt('644', 8) ); t.is( - fs.statSync(`${TMP}/chmod/xdir/deep`).mode & parseInt('755', 8), + common.statFollowLinks(`${TMP}/chmod/xdir/deep`).mode & parseInt('755', 8), parseInt('755', 8) ); t.is( - fs.statSync(`${TMP}/chmod/xdir/deep/file`).mode & parseInt('644', 8), + common.statFollowLinks(`${TMP}/chmod/xdir/deep/file`).mode & parseInt('644', 8), parseInt('644', 8) ); }); diff --git a/test/cp.js b/test/cp.js index 34b81c7e9..8ada327ad 100644 --- a/test/cp.js +++ b/test/cp.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; import utils from './utils/utils'; const oldMaxDepth = shell.config.maxdepth; @@ -295,7 +296,7 @@ test( t.falsy(result.stderr); t.is(result.code, 0); t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); - t.falsy(fs.statSync(`${t.context.tmp}/file1.txt`).isDirectory()); // don't let it be a dir + t.falsy(common.statFollowLinks(`${t.context.tmp}/file1.txt`).isDirectory()); // don't let it be a dir } ); @@ -309,8 +310,8 @@ test('recursive, everything exists, no force flag', t => { test('-R implies to not follow links', t => { utils.skipOnWin(t, () => { shell.cp('-R', 'test/resources/cp/*', t.context.tmp); - t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link - t.falsy((fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.falsy((common.statNoFollowLinks(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't t.not( shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() @@ -319,8 +320,8 @@ test('-R implies to not follow links', t => { t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); - t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link - t.truthy(fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink()); // this one is now a link + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink()); // this one is now a link t.is( shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() @@ -333,8 +334,8 @@ test('Missing -R implies -L', t => { // Recursive, everything exists, overwrite a real file *by following a link* // Because missing the -R implies -L. shell.cp('-R', 'test/resources/cp/*', t.context.tmp); - t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link - t.falsy((fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.falsy((common.statNoFollowLinks(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink())); // this one isn't t.not( shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), shell.cat(`${t.context.tmp}/fakeLinks/sym.lnk`).toString() @@ -343,8 +344,8 @@ test('Missing -R implies -L', t => { t.falsy(shell.error()); t.falsy(result.stderr); t.is(result.code, 0); - t.truthy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link - t.falsy(fs.lstatSync(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink()); // this one is still not a link + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); // this one is a link + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/fakeLinks/sym.lnk`).isSymbolicLink()); // this one is still not a link // But it still follows the link t.is( shell.cat(`${t.context.tmp}/links/sym.lnk`).toString(), @@ -414,11 +415,11 @@ test( utils.skipOnWin(t, () => { // preserve mode bits const execBit = parseInt('001', 8); - t.is(fs.statSync('test/resources/cp-mode-bits/executable').mode & execBit, execBit); + t.is(common.statFollowLinks('test/resources/cp-mode-bits/executable').mode & execBit, execBit); shell.cp('test/resources/cp-mode-bits/executable', `${t.context.tmp}/executable`); t.is( - fs.statSync('test/resources/cp-mode-bits/executable').mode, - fs.statSync(`${t.context.tmp}/executable`).mode + common.statFollowLinks('test/resources/cp-mode-bits/executable').mode, + common.statFollowLinks(`${t.context.tmp}/executable`).mode ); }); } @@ -459,29 +460,29 @@ test('no-recursive will copy regular files only', t => { test('-R implies -P', t => { utils.skipOnWin(t, () => { shell.cp('-R', 'test/resources/cp/links/sym.lnk', t.context.tmp); - t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); }); test('using -P explicitly works', t => { utils.skipOnWin(t, () => { shell.cp('-P', 'test/resources/cp/links/sym.lnk', t.context.tmp); - t.truthy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); }); test('using -PR on a link to a folder does not follow the link', t => { utils.skipOnWin(t, () => { shell.cp('-PR', 'test/resources/cp/symFolder', t.context.tmp); - t.truthy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); + t.truthy(common.statNoFollowLinks(`${t.context.tmp}/symFolder`).isSymbolicLink()); }); }); test('-L overrides -P for copying directory', t => { utils.skipOnWin(t, () => { shell.cp('-LPR', 'test/resources/cp/symFolder', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); - t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder/sym.lnk`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/symFolder`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/symFolder/sym.lnk`).isSymbolicLink()); }); }); @@ -537,34 +538,34 @@ test('-u flag works correctly recursively', t => { test('using -R on a link to a folder *does* follow the link', t => { shell.cp('-R', 'test/resources/cp/symFolder', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/symFolder`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/symFolder`).isSymbolicLink()); }); test('Without -R, -L is implied', t => { shell.cp('test/resources/cp/links/sym.lnk', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); test('-L explicitly works', t => { shell.cp('-L', 'test/resources/cp/links/sym.lnk', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); test('using -LR does not imply -P', t => { shell.cp('-LR', 'test/resources/cp/links/sym.lnk', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); test('using -LR also works recursively on directories containing links', t => { shell.cp('-LR', 'test/resources/cp/links', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/links/sym.lnk`).isSymbolicLink()); }); test('-L always overrides a -P', t => { shell.cp('-LP', 'test/resources/cp/links/sym.lnk', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); shell.cp('-LPR', 'test/resources/cp/links/sym.lnk', t.context.tmp); - t.falsy(fs.lstatSync(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); + t.falsy(common.statNoFollowLinks(`${t.context.tmp}/sym.lnk`).isSymbolicLink()); }); test('Make sure max depth does not limit shallow directory structures', t => { diff --git a/test/head.js b/test/head.js index 9d85aca6a..51b812686 100644 --- a/test/head.js +++ b/test/head.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; shell.config.silent = true; @@ -25,7 +26,7 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + t.truthy(common.statFollowLinks('test/resources/').isDirectory()); // sanity check const result = shell.head('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); diff --git a/test/ls.js b/test/ls.js index 2cdc1933c..0163f6f73 100644 --- a/test/ls.js +++ b/test/ls.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; import utils from './utils/utils'; const CWD = process.cwd(); @@ -463,7 +464,7 @@ test('long option, directory, recursive (and windows converts slashes)', t => { t.truthy(idx >= 0); result = result[idx]; t.is(result.name, result.name); - t.truthy(fs.statSync('test/resources/ls/a_dir/b_dir').isDirectory()); + t.truthy(common.statFollowLinks('test/resources/ls/a_dir/b_dir').isDirectory()); t.is(typeof result.nlink, 'number'); // This can vary between the local machine and travis t.is(typeof result.size, 'number'); // This can vary between different file systems t.truthy(result.mode); // check that these keys exist diff --git a/test/mkdir.js b/test/mkdir.js index 3827c2d38..5e5e75a0e 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; import utils from './utils/utils'; test.beforeEach(t => { @@ -28,21 +29,21 @@ test('no args', t => { }); test('dir already exists', t => { - const mtime = fs.statSync(t.context.tmp).mtime.toString(); + const mtime = common.statFollowLinks(t.context.tmp).mtime.toString(); const result = shell.mkdir(t.context.tmp); // dir already exists t.truthy(shell.error()); t.is(result.code, 1); t.is(result.stderr, `mkdir: path already exists: ${t.context.tmp}`); - t.is(fs.statSync(t.context.tmp).mtime.toString(), mtime); // didn't mess with dir + t.is(common.statFollowLinks(t.context.tmp).mtime.toString(), mtime); // didn't mess with dir }); test('Can\'t overwrite a broken link', t => { - const mtime = fs.lstatSync('test/resources/badlink').mtime.toString(); + const mtime = common.statNoFollowLinks('test/resources/badlink').mtime.toString(); const result = shell.mkdir('test/resources/badlink'); t.truthy(shell.error()); t.is(result.code, 1); t.is(result.stderr, 'mkdir: path already exists: test/resources/badlink'); - t.is(fs.lstatSync('test/resources/badlink').mtime.toString(), mtime); // didn't mess with file + t.is(common.statNoFollowLinks('test/resources/badlink').mtime.toString(), mtime); // didn't mess with file }); test('root path does not exist', t => { @@ -56,30 +57,30 @@ test('root path does not exist', t => { }); test('try to overwrite file', t => { - t.truthy(fs.statSync('test/resources/file1').isFile()); + t.truthy(common.statFollowLinks('test/resources/file1').isFile()); const result = shell.mkdir('test/resources/file1'); t.truthy(shell.error()); t.is(result.code, 1); t.is(result.stderr, 'mkdir: path already exists: test/resources/file1'); - t.truthy(fs.statSync('test/resources/file1').isFile()); + t.truthy(common.statFollowLinks('test/resources/file1').isFile()); }); test('try to overwrite file, with -p', t => { - t.truthy(fs.statSync('test/resources/file1').isFile()); + t.truthy(common.statFollowLinks('test/resources/file1').isFile()); const result = shell.mkdir('-p', 'test/resources/file1'); t.truthy(shell.error()); t.is(result.code, 1); t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1: File exists'); - t.truthy(fs.statSync('test/resources/file1').isFile()); + t.truthy(common.statFollowLinks('test/resources/file1').isFile()); }); test('try to make a subdirectory of a file', t => { - t.truthy(fs.statSync('test/resources/file1').isFile()); + t.truthy(common.statFollowLinks('test/resources/file1').isFile()); const result = shell.mkdir('test/resources/file1/subdir'); t.truthy(shell.error()); t.is(result.code, 1); t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1/subdir: Not a directory'); - t.truthy(fs.statSync('test/resources/file1').isFile()); + t.truthy(common.statFollowLinks('test/resources/file1').isFile()); t.falsy(fs.existsSync('test/resources/file1/subdir')); }); diff --git a/test/sort.js b/test/sort.js index 6d28c1e25..82015e41c 100644 --- a/test/sort.js +++ b/test/sort.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; shell.config.silent = true; @@ -31,7 +32,7 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + t.truthy(common.statFollowLinks('test/resources/').isDirectory()); // sanity check const result = shell.sort('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); diff --git a/test/tail.js b/test/tail.js index 328fb22ff..0942aabf8 100644 --- a/test/tail.js +++ b/test/tail.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; shell.config.silent = true; @@ -24,7 +25,7 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + t.truthy(common.statFollowLinks('test/resources/').isDirectory()); // sanity check const result = shell.tail('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); diff --git a/test/touch.js b/test/touch.js index 0221170f5..41b2107b1 100644 --- a/test/touch.js +++ b/test/touch.js @@ -4,6 +4,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; import utils from './utils/utils'; test.beforeEach(t => { @@ -21,7 +22,7 @@ function resetUtimes(f) { const d = new Date(); d.setYear(2000); fs.utimesSync(f, d, d); - return fs.statSync(f); + return common.statFollowLinks(f); } function tmpFile(t, noCreate) { @@ -98,23 +99,23 @@ test('uses a reference file for mtime', t => { t.falsy(shell.error()); t.is(result.code, 0); t.not( - fs.statSync(testFile).mtime.getTime(), - fs.statSync(testFile2).mtime.getTime() + common.statFollowLinks(testFile).mtime.getTime(), + common.statFollowLinks(testFile2).mtime.getTime() ); t.not( - fs.statSync(testFile).atime.getTime(), - fs.statSync(testFile2).atime.getTime() + common.statFollowLinks(testFile).atime.getTime(), + common.statFollowLinks(testFile2).atime.getTime() ); result = shell.touch({ '-r': testFile2 }, testFile); t.falsy(shell.error()); t.is(result.code, 0); t.is( - fs.statSync(testFile).mtime.getTime(), - fs.statSync(testFile2).mtime.getTime() + common.statFollowLinks(testFile).mtime.getTime(), + common.statFollowLinks(testFile2).mtime.getTime() ); t.is( - fs.statSync(testFile).atime.getTime(), - fs.statSync(testFile2).atime.getTime() + common.statFollowLinks(testFile).atime.getTime(), + common.statFollowLinks(testFile2).atime.getTime() ); }); @@ -123,8 +124,8 @@ test('sets mtime and atime by default', t => { const oldStat = resetUtimes(testFile); const result = shell.touch(testFile); t.is(result.code, 0); - t.truthy(oldStat.mtime < fs.statSync(testFile).mtime); - t.truthy(oldStat.atime < fs.statSync(testFile).atime); + t.truthy(oldStat.mtime < common.statFollowLinks(testFile).mtime); + t.truthy(oldStat.atime < common.statFollowLinks(testFile).atime); }); test('does not set mtime if told not to', t => { @@ -132,7 +133,7 @@ test('does not set mtime if told not to', t => { const oldStat = resetUtimes(testFile); const result = shell.touch('-a', testFile); t.is(result.code, 0); - t.is(oldStat.mtime.getTime(), fs.statSync(testFile).mtime.getTime()); + t.is(oldStat.mtime.getTime(), common.statFollowLinks(testFile).mtime.getTime()); }); test('does not set atime if told not to', t => { @@ -140,7 +141,7 @@ test('does not set atime if told not to', t => { const oldStat = resetUtimes(testFile); const result = shell.touch('-m', testFile); t.is(result.code, 0); - t.is(oldStat.atime.getTime(), fs.statSync(testFile).atime.getTime()); + t.is(oldStat.atime.getTime(), common.statFollowLinks(testFile).atime.getTime()); }); test('multiple files', t => { diff --git a/test/uniq.js b/test/uniq.js index c85df4e27..51881ff90 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import common from '../src/common'; shell.config.silent = true; @@ -24,7 +25,7 @@ test('file does not exist', t => { }); test('directory', t => { - t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + t.truthy(common.statFollowLinks('test/resources/').isDirectory()); // sanity check const result = shell.uniq('test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); @@ -32,7 +33,7 @@ test('directory', t => { }); test('output directory', t => { - t.truthy(fs.statSync('test/resources/').isDirectory()); // sanity check + t.truthy(common.statFollowLinks('test/resources/').isDirectory()); // sanity check const result = shell.uniq('test/resources/file1.txt', 'test/resources/'); t.truthy(shell.error()); t.is(result.code, 1); From 9e3f9abd2a2b66cae800783d62fb43b0122ea51f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 19 Oct 2017 13:19:52 -0700 Subject: [PATCH 155/338] refactor(exec): move child process to source file (#786) This PR refactors `shell.exec()` by putting its child process in a separate code file. This also slightly cleans up dead code. There's more potential to clean this up (e.g. exit status), but this is a good enough start. Issue #782 --- src/exec-child.js | 46 ++++++++++++++++++++++++++++ src/exec.js | 76 ++++++++++++++++++----------------------------- test/exec.js | 6 ++++ 3 files changed, 81 insertions(+), 47 deletions(-) create mode 100644 src/exec-child.js diff --git a/src/exec-child.js b/src/exec-child.js new file mode 100644 index 000000000..cd47597e6 --- /dev/null +++ b/src/exec-child.js @@ -0,0 +1,46 @@ +if (require.main !== module) { + throw new Error('This file should not be required'); +} + +var childProcess = require('child_process'); +var fs = require('fs'); + +// Note: this will break if `paramFilePath` contains special characters ( '\n', +// '\t', etc.). Such characters are possible if $TMP gets modified. We already +// rely on tempdir() to work for other things, so this is an acceptable risk. +var paramFilePath = process.argv[2]; + +var serializedParams = fs.readFileSync(paramFilePath, 'utf8'); +var params = JSON.parse(serializedParams); + +var cmd = params.command; +var execOptions = params.execOptions; +var pipe = params.pipe; +var stdoutFile = params.stdoutFile; +var stderrFile = params.stderrFile; +var codeFile = params.codeFile; + +var c = childProcess.exec(cmd, execOptions, function (err) { + if (!err) { + fs.writeFileSync(codeFile, '0'); + } else if (err.code === undefined) { + fs.writeFileSync(codeFile, '1'); + } else { + fs.writeFileSync(codeFile, err.code.toString()); + } +}); + +var stdoutStream = fs.createWriteStream(stdoutFile); +var stderrStream = fs.createWriteStream(stderrFile); + +c.stdout.pipe(stdoutStream, { end: false }); +c.stderr.pipe(stderrStream, { end: false }); +c.stdout.pipe(process.stdout); +c.stderr.pipe(process.stderr); + +if (pipe) { + c.stdin.end(pipe); +} + +c.stdout.on('end', stdoutStream.end); +c.stderr.on('end', stderrStream.end); diff --git a/src/exec.js b/src/exec.js index d425b5b21..936b36b7b 100644 --- a/src/exec.js +++ b/src/exec.js @@ -24,10 +24,10 @@ function execSync(cmd, opts, pipe) { } var tempDir = _tempDir(); - var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); - var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); var codeFile = path.resolve(tempDir + '/' + common.randomFileName()); - var scriptFile = path.resolve(tempDir + '/' + common.randomFileName()); + var paramsFile = path.resolve(tempDir + '/' + common.randomFileName()); + var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); + var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); opts = common.extend({ silent: common.config.silent, @@ -37,47 +37,29 @@ function execSync(cmd, opts, pipe) { encoding: 'utf8', }, opts); - if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); - if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); - if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); - - var execCommand = JSON.stringify(common.config.execPath) + ' ' + JSON.stringify(scriptFile); - var script; + if (fs.existsSync(paramsFile)) common.unlinkSync(paramsFile); + if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); + if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); opts.cwd = path.resolve(opts.cwd); - var optString = JSON.stringify(opts); - - script = [ - "var child = require('child_process')", - " , fs = require('fs');", - 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', - ' var fname = ' + JSON.stringify(codeFile) + ';', - ' if (!err) {', - ' fs.writeFileSync(fname, "0");', - ' } else if (err.code === undefined) {', - ' fs.writeFileSync(fname, "1");', - ' } else {', - ' fs.writeFileSync(fname, err.code.toString());', - ' }', - '});', - 'var stdoutStream = fs.createWriteStream(' + JSON.stringify(stdoutFile) + ');', - 'var stderrStream = fs.createWriteStream(' + JSON.stringify(stderrFile) + ');', - 'childProcess.stdout.pipe(stdoutStream, {end: false});', - 'childProcess.stderr.pipe(stderrStream, {end: false});', - 'childProcess.stdout.pipe(process.stdout);', - 'childProcess.stderr.pipe(process.stderr);', - ].join('\n') + - (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n') + - [ - 'var stdoutEnded = false, stderrEnded = false;', - 'function tryClosingStdout(){ if(stdoutEnded){ stdoutStream.end(); } }', - 'function tryClosingStderr(){ if(stderrEnded){ stderrStream.end(); } }', - "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosingStdout(); });", - "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosingStderr(); });", - ].join('\n'); - - fs.writeFileSync(scriptFile, script); + + var paramsToSerialize = { + command: cmd, + execOptions: opts, + pipe: pipe, + stdoutFile: stdoutFile, + stderrFile: stderrFile, + codeFile: codeFile, + }; + + fs.writeFileSync(paramsFile, JSON.stringify(paramsToSerialize), 'utf8'); + + var execCommand = [ + JSON.stringify(common.config.execPath), + JSON.stringify(path.join(__dirname, 'exec-child.js')), + JSON.stringify(paramsFile), + ].join(' '); /* istanbul ignore else */ if (opts.silent) { @@ -91,10 +73,10 @@ function execSync(cmd, opts, pipe) { child.execSync(execCommand, opts); } catch (e) { // Clean up immediately if we have an exception - try { common.unlinkSync(scriptFile); } catch (e2) {} - try { common.unlinkSync(stdoutFile); } catch (e2) {} - try { common.unlinkSync(stderrFile); } catch (e2) {} try { common.unlinkSync(codeFile); } catch (e2) {} + try { common.unlinkSync(paramsFile); } catch (e2) {} + try { common.unlinkSync(stderrFile); } catch (e2) {} + try { common.unlinkSync(stdoutFile); } catch (e2) {} throw e; } @@ -118,10 +100,10 @@ function execSync(cmd, opts, pipe) { } // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { common.unlinkSync(scriptFile); } catch (e) {} - try { common.unlinkSync(stdoutFile); } catch (e) {} - try { common.unlinkSync(stderrFile); } catch (e) {} try { common.unlinkSync(codeFile); } catch (e) {} + try { common.unlinkSync(paramsFile); } catch (e) {} + try { common.unlinkSync(stderrFile); } catch (e) {} + try { common.unlinkSync(stdoutFile); } catch (e) {} if (code !== 0) { common.error('', code, { continue: true }); diff --git a/test/exec.js b/test/exec.js index f2a1c00f3..cdd87a653 100644 --- a/test/exec.js +++ b/test/exec.js @@ -48,6 +48,12 @@ test('exec exits gracefully if we cannot find the execPath', t => { ); }); +test('cannot require exec-child.js', t => { + t.throws(() => { + require('../src/exec-child.js'); + }, /This file should not be required/); +}); + // // Valids // From 90165ba2f58ef73055368527c225e85e6065874f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 19 Oct 2017 23:06:24 -0700 Subject: [PATCH 156/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7427c2ab..a5cc21492 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,56 @@ # Change Log +## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) + +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.8...HEAD) + +**Closed issues:** + +- Is it possible to get a js library\(file\) for ShellJS [\#776](https://github.com/shelljs/shelljs/issues/776) +- 48, [\#774](https://github.com/shelljs/shelljs/issues/774) +- 47 [\#773](https://github.com/shelljs/shelljs/issues/773) +- getting different result from terminal and with shelljs [\#769](https://github.com/shelljs/shelljs/issues/769) +- test\(\) does not support -w and -x options [\#768](https://github.com/shelljs/shelljs/issues/768) +- Snyk "high severity" issue [\#766](https://github.com/shelljs/shelljs/issues/766) +- Snyk "high security [\#765](https://github.com/shelljs/shelljs/issues/765) +- Run second shell script [\#756](https://github.com/shelljs/shelljs/issues/756) +- shelljs seems NOT compatible with nexe under CentOS 6.5 [\#754](https://github.com/shelljs/shelljs/issues/754) +- Feature request: pushd/popd -q option [\#753](https://github.com/shelljs/shelljs/issues/753) +- cat doesn't support '-n' option [\#750](https://github.com/shelljs/shelljs/issues/750) +- shelljs run xcodebuild error [\#749](https://github.com/shelljs/shelljs/issues/749) +- Add wrappers around fs.statSync and fs.lstatSync [\#745](https://github.com/shelljs/shelljs/issues/745) +- Improve coverage for exec\(\) [\#742](https://github.com/shelljs/shelljs/issues/742) +- Improve coverage for head\(\) [\#741](https://github.com/shelljs/shelljs/issues/741) +- shelljs is no longer used in PDF.js [\#737](https://github.com/shelljs/shelljs/issues/737) +- ls doesn't follow links to directories [\#733](https://github.com/shelljs/shelljs/issues/733) +- Add test for `ls regular-file.txt` [\#732](https://github.com/shelljs/shelljs/issues/732) +- shelljs.exec hangs when password it's asked [\#716](https://github.com/shelljs/shelljs/issues/716) +- Clean up common tests [\#714](https://github.com/shelljs/shelljs/issues/714) +- Switch to os.homedir\(\) when we move to v4+ [\#683](https://github.com/shelljs/shelljs/issues/683) +- Can't run docker with exec\(\) \(the input device is not a TTY\) [\#680](https://github.com/shelljs/shelljs/issues/680) +- Cant get encoding buffer to work on exec [\#675](https://github.com/shelljs/shelljs/issues/675) +- Set up Codecov for the project [\#671](https://github.com/shelljs/shelljs/issues/671) +- ShellJS: internal error Error: EBUSY: resource busy or locked, lstat 'C:\pagefile.sys' [\#514](https://github.com/shelljs/shelljs/issues/514) +- Echo doesn't return value ending in a trailing newline [\#476](https://github.com/shelljs/shelljs/issues/476) + +**Merged pull requests:** + +- refactor\(exec\): move child process to source file [\#786](https://github.com/shelljs/shelljs/pull/786) ([nfischer](https://github.com/nfischer)) +- Remove unnecessary shell.error checks from common tests [\#785](https://github.com/shelljs/shelljs/pull/785) ([freitagbr](https://github.com/freitagbr)) +- Add a test for ls for a single file [\#784](https://github.com/shelljs/shelljs/pull/784) ([freitagbr](https://github.com/freitagbr)) +- Wrap fs.statSync and fs.lstatSync [\#783](https://github.com/shelljs/shelljs/pull/783) ([freitagbr](https://github.com/freitagbr)) +- chore: set AVA options [\#780](https://github.com/shelljs/shelljs/pull/780) ([nfischer](https://github.com/nfischer)) +- chore: clean up refs to unsupported node versions [\#779](https://github.com/shelljs/shelljs/pull/779) ([nfischer](https://github.com/nfischer)) +- Added `-q` \(quiet\) option to `push`, `popd`, `dirs` functions. [\#777](https://github.com/shelljs/shelljs/pull/777) ([alexreg](https://github.com/alexreg)) +- feat\(cat\): number output lines \(\#750\) [\#775](https://github.com/shelljs/shelljs/pull/775) ([gcca](https://github.com/gcca)) +- Fix ls not following links to directories by default [\#764](https://github.com/shelljs/shelljs/pull/764) ([freitagbr](https://github.com/freitagbr)) +- Add "encoding" option to exec [\#763](https://github.com/shelljs/shelljs/pull/763) ([freitagbr](https://github.com/freitagbr)) +- refactor\(test\): update AVA and refactor tests [\#760](https://github.com/shelljs/shelljs/pull/760) ([nfischer](https://github.com/nfischer)) +- chore: add skipOnWin and skipOnUnix test helpers [\#746](https://github.com/shelljs/shelljs/pull/746) ([nfischer](https://github.com/nfischer)) +- test\(exec\): add tests for coverage [\#744](https://github.com/shelljs/shelljs/pull/744) ([nfischer](https://github.com/nfischer)) +- test\(head\): improve coverage [\#743](https://github.com/shelljs/shelljs/pull/743) ([nfischer](https://github.com/nfischer)) +- Remove PDF.js mention from README.md [\#738](https://github.com/shelljs/shelljs/pull/738) ([voy](https://github.com/voy)) + ## [v0.7.8](https://github.com/shelljs/shelljs/tree/v0.7.8) (2017-06-07) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.7...v0.7.8) @@ -30,6 +81,7 @@ **Merged pull requests:** +- Merge dev into master [\#731](https://github.com/shelljs/shelljs/pull/731) ([freitagbr](https://github.com/freitagbr)) - Add node 8 to CI [\#730](https://github.com/shelljs/shelljs/pull/730) ([freitagbr](https://github.com/freitagbr)) - Deprecate common.getUserHome, advise using os.homedir instead [\#725](https://github.com/shelljs/shelljs/pull/725) ([freitagbr](https://github.com/freitagbr)) - fix\(mkdir\): improve error handling around files [\#721](https://github.com/shelljs/shelljs/pull/721) ([nfischer](https://github.com/nfischer)) From e9461dc5a7f9f8acf0bb21d23d6bd3ed9f2b23dc Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Mon, 23 Oct 2017 17:27:13 -0700 Subject: [PATCH 157/338] Add note to issue template about FAQ (#794) * Add note to issue template about FAQ * Use more general language in FAQ comment --- .github/ISSUE_TEMPLATE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 13d777fbc..172af387f 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,7 @@ + ### Node version (or tell us if you're using electron or some other framework): ### ShellJS version (the most recent version/Github branch you see the bug on): From b885590e0f005faa69ff10bd1b777367886df1ae Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 26 Oct 2017 20:33:04 -0700 Subject: [PATCH 158/338] Use execFileSync to launch child process (#790) This uses `child_process.execFileSync` instead of `execSync` to launch the child process. This further reduces the attack surface, removing a possible point for command injection in the ShellJS implementation. This does not affect backwards compatibility for the `shell.exec` API (the behavior is determined by the call to `child_process.exec` within `src/exec-child.js`). Issue #782 --- src/exec-child.js | 3 --- src/exec.js | 15 +++++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/exec-child.js b/src/exec-child.js index cd47597e6..798f31388 100644 --- a/src/exec-child.js +++ b/src/exec-child.js @@ -5,9 +5,6 @@ if (require.main !== module) { var childProcess = require('child_process'); var fs = require('fs'); -// Note: this will break if `paramFilePath` contains special characters ( '\n', -// '\t', etc.). Such characters are possible if $TMP gets modified. We already -// rely on tempdir() to work for other things, so this is an acceptable risk. var paramFilePath = process.argv[2]; var serializedParams = fs.readFileSync(paramFilePath, 'utf8'); diff --git a/src/exec.js b/src/exec.js index 936b36b7b..9a848e895 100644 --- a/src/exec.js +++ b/src/exec.js @@ -55,11 +55,10 @@ function execSync(cmd, opts, pipe) { fs.writeFileSync(paramsFile, JSON.stringify(paramsToSerialize), 'utf8'); - var execCommand = [ - JSON.stringify(common.config.execPath), - JSON.stringify(path.join(__dirname, 'exec-child.js')), - JSON.stringify(paramsFile), - ].join(' '); + var execArgs = [ + path.join(__dirname, 'exec-child.js'), + paramsFile, + ]; /* istanbul ignore else */ if (opts.silent) { @@ -70,7 +69,11 @@ function execSync(cmd, opts, pipe) { // Welcome to the future try { - child.execSync(execCommand, opts); + // Bad things if we pass in a `shell` option to child_process.execFileSync, + // so we need to explicitly remove it here. + delete opts.shell; + + child.execFileSync(common.config.execPath, execArgs, opts); } catch (e) { // Clean up immediately if we have an exception try { common.unlinkSync(codeFile); } catch (e2) {} From a187bd1b36ce28a5af214607257506ee28e1beb6 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 26 Oct 2017 21:29:26 -0700 Subject: [PATCH 159/338] Provide an API to pass parameters which resemble options (#792) This adds the special option string `--`, which means "no options". This can be passed if the first parameter looks like an option (starts with a `-` followed by 1+ letters). Fixes #778 --- README.md | 10 ++++++++++ src/common.js | 5 +++++ test/common.js | 12 ++++++++++++ test/grep.js | 6 ++++++ test/resources/grep/file2 | 3 +++ 5 files changed, 36 insertions(+) create mode 100644 test/resources/grep/file2 diff --git a/README.md b/README.md index 36087920e..169a5b9a1 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,16 @@ if (shell.exec('git commit -am "Auto-commit"').code !== 0) { } ``` +## Exclude options + +If you need to pass a parameter that looks like an option, you can do so like: + +```js +shell.grep('--', '-v', 'path/to/file'); // Search for "-v", no grep options + +shell.cp('-R', '-dir', 'outdir'); // If already using an option, you're done +``` + ## Global vs. Local We no longer recommend using a global-import for ShellJS (i.e. diff --git a/src/common.js b/src/common.js index 77e0306e4..7dad365a8 100644 --- a/src/common.js +++ b/src/common.js @@ -171,6 +171,11 @@ function parseOptions(opt, map, errorOptions) { throw new Error('parseOptions() internal error: errorOptions must be object'); } + if (opt === '--') { + // This means there are no options. + return {}; + } + // All options are false by default var options = {}; Object.keys(map).forEach(function (letter) { diff --git a/test/common.js b/test/common.js index b433f91ba..5e66c1b6c 100644 --- a/test/common.js +++ b/test/common.js @@ -264,6 +264,18 @@ test('common.parseOptions throws when passed a string not starting with "-"', t }, Error, "Options string must start with a '-'"); }); +test('common.parseOptions with -- argument', t => { + const result = common.parseOptions('--', { + R: 'recursive', + f: 'force', + r: 'reverse', + }); + + t.falsy(result.recursive); + t.falsy(result.force); + t.falsy(result.reverse); +}); + test('Some basic tests on the ShellString type', t => { const result = shell.ShellString('foo'); t.is(result.toString(), 'foo'); diff --git a/test/grep.js b/test/grep.js index 2fc62f50e..f450aabb1 100644 --- a/test/grep.js +++ b/test/grep.js @@ -136,3 +136,9 @@ test('-l option', t => { t.falsy(result.match(/file2.txt/)); t.is(result.split('\n').length - 1, 2); }); + +test('the pattern looks like an option', t => { + const result = shell.grep('--', '-v', 'test/resources/grep/file2'); + t.falsy(shell.error()); + t.is(result.toString(), '-v\n-vv\n'); +}); diff --git a/test/resources/grep/file2 b/test/resources/grep/file2 new file mode 100644 index 000000000..0c37715dc --- /dev/null +++ b/test/resources/grep/file2 @@ -0,0 +1,3 @@ +-v +-vv +-a From 8451fceb81abb252cba1144ff2a37362877b0079 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 30 Oct 2017 18:04:48 -0700 Subject: [PATCH 160/338] chore(eslint): use words instead of numbers (#797) Eslint rules can be configured either using words or number values: * "off" or 0 * "warn" or 1 * "error" or 2 This switches our config to use the string values instead of the number values, since the number values are too cryptic. No change to our actual settings. --- .eslintrc.json | 40 ++++++++++++++++++++-------------------- test/.eslintrc.json | 28 ++++++++++++++-------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index e712eeab2..7037c1760 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,26 +4,26 @@ }, "extends": "airbnb-base/legacy", "rules": { - "comma-dangle": [2, "always-multiline"], - "global-require": 0, - "vars-on-top": 0, - "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], - "no-param-reassign": 0, - "no-console": 0, - "curly": [2, "multi-line"], - "func-names": 0, - "quote-props": 0, - "no-underscore-dangle": 0, - "max-len": 0, - "no-use-before-define": 0, - "no-empty": 0, - "no-else-return": 0, - "no-throw-literal": 0, - "newline-per-chained-call": 0, - "consistent-return": 0, - "no-mixed-operators": 0, - "no-prototype-builtins": 0, - "new-cap": [2, { + "comma-dangle": ["error", "always-multiline"], + "global-require": "off", + "vars-on-top": "off", + "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], + "no-param-reassign": "off", + "no-console": "off", + "curly": ["error", "multi-line"], + "func-names": "off", + "quote-props": "off", + "no-underscore-dangle": "off", + "max-len": "off", + "no-use-before-define": "off", + "no-empty": "off", + "no-else-return": "off", + "no-throw-literal": "off", + "newline-per-chained-call": "off", + "consistent-return": "off", + "no-mixed-operators": "off", + "no-prototype-builtins": "off", + "new-cap": ["error", { "capIsNewExceptions": [ "ShellString" ]} diff --git a/test/.eslintrc.json b/test/.eslintrc.json index fd8099cb3..6f23f8ec4 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -4,20 +4,20 @@ }, "extends": "airbnb-base", "rules": { - "import/no-mutable-exports": 0, - "global-require": 0, - "vars-on-top": 0, - "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], - "no-param-reassign": 0, - "no-console": 0, - "curly": 0, - "no-var": 2, - "prefer-const": 2, - "prefer-template": 0, - "prefer-arrow-callback": 0, - "no-underscore-dangle": 0, - "max-len": 0, - "new-cap": [2, { + "import/no-mutable-exports": "off", + "global-require": "off", + "vars-on-top": "off", + "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], + "no-param-reassign": "off", + "no-console": "off", + "curly": "off", + "no-var": "error", + "prefer-const": "error", + "prefer-template": "off", + "prefer-arrow-callback": "off", + "no-underscore-dangle": "off", + "max-len": "off", + "new-cap": ["error", { "capIsNewExceptions": [ "ShellString" ]} From 6189d7f8e54456918520b469ec5074dd4c08875b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 31 Oct 2017 15:51:18 -0700 Subject: [PATCH 161/338] Remove codeFile parameter (#791) This parameter isn't needed, we can easily rely on exit code status for this. Eliminating the parameter reduces file IO, code complexity, and removes a busy loop. This also removes some legacy code related to streams. Issue #782 --- src/exec-child.js | 14 +++++--------- src/exec.js | 28 ++++++---------------------- 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/src/exec-child.js b/src/exec-child.js index 798f31388..eab86ed37 100644 --- a/src/exec-child.js +++ b/src/exec-child.js @@ -15,29 +15,25 @@ var execOptions = params.execOptions; var pipe = params.pipe; var stdoutFile = params.stdoutFile; var stderrFile = params.stderrFile; -var codeFile = params.codeFile; var c = childProcess.exec(cmd, execOptions, function (err) { if (!err) { - fs.writeFileSync(codeFile, '0'); + process.exitCode = 0; } else if (err.code === undefined) { - fs.writeFileSync(codeFile, '1'); + process.exitCode = 1; } else { - fs.writeFileSync(codeFile, err.code.toString()); + process.exitCode = err.code; } }); var stdoutStream = fs.createWriteStream(stdoutFile); var stderrStream = fs.createWriteStream(stderrFile); -c.stdout.pipe(stdoutStream, { end: false }); -c.stderr.pipe(stderrStream, { end: false }); +c.stdout.pipe(stdoutStream); +c.stderr.pipe(stderrStream); c.stdout.pipe(process.stdout); c.stderr.pipe(process.stderr); if (pipe) { c.stdin.end(pipe); } - -c.stdout.on('end', stdoutStream.end); -c.stderr.on('end', stderrStream.end); diff --git a/src/exec.js b/src/exec.js index 9a848e895..03f9826b5 100644 --- a/src/exec.js +++ b/src/exec.js @@ -13,18 +13,14 @@ common.register('exec', _exec, { wrapOutput: false, }); -// Hack to run child_process.exec() synchronously (sync avoids callback hell) -// Uses a custom wait loop that checks for a flag file, created when the child process is done. -// (Can't do a wait loop that checks for internal Node variables/messages as -// Node is single-threaded; callbacks and other internal state changes are done in the -// event loop). +// We use this function to run exec synchronously while also providing realtime +// output. function execSync(cmd, opts, pipe) { if (!common.config.execPath) { common.error('Unable to find a path to the node binary. Please manually set config.execPath'); } var tempDir = _tempDir(); - var codeFile = path.resolve(tempDir + '/' + common.randomFileName()); var paramsFile = path.resolve(tempDir + '/' + common.randomFileName()); var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); @@ -37,7 +33,6 @@ function execSync(cmd, opts, pipe) { encoding: 'utf8', }, opts); - if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); if (fs.existsSync(paramsFile)) common.unlinkSync(paramsFile); if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); @@ -50,7 +45,6 @@ function execSync(cmd, opts, pipe) { pipe: pipe, stdoutFile: stdoutFile, stderrFile: stderrFile, - codeFile: codeFile, }; fs.writeFileSync(paramsFile, JSON.stringify(paramsToSerialize), 'utf8'); @@ -67,6 +61,8 @@ function execSync(cmd, opts, pipe) { opts.stdio = [0, 1, 2]; } + var code = 0; + // Welcome to the future try { // Bad things if we pass in a `shell` option to child_process.execFileSync, @@ -75,19 +71,8 @@ function execSync(cmd, opts, pipe) { child.execFileSync(common.config.execPath, execArgs, opts); } catch (e) { - // Clean up immediately if we have an exception - try { common.unlinkSync(codeFile); } catch (e2) {} - try { common.unlinkSync(paramsFile); } catch (e2) {} - try { common.unlinkSync(stderrFile); } catch (e2) {} - try { common.unlinkSync(stdoutFile); } catch (e2) {} - throw e; - } - - // At this point codeFile exists, but it's not necessarily flushed yet. - // Keep reading it until it is. - var code = parseInt('', 10); - while (isNaN(code)) { - code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); + // Commands with non-zero exit code raise an exception. + code = e.status; } // fs.readFileSync uses buffer encoding by default, so call @@ -103,7 +88,6 @@ function execSync(cmd, opts, pipe) { } // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { common.unlinkSync(codeFile); } catch (e) {} try { common.unlinkSync(paramsFile); } catch (e) {} try { common.unlinkSync(stderrFile); } catch (e) {} try { common.unlinkSync(stdoutFile); } catch (e) {} From 8ab0a3a3931b59215553730ad86adef8b21a0fa0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 13 Nov 2017 22:55:41 -0800 Subject: [PATCH 162/338] chore: update nyc dependency (#805) This is to fix an issue related to the most recent node 8.x.y versions. Fixes #803 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eea927891..59cfa5292 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "eslint": "^2.0.0", "eslint-config-airbnb-base": "^3.0.0", "eslint-plugin-import": "^1.11.1", - "nyc": "^10.0.0", + "nyc": "^11.3.0", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.2.0", "shx": "^0.2.0", From 64d5899abc86dd7b7fa84455c0ce3551786c4b5b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 16 Nov 2017 12:43:54 -0800 Subject: [PATCH 163/338] refactor(exec): remove paramsFile (#807) The `paramsFile` is obsolete now that we use `execFileSync()` for our internal implementation. Instead, we pass parameters to the child process directly as a single commandline parameter to reduce file I/O. Issue #782 --- src/exec-child.js | 5 +---- src/exec.js | 7 +------ 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/exec-child.js b/src/exec-child.js index eab86ed37..4859e0328 100644 --- a/src/exec-child.js +++ b/src/exec-child.js @@ -5,10 +5,7 @@ if (require.main !== module) { var childProcess = require('child_process'); var fs = require('fs'); -var paramFilePath = process.argv[2]; - -var serializedParams = fs.readFileSync(paramFilePath, 'utf8'); -var params = JSON.parse(serializedParams); +var params = JSON.parse(process.argv[2]); var cmd = params.command; var execOptions = params.execOptions; diff --git a/src/exec.js b/src/exec.js index 03f9826b5..ea5793488 100644 --- a/src/exec.js +++ b/src/exec.js @@ -21,7 +21,6 @@ function execSync(cmd, opts, pipe) { } var tempDir = _tempDir(); - var paramsFile = path.resolve(tempDir + '/' + common.randomFileName()); var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); @@ -33,7 +32,6 @@ function execSync(cmd, opts, pipe) { encoding: 'utf8', }, opts); - if (fs.existsSync(paramsFile)) common.unlinkSync(paramsFile); if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); @@ -47,11 +45,9 @@ function execSync(cmd, opts, pipe) { stderrFile: stderrFile, }; - fs.writeFileSync(paramsFile, JSON.stringify(paramsToSerialize), 'utf8'); - var execArgs = [ path.join(__dirname, 'exec-child.js'), - paramsFile, + JSON.stringify(paramsToSerialize), ]; /* istanbul ignore else */ @@ -88,7 +84,6 @@ function execSync(cmd, opts, pipe) { } // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { common.unlinkSync(paramsFile); } catch (e) {} try { common.unlinkSync(stderrFile); } catch (e) {} try { common.unlinkSync(stdoutFile); } catch (e) {} From a2343d0eabf904b7abbf8213876d8b7ae621d576 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 16 Nov 2017 12:44:51 -0800 Subject: [PATCH 164/338] refactor: harden plugins against unknown options (#804) This reworks the plugin API such that: - Unable to register a command with unknown wrap-options - `TypeError` raised for wrap-option type mistakes - Remove the `overWrite` option (it's unused, probably safest to not expose for now) - `cmdOptions` defaults to `null` instead of `false` for type consistency (no change to default behavior) - Move `pipeMethods` logic into `_register`, since it makes more sense there This is not expected to have any effect on existing plugins. --- src/common.js | 34 +++++++++++++++++++++++----------- test/plugin.js | 23 +++++++++++++++++++++-- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/common.js b/src/common.js index 7dad365a8..facd72fe1 100644 --- a/src/common.js +++ b/src/common.js @@ -52,9 +52,6 @@ exports.state = state; delete process.env.OLDPWD; // initially, there's no previous directory -// This is populated by calls to commonl.wrap() -var pipeMethods = []; - // Reliably test if something is any sort of javascript object function isObject(a) { return typeof a === 'object' && a !== null; @@ -315,9 +312,6 @@ exports.randomFileName = randomFileName; // command-logging, and other nice things function wrap(cmd, fn, options) { options = options || {}; - if (options.canReceivePipe) { - pipeMethods.push(cmd); - } return function () { var retValue = null; @@ -428,22 +422,36 @@ exports.readFromPipe = _readFromPipe; var DEFAULT_WRAP_OPTIONS = { allowGlobbing: true, canReceivePipe: false, - cmdOptions: false, + cmdOptions: null, globStart: 1, pipeOnly: false, - unix: true, wrapOutput: true, - overWrite: false, + unix: true, }; +// This is populated during plugin registration +var pipeMethods = []; + // Register a new ShellJS command function _register(name, implementation, wrapOptions) { wrapOptions = wrapOptions || {}; + + // Validate options + Object.keys(wrapOptions).forEach(function (option) { + if (!DEFAULT_WRAP_OPTIONS.hasOwnProperty(option)) { + throw new Error("Unknown option '" + option + "'"); + } + if (typeof wrapOptions[option] !== typeof DEFAULT_WRAP_OPTIONS[option]) { + throw new TypeError("Unsupported type '" + typeof wrapOptions[option] + + "' for option '" + option + "'"); + } + }); + // If an option isn't specified, use the default wrapOptions = Object.assign({}, DEFAULT_WRAP_OPTIONS, wrapOptions); - if (shell[name] && !wrapOptions.overWrite) { - throw new Error('unable to overwrite `' + name + '` command'); + if (shell[name]) { + throw new Error('Command `' + name + '` already exists'); } if (wrapOptions.pipeOnly) { @@ -452,5 +460,9 @@ function _register(name, implementation, wrapOptions) { } else { shell[name] = wrap(name, implementation, wrapOptions); } + + if (wrapOptions.canReceivePipe) { + pipeMethods.push(name); + } } exports.register = _register; diff --git a/test/plugin.js b/test/plugin.js index e8a2bbc4f..bafe2a050 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -39,6 +39,25 @@ test.beforeEach(() => { shell.config.resetForTesting(); }); +// +// Invalids +// + +test('Unable to register a plugin with unknown options', t => { + t.throws(() => { + plugin.register('foo', fooImplementation, { + foobar: true, + }); + }, Error); +}); + +test('Unable to register a plugin with wrong option types', t => { + t.throws(() => { + plugin.register('foo', fooImplementation, { + wrapOutput: 'true', // should be a boolean + }); + }, TypeError); +}); // // Valids @@ -139,10 +158,10 @@ test('Plugins can continue from errors', t => { t.is(shell.error(), 'foo: Error, but continuing'); }); -test('Cannot overwrite an existing command by default', t => { +test('Cannot overwrite an existing command', t => { const oldCat = shell.cat; t.throws(() => { plugin.register('cat', fooImplementation); - }, 'unable to overwrite `cat` command'); + }, 'Command `cat` already exists'); t.is(shell.cat, oldCat); }); From 0b65d2a06d3edf3bf4d60a20e744bffdd0f06d4a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 11 Jan 2018 00:21:20 -0800 Subject: [PATCH 165/338] chore: update CI to Node v9 (#811) Fixes #799 --- .travis.yml | 1 + appveyor.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 90f780524..02a02fa5c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ env: - NODE_VERSION="6" - NODE_VERSION="7" - NODE_VERSION="8" + - NODE_VERSION="9" # keep this blank to make sure there are no before_install steps before_install: diff --git a/appveyor.yml b/appveyor.yml index ad698e448..3c7952800 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,6 @@ environment: matrix: + - nodejs_version: '9' - nodejs_version: '8' - nodejs_version: '7' - nodejs_version: '6' From 8f8119cfae6e26d7bed39becaebf451cf49331dd Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 11 Jan 2018 21:12:42 -0800 Subject: [PATCH 166/338] docs: announce plugin API (#812) Fixes #391 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 169a5b9a1..d5f577951 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,12 @@ $ shx touch foo/bar.txt $ shx rm -rf foo ``` +## Plugin API + +ShellJS now supports third-party plugins! You can learn more about using plugins +and writing your own ShellJS commands in [the +wiki](https://github.com/shelljs/shelljs/wiki/Using-ShellJS-Plugins). + ## A quick note about the docs For documentation on all the latest features, check out our From ec0d60aecf79513070786a1402b90c192ae1824e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 11 Jan 2018 23:13:59 -0800 Subject: [PATCH 167/338] 0.8.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59cfa5292..08076f63d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.8", + "version": "0.8.0", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 902e49c0f81834c4da61ace740cc285417b3c5d3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 11 Jan 2018 23:27:50 -0800 Subject: [PATCH 168/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5cc21492..35171d608 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,23 @@ # Change Log -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) - -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.8...HEAD) +## [v0.8.0](https://github.com/shelljs/shelljs/tree/v0.8.0) (2018-01-12) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.8...v0.8.0) **Closed issues:** +- Snyk vulnerability DB reporting command injection vulnerability in ShellJS [\#810](https://github.com/shelljs/shelljs/issues/810) +- chore: upgrade nyc [\#803](https://github.com/shelljs/shelljs/issues/803) +- Update CI to use Node v9 [\#799](https://github.com/shelljs/shelljs/issues/799) +- Link to FAQ wiki section in our issue template [\#787](https://github.com/shelljs/shelljs/issues/787) - Is it possible to get a js library\(file\) for ShellJS [\#776](https://github.com/shelljs/shelljs/issues/776) - 48, [\#774](https://github.com/shelljs/shelljs/issues/774) - 47 [\#773](https://github.com/shelljs/shelljs/issues/773) +- Exec function calls JSON.stringify on command [\#772](https://github.com/shelljs/shelljs/issues/772) - getting different result from terminal and with shelljs [\#769](https://github.com/shelljs/shelljs/issues/769) - test\(\) does not support -w and -x options [\#768](https://github.com/shelljs/shelljs/issues/768) - Snyk "high severity" issue [\#766](https://github.com/shelljs/shelljs/issues/766) - Snyk "high security [\#765](https://github.com/shelljs/shelljs/issues/765) +- ShellJS doesn't respect NPM Registry being set outside of it [\#761](https://github.com/shelljs/shelljs/issues/761) - Run second shell script [\#756](https://github.com/shelljs/shelljs/issues/756) - shelljs seems NOT compatible with nexe under CentOS 6.5 [\#754](https://github.com/shelljs/shelljs/issues/754) - Feature request: pushd/popd -q option [\#753](https://github.com/shelljs/shelljs/issues/753) @@ -26,15 +31,29 @@ - Add test for `ls regular-file.txt` [\#732](https://github.com/shelljs/shelljs/issues/732) - shelljs.exec hangs when password it's asked [\#716](https://github.com/shelljs/shelljs/issues/716) - Clean up common tests [\#714](https://github.com/shelljs/shelljs/issues/714) -- Switch to os.homedir\(\) when we move to v4+ [\#683](https://github.com/shelljs/shelljs/issues/683) - Can't run docker with exec\(\) \(the input device is not a TTY\) [\#680](https://github.com/shelljs/shelljs/issues/680) - Cant get encoding buffer to work on exec [\#675](https://github.com/shelljs/shelljs/issues/675) - Set up Codecov for the project [\#671](https://github.com/shelljs/shelljs/issues/671) - ShellJS: internal error Error: EBUSY: resource busy or locked, lstat 'C:\pagefile.sys' [\#514](https://github.com/shelljs/shelljs/issues/514) +- Feature request: provide a way to skip option parsing [\#778](https://github.com/shelljs/shelljs/issues/778) +- Switch to os.homedir\(\) when we move to v4+ [\#683](https://github.com/shelljs/shelljs/issues/683) +- Drop support for v0.12 [\#647](https://github.com/shelljs/shelljs/issues/647) +- feature: echo -n [\#559](https://github.com/shelljs/shelljs/issues/559) +- Don't kill the node process upon unexpected error [\#483](https://github.com/shelljs/shelljs/issues/483) - Echo doesn't return value ending in a trailing newline [\#476](https://github.com/shelljs/shelljs/issues/476) +- Synchronous exec stalls permenantly when there is an error/w the shell [\#7](https://github.com/shelljs/shelljs/issues/7) **Merged pull requests:** +- docs: announce plugin API [\#812](https://github.com/shelljs/shelljs/pull/812) ([nfischer](https://github.com/nfischer)) +- chore: update CI to Node v9 [\#811](https://github.com/shelljs/shelljs/pull/811) ([nfischer](https://github.com/nfischer)) +- refactor\(exec\): remove paramsFile [\#807](https://github.com/shelljs/shelljs/pull/807) ([nfischer](https://github.com/nfischer)) +- chore: update nyc dependency [\#805](https://github.com/shelljs/shelljs/pull/805) ([nfischer](https://github.com/nfischer)) +- refactor: harden plugins against unknown options [\#804](https://github.com/shelljs/shelljs/pull/804) ([nfischer](https://github.com/nfischer)) +- chore\(eslint\): use words instead of numbers [\#797](https://github.com/shelljs/shelljs/pull/797) ([nfischer](https://github.com/nfischer)) +- Add note to issue template about FAQ [\#794](https://github.com/shelljs/shelljs/pull/794) ([freitagbr](https://github.com/freitagbr)) +- Remove codeFile parameter [\#791](https://github.com/shelljs/shelljs/pull/791) ([nfischer](https://github.com/nfischer)) +- Use execFileSync to launch child process [\#790](https://github.com/shelljs/shelljs/pull/790) ([nfischer](https://github.com/nfischer)) - refactor\(exec\): move child process to source file [\#786](https://github.com/shelljs/shelljs/pull/786) ([nfischer](https://github.com/nfischer)) - Remove unnecessary shell.error checks from common tests [\#785](https://github.com/shelljs/shelljs/pull/785) ([freitagbr](https://github.com/freitagbr)) - Add a test for ls for a single file [\#784](https://github.com/shelljs/shelljs/pull/784) ([freitagbr](https://github.com/freitagbr)) @@ -43,13 +62,19 @@ - chore: clean up refs to unsupported node versions [\#779](https://github.com/shelljs/shelljs/pull/779) ([nfischer](https://github.com/nfischer)) - Added `-q` \(quiet\) option to `push`, `popd`, `dirs` functions. [\#777](https://github.com/shelljs/shelljs/pull/777) ([alexreg](https://github.com/alexreg)) - feat\(cat\): number output lines \(\#750\) [\#775](https://github.com/shelljs/shelljs/pull/775) ([gcca](https://github.com/gcca)) -- Fix ls not following links to directories by default [\#764](https://github.com/shelljs/shelljs/pull/764) ([freitagbr](https://github.com/freitagbr)) -- Add "encoding" option to exec [\#763](https://github.com/shelljs/shelljs/pull/763) ([freitagbr](https://github.com/freitagbr)) - refactor\(test\): update AVA and refactor tests [\#760](https://github.com/shelljs/shelljs/pull/760) ([nfischer](https://github.com/nfischer)) - chore: add skipOnWin and skipOnUnix test helpers [\#746](https://github.com/shelljs/shelljs/pull/746) ([nfischer](https://github.com/nfischer)) - test\(exec\): add tests for coverage [\#744](https://github.com/shelljs/shelljs/pull/744) ([nfischer](https://github.com/nfischer)) - test\(head\): improve coverage [\#743](https://github.com/shelljs/shelljs/pull/743) ([nfischer](https://github.com/nfischer)) - Remove PDF.js mention from README.md [\#738](https://github.com/shelljs/shelljs/pull/738) ([voy](https://github.com/voy)) +- Provide an API to pass parameters which resemble options [\#792](https://github.com/shelljs/shelljs/pull/792) ([nfischer](https://github.com/nfischer)) +- Fix ls not following links to directories by default [\#764](https://github.com/shelljs/shelljs/pull/764) ([freitagbr](https://github.com/freitagbr)) +- Add "encoding" option to exec [\#763](https://github.com/shelljs/shelljs/pull/763) ([freitagbr](https://github.com/freitagbr)) +- Merge dev into master [\#731](https://github.com/shelljs/shelljs/pull/731) ([freitagbr](https://github.com/freitagbr)) +- Deprecate common.getUserHome, advise using os.homedir instead [\#725](https://github.com/shelljs/shelljs/pull/725) ([freitagbr](https://github.com/freitagbr)) +- Echo test mocks [\#708](https://github.com/shelljs/shelljs/pull/708) ([freitagbr](https://github.com/freitagbr)) +- Safely exit by throwing an error [\#546](https://github.com/shelljs/shelljs/pull/546) ([freitagbr](https://github.com/freitagbr)) +- chore\(make\): depreciate shelljs/make [\#431](https://github.com/shelljs/shelljs/pull/431) ([ariporad](https://github.com/ariporad)) ## [v0.7.8](https://github.com/shelljs/shelljs/tree/v0.7.8) (2017-06-07) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.7...v0.7.8) @@ -81,14 +106,11 @@ **Merged pull requests:** -- Merge dev into master [\#731](https://github.com/shelljs/shelljs/pull/731) ([freitagbr](https://github.com/freitagbr)) - Add node 8 to CI [\#730](https://github.com/shelljs/shelljs/pull/730) ([freitagbr](https://github.com/freitagbr)) -- Deprecate common.getUserHome, advise using os.homedir instead [\#725](https://github.com/shelljs/shelljs/pull/725) ([freitagbr](https://github.com/freitagbr)) - fix\(mkdir\): improve error handling around files [\#721](https://github.com/shelljs/shelljs/pull/721) ([nfischer](https://github.com/nfischer)) - Properly handle directories as arguments [\#713](https://github.com/shelljs/shelljs/pull/713) ([nfischer](https://github.com/nfischer)) - Add common.buffer [\#710](https://github.com/shelljs/shelljs/pull/710) ([freitagbr](https://github.com/freitagbr)) - Fix common.expand error [\#709](https://github.com/shelljs/shelljs/pull/709) ([freitagbr](https://github.com/freitagbr)) -- Echo test mocks [\#708](https://github.com/shelljs/shelljs/pull/708) ([freitagbr](https://github.com/freitagbr)) - refactor: remove unnecessary common.js imports [\#703](https://github.com/shelljs/shelljs/pull/703) ([nfischer](https://github.com/nfischer)) - Fix \#631 throw error when overwriting recently created file [\#702](https://github.com/shelljs/shelljs/pull/702) ([uttpal](https://github.com/uttpal)) - Small clarification of verbose flag [\#691](https://github.com/shelljs/shelljs/pull/691) ([zommerfelds](https://github.com/zommerfelds)) @@ -108,7 +130,6 @@ - Difference between bash ls -R and ShellJS ls -R with symlinks [\#666](https://github.com/shelljs/shelljs/issues/666) - Refactor which\(\) \(too many repeated code blocks\) [\#656](https://github.com/shelljs/shelljs/issues/656) - find\(\) raises error when unable to find any files matching, expected to return empty array. [\#653](https://github.com/shelljs/shelljs/issues/653) -- Drop support for v0.12 [\#647](https://github.com/shelljs/shelljs/issues/647) - Reformat the markdown in RELEASE.md [\#642](https://github.com/shelljs/shelljs/issues/642) - rm -rf doesn't work if the directory contains an asar archive in Electron [\#618](https://github.com/shelljs/shelljs/issues/618) - Add support for other file types in rm [\#617](https://github.com/shelljs/shelljs/issues/617) @@ -165,7 +186,6 @@ - write to file [\#568](https://github.com/shelljs/shelljs/issues/568) - Cannot figure out how to disable globbing for rm [\#567](https://github.com/shelljs/shelljs/issues/567) - Switch to the ava test framework [\#560](https://github.com/shelljs/shelljs/issues/560) -- feature: echo -n [\#559](https://github.com/shelljs/shelljs/issues/559) - Option not recognized [\#556](https://github.com/shelljs/shelljs/issues/556) - chore: add @freitagbr to LGTM maintainers [\#552](https://github.com/shelljs/shelljs/issues/552) - chore: set up dev branch [\#548](https://github.com/shelljs/shelljs/issues/548) @@ -179,7 +199,6 @@ - Feature request: allow `common.error\(\)` to optionally not insert a prefix and optionally not print to console [\#523](https://github.com/shelljs/shelljs/issues/523) - Feature request: Add "shelljs.unlink" [\#519](https://github.com/shelljs/shelljs/issues/519) - Sed should allow a replacement string to contain `\1` for match groups [\#507](https://github.com/shelljs/shelljs/issues/507) -- Don't kill the node process upon unexpected error [\#483](https://github.com/shelljs/shelljs/issues/483) - Usage with neodoc [\#445](https://github.com/shelljs/shelljs/issues/445) - \[ Feature idea \] synchronous sleep command [\#441](https://github.com/shelljs/shelljs/issues/441) - Improve test coverage [\#347](https://github.com/shelljs/shelljs/issues/347) @@ -249,7 +268,6 @@ - Add Brandon Freitag to maintainers/contributors [\#553](https://github.com/shelljs/shelljs/pull/553) ([freitagbr](https://github.com/freitagbr)) - Get pipe tests running on Windows. [\#550](https://github.com/shelljs/shelljs/pull/550) ([binki](https://github.com/binki)) - fix: maxdepth doesn't limit total number of copies [\#549](https://github.com/shelljs/shelljs/pull/549) ([nfischer](https://github.com/nfischer)) -- Safely exit by throwing an error [\#546](https://github.com/shelljs/shelljs/pull/546) ([freitagbr](https://github.com/freitagbr)) - Fix lint warning [\#543](https://github.com/shelljs/shelljs/pull/543) ([freitagbr](https://github.com/freitagbr)) - chore: remove v0.10 from Travis CI [\#540](https://github.com/shelljs/shelljs/pull/540) ([nfischer](https://github.com/nfischer)) - chore: add Node v7 for CI [\#539](https://github.com/shelljs/shelljs/pull/539) ([nfischer](https://github.com/nfischer)) @@ -270,7 +288,6 @@ - ShellJS in Electron package don't find ffmpeg anymore [\#516](https://github.com/shelljs/shelljs/issues/516) - Exec issues with string option introduced in 0.7.4 [\#515](https://github.com/shelljs/shelljs/issues/515) - \[ Feature \] SSH command [\#435](https://github.com/shelljs/shelljs/issues/435) -- Synchronous exec stalls permenantly when there is an error/w the shell [\#7](https://github.com/shelljs/shelljs/issues/7) **Merged pull requests:** @@ -372,7 +389,6 @@ - docs: comment code better to help contributors [\#437](https://github.com/shelljs/shelljs/pull/437) ([nfischer](https://github.com/nfischer)) - chore\(CI\): update appveyor [\#436](https://github.com/shelljs/shelljs/pull/436) ([nfischer](https://github.com/nfischer)) - chore: test against node v6 [\#433](https://github.com/shelljs/shelljs/pull/433) ([nfischer](https://github.com/nfischer)) -- chore\(make\): depreciate shelljs/make [\#431](https://github.com/shelljs/shelljs/pull/431) ([ariporad](https://github.com/ariporad)) - docs: warn that README contains newest features [\#410](https://github.com/shelljs/shelljs/pull/410) ([nfischer](https://github.com/nfischer)) ## [v0.7.0](https://github.com/shelljs/shelljs/tree/v0.7.0) (2016-04-25) @@ -631,7 +647,7 @@ - Breaking: Allow -- as args separators \(fixes \#188\) [\#207](https://github.com/shelljs/shelljs/pull/207) ([nzakas](https://github.com/nzakas)) - Update .travis.yml [\#190](https://github.com/shelljs/shelljs/pull/190) ([arturadib](https://github.com/arturadib)) -- Use new child\_process.execSync instead of busywaiting [\#189](https://github.com/shelljs/shelljs/pull/189) ([devTristan](https://github.com/devTristan)) +- Use new child\_process.execSync instead of busywaiting [\#189](https://github.com/shelljs/shelljs/pull/189) ([madd512](https://github.com/madd512)) - Update README.md: explains how to access "config" [\#145](https://github.com/shelljs/shelljs/pull/145) ([kerphi](https://github.com/kerphi)) - Fix to set state.error before throw the exception [\#120](https://github.com/shelljs/shelljs/pull/120) ([abdul-martinez](https://github.com/abdul-martinez)) - Add -l and -s support to grep. [\#116](https://github.com/shelljs/shelljs/pull/116) ([idearat](https://github.com/idearat)) From cb9cf276cb0286ad4c54ed8a4d2a5f437b211043 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 19 Jan 2018 16:33:34 -0800 Subject: [PATCH 169/338] Revert "refactor(exec): remove paramsFile (#807)" (#819) This reverts commit 64d5899abc86dd7b7fa84455c0ce3551786c4b5b. Reason for revert: If stdin is large, then the param object can become an extremely long string, exceeding the maximum OS size limit on commandline parameters. Original change's description: > refactor(exec): remove paramsFile (#807) > > The `paramsFile` is obsolete now that we use `execFileSync()` for our > internal implementation. Instead, we pass parameters to the child > process directly as a single commandline parameter to reduce file I/O. > > Issue #782 Fixes #818 --- src/exec-child.js | 5 ++++- src/exec.js | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/exec-child.js b/src/exec-child.js index 4859e0328..eab86ed37 100644 --- a/src/exec-child.js +++ b/src/exec-child.js @@ -5,7 +5,10 @@ if (require.main !== module) { var childProcess = require('child_process'); var fs = require('fs'); -var params = JSON.parse(process.argv[2]); +var paramFilePath = process.argv[2]; + +var serializedParams = fs.readFileSync(paramFilePath, 'utf8'); +var params = JSON.parse(serializedParams); var cmd = params.command; var execOptions = params.execOptions; diff --git a/src/exec.js b/src/exec.js index ea5793488..03f9826b5 100644 --- a/src/exec.js +++ b/src/exec.js @@ -21,6 +21,7 @@ function execSync(cmd, opts, pipe) { } var tempDir = _tempDir(); + var paramsFile = path.resolve(tempDir + '/' + common.randomFileName()); var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); @@ -32,6 +33,7 @@ function execSync(cmd, opts, pipe) { encoding: 'utf8', }, opts); + if (fs.existsSync(paramsFile)) common.unlinkSync(paramsFile); if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); @@ -45,9 +47,11 @@ function execSync(cmd, opts, pipe) { stderrFile: stderrFile, }; + fs.writeFileSync(paramsFile, JSON.stringify(paramsToSerialize), 'utf8'); + var execArgs = [ path.join(__dirname, 'exec-child.js'), - JSON.stringify(paramsToSerialize), + paramsFile, ]; /* istanbul ignore else */ @@ -84,6 +88,7 @@ function execSync(cmd, opts, pipe) { } // No biggie if we can't erase the files now -- they're in a temp dir anyway + try { common.unlinkSync(paramsFile); } catch (e) {} try { common.unlinkSync(stderrFile); } catch (e) {} try { common.unlinkSync(stdoutFile); } catch (e) {} From 7058d63048e65d33d62b8ba1160f7e852f8f118c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 20 Jan 2018 14:58:43 -0800 Subject: [PATCH 170/338] 0.8.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 08076f63d..e22598d11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.8.0", + "version": "0.8.1", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From bbcfa5c63eec76e01340e6d2434935701ba22c66 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 20 Jan 2018 15:17:50 -0800 Subject: [PATCH 171/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35171d608..89409338a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## [v0.8.1](https://github.com/shelljs/shelljs/tree/v0.8.1) (2018-01-20) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.0...v0.8.1) + +**Closed issues:** + +- Exec failing with internal error when piping large output [\#818](https://github.com/shelljs/shelljs/issues/818) +- Shelljs exec\(\) not executing variables [\#815](https://github.com/shelljs/shelljs/issues/815) +- support for node-0.10.\* is broken [\#814](https://github.com/shelljs/shelljs/issues/814) +- using sed to replace just the first occurrence of a string [\#813](https://github.com/shelljs/shelljs/issues/813) + +**Merged pull requests:** + +- Revert "refactor\(exec\): remove paramsFile \(\#807\)" [\#819](https://github.com/shelljs/shelljs/pull/819) ([nfischer](https://github.com/nfischer)) + ## [v0.8.0](https://github.com/shelljs/shelljs/tree/v0.8.0) (2018-01-12) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.8...v0.8.0) @@ -29,9 +43,7 @@ - shelljs is no longer used in PDF.js [\#737](https://github.com/shelljs/shelljs/issues/737) - ls doesn't follow links to directories [\#733](https://github.com/shelljs/shelljs/issues/733) - Add test for `ls regular-file.txt` [\#732](https://github.com/shelljs/shelljs/issues/732) -- shelljs.exec hangs when password it's asked [\#716](https://github.com/shelljs/shelljs/issues/716) - Clean up common tests [\#714](https://github.com/shelljs/shelljs/issues/714) -- Can't run docker with exec\(\) \(the input device is not a TTY\) [\#680](https://github.com/shelljs/shelljs/issues/680) - Cant get encoding buffer to work on exec [\#675](https://github.com/shelljs/shelljs/issues/675) - Set up Codecov for the project [\#671](https://github.com/shelljs/shelljs/issues/671) - ShellJS: internal error Error: EBUSY: resource busy or locked, lstat 'C:\pagefile.sys' [\#514](https://github.com/shelljs/shelljs/issues/514) @@ -192,7 +204,6 @@ - bug: cp\(\) doesn't always copy everything [\#547](https://github.com/shelljs/shelljs/issues/547) - User-friendly lint command [\#544](https://github.com/shelljs/shelljs/issues/544) - Lint warning [\#542](https://github.com/shelljs/shelljs/issues/542) -- Possible Regression: cp from 0.6.0 to 0.7.x version [\#538](https://github.com/shelljs/shelljs/issues/538) - chore: add nodejs v7 to CI [\#537](https://github.com/shelljs/shelljs/issues/537) - error.code is not always available [\#536](https://github.com/shelljs/shelljs/issues/536) - Add shx as a dependency for testing [\#525](https://github.com/shelljs/shelljs/issues/525) @@ -367,7 +378,6 @@ - Stdout is empty on Git log command [\#439](https://github.com/shelljs/shelljs/issues/439) - Cannot read toString of null when using execSync [\#415](https://github.com/shelljs/shelljs/issues/415) - cp -R dir/ target fails to copy hidden files in dir [\#140](https://github.com/shelljs/shelljs/issues/140) -- Adding callback to basic commands [\#102](https://github.com/shelljs/shelljs/issues/102) - \#mv Won't Work Across Disks [\#1](https://github.com/shelljs/shelljs/issues/1) **Merged pull requests:** @@ -397,8 +407,6 @@ **Closed issues:** - exec\('nohup node some.js &'\) [\#426](https://github.com/shelljs/shelljs/issues/426) -- cp copy to symlinked folder [\#414](https://github.com/shelljs/shelljs/issues/414) -- Invalid version number \(0.0.1alpha1\) [\#399](https://github.com/shelljs/shelljs/issues/399) - shelljs Breaks SemVer for Alpha and Pre-Release Versions [\#390](https://github.com/shelljs/shelljs/issues/390) - Copy not accepting source end with wildcards \* when using -r on v0.6.0 [\#389](https://github.com/shelljs/shelljs/issues/389) - Support globbing in `shjs` [\#388](https://github.com/shelljs/shelljs/issues/388) @@ -417,7 +425,6 @@ - "exec" causes LiveScript interpreter \(lsc\) to hang [\#160](https://github.com/shelljs/shelljs/issues/160) - Don't modify string prototype [\#159](https://github.com/shelljs/shelljs/issues/159) - `exec\(...\).to\(file\)` should work [\#154](https://github.com/shelljs/shelljs/issues/154) -- Would like to see more async variants for cp/rm etc [\#144](https://github.com/shelljs/shelljs/issues/144) - Can't install shelljs locally instead of globally [\#136](https://github.com/shelljs/shelljs/issues/136) - shelljs and node 0.10.28 [\#125](https://github.com/shelljs/shelljs/issues/125) - Use case for global installed shelljs [\#123](https://github.com/shelljs/shelljs/issues/123) @@ -521,7 +528,6 @@ - sed\(\) should accept multiple file arguments [\#231](https://github.com/shelljs/shelljs/issues/231) - shelljs.exec\('aaa && bbb'\) blocks [\#229](https://github.com/shelljs/shelljs/issues/229) - Consider creating a GitHub Organization with more maintainers [\#223](https://github.com/shelljs/shelljs/issues/223) -- Doesn't work inside Electron [\#220](https://github.com/shelljs/shelljs/issues/220) - \[idea\] Add chmodr function. [\#219](https://github.com/shelljs/shelljs/issues/219) - Execute a file [\#211](https://github.com/shelljs/shelljs/issues/211) - Where is standard error going to? [\#209](https://github.com/shelljs/shelljs/issues/209) @@ -533,7 +539,6 @@ - Cannot recursively list all \*.js files [\#162](https://github.com/shelljs/shelljs/issues/162) - exec\(\) breaks if executed in a deleted directory [\#157](https://github.com/shelljs/shelljs/issues/157) - shjs command always exits with zero code [\#133](https://github.com/shelljs/shelljs/issues/133) -- Windows failing tests [\#127](https://github.com/shelljs/shelljs/issues/127) - touch command [\#122](https://github.com/shelljs/shelljs/issues/122) - Symbolic links are broken! [\#100](https://github.com/shelljs/shelljs/issues/100) - interpret `--` as stdin [\#55](https://github.com/shelljs/shelljs/issues/55) From 2271080e4f120b61169ca5659c69c6bf148bbc85 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 25 Jan 2018 00:05:25 -0800 Subject: [PATCH 172/338] chore: update contributing guidelines (#817) This updates some contributing guidelines: * Defer to ISSUE_TEMPLATE.md for filing bugs * Mention eslint and how to automatically fix style mistakes --- CONTRIBUTING.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 16257e158..a6b32ba32 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,12 +5,10 @@ We love to receive bug reports (we're always trying to make ShellJS more stable). If you've found a bug, please follow these steps: - - Search for any issues that may have been created already. We often receive - duplicates, and cutting down on this is helpful. If someone else has already - reported it, please ping that issue thread. - - Let us know your version of NodeJS (`node -v`), your version of ShellJS (from - `package.json`), your OS, and any other useful information. - - Give an example ShellJS command to reproduce the error. + - Please try to cut down on duplicates. Please search for issues which have + already been reported (remember to search closed issues). + - Please see [`ISSUE_TEMPLATE.md`](.github/ISSUE_TEMPLATE.md) for more + information. ## Pull requests @@ -20,7 +18,9 @@ PRs are welcome! However, we ask that you follow a few guidelines: - Make sure your code passes `npm test`. Please check the CI (both Appveyor and Travis). If you can't figure out why something doesn't work, feel free to ask for help. - - Make changes to the documentation *within the source files*, not in the - README. Then update the README by running `node scripts/generate-docs.js`. + - Make sure you conform to our style guidelines. You can run `npm run lint` to + check style, and `npm run lint -- --fix` to automatically fix some issues. + - Make documentation changes *within the source files*, not in the README. + Update the README with `npm run gendocs`. - Please keep your PR up to date (either via rebase or by pressing the "update branch" button on Github). From 62ce4bacab6ab980332201ce79e549ac2e4ae03a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 25 Jan 2018 13:51:50 -0800 Subject: [PATCH 173/338] chore(lint): don't allow excess trailing newlines (#816) * chore(lint): don't allow excess trailing newlines This enforces that files should not end with blank lines (i.e. more than one trailing newline). The `eol-last` rule (inherited from airbnb's config) already enforces that files end in at least one trailing newline, so adding this rule enforces that it ends in exactly 1. See https://eslint.org/docs/rules/no-multiple-empty-lines and https://eslint.org/docs/rules/eol-last for more information. Inspired by #809. * add maxBOF --- .eslintrc.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.json b/.eslintrc.json index 7037c1760..f96d7f578 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,6 +23,7 @@ "consistent-return": "off", "no-mixed-operators": "off", "no-prototype-builtins": "off", + "no-multiple-empty-lines": ["error", { "max": 2, "maxBOF": 0, "maxEOF": 0 } ], "new-cap": ["error", { "capIsNewExceptions": [ "ShellString" From 9077f4171e30520565a1a964a2270023f375cf1d Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Mon, 29 Jan 2018 12:28:02 -0800 Subject: [PATCH 174/338] Remove separate "internal error" from exec (#802) * Remove separate "internal error" from exec * Fix unknown command error regex * Add message about command not found regex * Silence errors while reading files in exec The stdout and stderr files may never be opened or written to in certain circumstances. In particular, if the timeout is short enough, the child node process does not have enough time to start, and the child script does not execute, so the files are not written to. So, catch errors form trying to read the files, and ignore them. * Do not silence errors due to short timeouts * Simplify test regex for missing command * Default error code to 1 if not set --- src/exec.js | 25 ++++++++++++------------- test/exec.js | 4 ++-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/exec.js b/src/exec.js index 03f9826b5..b791cf896 100644 --- a/src/exec.js +++ b/src/exec.js @@ -6,6 +6,7 @@ var fs = require('fs'); var child = require('child_process'); var DEFAULT_MAXBUFFER_SIZE = 20 * 1024 * 1024; +var DEFAULT_ERROR_CODE = 1; common.register('exec', _exec, { unix: false, @@ -72,13 +73,15 @@ function execSync(cmd, opts, pipe) { child.execFileSync(common.config.execPath, execArgs, opts); } catch (e) { // Commands with non-zero exit code raise an exception. - code = e.status; + code = e.status || DEFAULT_ERROR_CODE; } // fs.readFileSync uses buffer encoding by default, so call - // it without the encoding option if the encoding is 'buffer' - var stdout; - var stderr; + // it without the encoding option if the encoding is 'buffer'. + // Also, if the exec timeout is too short for node to start up, + // the files will not be created, so these calls will throw. + var stdout = ''; + var stderr = ''; if (opts.encoding === 'buffer') { stdout = fs.readFileSync(stdoutFile); stderr = fs.readFileSync(stderrFile); @@ -93,7 +96,7 @@ function execSync(cmd, opts, pipe) { try { common.unlinkSync(stdoutFile); } catch (e) {} if (code !== 0) { - common.error('', code, { continue: true }); + common.error(stderr, code, { continue: true }); } var obj = common.ShellString(stdout, stderr, code); return obj; @@ -196,14 +199,10 @@ function _exec(command, options, callback) { async: false, }, options); - try { - if (options.async) { - return execAsync(command, options, pipe, callback); - } else { - return execSync(command, options, pipe); - } - } catch (e) { - common.error('internal error'); + if (options.async) { + return execAsync(command, options, pipe, callback); + } else { + return execSync(command, options, pipe); } } module.exports = _exec; diff --git a/test/exec.js b/test/exec.js index cdd87a653..2cd2a67fd 100644 --- a/test/exec.js +++ b/test/exec.js @@ -35,7 +35,7 @@ test('config.fatal and unknown command', t => { shell.config.fatal = true; t.throws(() => { shell.exec('asdfasdf'); // could not find command - }, /exec: internal error/); + }, /asdfasdf/); // name of command should be in error message shell.config.fatal = oldFatal; }); @@ -127,7 +127,7 @@ test('set timeout option', t => { const result = shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`); // default timeout is ok t.falsy(shell.error()); t.is(result.code, 0); - shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`, { timeout: 10 }); // times out + shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 2000`, { timeout: 1000 }); // times out t.truthy(shell.error()); }); From 9035b27403c7e3c3dc801939d20dec8fe6143c06 Mon Sep 17 00:00:00 2001 From: Zearin Date: Tue, 20 Feb 2018 01:21:17 -0500 Subject: [PATCH 175/338] docs: fix typos and adjust markdown formatting (#825) Miscellaneous docs/markdown changes. No change to logic. --- README.md | 133 +++++++++++++++++++++++++++++--------------------- shell.js | 14 +++--- src/cat.js | 1 + src/cd.js | 1 + src/chmod.js | 8 +-- src/common.js | 2 +- src/cp.js | 3 +- src/dirs.js | 14 +++--- src/echo.js | 3 +- src/error.js | 3 +- src/exec.js | 15 +++--- src/find.js | 7 +-- src/grep.js | 3 +- src/head.js | 1 + src/ln.js | 3 +- src/ls.js | 6 ++- src/mkdir.js | 5 +- src/mv.js | 3 +- src/pwd.js | 1 + src/rm.js | 1 + src/sed.js | 7 +-- src/set.js | 3 +- src/sort.js | 7 +-- src/tail.js | 5 +- src/test.js | 3 +- src/to.js | 2 +- src/toEnd.js | 2 +- src/touch.js | 11 +++-- src/uniq.js | 3 +- src/which.js | 8 +-- 30 files changed, 162 insertions(+), 116 deletions(-) diff --git a/README.md b/README.md index d5f577951..cf916b94c 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ shell.echo('hello world'); All commands run synchronously, unless otherwise stated. All commands accept standard bash globbing characters (`*`, `?`, etc.), -compatible with the [node glob module](https://github.com/isaacs/node-glob). +compatible with the [node `glob` module](https://github.com/isaacs/node-glob). For less-commonly used commands and features, please check out our [wiki page](https://github.com/shelljs/shelljs/wiki). @@ -139,6 +139,7 @@ page](https://github.com/shelljs/shelljs/wiki). ### cat([options,] file [, file ...]) ### cat([options,] file_array) + Available options: + `-n`: number all output lines @@ -157,6 +158,7 @@ introduced between each file). ### cd([dir]) + Changes to directory `dir` for the duration of the script. Changes to home directory if no argument is supplied. @@ -167,7 +169,7 @@ directory if no argument is supplied. Available options: + `-v`: output a diagnostic for every file processed -+ `-c`: like verbose but report only when a change is made ++ `-c`: like verbose, but report only when a change is made + `-R`: change files and directories recursively Examples: @@ -184,18 +186,19 @@ absolute permissions in octal form or expressing the changes in symbols. This command tries to mimic the POSIX behavior as much as possible. Notable exceptions: -+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is - given to the umask. -+ There is no "quiet" option since default behavior is to run silent. ++ In symbolic modes, `a-r` and `-r` are identical. No consideration is + given to the `umask`. ++ There is no "quiet" option, since default behavior is to run silent. ### cp([options,] source [, source ...], dest) ### cp([options,] source_array, dest) + Available options: + `-f`: force (default behavior) + `-n`: no-clobber -+ `-u`: only copy if source is newer than dest ++ `-u`: only copy if `source` is newer than `dest` + `-r`, `-R`: recursive + `-L`: follow symlinks + `-P`: don't follow symlinks @@ -221,7 +224,7 @@ Available options: Arguments: -+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. ++ `dir`: Sets the current working directory to the top of the stack, then executes the equivalent of `cd dir`. + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. @@ -233,13 +236,14 @@ pushd('/etc'); // Returns /etc /usr pushd('+1'); // Returns /usr /etc ``` -Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. +Save the current directory on the top of the directory stack and then `cd` to `dir`. With no arguments, `pushd` exchanges the top two directories. Returns an array of paths in the stack. + ### popd([options,] ['-N' | '+N']) Available options: -+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. ++ `-n`: Suppress the normal directory change when removing directories from the stack, so that only the stack is manipulated. + `-q`: Supresses output to the console. Arguments: @@ -257,7 +261,8 @@ popd(); // '/usr' echo(process.cwd()); // '/usr' ``` -When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. +When no arguments are given, `popd` removes the top directory from the stack and performs a `cd` to the new top directory. The elements are numbered from 0, starting at the first directory listed with dirs (i.e., `popd` is equivalent to `popd +0`). Returns an array of paths in the stack. + ### dirs([options | '+N' | '-N']) @@ -271,12 +276,13 @@ Arguments: + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. -Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. +Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if `+N` or `-N` was specified. -See also: pushd, popd +See also: `pushd`, `popd` ### echo([options,] string [, string ...]) + Available options: + `-e`: interpret backslash escapes (default) @@ -290,20 +296,21 @@ var str = echo('hello world'); echo('-n', 'no newline at end'); ``` -Prints string to stdout, and returns string with additional utility methods +Prints `string` to stdout, and returns string with additional utility methods like `.to()`. ### exec(command [, options] [, callback]) + Available options: + `async`: Asynchronous execution. If a callback is provided, it will be set to `true`, regardless of the passed value (default: `false`). + `silent`: Do not echo program output to console (default: `false`). -+ `encoding`: Character encoding to use. Affects the returned stdout and stderr values, and ++ `encoding`: Character encoding to use. Affects the values returned to stdout and stderr, and what is written to stdout and stderr when not in silent mode (default: `'utf8'`). + and any option available to Node.js's - [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) + [`child_process.exec()`](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) Examples: @@ -323,21 +330,18 @@ exec('some_long_running_process', function(code, stdout, stderr) { ``` Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -mode, this returns a ShellString (compatible with ShellJS v0.6.x, which returns an object +mode, this returns a `ShellString` (compatible with ShellJS v0.6.x, which returns an object of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -object, and the `callback` gets the arguments `(code, stdout, stderr)`. +object, and the `callback` receives the arguments `(code, stdout, stderr)`. Not seeing the behavior you want? `exec()` runs everything through `sh` by default (or `cmd.exe` on Windows), which differs from `bash`. If you need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. -**Note:** For long-lived processes, it's best to run `exec()` asynchronously as -the current synchronous implementation uses a lot of CPU. This should be getting -fixed soon. - ### find(path [, path ...]) ### find(path_array) + Examples: ```javascript @@ -349,14 +353,15 @@ find('.').filter(function(file) { return file.match(/\.js$/); }); Returns array of all files (however deep) in the given paths. The main difference from `ls('-R', path)` is that the resulting file names -include the base directories, e.g. `lib/resources/file1` instead of just `file1`. +include the base directories (e.g., `lib/resources/file1` instead of just `file1`). ### grep([options,] regex_filter, file [, file ...]) ### grep([options,] regex_filter, file_array) + Available options: -+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. ++ `-v`: Invert `regex_filter` (only print non-matching lines). + `-l`: Print only filenames of matching files Examples: @@ -372,6 +377,7 @@ file that match the given `regex_filter`. ### head([{'-n': \},] file [, file ...]) ### head([{'-n': \},] file_array) + Available options: + `-n `: Show the first `` lines of the files @@ -388,6 +394,7 @@ Read the start of a file. ### ln([options,] source, dest) + Available options: + `-s`: symlink @@ -400,11 +407,12 @@ ln('file', 'newlink'); ln('-sf', 'file', 'existing'); ``` -Links source to dest. Use -f to force the link, should dest already exist. +Links `source` to `dest`. Use `-f` to force the link, should `dest` already exist. ### ls([options,] [path, ...]) ### ls([options,] path_array) + Available options: + `-R`: recursive @@ -413,7 +421,7 @@ Available options: + `-d`: list directories themselves, not their contents + `-l`: list objects representing each file, each with fields containing `ls -l` output fields. See - [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) + [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) for more info Examples: @@ -425,14 +433,16 @@ ls('-R', ['/users/me', '/tmp']); // same as above ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} ``` -Returns array of files in the given path, or in current directory if no path provided. +Returns array of files in the given `path`, or files in +the current directory if no `path` is provided. ### mkdir([options,] dir [, dir ...]) ### mkdir([options,] dir_array) + Available options: -+ `-p`: full path (will create intermediate dirs if necessary) ++ `-p`: full path (and create intermediate directories, if necessary) Examples: @@ -446,6 +456,7 @@ Creates directories. ### mv([options ,] source [, source ...], dest') ### mv([options ,] source_array, dest') + Available options: + `-f`: force (default behavior) @@ -459,15 +470,17 @@ mv('file1', 'file2', 'dir/'); mv(['file1', 'file2'], 'dir/'); // same as above ``` -Moves files. +Moves `source` file(s) to `dest`. ### pwd() + Returns the current directory. ### rm([options,] file [, file ...]) ### rm([options,] file_array) + Available options: + `-f`: force @@ -486,9 +499,10 @@ Removes files. ### sed([options,] search_regex, replacement, file [, file ...]) ### sed([options,] search_regex, replacement, file_array) + Available options: -+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ ++ `-i`: Replace contents of `file` in-place. _Note that no backups will be created!_ Examples: @@ -497,8 +511,8 @@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); ``` -Reads an input string from `files` and performs a JavaScript `replace()` on the input -using the given search regex and replacement string or function. Returns the new string after replacement. +Reads an input string from `file`s, and performs a JavaScript `replace()` on the input +using the given `search_regex` and `replacement` string or function. Returns the new string after replacement. Note: @@ -511,6 +525,7 @@ sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); ### set(options) + Available options: + `+/-e`: exit upon error (`config.fatal`) @@ -524,14 +539,15 @@ set('-e'); // exit upon first error set('+e'); // this undoes a "set('-e')" ``` -Sets global configuration variables +Sets global configuration variables. ### sort([options,] file [, file ...]) ### sort([options,] file_array) + Available options: -+ `-r`: Reverse the result of comparisons ++ `-r`: Reverse the results + `-n`: Compare according to numerical value Examples: @@ -541,15 +557,16 @@ sort('foo.txt', 'bar.txt'); sort('-r', 'foo.txt'); ``` -Return the contents of the files, sorted line-by-line. Sorting multiple -files mixes their content, just like unix sort does. +Return the contents of the `file`s, sorted line-by-line. Sorting multiple +files mixes their content (just as unix `sort` does). ### tail([{'-n': \},] file [, file ...]) ### tail([{'-n': \},] file_array) + Available options: -+ `-n `: Show the last `` lines of the files ++ `-n `: Show the last `` lines of `file`s Examples: @@ -559,7 +576,7 @@ var str = tail('file1', 'file2'); var str = tail(['file1', 'file2']); // same as above ``` -Read the end of a file. +Read the end of a `file`. ### tempdir() @@ -575,6 +592,7 @@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.ht ### test(expression) + Available expression primaries: + `'-b', 'path'`: true if path is a block device @@ -593,7 +611,7 @@ if (test('-d', path)) { /* do something with dir */ }; if (!test('-f', path)) continue; // skip if it's a regular file ``` -Evaluates expression using the available primaries and returns corresponding value. +Evaluates `expression` using the available primaries and returns corresponding value. ### ShellString.prototype.to(file) @@ -605,7 +623,7 @@ cat('input.txt').to('output.txt'); ``` Analogous to the redirection operator `>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix +`ShellStrings` (such as those returned by `cat`, `grep`, etc.). _Like Unix redirections, `to()` will overwrite any existing file!_ @@ -618,18 +636,19 @@ cat('input.txt').toEnd('output.txt'); ``` Analogous to the redirect-and-append operator `>>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). +`ShellStrings` (such as those returned by `cat`, `grep`, etc.). ### touch([options,] file [, file ...]) ### touch([options,] file_array) + Available options: + `-a`: Change only the access time + `-c`: Do not create any files + `-m`: Change only the modification time -+ `-d DATE`: Parse DATE and use it instead of current time -+ `-r FILE`: Use FILE's times instead of current time ++ `-d DATE`: Parse `DATE` and use it instead of current time ++ `-r FILE`: Use `FILE`'s times instead of current time Examples: @@ -639,12 +658,13 @@ touch('-c', '/path/to/some/dir/source.js'); touch({ '-r': FILE }, '/path/to/some/dir/source.js'); ``` -Update the access and modification times of each FILE to the current time. -A FILE argument that does not exist is created empty, unless -c is supplied. -This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. +Update the access and modification times of each `FILE` to the current time. +A `FILE` argument that does not exist is created empty, unless `-c` is supplied. +This is a partial implementation of [`touch(1)`](http://linux.die.net/man/1/touch). ### uniq([options,] [input, [output]]) + Available options: + `-i`: Ignore case while comparing @@ -659,7 +679,7 @@ uniq('-i', 'foo.txt'); uniq('-cd', 'foo.txt', 'bar.txt'); ``` -Filter adjacent matching lines from input +Filter adjacent matching lines from `input`. ### which(command) @@ -670,17 +690,19 @@ Examples: var nodeExec = which('node'); ``` -Searches for `command` in the system's PATH. On Windows, this uses the +Searches for `command` in the system's `PATH`. On Windows, this uses the `PATHEXT` variable to append the extension if it's not already executable. -Returns string containing the absolute path to the command. +Returns string containing the absolute path to `command`. ### exit(code) -Exits the current process with the given exit code. + +Exits the current process with the given exit `code`. ### error() + Tests if error occurred in the last command. Returns a truthy value if an -error returned and a falsy value otherwise. +error returned, or a falsy value otherwise. **Note**: do not rely on the return value to be an error message. If you need the last error message, use @@ -696,12 +718,13 @@ var foo = ShellString('hello world'); ``` Turns a regular string into a string-like object similar to what each -command returns. This has special methods, like `.to()` and `.toEnd()` +command returns. This has special methods, like `.to()` and `.toEnd()`. ### env['VAR_NAME'] + Object containing environment variables (both getter and setter). Shortcut -to process.env. +to `process.env`. ### Pipes @@ -746,9 +769,9 @@ cp('this_file_does_not_exist', '/dev/null'); // throws Error here /* more commands... */ ``` -If `true` the script will throw a Javascript error when any shell.js +If `true`, the script will throw a Javascript error when any shell.js command encounters an error. Default is `false`. This is analogous to -Bash's `set -e` +Bash's `set -e`. ### config.verbose @@ -792,7 +815,7 @@ shell.config.reset(); // reset to original state /* ... */ ``` -Reset shell.config to the defaults: +Reset `shell.config` to the defaults: ```javascript { diff --git a/shell.js b/shell.js index 2541a2036..f9c6f36df 100644 --- a/shell.js +++ b/shell.js @@ -11,7 +11,7 @@ var common = require('./src/common'); //@ //@ All commands run synchronously, unless otherwise stated. //@ All commands accept standard bash globbing characters (`*`, `?`, etc.), -//@ compatible with the [node glob module](https://github.com/isaacs/node-glob). +//@ compatible with the [node `glob` module](https://github.com/isaacs/node-glob). //@ //@ For less-commonly used commands and features, please check out our [wiki //@ page](https://github.com/shelljs/shelljs/wiki). @@ -27,7 +27,8 @@ require('./commands').forEach(function (command) { //@ //@ ### exit(code) -//@ Exits the current process with the given exit code. +//@ +//@ Exits the current process with the given exit `code`. exports.exit = process.exit; //@include ./src/error @@ -38,8 +39,9 @@ exports.ShellString = common.ShellString; //@ //@ ### env['VAR_NAME'] +//@ //@ Object containing environment variables (both getter and setter). Shortcut -//@ to process.env. +//@ to `process.env`. exports.env = process.env; //@ @@ -91,9 +93,9 @@ exports.config = common.config; //@ /* more commands... */ //@ ``` //@ -//@ If `true` the script will throw a Javascript error when any shell.js +//@ If `true`, the script will throw a Javascript error when any shell.js //@ command encounters an error. Default is `false`. This is analogous to -//@ Bash's `set -e` +//@ Bash's `set -e`. //@ //@ ### config.verbose @@ -140,7 +142,7 @@ exports.config = common.config; //@ /* ... */ //@ ``` //@ -//@ Reset shell.config to the defaults: +//@ Reset `shell.config` to the defaults: //@ //@ ```javascript //@ { diff --git a/src/cat.js b/src/cat.js index cdad1b0f6..c5c44347c 100644 --- a/src/cat.js +++ b/src/cat.js @@ -11,6 +11,7 @@ common.register('cat', _cat, { //@ //@ ### cat([options,] file [, file ...]) //@ ### cat([options,] file_array) +//@ //@ Available options: //@ //@ + `-n`: number all output lines diff --git a/src/cd.js b/src/cd.js index 87ce9b9a7..27bc21075 100644 --- a/src/cd.js +++ b/src/cd.js @@ -5,6 +5,7 @@ common.register('cd', _cd, {}); //@ //@ ### cd([dir]) +//@ //@ Changes to directory `dir` for the duration of the script. Changes to home //@ directory if no argument is supplied. function _cd(options, dir) { diff --git a/src/chmod.js b/src/chmod.js index 758c6e515..bcc3a0370 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -39,7 +39,7 @@ common.register('chmod', _chmod, { //@ Available options: //@ //@ + `-v`: output a diagnostic for every file processed//@ -//@ + `-c`: like verbose but report only when a change is made//@ +//@ + `-c`: like verbose, but report only when a change is made//@ //@ + `-R`: change files and directories recursively//@ //@ //@ Examples: @@ -56,9 +56,9 @@ common.register('chmod', _chmod, { //@ This command tries to mimic the POSIX behavior as much as possible. //@ Notable exceptions: //@ -//@ + In symbolic modes, 'a-r' and '-r' are identical. No consideration is -//@ given to the umask. -//@ + There is no "quiet" option since default behavior is to run silent. +//@ + In symbolic modes, `a-r` and `-r` are identical. No consideration is +//@ given to the `umask`. +//@ + There is no "quiet" option, since default behavior is to run silent. function _chmod(options, mode, filePattern) { if (!filePattern) { if (options.length > 0 && options.charAt(0) === '-') { diff --git a/src/common.js b/src/common.js index facd72fe1..f873782bc 100644 --- a/src/common.js +++ b/src/common.js @@ -129,7 +129,7 @@ exports.error = error; //@ ``` //@ //@ Turns a regular string into a string-like object similar to what each -//@ command returns. This has special methods, like `.to()` and `.toEnd()` +//@ command returns. This has special methods, like `.to()` and `.toEnd()`. function ShellString(stdout, stderr, code) { var that; if (stdout instanceof Array) { diff --git a/src/cp.js b/src/cp.js index d46a54ab5..4214b0bdf 100644 --- a/src/cp.js +++ b/src/cp.js @@ -186,11 +186,12 @@ function cpcheckcycle(sourceDir, srcFile) { //@ //@ ### cp([options,] source [, source ...], dest) //@ ### cp([options,] source_array, dest) +//@ //@ Available options: //@ //@ + `-f`: force (default behavior) //@ + `-n`: no-clobber -//@ + `-u`: only copy if source is newer than dest +//@ + `-u`: only copy if `source` is newer than `dest` //@ + `-r`, `-R`: recursive //@ + `-L`: follow symlinks //@ + `-P`: don't follow symlinks diff --git a/src/dirs.js b/src/dirs.js index 3e27ac95e..26547a5b3 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -44,7 +44,7 @@ function _actualDirStack() { //@ //@ Arguments: //@ -//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. +//@ + `dir`: Sets the current working directory to the top of the stack, then executes the equivalent of `cd dir`. //@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. //@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. //@ @@ -56,7 +56,7 @@ function _actualDirStack() { //@ pushd('+1'); // Returns /usr /etc //@ ``` //@ -//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. +//@ Save the current directory on the top of the directory stack and then `cd` to `dir`. With no arguments, `pushd` exchanges the top two directories. Returns an array of paths in the stack. function _pushd(options, dir) { if (_isStackIndex(options)) { dir = options; @@ -101,12 +101,13 @@ function _pushd(options, dir) { } exports.pushd = _pushd; +//@ //@ //@ ### popd([options,] ['-N' | '+N']) //@ //@ Available options: //@ -//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. +//@ + `-n`: Suppress the normal directory change when removing directories from the stack, so that only the stack is manipulated. //@ + `-q`: Supresses output to the console. //@ //@ Arguments: @@ -124,7 +125,7 @@ exports.pushd = _pushd; //@ echo(process.cwd()); // '/usr' //@ ``` //@ -//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. +//@ When no arguments are given, `popd` removes the top directory from the stack and performs a `cd` to the new top directory. The elements are numbered from 0, starting at the first directory listed with dirs (i.e., `popd` is equivalent to `popd +0`). Returns an array of paths in the stack. function _popd(options, index) { if (_isStackIndex(options)) { index = options; @@ -154,6 +155,7 @@ function _popd(options, index) { } exports.popd = _popd; +//@ //@ //@ ### dirs([options | '+N' | '-N']) //@ @@ -167,9 +169,9 @@ exports.popd = _popd; //@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. //@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. //@ -//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. +//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if `+N` or `-N` was specified. //@ -//@ See also: pushd, popd +//@ See also: `pushd`, `popd` function _dirs(options, index) { if (_isStackIndex(options)) { index = options; diff --git a/src/echo.js b/src/echo.js index 7229ce7f2..1b089d59c 100644 --- a/src/echo.js +++ b/src/echo.js @@ -8,6 +8,7 @@ common.register('echo', _echo, { //@ //@ ### echo([options,] string [, string ...]) +//@ //@ Available options: //@ //@ + `-e`: interpret backslash escapes (default) @@ -21,7 +22,7 @@ common.register('echo', _echo, { //@ echo('-n', 'no newline at end'); //@ ``` //@ -//@ Prints string to stdout, and returns string with additional utility methods +//@ Prints `string` to stdout, and returns string with additional utility methods //@ like `.to()`. function _echo(opts) { // allow strings starting with '-', see issue #20 diff --git a/src/error.js b/src/error.js index 507c86ddd..b0ed59e12 100644 --- a/src/error.js +++ b/src/error.js @@ -2,8 +2,9 @@ var common = require('./common'); //@ //@ ### error() +//@ //@ Tests if error occurred in the last command. Returns a truthy value if an -//@ error returned and a falsy value otherwise. +//@ error returned, or a falsy value otherwise. //@ //@ **Note**: do not rely on the //@ return value to be an error message. If you need the last error message, use diff --git a/src/exec.js b/src/exec.js index b791cf896..66ef3d736 100644 --- a/src/exec.js +++ b/src/exec.js @@ -14,7 +14,7 @@ common.register('exec', _exec, { wrapOutput: false, }); -// We use this function to run exec synchronously while also providing realtime +// We use this function to run `exec` synchronously while also providing realtime // output. function execSync(cmd, opts, pipe) { if (!common.config.execPath) { @@ -138,15 +138,16 @@ function execAsync(cmd, opts, pipe, callback) { //@ //@ ### exec(command [, options] [, callback]) +//@ //@ Available options: //@ //@ + `async`: Asynchronous execution. If a callback is provided, it will be set to //@ `true`, regardless of the passed value (default: `false`). //@ + `silent`: Do not echo program output to console (default: `false`). -//@ + `encoding`: Character encoding to use. Affects the returned stdout and stderr values, and +//@ + `encoding`: Character encoding to use. Affects the values returned to stdout and stderr, and //@ what is written to stdout and stderr when not in silent mode (default: `'utf8'`). //@ + and any option available to Node.js's -//@ [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) +//@ [`child_process.exec()`](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) //@ //@ Examples: //@ @@ -166,17 +167,13 @@ function execAsync(cmd, opts, pipe, callback) { //@ ``` //@ //@ Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -//@ mode, this returns a ShellString (compatible with ShellJS v0.6.x, which returns an object +//@ mode, this returns a `ShellString` (compatible with ShellJS v0.6.x, which returns an object //@ of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -//@ object, and the `callback` gets the arguments `(code, stdout, stderr)`. +//@ object, and the `callback` receives the arguments `(code, stdout, stderr)`. //@ //@ Not seeing the behavior you want? `exec()` runs everything through `sh` //@ by default (or `cmd.exe` on Windows), which differs from `bash`. If you //@ need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. -//@ -//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as -//@ the current synchronous implementation uses a lot of CPU. This should be getting -//@ fixed soon. function _exec(command, options, callback) { options = options || {}; if (!command) common.error('must specify command'); diff --git a/src/find.js b/src/find.js index b28d0378e..0de695ade 100644 --- a/src/find.js +++ b/src/find.js @@ -7,6 +7,7 @@ common.register('find', _find, {}); //@ //@ ### find(path [, path ...]) //@ ### find(path_array) +//@ //@ Examples: //@ //@ ```javascript @@ -18,7 +19,7 @@ common.register('find', _find, {}); //@ Returns array of all files (however deep) in the given paths. //@ //@ The main difference from `ls('-R', path)` is that the resulting file names -//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. +//@ include the base directories (e.g., `lib/resources/file1` instead of just `file1`). function _find(options, paths) { if (!paths) { common.error('no path specified'); @@ -35,8 +36,8 @@ function _find(options, paths) { list.push(file); } - // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs - // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory + // why not simply do `ls('-R', paths)`? because the output wouldn't give the base dirs + // to get the base dir in the output, we need instead `ls('-R', 'dir/*')` for every directory paths.forEach(function (file) { var stat; diff --git a/src/grep.js b/src/grep.js index 8cf53b157..3880fa191 100644 --- a/src/grep.js +++ b/src/grep.js @@ -13,9 +13,10 @@ common.register('grep', _grep, { //@ //@ ### grep([options,] regex_filter, file [, file ...]) //@ ### grep([options,] regex_filter, file_array) +//@ //@ Available options: //@ -//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. +//@ + `-v`: Invert `regex_filter` (only print non-matching lines). //@ + `-l`: Print only filenames of matching files //@ //@ Examples: diff --git a/src/head.js b/src/head.js index c08ae9ba3..7169fd393 100644 --- a/src/head.js +++ b/src/head.js @@ -33,6 +33,7 @@ function readSomeLines(file, numLines) { //@ //@ ### head([{'-n': \},] file [, file ...]) //@ ### head([{'-n': \},] file_array) +//@ //@ Available options: //@ //@ + `-n `: Show the first `` lines of the files diff --git a/src/ln.js b/src/ln.js index 71f2b3916..2cf87cd89 100644 --- a/src/ln.js +++ b/src/ln.js @@ -11,6 +11,7 @@ common.register('ln', _ln, { //@ //@ ### ln([options,] source, dest) +//@ //@ Available options: //@ //@ + `-s`: symlink @@ -23,7 +24,7 @@ common.register('ln', _ln, { //@ ln('-sf', 'file', 'existing'); //@ ``` //@ -//@ Links source to dest. Use -f to force the link, should dest already exist. +//@ Links `source` to `dest`. Use `-f` to force the link, should `dest` already exist. function _ln(options, source, dest) { if (!source || !dest) { common.error('Missing and/or '); diff --git a/src/ls.js b/src/ls.js index 2f3ac6973..eea99c5ca 100644 --- a/src/ls.js +++ b/src/ls.js @@ -19,6 +19,7 @@ common.register('ls', _ls, { //@ //@ ### ls([options,] [path, ...]) //@ ### ls([options,] path_array) +//@ //@ Available options: //@ //@ + `-R`: recursive @@ -27,7 +28,7 @@ common.register('ls', _ls, { //@ + `-d`: list directories themselves, not their contents //@ + `-l`: list objects representing each file, each with fields containing `ls //@ -l` output fields. See -//@ [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) +//@ [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) //@ for more info //@ //@ Examples: @@ -39,7 +40,8 @@ common.register('ls', _ls, { //@ ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} //@ ``` //@ -//@ Returns array of files in the given path, or in current directory if no path provided. +//@ Returns array of files in the given `path`, or files in +//@ the current directory if no `path` is provided. function _ls(options, paths) { if (options.all_deprecated) { // We won't support the -a option as it's hard to image why it's useful diff --git a/src/mkdir.js b/src/mkdir.js index 723c137d2..6168d592b 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -8,7 +8,7 @@ common.register('mkdir', _mkdir, { }, }); -// Recursively creates 'dir' +// Recursively creates `dir` function mkdirSyncRecursive(dir) { var baseDir = path.dirname(dir); @@ -35,9 +35,10 @@ function mkdirSyncRecursive(dir) { //@ //@ ### mkdir([options,] dir [, dir ...]) //@ ### mkdir([options,] dir_array) +//@ //@ Available options: //@ -//@ + `-p`: full path (will create intermediate dirs if necessary) +//@ + `-p`: full path (and create intermediate directories, if necessary) //@ //@ Examples: //@ diff --git a/src/mv.js b/src/mv.js index 525be06b8..ac28a24eb 100644 --- a/src/mv.js +++ b/src/mv.js @@ -22,6 +22,7 @@ function checkRecentCreated(sources, index) { //@ //@ ### mv([options ,] source [, source ...], dest') //@ ### mv([options ,] source_array, dest') +//@ //@ Available options: //@ //@ + `-f`: force (default behavior) @@ -35,7 +36,7 @@ function checkRecentCreated(sources, index) { //@ mv(['file1', 'file2'], 'dir/'); // same as above //@ ``` //@ -//@ Moves files. +//@ Moves `source` file(s) to `dest`. function _mv(options, sources, dest) { // Get sources, dest if (arguments.length < 3) { diff --git a/src/pwd.js b/src/pwd.js index 38618518b..8fcf8fcec 100644 --- a/src/pwd.js +++ b/src/pwd.js @@ -7,6 +7,7 @@ common.register('pwd', _pwd, { //@ //@ ### pwd() +//@ //@ Returns the current directory. function _pwd() { var pwd = path.resolve(process.cwd()); diff --git a/src/rm.js b/src/rm.js index 75dcd7fa4..90409ac68 100644 --- a/src/rm.js +++ b/src/rm.js @@ -149,6 +149,7 @@ function handleFIFO(file) { //@ //@ ### rm([options,] file [, file ...]) //@ ### rm([options,] file_array) +//@ //@ Available options: //@ //@ + `-f`: force diff --git a/src/sed.js b/src/sed.js index 7d396e7e9..f094e4442 100644 --- a/src/sed.js +++ b/src/sed.js @@ -12,9 +12,10 @@ common.register('sed', _sed, { //@ //@ ### sed([options,] search_regex, replacement, file [, file ...]) //@ ### sed([options,] search_regex, replacement, file_array) +//@ //@ Available options: //@ -//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ +//@ + `-i`: Replace contents of `file` in-place. _Note that no backups will be created!_ //@ //@ Examples: //@ @@ -23,8 +24,8 @@ common.register('sed', _sed, { //@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); //@ ``` //@ -//@ Reads an input string from `files` and performs a JavaScript `replace()` on the input -//@ using the given search regex and replacement string or function. Returns the new string after replacement. +//@ Reads an input string from `file`s, and performs a JavaScript `replace()` on the input +//@ using the given `search_regex` and `replacement` string or function. Returns the new string after replacement. //@ //@ Note: //@ diff --git a/src/set.js b/src/set.js index 238e23e4a..1101b6ffa 100644 --- a/src/set.js +++ b/src/set.js @@ -7,6 +7,7 @@ common.register('set', _set, { //@ //@ ### set(options) +//@ //@ Available options: //@ //@ + `+/-e`: exit upon error (`config.fatal`) @@ -20,7 +21,7 @@ common.register('set', _set, { //@ set('+e'); // this undoes a "set('-e')" //@ ``` //@ -//@ Sets global configuration variables +//@ Sets global configuration variables. function _set(options) { if (!options) { var args = [].slice.call(arguments, 0); diff --git a/src/sort.js b/src/sort.js index e0feed746..0f42cb6a3 100644 --- a/src/sort.js +++ b/src/sort.js @@ -41,9 +41,10 @@ function numericalCmp(a, b) { //@ //@ ### sort([options,] file [, file ...]) //@ ### sort([options,] file_array) +//@ //@ Available options: //@ -//@ + `-r`: Reverse the result of comparisons +//@ + `-r`: Reverse the results //@ + `-n`: Compare according to numerical value //@ //@ Examples: @@ -53,8 +54,8 @@ function numericalCmp(a, b) { //@ sort('-r', 'foo.txt'); //@ ``` //@ -//@ Return the contents of the files, sorted line-by-line. Sorting multiple -//@ files mixes their content, just like unix sort does. +//@ Return the contents of the `file`s, sorted line-by-line. Sorting multiple +//@ files mixes their content (just as unix `sort` does). function _sort(options, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); diff --git a/src/tail.js b/src/tail.js index 5e0256e76..258412f73 100644 --- a/src/tail.js +++ b/src/tail.js @@ -11,9 +11,10 @@ common.register('tail', _tail, { //@ //@ ### tail([{'-n': \},] file [, file ...]) //@ ### tail([{'-n': \},] file_array) +//@ //@ Available options: //@ -//@ + `-n `: Show the last `` lines of the files +//@ + `-n `: Show the last `` lines of `file`s //@ //@ Examples: //@ @@ -23,7 +24,7 @@ common.register('tail', _tail, { //@ var str = tail(['file1', 'file2']); // same as above //@ ``` //@ -//@ Read the end of a file. +//@ Read the end of a `file`. function _tail(options, files) { var tail = []; var pipe = common.readFromPipe(); diff --git a/src/test.js b/src/test.js index c0c6469f8..228c7471f 100644 --- a/src/test.js +++ b/src/test.js @@ -19,6 +19,7 @@ common.register('test', _test, { //@ //@ ### test(expression) +//@ //@ Available expression primaries: //@ //@ + `'-b', 'path'`: true if path is a block device @@ -37,7 +38,7 @@ common.register('test', _test, { //@ if (!test('-f', path)) continue; // skip if it's a regular file //@ ``` //@ -//@ Evaluates expression using the available primaries and returns corresponding value. +//@ Evaluates `expression` using the available primaries and returns corresponding value. function _test(options, path) { if (!path) common.error('no path given'); diff --git a/src/to.js b/src/to.js index d3d9e37be..f1355bfc7 100644 --- a/src/to.js +++ b/src/to.js @@ -17,7 +17,7 @@ common.register('to', _to, { //@ ``` //@ //@ Analogous to the redirection operator `>` in Unix, but works with -//@ ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix +//@ `ShellStrings` (such as those returned by `cat`, `grep`, etc.). _Like Unix //@ redirections, `to()` will overwrite any existing file!_ function _to(options, file) { if (!file) common.error('wrong arguments'); diff --git a/src/toEnd.js b/src/toEnd.js index dc165fe8d..63749d0b4 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -17,7 +17,7 @@ common.register('toEnd', _toEnd, { //@ ``` //@ //@ Analogous to the redirect-and-append operator `>>` in Unix, but works with -//@ ShellStrings (such as those returned by `cat`, `grep`, etc). +//@ `ShellStrings` (such as those returned by `cat`, `grep`, etc.). function _toEnd(options, file) { if (!file) common.error('wrong arguments'); diff --git a/src/touch.js b/src/touch.js index dd6b8bc54..7b7033cd4 100644 --- a/src/touch.js +++ b/src/touch.js @@ -14,13 +14,14 @@ common.register('touch', _touch, { //@ //@ ### touch([options,] file [, file ...]) //@ ### touch([options,] file_array) +//@ //@ Available options: //@ //@ + `-a`: Change only the access time //@ + `-c`: Do not create any files //@ + `-m`: Change only the modification time -//@ + `-d DATE`: Parse DATE and use it instead of current time -//@ + `-r FILE`: Use FILE's times instead of current time +//@ + `-d DATE`: Parse `DATE` and use it instead of current time +//@ + `-r FILE`: Use `FILE`'s times instead of current time //@ //@ Examples: //@ @@ -30,9 +31,9 @@ common.register('touch', _touch, { //@ touch({ '-r': FILE }, '/path/to/some/dir/source.js'); //@ ``` //@ -//@ Update the access and modification times of each FILE to the current time. -//@ A FILE argument that does not exist is created empty, unless -c is supplied. -//@ This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. +//@ Update the access and modification times of each `FILE` to the current time. +//@ A `FILE` argument that does not exist is created empty, unless `-c` is supplied. +//@ This is a partial implementation of [`touch(1)`](http://linux.die.net/man/1/touch). function _touch(opts, files) { if (!files) { common.error('no files given'); diff --git a/src/uniq.js b/src/uniq.js index 2a287ce15..a7e343bd3 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -21,6 +21,7 @@ common.register('uniq', _uniq, { //@ //@ ### uniq([options,] [input, [output]]) +//@ //@ Available options: //@ //@ + `-i`: Ignore case while comparing @@ -35,7 +36,7 @@ common.register('uniq', _uniq, { //@ uniq('-cd', 'foo.txt', 'bar.txt'); //@ ``` //@ -//@ Filter adjacent matching lines from input +//@ Filter adjacent matching lines from `input`. function _uniq(options, input, output) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); diff --git a/src/which.js b/src/which.js index e6ae9eb58..0e5433c03 100644 --- a/src/which.js +++ b/src/which.js @@ -9,11 +9,11 @@ common.register('which', _which, { }, }); -// XP's system default value for PATHEXT system variable, just in case it's not +// XP's system default value for `PATHEXT` system variable, just in case it's not // set on Windows. var XP_DEFAULT_PATHEXT = '.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh'; -// Cross-platform method for splitting environment PATH variables +// Cross-platform method for splitting environment `PATH` variables function splitPath(p) { return p ? p.split(path.delimiter) : []; } @@ -31,9 +31,9 @@ function checkPath(pathName) { //@ var nodeExec = which('node'); //@ ``` //@ -//@ Searches for `command` in the system's PATH. On Windows, this uses the +//@ Searches for `command` in the system's `PATH`. On Windows, this uses the //@ `PATHEXT` variable to append the extension if it's not already executable. -//@ Returns string containing the absolute path to the command. +//@ Returns string containing the absolute path to `command`. function _which(options, cmd) { if (!cmd) common.error('must specify command'); From d7b6a1f3784fa6f9d1abcc07fcec6d08e89bf294 Mon Sep 17 00:00:00 2001 From: Tzu-Lin Huang Date: Tue, 24 Apr 2018 03:24:29 +0900 Subject: [PATCH 176/338] Workaround codecov bug of miscalculation of coverage (#795) (#838) This fixes #795 (actually, workarounds it.) For detail, please refer to the issue. --- src/ls.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ls.js b/src/ls.js index eea99c5ca..daebdf822 100644 --- a/src/ls.js +++ b/src/ls.js @@ -79,6 +79,10 @@ function _ls(options, paths) { stat = options.link ? common.statFollowLinks(p) : common.statNoFollowLinks(p); // follow links to directories by default if (stat.isSymbolicLink()) { + /* istanbul ignore next */ + // workaround for https://github.com/shelljs/shelljs/issues/795 + // codecov seems to have a bug that miscalculate this block as uncovered. + // but according to nyc report this block does get covered. try { var _stat = common.statFollowLinks(p); if (_stat.isDirectory()) { From 3ce805e6363fa2d067d9d4c9a9d935e5b62ead30 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 7 May 2018 23:59:38 -0700 Subject: [PATCH 177/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89409338a..a6f6270a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,34 @@ # Change Log +## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) + +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.1...HEAD) + +**Closed issues:** + +- High severity vulnerability in shelljs 0.8.1 [\#842](https://github.com/shelljs/shelljs/issues/842) +- Add test for ls\(\) on a symlink to a directory [\#795](https://github.com/shelljs/shelljs/issues/795) +- Harden shell.exec by writing the child process in a source file [\#782](https://github.com/shelljs/shelljs/issues/782) +- shell.exec\(\) doesn't respond correctly to config.fatal = true [\#735](https://github.com/shelljs/shelljs/issues/735) +- Merge 'exec: internal error' with ShellJSInternalError [\#734](https://github.com/shelljs/shelljs/issues/734) +- exec returning null from command [\#724](https://github.com/shelljs/shelljs/issues/724) +- Only Get Stderr from Exec [\#371](https://github.com/shelljs/shelljs/issues/371) +- Execute child.stdout.on before child.on\("exit"\) [\#224](https://github.com/shelljs/shelljs/issues/224) + +**Merged pull requests:** + +- Workaround codecov bug of miscalculation of coverage \(\#795\) [\#838](https://github.com/shelljs/shelljs/pull/838) ([dwi2](https://github.com/dwi2)) +- Update doc comments and regenerate README.md. [\#825](https://github.com/shelljs/shelljs/pull/825) ([Zearin](https://github.com/Zearin)) +- chore: update contributing guidelines [\#817](https://github.com/shelljs/shelljs/pull/817) ([nfischer](https://github.com/nfischer)) +- chore\(lint\): don't allow excess trailing newlines [\#816](https://github.com/shelljs/shelljs/pull/816) ([nfischer](https://github.com/nfischer)) +- Remove separate "internal error" from exec [\#802](https://github.com/shelljs/shelljs/pull/802) ([freitagbr](https://github.com/freitagbr)) + ## [v0.8.1](https://github.com/shelljs/shelljs/tree/v0.8.1) (2018-01-20) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.0...v0.8.1) **Closed issues:** - Exec failing with internal error when piping large output [\#818](https://github.com/shelljs/shelljs/issues/818) -- Shelljs exec\(\) not executing variables [\#815](https://github.com/shelljs/shelljs/issues/815) -- support for node-0.10.\* is broken [\#814](https://github.com/shelljs/shelljs/issues/814) - using sed to replace just the first occurrence of a string [\#813](https://github.com/shelljs/shelljs/issues/813) **Merged pull requests:** @@ -794,6 +815,7 @@ - exec with callback should automatically be async [\#31](https://github.com/shelljs/shelljs/issues/31) - Exporting variables. [\#30](https://github.com/shelljs/shelljs/issues/30) - Detecting shelljs/node [\#27](https://github.com/shelljs/shelljs/issues/27) +- Unexpected cp behaviour with directories [\#15](https://github.com/shelljs/shelljs/issues/15) **Merged pull requests:** @@ -808,7 +830,6 @@ - gh-pages: clicking 'fork me' just reloads the page [\#26](https://github.com/shelljs/shelljs/issues/26) - Not declared local var implies possible memory leak [\#21](https://github.com/shelljs/shelljs/issues/21) - Cannot echo a string that starts with - [\#20](https://github.com/shelljs/shelljs/issues/20) -- Unexpected cp behaviour with directories [\#15](https://github.com/shelljs/shelljs/issues/15) **Merged pull requests:** From 3b266d0a2992f5bbae5ec03710c9e29b1175e67a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 8 May 2018 00:09:33 -0700 Subject: [PATCH 178/338] 0.8.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e22598d11..738b722e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.8.1", + "version": "0.8.2", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 97a4df82a0a0ba5275bef54c18e408d24941bcb0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 8 May 2018 00:29:11 -0700 Subject: [PATCH 179/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6f6270a6..15741bc80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,7 @@ # Change Log -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) - -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.1...HEAD) +## [v0.8.2](https://github.com/shelljs/shelljs/tree/v0.8.2) (2018-05-08) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.1...v0.8.2) **Closed issues:** @@ -815,7 +814,6 @@ - exec with callback should automatically be async [\#31](https://github.com/shelljs/shelljs/issues/31) - Exporting variables. [\#30](https://github.com/shelljs/shelljs/issues/30) - Detecting shelljs/node [\#27](https://github.com/shelljs/shelljs/issues/27) -- Unexpected cp behaviour with directories [\#15](https://github.com/shelljs/shelljs/issues/15) **Merged pull requests:** @@ -830,6 +828,7 @@ - gh-pages: clicking 'fork me' just reloads the page [\#26](https://github.com/shelljs/shelljs/issues/26) - Not declared local var implies possible memory leak [\#21](https://github.com/shelljs/shelljs/issues/21) - Cannot echo a string that starts with - [\#20](https://github.com/shelljs/shelljs/issues/20) +- Unexpected cp behaviour with directories [\#15](https://github.com/shelljs/shelljs/issues/15) **Merged pull requests:** From dd5551da0c8da3a14de7c492865d1dfb4defada4 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 8 May 2018 21:30:32 -0700 Subject: [PATCH 180/338] chore: update shelljs-release version (#846) This bumps the version of our dependency, shelljs-release. I just cut the 3.0 release for shelljs-release, which contains support for the `--otp` flag, as well as the significant refactoring work we put in. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 738b722e9..9fd41b6e2 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "eslint-plugin-import": "^1.11.1", "nyc": "^11.3.0", "shelljs-changelog": "^0.2.0", - "shelljs-release": "^0.2.0", + "shelljs-release": "^0.3.0", "shx": "^0.2.0", "travis-check-changes": "^0.2.0" }, From 4733a32c0825cd75742959ebcef7dc93b03f1b50 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 9 May 2018 17:02:37 -0700 Subject: [PATCH 181/338] chore(appveyor): do not use latest npm (#847) This changes appveyor from using the latest npm version to only using the preinstalled npm version. This is safer, because it's guaranteed to be a compatible version. Fixes #844 --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 3c7952800..f66b81748 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,6 @@ version: '{build}' # Install scripts. (runs after repo cloning) install: - ps: Install-Product node $env:nodejs_version - - npm -g install npm@latest - set PATH=%APPDATA%\npm;%PATH% - node --version - npm --version From aa9d443e7b8126763cfb76b1230a7bdb578a6a5e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 10 May 2018 21:16:25 -0700 Subject: [PATCH 182/338] chore: output npm version in travis (#850) Knowing the `npm` version was a huge help to debugging issue #844. For some reason, we output this on appveyor but not on Travis. This PR fixes that. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 02a02fa5c..bb164d863 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ install: - source ~/.nvm/nvm.sh - nvm install $NODE_VERSION - node --version + - npm --version - npm install os: - linux From 93bbf684c6f487b8ff65b3fc39cde13020f02896 Mon Sep 17 00:00:00 2001 From: Brandon Freitag Date: Wed, 27 Jun 2018 00:02:32 -0700 Subject: [PATCH 183/338] Prevent require-ing bin/shjs (#848) * Prevent require-ing bin/shjs * Move require guard up, and improve function name * Move require up and clarify comment --- bin/shjs | 19 ++++++++++++++----- test/shjs.js | 11 ++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/bin/shjs b/bin/shjs index 75ca58b9d..c4609f7af 100755 --- a/bin/shjs +++ b/bin/shjs @@ -1,12 +1,23 @@ #!/usr/bin/env node + +if (require.main !== module) { + throw new Error('Executable-only module should not be required'); +} + +// we must import global ShellJS methods after the require.main check to prevent the global +// namespace from being polluted if the error is caught require('../global'); -if (process.argv.length < 3) { - console.log('ShellJS: missing argument (script name)'); +function exitWithErrorMessage(msg) { + console.log(msg); console.log(); process.exit(1); } +if (process.argv.length < 3) { + exitWithErrorMessage('ShellJS: missing argument (script name)'); +} + var args, scriptName = process.argv[2]; env['NODE_PATH'] = __dirname + '/../..'; @@ -19,9 +30,7 @@ if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { } if (!test('-f', scriptName)) { - console.log('ShellJS: script not found ('+scriptName+')'); - console.log(); - process.exit(1); + exitWithErrorMessage('ShellJS: script not found ('+scriptName+')'); } args = process.argv.slice(3); diff --git a/test/shjs.js b/test/shjs.js index 4df91666d..850a60f93 100644 --- a/test/shjs.js +++ b/test/shjs.js @@ -4,9 +4,10 @@ import test from 'ava'; import shell from '..'; +const binPath = path.resolve(__dirname, '../bin/shjs'); + function runWithShjs(name) { // prefix with 'node ' for Windows, don't prefix for unix - const binPath = path.resolve(__dirname, '../bin/shjs'); const execPath = process.platform === 'win32' ? `${JSON.stringify(shell.config.execPath)} ` : ''; @@ -52,3 +53,11 @@ test('Extension detection', t => { t.is(result.stdout, 'OK!\n'); t.falsy(result.stderr); }); + +// +// Invalids +// + +test('disallow require-ing', t => { + t.throws(() => require(binPath), 'Executable-only module should not be required'); +}); From 72ff790f4ffbc66f2583f3e3be95d9fd350a4f5f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 28 Jun 2018 14:15:38 -0700 Subject: [PATCH 184/338] chore: bump dev dependencies and add package-lock (#864) No change to logic. This reduces install spam by bumping codecov to avoid depending on a deprecated graceful-fs version, as well as adding a package-lock.json. --- package-lock.json | 7520 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 7521 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..f2ebfb5cd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7520 @@ +{ + "name": "shelljs", + "version": "0.8.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ava/babel-plugin-throws-helper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz", + "integrity": "sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=", + "dev": true + }, + "@ava/babel-preset-stage-4": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz", + "integrity": "sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "package-hash": "1.2.0" + }, + "dependencies": { + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "package-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz", + "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=", + "dev": true, + "requires": { + "md5-hex": "1.3.0" + } + } + } + }, + "@ava/babel-preset-transform-test-files": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz", + "integrity": "sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=", + "dev": true, + "requires": { + "@ava/babel-plugin-throws-helper": "2.0.0", + "babel-plugin-espower": "2.4.0" + } + }, + "@ava/write-file-atomic": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz", + "integrity": "sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "@concordance/react": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@concordance/react/-/react-1.0.0.tgz", + "integrity": "sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ==", + "dev": true, + "requires": { + "arrify": "1.0.1" + } + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.2" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-exclude": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/arr-exclude/-/arr-exclude-1.0.0.tgz", + "integrity": "sha1-38fC5VKicHI8zaBM8xKMjL/lxjE=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "auto-bind": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.2.1.tgz", + "integrity": "sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA==", + "dev": true + }, + "ava": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-0.21.0.tgz", + "integrity": "sha512-+ZjahyjqyzkPLlFZe2OoLmiE3aaQ2jK5h74wrkuX5I+J6LpNAPoQ8X/EhqEtKEjuWwmniLAjnVjZ7OY8rWdJwA==", + "dev": true, + "requires": { + "@ava/babel-preset-stage-4": "1.1.0", + "@ava/babel-preset-transform-test-files": "3.0.0", + "@ava/write-file-atomic": "2.2.0", + "@concordance/react": "1.0.0", + "ansi-escapes": "2.0.0", + "ansi-styles": "3.2.1", + "arr-flatten": "1.1.0", + "array-union": "1.0.2", + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "auto-bind": "1.2.1", + "ava-init": "0.2.1", + "babel-core": "6.26.3", + "bluebird": "3.5.1", + "caching-transform": "1.0.1", + "chalk": "2.4.1", + "chokidar": "1.7.0", + "clean-stack": "1.3.0", + "clean-yaml-object": "0.1.0", + "cli-cursor": "2.1.0", + "cli-spinners": "1.3.1", + "cli-truncate": "1.1.0", + "co-with-promise": "4.6.0", + "code-excerpt": "2.1.1", + "common-path-prefix": "1.0.0", + "concordance": "3.0.0", + "convert-source-map": "1.5.1", + "core-assert": "0.2.1", + "currently-unhandled": "0.4.1", + "debug": "2.6.9", + "dot-prop": "4.2.0", + "empower-core": "0.6.2", + "equal-length": "1.0.1", + "figures": "2.0.0", + "find-cache-dir": "1.0.0", + "fn-name": "2.0.1", + "get-port": "3.2.0", + "globby": "6.1.0", + "has-flag": "2.0.0", + "hullabaloo-config-manager": "1.1.1", + "ignore-by-default": "1.0.1", + "import-local": "0.1.1", + "indent-string": "3.2.0", + "is-ci": "1.1.0", + "is-generator-fn": "1.0.0", + "is-obj": "1.0.1", + "is-observable": "0.2.0", + "is-promise": "2.1.0", + "js-yaml": "3.12.0", + "last-line-stream": "1.0.0", + "lodash.clonedeepwith": "4.5.0", + "lodash.debounce": "4.0.8", + "lodash.difference": "4.5.0", + "lodash.flatten": "4.4.0", + "loud-rejection": "1.6.0", + "make-dir": "1.3.0", + "matcher": "1.1.1", + "md5-hex": "2.0.0", + "meow": "3.7.0", + "ms": "2.1.1", + "multimatch": "2.1.0", + "observable-to-promise": "0.5.0", + "option-chain": "1.0.0", + "package-hash": "2.0.0", + "pkg-conf": "2.1.0", + "plur": "2.1.2", + "pretty-ms": "2.1.0", + "require-precompiled": "0.1.0", + "resolve-cwd": "2.0.0", + "safe-buffer": "5.1.2", + "slash": "1.0.0", + "source-map-support": "0.4.18", + "stack-utils": "1.0.1", + "strip-ansi": "4.0.0", + "strip-bom-buf": "1.0.0", + "supports-color": "4.5.0", + "time-require": "0.1.2", + "trim-off-newlines": "1.0.1", + "unique-temp-dir": "1.0.0", + "update-notifier": "2.5.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + } + } + }, + "ava-init": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.1.tgz", + "integrity": "sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg==", + "dev": true, + "requires": { + "arr-exclude": "1.0.0", + "execa": "0.7.0", + "has-yarn": "1.0.0", + "read-pkg-up": "2.0.0", + "write-pkg": "3.2.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-espower": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-2.4.0.tgz", + "integrity": "sha512-/+SRpy7pKgTI28oEHfn1wkuM5QFAdRq8WNsOOih1dVrdV6A/WbNbRZyl0eX5eyDgtb0lOE27PeDFuCX2j8OxVg==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babylon": "6.18.0", + "call-matcher": "1.0.1", + "core-js": "2.5.7", + "espower-location-detector": "1.0.0", + "espurify": "1.8.0", + "estraverse": "4.2.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "buf-compare": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", + "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=", + "dev": true + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + }, + "dependencies": { + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + } + } + }, + "call-matcher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", + "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", + "dev": true, + "requires": { + "core-js": "2.5.7", + "deep-equal": "1.0.1", + "espurify": "1.8.0", + "estraverse": "4.2.0" + } + }, + "call-signature": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", + "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", + "dev": true + }, + "clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "cli-truncate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", + "dev": true, + "requires": { + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "co-with-promise": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co-with-promise/-/co-with-promise-4.6.0.tgz", + "integrity": "sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=", + "dev": true, + "requires": { + "pinkie-promise": "1.0.0" + } + }, + "code-excerpt": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.1.tgz", + "integrity": "sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw==", + "dev": true, + "requires": { + "convert-to-spaces": "1.0.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codecov": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.2.tgz", + "integrity": "sha512-9ljtIROIjPIUmMRqO+XuDITDoV8xRrZmA0jcEq6p2hg2+wY9wGmLfreAZGIL72IzUfdEDZaU8+Vjidg1fBQ8GQ==", + "dev": true, + "requires": { + "argv": "0.0.2", + "request": "2.87.0", + "urlgrey": "0.4.4" + } + }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "common-path-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", + "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "concordance": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-3.0.0.tgz", + "integrity": "sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ==", + "dev": true, + "requires": { + "date-time": "2.1.0", + "esutils": "2.0.2", + "fast-diff": "1.1.2", + "function-name-support": "0.2.0", + "js-string-escape": "1.0.1", + "lodash.clonedeep": "4.5.0", + "lodash.flattendeep": "4.4.0", + "lodash.merge": "4.6.1", + "md5-hex": "2.0.0", + "semver": "5.5.0", + "well-known-symbols": "1.0.0" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "convert-to-spaces": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", + "dev": true + }, + "core-assert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", + "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=", + "dev": true, + "requires": { + "buf-compare": "1.0.1", + "is-error": "2.2.1" + } + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.45" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-time": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", + "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", + "dev": true, + "requires": { + "time-zone": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "empower-core": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", + "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", + "dev": true, + "requires": { + "call-signature": "0.0.2", + "core-js": "2.5.7" + } + }, + "equal-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", + "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "concat-stream": "1.6.2", + "debug": "2.6.9", + "doctrine": "1.5.0", + "es6-map": "0.1.5", + "escope": "3.6.0", + "espree": "3.5.4", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "1.3.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.17.2", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "optionator": "0.8.2", + "path-is-absolute": "1.0.1", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.6.1", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-3.0.1.tgz", + "integrity": "sha1-t3fgH2XpRpM0QrSZ/IUYqiUaZTA=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "object-assign": "4.1.1", + "resolve": "1.8.1" + } + }, + "eslint-plugin-import": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz", + "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.3.0", + "es6-map": "0.1.5", + "es6-set": "0.1.5", + "eslint-import-resolver-node": "0.2.3", + "has": "1.0.3", + "lodash.cond": "4.5.2", + "lodash.endswith": "4.2.1", + "lodash.find": "4.6.0", + "lodash.findindex": "4.6.0", + "minimatch": "3.0.4", + "object-assign": "4.1.1", + "pkg-dir": "1.0.0", + "pkg-up": "1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz", + "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + } + } + }, + "espower-location-detector": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", + "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", + "dev": true, + "requires": { + "is-url": "1.2.4", + "path-is-absolute": "1.0.1", + "source-map": "0.5.7", + "xtend": "4.0.1" + } + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "5.7.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "espurify": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.0.tgz", + "integrity": "sha512-jdkJG9jswjKCCDmEridNUuIQei9algr+o66ZZ19610ZoBsiWLRsQGNYS4HGez3Z/DsR0lhANGAqiwBUclPuNag==", + "dev": true, + "requires": { + "core-js": "2.5.7" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.4" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.0.0", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "fn-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", + "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function-name-support": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/function-name-support/-/function-name-support-0.2.0.tgz", + "integrity": "sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE=", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-yarn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-1.0.0.tgz", + "integrity": "sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", + "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" + } + }, + "hullabaloo-config-manager": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz", + "integrity": "sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "es6-error": "4.1.1", + "graceful-fs": "4.1.11", + "indent-string": "3.2.0", + "json5": "0.5.1", + "lodash.clonedeep": "4.5.0", + "lodash.clonedeepwith": "4.5.0", + "lodash.isequal": "4.5.0", + "lodash.merge": "4.6.1", + "md5-hex": "2.0.0", + "package-hash": "2.0.0", + "pkg-dir": "2.0.0", + "resolve-from": "3.0.0", + "safe-buffer": "5.1.2" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", + "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.10", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-error": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.1.tgz", + "integrity": "sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "dev": true, + "requires": { + "symbol-observable": "0.2.4" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "last-line-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/last-line-stream/-/last-line-stream-1.0.0.tgz", + "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=", + "dev": true, + "requires": { + "through2": "2.0.3" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ=", + "dev": true + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.endswith": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", + "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", + "dev": true + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", + "dev": true + }, + "lodash.findindex": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "matcher": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", + "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "md5-hex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", + "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.9.0.tgz", + "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", + "dev": true, + "requires": { + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.1", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.3", + "istanbul-lib-source-maps": "1.2.3", + "istanbul-reports": "1.4.0", + "md5-hex": "1.3.0", + "merge-source-map": "1.1.0", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "spawn-wrap": "1.4.2", + "test-exclude": "4.2.1", + "yargs": "11.1.0", + "yargs-parser": "8.1.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "atob": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.1", + "bundled": true, + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "core-js": "2.5.6", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + } + }, + "babel-traverse": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" + } + }, + "babel-types": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "base": { + "version": "0.11.2", + "bundled": true, + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "class-utils": { + "version": "0.3.6", + "bundled": true, + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "bundled": true, + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "core-js": { + "version": "2.5.6", + "bundled": true, + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "define-property": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "fill-range": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "fragment-cache": { + "version": "0.2.1", + "bundled": true, + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "get-value": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "9.18.0", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "bundled": true, + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "has-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hosted-git-info": { + "version": "2.6.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invariant": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-odd": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "bundled": true, + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.3", + "bundled": true, + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "lodash": { + "version": "4.17.10", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.3", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "map-cache": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "nanomatch": { + "version": "1.2.9", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "object.pick": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "bundled": true, + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "ret": { + "version": "0.1.15", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-regex": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "set-value": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "which": "1.3.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "split-string": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "static-extend": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "braces": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "union-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "bundled": true, + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "bundled": true, + "dev": true + }, + "use": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "11.1.0", + "bundled": true, + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "observable-to-promise": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", + "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=", + "dev": true, + "requires": { + "is-observable": "0.2.0", + "symbol-observable": "1.2.0" + }, + "dependencies": { + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "option-chain": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/option-chain/-/option-chain-1.0.0.tgz", + "integrity": "sha1-k41zvU4Xg/lI00AjZEraI2aeMPI=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", + "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "lodash.flattendeep": "4.4.0", + "md5-hex": "2.0.0", + "release-zalgo": "1.0.0" + } + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "parse-ms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", + "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", + "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", + "dev": true + }, + "pinkie-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", + "dev": true, + "requires": { + "pinkie": "1.0.0" + } + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "load-json-file": "4.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + } + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "1.4.0" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", + "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", + "dev": true, + "requires": { + "is-finite": "1.0.2", + "parse-ms": "1.0.1", + "plur": "1.0.0" + }, + "dependencies": { + "plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "randomatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "dev": true, + "requires": { + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "1.8.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + }, + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.8", + "safe-buffer": "5.1.2" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "4.1.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.3.0" + } + }, + "require-precompiled": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", + "integrity": "sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true + }, + "shelljs-changelog": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/shelljs-changelog/-/shelljs-changelog-0.2.5.tgz", + "integrity": "sha1-qDkhj9cqyfz4QGW8lNzTCzDS/x8=", + "dev": true, + "requires": { + "shelljs": "0.7.8" + }, + "dependencies": { + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + } + } + }, + "shelljs-release": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs-release/-/shelljs-release-0.3.0.tgz", + "integrity": "sha512-mTFv773NZF83TyOhmbOT+u7dlh5uqCawvGBuaM6ArHhDo4Y+XNPkZ5m1U9eUfoAJg6Cfiag21JbLO+d13guDXw==", + "dev": true, + "requires": { + "minimist": "1.2.0", + "shelljs": "0.7.8" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + } + } + }, + "shx": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.2.2.tgz", + "integrity": "sha1-CjBNAgsO3xMGrYFXDoDwNG31ijk=", + "dev": true, + "requires": { + "es6-object-assign": "1.1.0", + "minimist": "1.2.0", + "shelljs": "0.7.8" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + } + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.10", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "time-require": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", + "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "date-time": "0.1.1", + "pretty-ms": "0.2.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" + } + }, + "date-time": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", + "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=", + "dev": true + }, + "parse-ms": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz", + "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=", + "dev": true + }, + "pretty-ms": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", + "dev": true, + "requires": { + "parse-ms": "0.1.2" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "travis-check-changes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.2.0.tgz", + "integrity": "sha1-60H3EgiBTgkryRR3O5SaNT0T+SI=", + "dev": true, + "requires": { + "shelljs": "0.7.8" + }, + "dependencies": { + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unique-temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", + "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", + "dev": true, + "requires": { + "mkdirp": "0.5.1", + "os-tmpdir": "1.0.2", + "uid2": "0.0.3" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "urlgrey": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.0.tgz", + "integrity": "sha512-ijO9N2xY/YaOqQ5yz5c4sy2ZjWmA6AR6zASb/gdpeKZ8+948CxwfMW9RrKVk5may6ev8c0/Xguu32e2Llelpqw==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "well-known-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-1.0.0.tgz", + "integrity": "sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "5.0.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "pify": "3.0.0", + "sort-keys": "2.0.0", + "write-file-atomic": "2.3.0" + }, + "dependencies": { + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "write-pkg": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "dev": true, + "requires": { + "sort-keys": "2.0.0", + "write-json-file": "2.3.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 9fd41b6e2..fd9e02d00 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "devDependencies": { "ava": "^0.21.0", "chalk": "^1.1.3", - "codecov": "^1.0.1", + "codecov": "^3.0.2", "coffee-script": "^1.10.0", "eslint": "^2.0.0", "eslint-config-airbnb-base": "^3.0.0", From 1dd437eb6b29a2d9e88ed1542cba5a3bd4e66c99 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 28 Jun 2018 14:15:54 -0700 Subject: [PATCH 185/338] fix(mocks): fix conflict between mocks and skip (#863) This fixes a conflict between mocks.init() and utils.skipOnWin/skipOnUnix. mocks.init() mocks out process.stderr.write, which utils.js implicitly depends on. Instead, preserve stderr.write in a local variable to avoid polluting mocked stdio and to correctly output warning messages. Fixes #862 Test: locally apply mocks.init() inside test/which.js --- test/utils/utils.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/utils/utils.js b/test/utils/utils.js index aae5cdefb..1a3020c1d 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -5,6 +5,9 @@ const chalk = require('chalk'); const common = require('../../src/common'); +// Capture process.stderr.write, otherwise we have a conflict with mocks.js +const _processStderrWrite = process.stderr.write.bind(process.stderr); + function numLines(str) { return typeof str === 'string' ? (str.match(/\n/g) || []).length + 1 : 0; } @@ -23,7 +26,7 @@ function skipOnWinForEPERM(action, testCase) { const error = ret.code; const isWindows = process.platform === 'win32'; if (isWindows && error && /EPERM:/.test(error)) { - console.warn('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.'); + _processStderrWrite('Got EPERM when testing symlinks on Windows. Assuming non-admin environment and skipping test.\n'); } else { testCase(); } @@ -56,9 +59,10 @@ exports.mkfifo = mkfifo; function skipIfTrue(booleanValue, t, closure) { if (booleanValue) { - console.warn( + _processStderrWrite( chalk.yellow('Warning: skipping platform-dependent test ') + - chalk.bold.white(`'${t._test.title}'`) + chalk.bold.white(`'${t._test.title}'`) + + '\n' ); t.truthy(true); // dummy assertion to satisfy ava v0.19+ } else { From 131b88f992346085ed436e02e02e78935f379ae6 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 9 Jul 2018 22:53:58 -0700 Subject: [PATCH 186/338] Fix cp from readonly source (#870) This is a redo of PR #555. This rebases, cleans up a test, and fixes a bug (the original PR uses `fs.chown()` instead of `fs.chownSync()`). Fixes #98 --- src/cp.js | 8 ++++++-- test/cp.js | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/cp.js b/src/cp.js index 4214b0bdf..6218f6700 100644 --- a/src/cp.js +++ b/src/cp.js @@ -99,8 +99,7 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { // Create the directory where all our junk is moving to; read the mode of the // source directory and mirror it try { - var checkDir = common.statFollowLinks(sourceDir); - fs.mkdirSync(destDir, checkDir.mode); + fs.mkdirSync(destDir); } catch (e) { // if the directory already exists, that's okay if (e.code !== 'EEXIST') throw e; @@ -151,6 +150,11 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { } } } // for files + + // finally change the mode for the newly created directory (otherwise, we + // couldn't add files to a read-only directory). + var checkDir = common.statFollowLinks(sourceDir); + fs.chmodSync(destDir, checkDir.mode); } // cpdirSyncRecursive // Checks if cureent file was created recently diff --git a/test/cp.js b/test/cp.js index 8ada327ad..7007917d7 100644 --- a/test/cp.js +++ b/test/cp.js @@ -756,3 +756,27 @@ test('should not overwrite recently created files (not give error no-force mode) // Ensure First file is copied t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'test1'); }); + +// cp -R should be able to copy a readonly src (issue #98). +// On Windows, chmod acts VERY differently so skip these tests for now +test('cp -R should be able to copy a readonly src. issue #98; (Non window platforms only)', t => { + utils.skipOnWin(t, () => { + shell.cp('-r', 'test/resources/cp', t.context.tmp); + shell.chmod('555', `${t.context.tmp}/cp/`); + shell.chmod('555', `${t.context.tmp}/cp/dir_a`); + shell.chmod('555', `${t.context.tmp}/cp/dir_b`); + shell.chmod('555', `${t.context.tmp}/cp/a`); + + const result = shell.cp('-r', `${t.context.tmp}/cp`, `${t.context.tmp}/cp_cp`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + + t.is(shell.ls('-R', `${t.context.tmp}/cp`) + '', shell.ls('-R', `${t.context.tmp}/cp_cp`) + ''); + t.is(fs.statSync(`${t.context.tmp}/cp_cp`).mode & parseInt('777', 8), parseInt('555', 8)); + t.is(fs.statSync(`${t.context.tmp}/cp_cp/dir_a`).mode & parseInt('777', 8), parseInt('555', 8)); + t.is(fs.statSync(`${t.context.tmp}/cp_cp/a`).mode & parseInt('777', 8), parseInt('555', 8)); + + shell.chmod('-R', '755', t.context.tmp); + }); +}); From 6d66a1af98430bc0275e2125d4cae41ccb0de645 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 11 Jul 2018 15:06:20 -0700 Subject: [PATCH 187/338] chore: rename some tests (#871) No change to logic. This renames some tests to be a bit more readable. --- test/cp.js | 129 +++++++++++++++++++++++---------------------------- test/echo.js | 6 +-- 2 files changed, 61 insertions(+), 74 deletions(-) diff --git a/test/cp.js b/test/cp.js index 7007917d7..660dcb881 100644 --- a/test/cp.js +++ b/test/cp.js @@ -54,7 +54,7 @@ test('invalid option', t => { t.is(result.stderr, 'cp: option not recognized: @'); }); -test('invalid option', t => { +test('invalid option #2', t => { const result = shell.cp('-Z', 'asdfasdf', `${t.context.tmp}/file2`); t.truthy(shell.error()); t.is(result.code, 1); @@ -265,39 +265,34 @@ test('recursive, nothing exists', t => { t.is(shell.ls('-R', 'test/resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); }); -test( - 'recursive, nothing exists, source ends in \'/\' (see Github issue #15)', - t => { - const result = shell.cp('-R', 'test/resources/cp/', `${t.context.tmp}/`); - t.falsy(shell.error()); - t.falsy(result.stderr); - t.is(result.code, 0); - t.is(shell.ls('-R', 'test/resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); - } -); +test('recursive, nothing exists, source ends in "/"', t => { + // Github issue #15 + const result = shell.cp('-R', 'test/resources/cp/', `${t.context.tmp}/`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.is(shell.ls('-R', 'test/resources/cp').toString(), shell.ls('-R', `${t.context.tmp}/cp`).toString()); +}); -test( - 'recursive, globbing regular files with extension (see Github issue #376)', - t => { - const result = shell.cp('-R', 'test/resources/file*.txt', t.context.tmp); - t.falsy(shell.error()); - t.falsy(result.stderr); - t.is(result.code, 0); - t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); - t.truthy(fs.existsSync(`${t.context.tmp}/file2.txt`)); - } -); +test('recursive, globbing regular files with extension', t => { + // Github issue #376 + const result = shell.cp('-R', 'test/resources/file*.txt', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); + t.truthy(fs.existsSync(`${t.context.tmp}/file2.txt`)); +}); -test( - 'recursive, copying one regular file (also related to Github issue #376)', - t => { - const result = shell.cp('-R', 'test/resources/file1.txt', t.context.tmp); - t.falsy(shell.error()); - t.falsy(result.stderr); - t.is(result.code, 0); - t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); - t.falsy(common.statFollowLinks(`${t.context.tmp}/file1.txt`).isDirectory()); // don't let it be a dir - } +test('recursive, copying one regular file', t => { + // Github issue #376 + const result = shell.cp('-R', 'test/resources/file1.txt', t.context.tmp); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); + t.falsy(common.statFollowLinks(`${t.context.tmp}/file1.txt`).isDirectory()); // don't let it be a dir +} ); test('recursive, everything exists, no force flag', t => { @@ -365,34 +360,30 @@ test('recursive, everything exists, with force flag', t => { t.is(shell.cat('test/resources/cp/dir_a/z').toString(), shell.cat(`${t.context.tmp}/cp/dir_a/z`).toString()); // after cp }); -test( - 'recursive, creates dest dir since it\'s only one level deep (see Github issue #44)', - t => { - const result = shell.cp('-r', 'test/resources/issue44', `${t.context.tmp}/dir2`); - t.falsy(shell.error()); - t.falsy(result.stderr); - t.is(result.code, 0); - t.is(shell.ls('-R', 'test/resources/issue44').toString(), shell.ls('-R', `${t.context.tmp}/dir2`).toString()); - t.is( +test("recursive, creates dest dir since it's only one level deep", t => { + // Github issue #44 + const result = shell.cp('-r', 'test/resources/issue44', `${t.context.tmp}/dir2`); + t.falsy(shell.error()); + t.falsy(result.stderr); + t.is(result.code, 0); + t.is(shell.ls('-R', 'test/resources/issue44').toString(), shell.ls('-R', `${t.context.tmp}/dir2`).toString()); + t.is( shell.cat('test/resources/issue44/main.js').toString(), shell.cat(`${t.context.tmp}/dir2/main.js`).toString() ); - } -); +}); -test( - 'recursive, does *not* create dest dir since it\'s too deep (see Github issue #44)', - t => { - const result = shell.cp('-r', 'test/resources/issue44', `${t.context.tmp}/dir2/dir3`); - t.truthy(shell.error()); - t.is( - result.stderr, - `cp: cannot create directory '${t.context.tmp}/dir2/dir3': No such file or directory` - ); - t.is(result.code, 1); - t.falsy(fs.existsSync(`${t.context.tmp}/dir2`)); - } -); +test("recursive, does *not* create dest dir since it's too deep", t => { + // Github issue #44 + const result = shell.cp('-r', 'test/resources/issue44', `${t.context.tmp}/dir2/dir3`); + t.truthy(shell.error()); + t.is( + result.stderr, + `cp: cannot create directory '${t.context.tmp}/dir2/dir3': No such file or directory` + ); + t.is(result.code, 1); + t.falsy(fs.existsSync(`${t.context.tmp}/dir2`)); +}); test('recursive, copies entire directory', t => { const result = shell.cp('-r', 'test/resources/cp/dir_a', `${t.context.tmp}/dest`); @@ -409,21 +400,17 @@ test('recursive, with trailing slash, does the exact same', t => { t.truthy(fs.existsSync(`${t.context.tmp}/dest/z`)); }); -test( - 'On Windows, permission bits are quite different so skip those tests for now', - t => { - utils.skipOnWin(t, () => { - // preserve mode bits - const execBit = parseInt('001', 8); - t.is(common.statFollowLinks('test/resources/cp-mode-bits/executable').mode & execBit, execBit); - shell.cp('test/resources/cp-mode-bits/executable', `${t.context.tmp}/executable`); - t.is( - common.statFollowLinks('test/resources/cp-mode-bits/executable').mode, - common.statFollowLinks(`${t.context.tmp}/executable`).mode - ); - }); - } -); +test('preserve mode bits by default for file', t => { + utils.skipOnWin(t, () => { + const execBit = parseInt('001', 8); + t.is(common.statFollowLinks('test/resources/cp-mode-bits/executable').mode & execBit, execBit); + shell.cp('test/resources/cp-mode-bits/executable', `${t.context.tmp}/executable`); + t.is( + common.statFollowLinks('test/resources/cp-mode-bits/executable').mode, + common.statFollowLinks(`${t.context.tmp}/executable`).mode + ); + }); +}); test('Make sure hidden files are copied recursively', t => { shell.rm('-rf', t.context.tmp); diff --git a/test/echo.js b/test/echo.js index f8afbee26..1d571e49b 100644 --- a/test/echo.js +++ b/test/echo.js @@ -31,7 +31,7 @@ test('simple test with defaults', t => { }); test('allow arguments to begin with a hyphen', t => { - // see issue #20 + // Github issue #20 const result = shell.echo('-asdf', '111'); const stdout = mocks.stdout(); const stderr = mocks.stderr(); @@ -62,7 +62,7 @@ test('-e option', t => { }); test('piping to a file', t => { - // see issue #476 + // Github issue #476 shell.mkdir(t.context.tmp); const tmp = `${t.context.tmp}/echo.txt`; const resultA = shell.echo('A').toEnd(tmp); @@ -121,7 +121,7 @@ test('-en option with escaped characters', t => { }); test('piping to a file with -n', t => { - // see issue #476 + // Github issue #476 shell.mkdir(t.context.tmp); const tmp = `${t.context.tmp}/echo.txt`; const resultA = shell.echo('-n', 'A').toEnd(tmp); From 8dae55ff4ac89017eb2fd071b94e8464b1a20bdc Mon Sep 17 00:00:00 2001 From: Stanislav Termosa Date: Thu, 19 Jul 2018 01:33:08 +0300 Subject: [PATCH 188/338] Fix(which): match only executable files (#874) On Unix, this only matches files with the exec bit set. On Windows, this only matches files which are readable (since Windows has different rules for execution). Fixes #657. --- src/which.js | 27 +++++++++++++++++++++++---- test/resources/which/node | 1 + test/which.js | 25 ++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 test/resources/which/node diff --git a/src/which.js b/src/which.js index 0e5433c03..cc497384e 100644 --- a/src/which.js +++ b/src/which.js @@ -13,13 +13,33 @@ common.register('which', _which, { // set on Windows. var XP_DEFAULT_PATHEXT = '.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh'; +// For earlier versions of NodeJS that doesn't have a list of constants (< v6) +var FILE_EXECUTABLE_MODE = 1; + +function isWindowsPlatform() { + return process.platform === 'win32'; +} + // Cross-platform method for splitting environment `PATH` variables function splitPath(p) { return p ? p.split(path.delimiter) : []; } +// Tests are running all cases for this func but it stays uncovered by codecov due to unknown reason +/* istanbul ignore next */ +function isExecutable(pathName) { + try { + // TODO(node-support): replace with fs.constants.X_OK once remove support for node < v6 + fs.accessSync(pathName, FILE_EXECUTABLE_MODE); + } catch (err) { + return false; + } + return true; +} + function checkPath(pathName) { - return fs.existsSync(pathName) && !common.statFollowLinks(pathName).isDirectory(); + return fs.existsSync(pathName) && !common.statFollowLinks(pathName).isDirectory() + && (isWindowsPlatform() || isExecutable(pathName)); } //@ @@ -37,9 +57,8 @@ function checkPath(pathName) { function _which(options, cmd) { if (!cmd) common.error('must specify command'); - var isWindows = process.platform === 'win32'; - var pathEnv = process.env.path || process.env.Path || process.env.PATH; - var pathArray = splitPath(pathEnv); + var isWindows = isWindowsPlatform(); + var pathArray = splitPath(process.env.PATH); var queryMatches = []; diff --git a/test/resources/which/node b/test/resources/which/node new file mode 100644 index 000000000..0b917ba31 --- /dev/null +++ b/test/resources/which/node @@ -0,0 +1 @@ +text file, not an executable diff --git a/test/which.js b/test/which.js index 530fcd2ca..f81d9e0e2 100644 --- a/test/which.js +++ b/test/which.js @@ -1,4 +1,5 @@ import fs from 'fs'; +import path from 'path'; import test from 'ava'; @@ -69,5 +70,27 @@ test('Searching with -a flag returns an array with first item equals to the regu t.falsy(shell.error()); t.truthy(resultForWhich); t.truthy(resultForWhichA); - t.is(resultForWhich.toString(), resultForWhichA[0].toString()); + t.is(resultForWhich.toString(), resultForWhichA[0]); +}); + +test('None executable files does not appear in the result list', t => { + const commandName = 'node'; // Should be an existing command + const extraPath = path.resolve(__dirname, 'resources', 'which'); + const matchingFile = path.resolve(extraPath, commandName); + const pathEnv = process.env.PATH; + + // make sure that file is exists (will throw error otherwise) + t.truthy(fs.existsSync(matchingFile)); + + process.env.PATH = extraPath + path.delimiter + process.env.PATH; + const resultForWhich = shell.which(commandName); + const resultForWhichA = shell.which('-a', commandName); + t.falsy(shell.error()); + t.truthy(resultForWhich); + t.truthy(resultForWhichA); + t.truthy(resultForWhichA.length); + t.not(resultForWhich.toString(), matchingFile); + t.is(resultForWhichA.indexOf(matchingFile), -1); + + process.env.PATH = pathEnv; }); From 4113a72c16dc919ca0f204c9552eaf9247a9dc37 Mon Sep 17 00:00:00 2001 From: Peng Zhao Date: Mon, 23 Jul 2018 11:38:13 +0800 Subject: [PATCH 189/338] grep includes the i flag (#876) grep includes the i flag to ignored upper/lower case differences --- README.md | 3 ++- src/grep.js | 7 ++++++- test/grep.js | 7 +++++++ test/resources/grep/case1 | 1 + test/resources/grep/case1.js | 1 + test/resources/grep/case1.txt | 1 + 6 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 test/resources/grep/case1 create mode 100644 test/resources/grep/case1.js create mode 100644 test/resources/grep/case1.txt diff --git a/README.md b/README.md index cf916b94c..43ce1411b 100644 --- a/README.md +++ b/README.md @@ -362,7 +362,8 @@ include the base directories (e.g., `lib/resources/file1` instead of just `file1 Available options: + `-v`: Invert `regex_filter` (only print non-matching lines). -+ `-l`: Print only filenames of matching files ++ `-l`: Print only filenames of matching files. ++ `-i`: Ignore case. Examples: diff --git a/src/grep.js b/src/grep.js index 3880fa191..b696792a7 100644 --- a/src/grep.js +++ b/src/grep.js @@ -7,6 +7,7 @@ common.register('grep', _grep, { cmdOptions: { 'v': 'inverse', 'l': 'nameOnly', + 'i': 'ignoreCase', }, }); @@ -17,7 +18,8 @@ common.register('grep', _grep, { //@ Available options: //@ //@ + `-v`: Invert `regex_filter` (only print non-matching lines). -//@ + `-l`: Print only filenames of matching files +//@ + `-l`: Print only filenames of matching files. +//@ + `-i`: Ignore case. //@ //@ Examples: //@ @@ -41,6 +43,9 @@ function _grep(options, regex, files) { } var grep = []; + if (options.ignoreCase) { + regex = new RegExp(regex, 'i'); + } files.forEach(function (file) { if (!fs.existsSync(file) && file !== '-') { common.error('no such file or directory: ' + file, 2, { continue: true }); diff --git a/test/grep.js b/test/grep.js index f450aabb1..f973640cc 100644 --- a/test/grep.js +++ b/test/grep.js @@ -137,6 +137,13 @@ test('-l option', t => { t.is(result.split('\n').length - 1, 2); }); +test('-i option', t => { + const result = shell.grep('-i', 'test', 'test/resources/grep/case1', 'test/resources/grep/case1.txt', + 'test/resources/grep/case1.js'); + t.falsy(shell.error()); + t.is(result.split('\n').length - 1, 3); +}); + test('the pattern looks like an option', t => { const result = shell.grep('--', '-v', 'test/resources/grep/file2'); t.falsy(shell.error()); diff --git a/test/resources/grep/case1 b/test/resources/grep/case1 new file mode 100644 index 000000000..b08f7b082 --- /dev/null +++ b/test/resources/grep/case1 @@ -0,0 +1 @@ +Test3 diff --git a/test/resources/grep/case1.js b/test/resources/grep/case1.js new file mode 100644 index 000000000..df6b0d2bc --- /dev/null +++ b/test/resources/grep/case1.js @@ -0,0 +1 @@ +test3 diff --git a/test/resources/grep/case1.txt b/test/resources/grep/case1.txt new file mode 100644 index 000000000..bac87cc8e --- /dev/null +++ b/test/resources/grep/case1.txt @@ -0,0 +1 @@ +TEST3 From d0795156537f83f353deb4834d6cd2c31e212ef9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 9 Oct 2018 19:28:20 -0700 Subject: [PATCH 190/338] docs: remove gitter badge (#880) No change to logic. We don't really use the gitter chatroom right now, so we shouldn't direct users to chat there. It's best to have issues reported directly on Github. This PR removes the gitter badge from the README. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 43ce1411b..bead36e93 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # ShellJS - Unix shell commands for Node.js -[![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/shelljs/shelljs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Travis](https://img.shields.io/travis/shelljs/shelljs/master.svg?style=flat-square&label=unix)](https://travis-ci.org/shelljs/shelljs) [![AppVeyor](https://img.shields.io/appveyor/ci/shelljs/shelljs/master.svg?style=flat-square&label=windows)](https://ci.appveyor.com/project/shelljs/shelljs/branch/master) [![Codecov](https://img.shields.io/codecov/c/github/shelljs/shelljs/master.svg?style=flat-square&label=coverage)](https://codecov.io/gh/shelljs/shelljs) From 4e861db8f9082e946a62b042753b1c227755c80c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 9 Oct 2018 19:28:43 -0700 Subject: [PATCH 191/338] chore(appveyor): run entire test matrix (#886) No change to logic. This changes appveyor to run the entire test matrix, even if a failure occurs early on. This is helpful for debugging. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index f66b81748..24e22b33c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,7 +18,7 @@ install: - npm install matrix: - fast_finish: true + fast_finish: false # No need for MSBuild on this project build: off From 37acb86e89ea03ef8ab6ec9b24f5d1dcd93e8f3f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 27 Oct 2018 13:48:31 -0700 Subject: [PATCH 192/338] chore(npm): add ci-or-install script (#896) * chore(npm): add ci-or-install script This adds a script which checks the npm version and runs either `npm ci` or `npm install` based on support. This is primarily to work around an issue where `npm install` modifies `package-lock.json` for newer npm versions. A side benefit is that `npm ci` is slightly faster than `npm install`. Fixes #893 --- .travis.yml | 2 +- appveyor.yml | 2 +- package-lock.json | 537 +++++++++++++++++++++++++++++++++++++++ package.json | 1 + scripts/ci-or-install.js | 41 +++ 5 files changed, 581 insertions(+), 2 deletions(-) create mode 100755 scripts/ci-or-install.js diff --git a/.travis.yml b/.travis.yml index bb164d863..fd60d6d94 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ install: - nvm install $NODE_VERSION - node --version - npm --version - - npm install + - npm run ci-or-install os: - linux - osx diff --git a/appveyor.yml b/appveyor.yml index 24e22b33c..ca4d4cbd5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,7 @@ install: - set PATH=%APPDATA%\npm;%PATH% - node --version - npm --version - - npm install + - npm run ci-or-install matrix: fast_finish: false diff --git a/package-lock.json b/package-lock.json index f2ebfb5cd..4a3d67b5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1057,6 +1057,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.2.4", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -2034,6 +2035,535 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.11.1", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3274,6 +3804,13 @@ "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "dev": true, + "optional": true + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", diff --git a/package.json b/package.json index fd9e02d00..c4e8a551e 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "src" ], "scripts": { + "ci-or-install": "node scripts/ci-or-install", "posttest": "npm run lint", "test": "nyc --reporter=text --reporter=lcov ava test/*.js", "test-no-coverage": "ava test/*.js", diff --git a/scripts/ci-or-install.js b/scripts/ci-or-install.js new file mode 100755 index 000000000..e71cd1e33 --- /dev/null +++ b/scripts/ci-or-install.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node +var childProcess = require('child_process'); +// Note: can't use 3P modules or shelljs, because this must run before we +// download dependencies. + +// Also, we must use exec{Sync} because `npm` is a batch script on Windows, +// which must run in-process in the shell, and the 'shell' option isn't +// supported on node v4. + +function Version(components) { + this.components = components; +} + +Version.prototype.isAtLeast = function (other) { + if (this.components.length !== 3 || other.components.length !== 3) { + throw new Error('version numbers must have 3 components.'); + } + for (var k = 0; k < this.components.length; k++) { + if (this.components[k] > other.components[k]) return true; + if (this.components[k] < other.components[k]) return false; + } + // At this point, the components must be equal. + return true; +}; + +var npmVersionComponents = childProcess.execSync('npm --version') + .toString().trim().split('.').map(function (str) { + return parseInt(str, 10); + }); +var npmVersion = new Version(npmVersionComponents); +var minimumVersionWithNpmCi = new Version([5, 7, 0]); + +var subcommand = npmVersion.isAtLeast(minimumVersionWithNpmCi) ? + 'ci' : + 'install'; + +console.log('Executing `npm ' + subcommand + '`'); +// Async. Node waits until this is finished. +var c = childProcess.exec('npm ' + subcommand); +c.stdout.pipe(process.stdout); +c.stderr.pipe(process.stderr); From 2b3b781bbc41add8ca17bcd35a6d8f19797285ce Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 27 Oct 2018 13:51:36 -0700 Subject: [PATCH 193/338] fix: silent exec (#892) Unconditionally apply `silent: true` when calling `common.error()` from `exec()`. This is because errors are already printed to stderr, or are intentionally silenced by `shell.config.silent`. Based on #861 Fixes #851 --- src/exec.js | 5 ++++- test/exec.js | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/exec.js b/src/exec.js index 66ef3d736..a73e2cd40 100644 --- a/src/exec.js +++ b/src/exec.js @@ -96,7 +96,10 @@ function execSync(cmd, opts, pipe) { try { common.unlinkSync(stdoutFile); } catch (e) {} if (code !== 0) { - common.error(stderr, code, { continue: true }); + // Note: `silent` should be unconditionally true to avoid double-printing + // the command's stderr, and to avoid printing any stderr when the user has + // set `shell.config.silent`. + common.error(stderr, code, { continue: true, silent: true }); } var obj = common.ShellString(stdout, stderr, code); return obj; diff --git a/test/exec.js b/test/exec.js index 2cd2a67fd..18c9b1b53 100644 --- a/test/exec.js +++ b/test/exec.js @@ -6,14 +6,20 @@ import test from 'ava'; import shell from '..'; import utils from './utils/utils'; +import mocks from './utils/mocks'; const CWD = process.cwd(); const ORIG_EXEC_PATH = shell.config.execPath; shell.config.silent = true; +test.beforeEach(() => { + mocks.init(); +}); + test.afterEach.always(() => { process.chdir(CWD); shell.config.execPath = ORIG_EXEC_PATH; + mocks.restore(); }); // @@ -85,6 +91,14 @@ test('check if stdout + stderr go to output', t => { t.is(result.stderr, '1234\n'); }); +test('check if stdout + stderr should not be printed to console if silent', t => { + shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.error(1234); console.log(666); process.exit(12);"`, { silent: true }); + const stdout = mocks.stdout(); + const stderr = mocks.stderr(); + t.is(stdout, ''); + t.is(stderr, ''); +}); + test('check exit code', t => { const result = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "process.exit(12);"`); t.truthy(shell.error()); From 4bd22e77423182219cd43f0c8d38621b1c957986 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 6 Nov 2018 01:47:25 -0800 Subject: [PATCH 194/338] chore(ci): fix codecov on travis (#897) Apparently, travis hasn't been uploading any coverage data this whole time. This fixes the command (copied from appveyor). --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fd60d6d94..de2e73551 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ script: - npm run gendocs - npm run after-travis "Make sure to generate docs!" after_success: - - codecov + - npm run codecov -- -f coverage/lcov.info # Gitter notifications: From 6b3c7b1e44b5cd308aac3a924165658fac3268d8 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 8 Nov 2018 23:00:22 -0800 Subject: [PATCH 195/338] refactor: don't expose tempdir in common.state (#903) Previously, the cached `tempdir` value was stored in `common.state`. Unlike the other `common.state` values, this isn't immediately useful to other commands (they can just call the tempdir API). So, this moves the cached value into `tempdir.js`. This also adds a unit test for the caching behavior, and exposes test-only helpers to verify this behavior. Finally, this adds a note to `common.state` that values should generally be considered read-only, since this can be important for customized behavior. Although, I recognize our code base has one exception to this rule (`echo()`), we should strive to maintain this. Fixes #902 Test: Added a unit test. --- src/common.js | 2 +- src/exec.js | 2 +- src/tempdir.js | 26 +++++++++++++++++++++----- test/tempdir.js | 10 ++++++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/common.js b/src/common.js index f873782bc..14a49fc58 100644 --- a/src/common.js +++ b/src/common.js @@ -42,11 +42,11 @@ var config = { config.reset(); exports.config = config; +// Note: commands should generally consider these as read-only values. var state = { error: null, errorCode: 0, currentCmd: 'shell.js', - tempDir: null, }; exports.state = state; diff --git a/src/exec.js b/src/exec.js index a73e2cd40..de3322c81 100644 --- a/src/exec.js +++ b/src/exec.js @@ -1,5 +1,5 @@ var common = require('./common'); -var _tempDir = require('./tempdir'); +var _tempDir = require('./tempdir').tempDir; var _pwd = require('./pwd'); var path = require('path'); var fs = require('fs'); diff --git a/src/tempdir.js b/src/tempdir.js index 6fe116fe2..b62032d7d 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -24,6 +24,8 @@ function writeableDir(dir) { } } +// Variable to cache the tempdir value for successive lookups. +var cachedTempDir; //@ //@ ### tempdir() @@ -37,10 +39,9 @@ function writeableDir(dir) { //@ Searches and returns string containing a writeable, platform-dependent temporary directory. //@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). function _tempDir() { - var state = common.state; - if (state.tempDir) return state.tempDir; // from cache + if (cachedTempDir) return cachedTempDir; - state.tempDir = writeableDir(os.tmpdir()) || + cachedTempDir = writeableDir(os.tmpdir()) || writeableDir(process.env.TMPDIR) || writeableDir(process.env.TEMP) || writeableDir(process.env.TMP) || @@ -54,6 +55,21 @@ function _tempDir() { writeableDir('/usr/tmp') || writeableDir('.'); // last resort - return state.tempDir; + return cachedTempDir; } -module.exports = _tempDir; + +// Indicates if the tempdir value is currently cached. This is exposed for tests +// only. The return value should only be tested for truthiness. +function isCached() { + return cachedTempDir; +} + +// Clears the cached tempDir value, if one is cached. This is exposed for tests +// only. +function clearCache() { + cachedTempDir = undefined; +} + +module.exports.tempDir = _tempDir; +module.exports.isCached = isCached; +module.exports.clearCache = clearCache; diff --git a/test/tempdir.js b/test/tempdir.js index ed7ec77fd..c9c24754f 100644 --- a/test/tempdir.js +++ b/test/tempdir.js @@ -3,6 +3,7 @@ import fs from 'fs'; import test from 'ava'; import shell from '..'; +import { isCached, clearCache } from '../src/tempdir'; shell.config.silent = true; @@ -19,3 +20,12 @@ test('basic usage', t => { // It's a directory t.truthy(shell.test('-d', tmp)); }); + +test('cache', t => { + clearCache(); // In case this runs after any test which relies on tempdir(). + t.falsy(isCached()); + const tmp1 = shell.tempdir(); + t.truthy(isCached()); + const tmp2 = shell.tempdir(); + t.is(tmp1, tmp2); +}); From 0d5ecb673e65d4041a2ca26956deee7f5b9480f4 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 12 Nov 2018 20:27:35 -0800 Subject: [PATCH 196/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15741bc80..68c9ccfb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,56 @@ # Change Log +## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) + +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.2...HEAD) + +**Closed issues:** + +- Shelljs print stderr to console even if exec-only "silent" is true [\#905](https://github.com/shelljs/shelljs/issues/905) +- refactor: remove common.state.tempDir [\#902](https://github.com/shelljs/shelljs/issues/902) +- Can't suppress stdout for echo [\#899](https://github.com/shelljs/shelljs/issues/899) +- exec\(\) doesn't apply the arguments correctly [\#895](https://github.com/shelljs/shelljs/issues/895) +- Travis CI currently broken [\#893](https://github.com/shelljs/shelljs/issues/893) +- shell.exec\('npm pack'\) painfully slow [\#885](https://github.com/shelljs/shelljs/issues/885) +- shelljs.exec cannot find app.asar/node\_modules/shelljs/src/exec-child.js [\#881](https://github.com/shelljs/shelljs/issues/881) +- test infra: mocks and skipOnWin conflict [\#862](https://github.com/shelljs/shelljs/issues/862) +- Support for shell function completion on IDE [\#859](https://github.com/shelljs/shelljs/issues/859) +- echo command shows options in stdout [\#855](https://github.com/shelljs/shelljs/issues/855) +- silent does not always work [\#851](https://github.com/shelljs/shelljs/issues/851) +- Appveyor installs the latest npm, instead of the latest compatible npm [\#844](https://github.com/shelljs/shelljs/issues/844) +- Force symbolic link \(ln -sf\) does not overwrite/recreate existing destination [\#830](https://github.com/shelljs/shelljs/issues/830) +- inconsistent result when trying to echo to a file [\#798](https://github.com/shelljs/shelljs/issues/798) +- Prevent require\(\)ing executable-only files [\#789](https://github.com/shelljs/shelljs/issues/789) +- Cannot set property to of \[object String\] which has only a getter [\#752](https://github.com/shelljs/shelljs/issues/752) +- which\(\) should check executability before returning a value [\#657](https://github.com/shelljs/shelljs/issues/657) +- Bad encoding experience [\#456](https://github.com/shelljs/shelljs/issues/456) +- phpcs very slow [\#440](https://github.com/shelljs/shelljs/issues/440) +- Error shown when triggering a sigint during shelljs.exec if process.on sigint is defined [\#254](https://github.com/shelljs/shelljs/issues/254) +- `.to\(file\)` does not mute STDIO output [\#146](https://github.com/shelljs/shelljs/issues/146) +- Escaping shell arguments to exec\(\) [\#143](https://github.com/shelljs/shelljs/issues/143) +- Allow multiple string arguments for exec\(\) [\#103](https://github.com/shelljs/shelljs/issues/103) +- cp does not recursively copy from readonly location [\#98](https://github.com/shelljs/shelljs/issues/98) +- Handling permissions errors on file I/O [\#64](https://github.com/shelljs/shelljs/issues/64) + +**Merged pull requests:** + +- refactor: don't expose tempdir in common.state [\#903](https://github.com/shelljs/shelljs/pull/903) ([nfischer](https://github.com/nfischer)) +- chore\(ci\): fix codecov on travis [\#897](https://github.com/shelljs/shelljs/pull/897) ([nfischer](https://github.com/nfischer)) +- chore\(npm\): add ci-or-install script [\#896](https://github.com/shelljs/shelljs/pull/896) ([nfischer](https://github.com/nfischer)) +- Fix silent exec [\#892](https://github.com/shelljs/shelljs/pull/892) ([nfischer](https://github.com/nfischer)) +- chore\(appveyor\): run entire test matrix [\#886](https://github.com/shelljs/shelljs/pull/886) ([nfischer](https://github.com/nfischer)) +- docs: remove gitter badge [\#880](https://github.com/shelljs/shelljs/pull/880) ([nfischer](https://github.com/nfischer)) +- grep includes the i flag [\#876](https://github.com/shelljs/shelljs/pull/876) ([ppsleep](https://github.com/ppsleep)) +- Fix\(which\): match only executable files \(\#657\) [\#874](https://github.com/shelljs/shelljs/pull/874) ([termosa](https://github.com/termosa)) +- chore: rename some tests [\#871](https://github.com/shelljs/shelljs/pull/871) ([nfischer](https://github.com/nfischer)) +- Fix cp from readonly source [\#870](https://github.com/shelljs/shelljs/pull/870) ([nfischer](https://github.com/nfischer)) +- chore: bump dev dependencies and add package-lock [\#864](https://github.com/shelljs/shelljs/pull/864) ([nfischer](https://github.com/nfischer)) +- fix\(mocks\): fix conflict between mocks and skip [\#863](https://github.com/shelljs/shelljs/pull/863) ([nfischer](https://github.com/nfischer)) +- chore: output npm version in travis [\#850](https://github.com/shelljs/shelljs/pull/850) ([nfischer](https://github.com/nfischer)) +- Prevent require-ing bin/shjs [\#848](https://github.com/shelljs/shelljs/pull/848) ([freitagbr](https://github.com/freitagbr)) +- chore\(appveyor\): do not use latest npm [\#847](https://github.com/shelljs/shelljs/pull/847) ([nfischer](https://github.com/nfischer)) +- chore: update shelljs-release version [\#846](https://github.com/shelljs/shelljs/pull/846) ([nfischer](https://github.com/nfischer)) + ## [v0.8.2](https://github.com/shelljs/shelljs/tree/v0.8.2) (2018-05-08) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.1...v0.8.2) @@ -28,7 +79,6 @@ **Closed issues:** - Exec failing with internal error when piping large output [\#818](https://github.com/shelljs/shelljs/issues/818) -- using sed to replace just the first occurrence of a string [\#813](https://github.com/shelljs/shelljs/issues/813) **Merged pull requests:** @@ -167,7 +217,6 @@ - Add support for other file types in rm [\#617](https://github.com/shelljs/shelljs/issues/617) - Feature request: ls -L option [\#563](https://github.com/shelljs/shelljs/issues/563) - How to send SIGINT signal to child process launched with exec [\#518](https://github.com/shelljs/shelljs/issues/518) -- exec doesnt seem to be working [\#480](https://github.com/shelljs/shelljs/issues/480) - feature request: option to add node\_modules to the path for shelljs scripts [\#469](https://github.com/shelljs/shelljs/issues/469) - high cpu usage during synchronous exec [\#167](https://github.com/shelljs/shelljs/issues/167) From db317bf09236b8cabfa6a18b232a02035e9e08f1 Mon Sep 17 00:00:00 2001 From: Will Yardley Date: Mon, 12 Nov 2018 20:46:10 -0800 Subject: [PATCH 197/338] Add test case for sed on empty file (#904) As discussed as an aside in #900, add test case with an empty file. --- test/resources/sed/empty.txt | 0 test/sed.js | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 test/resources/sed/empty.txt diff --git a/test/resources/sed/empty.txt b/test/resources/sed/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/test/sed.js b/test/sed.js index fc65c5412..b2dc655aa 100644 --- a/test/sed.js +++ b/test/sed.js @@ -174,3 +174,9 @@ test('glob file names, with in-place-replacement', t => { t.is(shell.cat(`${t.context.tmp}/file1.txt`).toString(), 'hello1\n'); t.is(shell.cat(`${t.context.tmp}/file2.txt`).toString(), 'hello2\n'); }); + +test('empty file', t => { + const result = shell.sed('widget', 'wizzle', 'test/resources/sed/empty.txt'); + t.is(result.code, 0); + t.is(result.toString(), ''); +}); From d4d1317ce62531fbd49085852b8492db3dd39312 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 12 Nov 2018 20:49:46 -0800 Subject: [PATCH 198/338] 0.8.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a3d67b5a..3cca706bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.8.2", + "version": "0.8.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c4e8a551e..fcb0fb570 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.8.2", + "version": "0.8.3", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 5da1dda414afe03de49dea93e92ea4a627106fab Mon Sep 17 00:00:00 2001 From: Will Yardley Date: Mon, 12 Nov 2018 21:34:13 -0800 Subject: [PATCH 199/338] fix: Exit 1 with no output if no match (#900) (#901) When we can read all files, but none match, exit 1 and return no output. This matches the behavior of grep more closely. Fixes #900 --- src/grep.js | 4 ++++ test/grep.js | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/grep.js b/src/grep.js index b696792a7..8b3f0226b 100644 --- a/src/grep.js +++ b/src/grep.js @@ -68,6 +68,10 @@ function _grep(options, regex, files) { } }); + if (grep.length === 0 && common.state.errorCode !== 2) { + // We didn't hit the error above, but pattern didn't match + common.error('', { silent: true }); + } return grep.join('\n') + '\n'; } module.exports = _grep; diff --git a/test/grep.js b/test/grep.js index f973640cc..8f6a0c6a8 100644 --- a/test/grep.js +++ b/test/grep.js @@ -49,6 +49,13 @@ test('if at least one file is missing, this should be an error', t => { t.is(result.code, 2); }); +test("multiple files, one doesn't exist, one doesn't match", t => { + const result = shell.grep(/oogabooga/, 'test/resources/file1.txt', + 'test/resources/filedoesnotexist.txt'); + t.truthy(shell.error()); + t.is(result.code, 2); +}); + // // Valids // @@ -127,6 +134,17 @@ test('one file, * in string-regex, make sure * is not globbed', t => { t.is(result.toString(), 'this line ends in.js\nlllllllllllllllll.js\n'); }); +test("one file, pattern doesn't match", t => { + const result = shell.grep('notfoundstring', 'test/resources/grep/file'); + t.truthy(shell.error()); + t.is(result.toString(), ''); + t.is(result.stdout, ''); + // TODO(#900): "grep: " isn't really the correct stderr output, but we need a + // non-empty string so `shell.error()` is truthy. + t.is(result.stderr, 'grep: '); + t.is(result.code, 1); +}); + test('-l option', t => { const result = shell.grep('-l', 'test1', 'test/resources/file1', 'test/resources/file2', 'test/resources/file1.txt'); From 18d8bbf290362d17a1ba5d1e6e9560aed27ce59c Mon Sep 17 00:00:00 2001 From: Shubham Joshi Date: Mon, 12 Nov 2018 21:35:06 -0800 Subject: [PATCH 200/338] feat(cp): support update flag when recursing (#889) Fixed `cp -Ru` ignoring `-u`, and added a test. Fixes #808 --- src/cp.js | 2 +- test/cp.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/cp.js b/src/cp.js index 6218f6700..aa3c80efb 100644 --- a/src/cp.js +++ b/src/cp.js @@ -260,7 +260,7 @@ function _cp(options, sources, dest) { try { common.statFollowLinks(path.dirname(dest)); - cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink }); + cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink, update: options.update }); } catch (e) { /* istanbul ignore next */ common.error("cannot create directory '" + dest + "': No such file or directory"); diff --git a/test/cp.js b/test/cp.js index 660dcb881..f3606a278 100644 --- a/test/cp.js +++ b/test/cp.js @@ -451,6 +451,50 @@ test('-R implies -P', t => { }); }); +test('-Ru respects the -u flag recursively (don\'t update newer file)', t => { + // Setup code + const TWO_DAYS_IN_MS = 2 * 24 * 60 * 60 * 1000; + const dir = `${t.context.tmp}/cp-Ru`; + const sourceDir = `${dir}/old`; + const sourceFile = `${sourceDir}/file`; + const destDir = `${dir}/new`; + const destFile = `${destDir}/file`; + [sourceDir, destDir].forEach(d => shell.mkdir('-p', d)); + shell.ShellString('Source File Contents\n').to(sourceFile); + shell.ShellString('Destination File Contents\n').to(destFile); + // End setup + // Get the old mtime for dest + const oldTime = fs.statSync(destFile).mtimeMs; + // Set the source file to be older than the destination file + shell.touch('-m', oldTime - TWO_DAYS_IN_MS, sourceFile); + // Now, copy the old dir to the new one + shell.cp('-Ru', sourceDir, destDir); + // Check that dest has not been updated + t.is(shell.cat(destFile).stdout, 'Destination File Contents\n'); +}); + +test('-Ru respects the -u flag recursively (update older file)', t => { + // Setup code + const TWO_DAYS_IN_MS = 2 * 24 * 60 * 60 * 1000; + const dir = `${t.context.tmp}/cp-Ru`; + const sourceDir = `${dir}/old`; + const sourceFile = `${sourceDir}/file`; + const destDir = `${dir}/new`; + const destFile = `${destDir}/file`; + [sourceDir, destDir].forEach(d => shell.mkdir('-p', d)); + shell.ShellString('Source File Contents\n').to(sourceFile); + shell.ShellString('Destination File Contents\n').to(destFile); + // End setup + // Get the old mtime for dest + const oldTime = fs.statSync(destFile).mtimeMs; + // Set the destination file to be older than the source file + shell.touch('-m', oldTime + TWO_DAYS_IN_MS, sourceFile); + // Now, copy the old dir to the new one + shell.cp('-Ru', sourceDir, destDir); + // Check that dest has been updated + t.is(shell.cat(sourceFile).stdout, 'Source File Contents\n'); +}); + test('using -P explicitly works', t => { utils.skipOnWin(t, () => { shell.cp('-P', 'test/resources/cp/links/sym.lnk', t.context.tmp); From 26d6e0e02b290e9462d144b1d7e4ef4a29e83317 Mon Sep 17 00:00:00 2001 From: Daniel Ruf Date: Thu, 29 Nov 2018 11:00:05 +0100 Subject: [PATCH 201/338] ci: change language to node_js and remove obsolete scripts (#910) We can safely use `node_js` on all three supported platforms on Travis CI and remove the obsolete scripts. See https://github.com/shelljs/shelljs/pull/908#issuecomment-442732567 --- .travis.yml | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index de2e73551..0258d0b59 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,14 @@ -language: c++ +language: node_js sudo: false -env: - - NODE_VERSION="4" - - NODE_VERSION="5" - - NODE_VERSION="6" - - NODE_VERSION="7" - - NODE_VERSION="8" - - NODE_VERSION="9" - -# keep this blank to make sure there are no before_install steps -before_install: +node_js: + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 install: - - rm -rf ~/.nvm - - git clone https://github.com/creationix/nvm.git ~/.nvm - - source ~/.nvm/nvm.sh - - nvm install $NODE_VERSION - - node --version - - npm --version - npm run ci-or-install os: - linux From 5a6abb5505c282679283bcbc435be29be213fa99 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 29 Nov 2018 02:57:32 -0800 Subject: [PATCH 202/338] chore: remove gitter integration (#907) No change to logic. This removes gitter integration with the project. I don't monitor gitter right now, and I've never noticed the integration to be particularly useful otherwise. Test: N/A --- .travis.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0258d0b59..4c6ee51bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,12 +21,5 @@ script: after_success: - npm run codecov -- -f coverage/lcov.info -# Gitter notifications: email: false - webhooks: - urls: - - https://webhooks.gitter.im/e/743dc6b83b6dd05111ee - on_success: change # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: never # options: [always|never|change] default: always From 87c1ff7d4c1c2f16762103f2962a17f24cf356df Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 29 Nov 2018 22:55:45 -0800 Subject: [PATCH 203/338] chore(npm): remove lockfile (#911) This removes our lockfile and our `ci-or-install` script. The lockfile caused headaches, since `npm install` would modify the lockfile. Unfortunately, `ci-or-install` (added in #896) didn't work reliably on appveyor, so removing the lockfile seems easier. We remove the script since it's now obsolete. Fixes #893 --- .npmrc | 3 + .travis.yml | 2 - appveyor.yml | 2 +- package-lock.json | 8057 -------------------------------------- package.json | 1 - scripts/ci-or-install.js | 41 - 6 files changed, 4 insertions(+), 8102 deletions(-) create mode 100644 .npmrc delete mode 100644 package-lock.json delete mode 100755 scripts/ci-or-install.js diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..2be0a0afb --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +# We can't use lockfiles because npm@5 and npm@6 disagree about the syntax (and +# will modify the lockfile when we run `npm install`). +package-lock=false diff --git a/.travis.yml b/.travis.yml index 4c6ee51bf..42eb81fbf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,6 @@ node_js: - 8 - 9 -install: - - npm run ci-or-install os: - linux - osx diff --git a/appveyor.yml b/appveyor.yml index ca4d4cbd5..24e22b33c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,7 @@ install: - set PATH=%APPDATA%\npm;%PATH% - node --version - npm --version - - npm run ci-or-install + - npm install matrix: fast_finish: false diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3cca706bd..000000000 --- a/package-lock.json +++ /dev/null @@ -1,8057 +0,0 @@ -{ - "name": "shelljs", - "version": "0.8.3", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ava/babel-plugin-throws-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz", - "integrity": "sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=", - "dev": true - }, - "@ava/babel-preset-stage-4": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz", - "integrity": "sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "package-hash": "1.2.0" - }, - "dependencies": { - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "package-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz", - "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=", - "dev": true, - "requires": { - "md5-hex": "1.3.0" - } - } - } - }, - "@ava/babel-preset-transform-test-files": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz", - "integrity": "sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=", - "dev": true, - "requires": { - "@ava/babel-plugin-throws-helper": "2.0.0", - "babel-plugin-espower": "2.4.0" - } - }, - "@ava/write-file-atomic": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz", - "integrity": "sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "@concordance/react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-1.0.0.tgz", - "integrity": "sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ==", - "dev": true, - "requires": { - "arrify": "1.0.1" - } - }, - "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "2.1.1" - } - }, - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.2" - } - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-exclude": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/arr-exclude/-/arr-exclude-1.0.0.tgz", - "integrity": "sha1-38fC5VKicHI8zaBM8xKMjL/lxjE=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "auto-bind": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.2.1.tgz", - "integrity": "sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA==", - "dev": true - }, - "ava": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-0.21.0.tgz", - "integrity": "sha512-+ZjahyjqyzkPLlFZe2OoLmiE3aaQ2jK5h74wrkuX5I+J6LpNAPoQ8X/EhqEtKEjuWwmniLAjnVjZ7OY8rWdJwA==", - "dev": true, - "requires": { - "@ava/babel-preset-stage-4": "1.1.0", - "@ava/babel-preset-transform-test-files": "3.0.0", - "@ava/write-file-atomic": "2.2.0", - "@concordance/react": "1.0.0", - "ansi-escapes": "2.0.0", - "ansi-styles": "3.2.1", - "arr-flatten": "1.1.0", - "array-union": "1.0.2", - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "auto-bind": "1.2.1", - "ava-init": "0.2.1", - "babel-core": "6.26.3", - "bluebird": "3.5.1", - "caching-transform": "1.0.1", - "chalk": "2.4.1", - "chokidar": "1.7.0", - "clean-stack": "1.3.0", - "clean-yaml-object": "0.1.0", - "cli-cursor": "2.1.0", - "cli-spinners": "1.3.1", - "cli-truncate": "1.1.0", - "co-with-promise": "4.6.0", - "code-excerpt": "2.1.1", - "common-path-prefix": "1.0.0", - "concordance": "3.0.0", - "convert-source-map": "1.5.1", - "core-assert": "0.2.1", - "currently-unhandled": "0.4.1", - "debug": "2.6.9", - "dot-prop": "4.2.0", - "empower-core": "0.6.2", - "equal-length": "1.0.1", - "figures": "2.0.0", - "find-cache-dir": "1.0.0", - "fn-name": "2.0.1", - "get-port": "3.2.0", - "globby": "6.1.0", - "has-flag": "2.0.0", - "hullabaloo-config-manager": "1.1.1", - "ignore-by-default": "1.0.1", - "import-local": "0.1.1", - "indent-string": "3.2.0", - "is-ci": "1.1.0", - "is-generator-fn": "1.0.0", - "is-obj": "1.0.1", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "js-yaml": "3.12.0", - "last-line-stream": "1.0.0", - "lodash.clonedeepwith": "4.5.0", - "lodash.debounce": "4.0.8", - "lodash.difference": "4.5.0", - "lodash.flatten": "4.4.0", - "loud-rejection": "1.6.0", - "make-dir": "1.3.0", - "matcher": "1.1.1", - "md5-hex": "2.0.0", - "meow": "3.7.0", - "ms": "2.1.1", - "multimatch": "2.1.0", - "observable-to-promise": "0.5.0", - "option-chain": "1.0.0", - "package-hash": "2.0.0", - "pkg-conf": "2.1.0", - "plur": "2.1.2", - "pretty-ms": "2.1.0", - "require-precompiled": "0.1.0", - "resolve-cwd": "2.0.0", - "safe-buffer": "5.1.2", - "slash": "1.0.0", - "source-map-support": "0.4.18", - "stack-utils": "1.0.1", - "strip-ansi": "4.0.0", - "strip-bom-buf": "1.0.0", - "supports-color": "4.5.0", - "time-require": "0.1.2", - "trim-off-newlines": "1.0.1", - "unique-temp-dir": "1.0.0", - "update-notifier": "2.5.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - } - } - }, - "ava-init": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.1.tgz", - "integrity": "sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg==", - "dev": true, - "requires": { - "arr-exclude": "1.0.0", - "execa": "0.7.0", - "has-yarn": "1.0.0", - "read-pkg-up": "2.0.0", - "write-pkg": "3.2.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-espower": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-2.4.0.tgz", - "integrity": "sha512-/+SRpy7pKgTI28oEHfn1wkuM5QFAdRq8WNsOOih1dVrdV6A/WbNbRZyl0eX5eyDgtb0lOE27PeDFuCX2j8OxVg==", - "dev": true, - "requires": { - "babel-generator": "6.26.1", - "babylon": "6.18.0", - "call-matcher": "1.0.1", - "core-js": "2.5.7", - "espower-location-detector": "1.0.0", - "espurify": "1.8.0", - "estraverse": "4.2.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.4.1", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "buf-compare": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", - "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=", - "dev": true - }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "dev": true, - "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" - }, - "dependencies": { - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - } - } - }, - "call-matcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", - "dev": true, - "requires": { - "core-js": "2.5.7", - "deep-equal": "1.0.1", - "espurify": "1.8.0", - "estraverse": "4.2.0" - } - }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.4", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", - "dev": true - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-spinners": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", - "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", - "dev": true - }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "requires": { - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "co-with-promise": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co-with-promise/-/co-with-promise-4.6.0.tgz", - "integrity": "sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=", - "dev": true, - "requires": { - "pinkie-promise": "1.0.0" - } - }, - "code-excerpt": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.1.tgz", - "integrity": "sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw==", - "dev": true, - "requires": { - "convert-to-spaces": "1.0.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codecov": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.2.tgz", - "integrity": "sha512-9ljtIROIjPIUmMRqO+XuDITDoV8xRrZmA0jcEq6p2hg2+wY9wGmLfreAZGIL72IzUfdEDZaU8+Vjidg1fBQ8GQ==", - "dev": true, - "requires": { - "argv": "0.0.2", - "request": "2.87.0", - "urlgrey": "0.4.4" - } - }, - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "dev": true - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "common-path-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", - "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "concordance": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-3.0.0.tgz", - "integrity": "sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ==", - "dev": true, - "requires": { - "date-time": "2.1.0", - "esutils": "2.0.2", - "fast-diff": "1.1.2", - "function-name-support": "0.2.0", - "js-string-escape": "1.0.1", - "lodash.clonedeep": "4.5.0", - "lodash.flattendeep": "4.4.0", - "lodash.merge": "4.6.1", - "md5-hex": "2.0.0", - "semver": "5.5.0", - "well-known-symbols": "1.0.0" - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" - } - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", - "dev": true - }, - "core-assert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", - "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=", - "dev": true, - "requires": { - "buf-compare": "1.0.1", - "is-error": "2.2.1" - } - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.45" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "date-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", - "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", - "dev": true, - "requires": { - "time-zone": "1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "empower-core": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", - "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", - "dev": true, - "requires": { - "call-signature": "0.0.2", - "core-js": "2.5.7" - } - }, - "equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", - "dev": true - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", - "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "concat-stream": "1.6.2", - "debug": "2.6.9", - "doctrine": "1.5.0", - "es6-map": "0.1.5", - "escope": "3.6.0", - "espree": "3.5.4", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "1.3.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.10", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.2", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "optionator": "0.8.2", - "path-is-absolute": "1.0.1", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.6.1", - "strip-json-comments": "1.0.4", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - }, - "dependencies": { - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "eslint-config-airbnb-base": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-3.0.1.tgz", - "integrity": "sha1-t3fgH2XpRpM0QrSZ/IUYqiUaZTA=", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", - "dev": true, - "requires": { - "debug": "2.6.9", - "object-assign": "4.1.1", - "resolve": "1.8.1" - } - }, - "eslint-plugin-import": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz", - "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.3.0", - "es6-map": "0.1.5", - "es6-set": "0.1.5", - "eslint-import-resolver-node": "0.2.3", - "has": "1.0.3", - "lodash.cond": "4.5.2", - "lodash.endswith": "4.2.1", - "lodash.find": "4.6.0", - "lodash.findindex": "4.6.0", - "minimatch": "3.0.4", - "object-assign": "4.1.1", - "pkg-dir": "1.0.0", - "pkg-up": "1.0.0" - }, - "dependencies": { - "doctrine": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz", - "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - } - } - }, - "espower-location-detector": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", - "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", - "dev": true, - "requires": { - "is-url": "1.2.4", - "path-is-absolute": "1.0.1", - "source-map": "0.5.7", - "xtend": "4.0.1" - } - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "5.7.1", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "espurify": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.0.tgz", - "integrity": "sha512-jdkJG9jswjKCCDmEridNUuIQei9algr+o66ZZ19610ZoBsiWLRsQGNYS4HGez3Z/DsR0lhANGAqiwBUclPuNag==", - "dev": true, - "requires": { - "core-js": "2.5.7" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.4" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", - "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", - "dev": true, - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.11.1", - "node-pre-gyp": "0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function-name-support": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/function-name-support/-/function-name-support-0.2.0.tgz", - "integrity": "sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE=", - "dev": true - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "1.3.5" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - } - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-yarn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-1.0.0.tgz", - "integrity": "sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", - "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" - } - }, - "hullabaloo-config-manager": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz", - "integrity": "sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "es6-error": "4.1.1", - "graceful-fs": "4.1.11", - "indent-string": "3.2.0", - "json5": "0.5.1", - "lodash.clonedeep": "4.5.0", - "lodash.clonedeepwith": "4.5.0", - "lodash.isequal": "4.5.0", - "lodash.merge": "4.6.1", - "md5-hex": "2.0.0", - "package-hash": "2.0.0", - "pkg-dir": "2.0.0", - "resolve-from": "3.0.0", - "safe-buffer": "5.1.2" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "import-local": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", - "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", - "dev": true, - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.10", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.11.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", - "dev": true, - "requires": { - "ci-info": "1.1.3" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-error": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.1.tgz", - "integrity": "sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" - } - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "dev": true, - "requires": { - "symbol-observable": "0.2.4" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "last-line-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/last-line-stream/-/last-line-stream-1.0.0.tgz", - "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=", - "dev": true, - "requires": { - "through2": "2.0.3" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "4.0.1" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.clonedeepwith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ=", - "dev": true - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "lodash.endswith": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", - "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", - "dev": true - }, - "lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", - "dev": true - }, - "lodash.findindex": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", - "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "dev": true, - "optional": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.6.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nyc": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.9.0.tgz", - "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", - "dev": true, - "requires": { - "archy": "1.0.0", - "arrify": "1.0.1", - "caching-transform": "1.0.1", - "convert-source-map": "1.5.1", - "debug-log": "1.0.1", - "default-require-extensions": "1.0.0", - "find-cache-dir": "0.1.1", - "find-up": "2.1.0", - "foreground-child": "1.5.6", - "glob": "7.1.2", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.3", - "istanbul-lib-source-maps": "1.2.3", - "istanbul-reports": "1.4.0", - "md5-hex": "1.3.0", - "merge-source-map": "1.1.0", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "resolve-from": "2.0.0", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "spawn-wrap": "1.4.2", - "test-exclude": "4.2.1", - "yargs": "11.1.0", - "yargs-parser": "8.1.0" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "async": { - "version": "1.5.2", - "bundled": true, - "dev": true - }, - "atob": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "bundled": true, - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-generator": { - "version": "6.26.1", - "bundled": true, - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "bundled": true, - "dev": true, - "requires": { - "core-js": "2.5.6", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" - } - }, - "babel-traverse": { - "version": "6.26.0", - "bundled": true, - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" - } - }, - "babel-types": { - "version": "6.26.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "base": { - "version": "0.11.2", - "bundled": true, - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "caching-transform": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" - } - }, - "camelcase": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "class-utils": { - "version": "0.3.6", - "bundled": true, - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "cliui": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "bundled": true, - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "core-js": { - "version": "2.5.6", - "bundled": true, - "dev": true - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "4.1.3", - "which": "1.3.0" - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "debug-log": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "2.0.0" - } - }, - "define-property": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "detect-indent": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "esutils": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "execa": { - "version": "0.7.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "fill-range": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "4.0.2", - "signal-exit": "3.0.2" - } - }, - "fragment-cache": { - "version": "0.2.1", - "bundled": true, - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "get-value": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "globals": { - "version": "9.18.0", - "bundled": true, - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "bundled": true, - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "has-value": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hosted-git-info": { - "version": "2.6.0", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invariant": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "bundled": true, - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-odd": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "bundled": true, - "dev": true - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "bundled": true, - "dev": true, - "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.3", - "bundled": true, - "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "4.0.11" - } - }, - "js-tokens": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - }, - "lodash": { - "version": "4.17.10", - "bundled": true, - "dev": true - }, - "longest": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.3", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "map-cache": { - "version": "0.2.2", - "bundled": true, - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "md5-hex": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "micromatch": { - "version": "3.1.10", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "nanomatch": { - "version": "1.2.9", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "object.pick": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "pascalcase": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "1.1.2" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "bundled": true, - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "repeat-element": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, - "repeating": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "ret": { - "version": "0.1.15", - "bundled": true, - "dev": true - }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-regex": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "ret": "0.1.15" - } - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "set-value": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true - }, - "source-map-resolve": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "1.5.6", - "mkdirp": "0.5.1", - "os-homedir": "1.0.2", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "which": "1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "split-string": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - } - }, - "static-extend": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.10", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "braces": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "bundled": true, - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } - } - }, - "to-fast-properties": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "to-regex": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "union-value": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "bundled": true, - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "bundled": true, - "dev": true - }, - "use": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "which": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "11.1.0", - "bundled": true, - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "8.1.0", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - } - } - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "observable-to-promise": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", - "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=", - "dev": true, - "requires": { - "is-observable": "0.2.0", - "symbol-observable": "1.2.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "option-chain": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/option-chain/-/option-chain-1.0.0.tgz", - "integrity": "sha1-k41zvU4Xg/lI00AjZEraI2aeMPI=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.3.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "lodash.flattendeep": "4.4.0", - "md5-hex": "2.0.0", - "release-zalgo": "1.0.0" - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.2" - } - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", - "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", - "dev": true - }, - "pinkie-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", - "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", - "dev": true, - "requires": { - "pinkie": "1.0.0" - } - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "load-json-file": "4.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true, - "requires": { - "find-up": "1.1.2" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - } - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "1.4.0" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dev": true, - "requires": { - "is-finite": "1.0.2", - "parse-ms": "1.0.1", - "plur": "1.0.0" - }, - "dependencies": { - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "1.8.1" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, - "requires": { - "rc": "1.2.8", - "safe-buffer": "5.1.2" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "4.1.1" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.0" - } - }, - "require-precompiled": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", - "integrity": "sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "5.5.0" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shelljs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", - "dev": true - }, - "shelljs-changelog": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/shelljs-changelog/-/shelljs-changelog-0.2.5.tgz", - "integrity": "sha1-qDkhj9cqyfz4QGW8lNzTCzDS/x8=", - "dev": true, - "requires": { - "shelljs": "0.7.8" - }, - "dependencies": { - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - } - } - }, - "shelljs-release": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs-release/-/shelljs-release-0.3.0.tgz", - "integrity": "sha512-mTFv773NZF83TyOhmbOT+u7dlh5uqCawvGBuaM6ArHhDo4Y+XNPkZ5m1U9eUfoAJg6Cfiag21JbLO+d13guDXw==", - "dev": true, - "requires": { - "minimist": "1.2.0", - "shelljs": "0.7.8" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - } - } - }, - "shx": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.2.2.tgz", - "integrity": "sha1-CjBNAgsO3xMGrYFXDoDwNG31ijk=", - "dev": true, - "requires": { - "es6-object-assign": "1.1.0", - "minimist": "1.2.0", - "shelljs": "0.7.8" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - } - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" - } - }, - "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-buf": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", - "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", - "dev": true - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.10", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "0.7.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "time-require": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", - "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=", - "dev": true, - "requires": { - "chalk": "0.4.0", - "date-time": "0.1.1", - "pretty-ms": "0.2.2", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" - } - }, - "date-time": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", - "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=", - "dev": true - }, - "parse-ms": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz", - "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=", - "dev": true - }, - "pretty-ms": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", - "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", - "dev": true, - "requires": { - "parse-ms": "0.1.2" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - } - } - }, - "time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "travis-check-changes": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.2.0.tgz", - "integrity": "sha1-60H3EgiBTgkryRR3O5SaNT0T+SI=", - "dev": true, - "requires": { - "shelljs": "0.7.8" - }, - "dependencies": { - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", - "dev": true - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "1.0.0" - } - }, - "unique-temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", - "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", - "dev": true, - "requires": { - "mkdirp": "0.5.1", - "os-tmpdir": "1.0.2", - "uid2": "0.0.3" - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "1.3.0", - "chalk": "2.4.1", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "dev": true - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.0.tgz", - "integrity": "sha512-ijO9N2xY/YaOqQ5yz5c4sy2ZjWmA6AR6zASb/gdpeKZ8+948CxwfMW9RrKVk5may6ev8c0/Xguu32e2Llelpqw==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "well-known-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-1.0.0.tgz", - "integrity": "sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, - "requires": { - "string-width": "2.1.1" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "5.0.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "pify": "3.0.0", - "sort-keys": "2.0.0", - "write-file-atomic": "2.3.0" - }, - "dependencies": { - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "write-pkg": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", - "dev": true, - "requires": { - "sort-keys": "2.0.0", - "write-json-file": "2.3.0" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } -} diff --git a/package.json b/package.json index fcb0fb570..bcc9d2380 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "src" ], "scripts": { - "ci-or-install": "node scripts/ci-or-install", "posttest": "npm run lint", "test": "nyc --reporter=text --reporter=lcov ava test/*.js", "test-no-coverage": "ava test/*.js", diff --git a/scripts/ci-or-install.js b/scripts/ci-or-install.js deleted file mode 100755 index e71cd1e33..000000000 --- a/scripts/ci-or-install.js +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env node -var childProcess = require('child_process'); -// Note: can't use 3P modules or shelljs, because this must run before we -// download dependencies. - -// Also, we must use exec{Sync} because `npm` is a batch script on Windows, -// which must run in-process in the shell, and the 'shell' option isn't -// supported on node v4. - -function Version(components) { - this.components = components; -} - -Version.prototype.isAtLeast = function (other) { - if (this.components.length !== 3 || other.components.length !== 3) { - throw new Error('version numbers must have 3 components.'); - } - for (var k = 0; k < this.components.length; k++) { - if (this.components[k] > other.components[k]) return true; - if (this.components[k] < other.components[k]) return false; - } - // At this point, the components must be equal. - return true; -}; - -var npmVersionComponents = childProcess.execSync('npm --version') - .toString().trim().split('.').map(function (str) { - return parseInt(str, 10); - }); -var npmVersion = new Version(npmVersionComponents); -var minimumVersionWithNpmCi = new Version([5, 7, 0]); - -var subcommand = npmVersion.isAtLeast(minimumVersionWithNpmCi) ? - 'ci' : - 'install'; - -console.log('Executing `npm ' + subcommand + '`'); -// Async. Node waits until this is finished. -var c = childProcess.exec('npm ' + subcommand); -c.stdout.pipe(process.stdout); -c.stderr.pipe(process.stderr); From 06450b8070c02baf71780c9801c3a154228bdc3f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 1 Dec 2018 19:21:45 -0800 Subject: [PATCH 204/338] chore: script to bump supported node versions (#913) No change to node support, this just adds a script. This adds a script to check that we correctly configure all supported node versions, since we need to update quite a few spots (README.md, package.json, travis, appveyor). Issue #873 Test: manual --- .travis.yml | 1 + README.md | 2 +- package.json | 2 + scripts/check-node-support.js | 88 +++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100755 scripts/check-node-support.js diff --git a/.travis.yml b/.travis.yml index 42eb81fbf..807dca4db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,7 @@ script: - npm test # make sure when the docs are generated nothing changes (a.k.a. the docs have already been generated) - npm run gendocs + - npm run check-node-support - npm run after-travis "Make sure to generate docs!" after_success: - npm run codecov -- -f coverage/lcov.info diff --git a/README.md b/README.md index bead36e93..84661fce6 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! -ShellJS is proudly tested on every node release since `v4`! +ShellJS is proudly tested on every node release since `v4`! The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-tested in projects like: diff --git a/package.json b/package.json index bcc9d2380..0cb3cb0b3 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "src" ], "scripts": { + "check-node-support": "node scripts/check-node-support", "posttest": "npm run lint", "test": "nyc --reporter=text --reporter=lcov ava test/*.js", "test-no-coverage": "ava test/*.js", @@ -65,6 +66,7 @@ "eslint": "^2.0.0", "eslint-config-airbnb-base": "^3.0.0", "eslint-plugin-import": "^1.11.1", + "js-yaml": "^3.12.0", "nyc": "^11.3.0", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.3.0", diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js new file mode 100755 index 000000000..ca499c009 --- /dev/null +++ b/scripts/check-node-support.js @@ -0,0 +1,88 @@ +#!/usr/bin/env node + +var assert = require('assert'); +var path = require('path'); + +var yaml = require('js-yaml'); + +var shell = require('..'); + +// This is the authoritative list of supported node versions. +var MIN_NODE_VERSION = 4; +var MAX_NODE_VERSION = 9; + +function checkReadme(minNodeVersion) { + var start = ''; + var stop = ''; + var formattedMinVersion = '`v' + minNodeVersion + '`'; + var expectedReadmeRegex = new RegExp( + start + '\\s*' + formattedMinVersion + '\\s*' + stop, ''); + var readme = path.join(__dirname, '..', 'README.md'); + var match = shell.grep(expectedReadmeRegex, readme); + if (!match.toString()) { + var msg = 'Update README to specify the min supported version. Look for "' + + start + '"'; + throw new Error(msg); + } +} + +function checkEngines(minNodeVersion, package) { + var expectedEnginesNode = '>=' + minNodeVersion; + if (package.engines.node !== expectedEnginesNode) { + var msg = 'Update package.json to fix the "engines" attribute'; + throw new Error(msg); + } +} + +function assertDeepEquals(arr1, arr2, msg) { + try { + assert.deepStrictEqual(arr1, arr2); + } catch (e) { + throw new Error(msg + '\n' + e); + } +} + +function range(start, stop) { + var ret = []; + for (var i = start; i <= stop; i++) { + ret.push(i); + } + return ret; +} + +function checkTravis(minNodeVersion, maxNodeVersion, travisYaml) { + var expectedTravisVersions = range(minNodeVersion, maxNodeVersion); + var msg = 'Check Travis node_js versions'; + assertDeepEquals(travisYaml.node_js, expectedTravisVersions, msg); +} + +function checkAppveyor(minNodeVersion, maxNodeVersion, appveyorYaml) { + var expectedAppveyorVersions = range(minNodeVersion, maxNodeVersion) + .map(function (num) { + return { nodejs_version: num.toString() }; + }) + .reverse(); // Arbitrarily, we store appveyor in reverse order. + var msg = 'Check Appveyor environment.matrix versions'; + assertDeepEquals(appveyorYaml.environment.matrix, expectedAppveyorVersions, + msg); +} + +try { + checkReadme(MIN_NODE_VERSION); + + var package = require('../package.json'); + checkEngines(MIN_NODE_VERSION, package); + + var travisFileName = path.join(__dirname, '..', '.travis.yml'); + var travisYaml = yaml.safeLoad(shell.cat(travisFileName)); + checkTravis(MIN_NODE_VERSION, MAX_NODE_VERSION, travisYaml); + + var appveyorFileName = path.join(__dirname, '..', 'appveyor.yml'); + var appveyorYaml = yaml.safeLoad(shell.cat(appveyorFileName)); + checkAppveyor(MIN_NODE_VERSION, MAX_NODE_VERSION, appveyorYaml); +} catch (e) { + console.error('Please check the files which declare our Node version'); + console.error('support, as something is out-of-sync. This script failed'); + console.error('specificaly because:'); + throw e; +} From 3bb72eda8b82e2b70ea944e9a865e6a8acad2d12 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 1 Dec 2018 20:23:46 -0800 Subject: [PATCH 205/338] chore(node): drop node v4 and v5 (#917) This drops support for node v4 and v5. Neither is currently supported by the Node.js team, nor by the `npm` CLI team, so it's hard to justify we continue to support it. The new minimum supported version is v6. Fixes #873 --- .travis.yml | 2 -- README.md | 2 +- appveyor.yml | 2 -- package.json | 2 +- scripts/check-node-support.js | 2 +- 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 807dca4db..8df349a8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ language: node_js sudo: false node_js: - - 4 - - 5 - 6 - 7 - 8 diff --git a/README.md b/README.md index 84661fce6..fde0b4438 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! -ShellJS is proudly tested on every node release since `v4`! +ShellJS is proudly tested on every node release since `v6`! The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-tested in projects like: diff --git a/appveyor.yml b/appveyor.yml index 24e22b33c..e6fdf5d95 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,8 +4,6 @@ environment: - nodejs_version: '8' - nodejs_version: '7' - nodejs_version: '6' - - nodejs_version: '5' - - nodejs_version: '4' version: '{build}' diff --git a/package.json b/package.json index 0cb3cb0b3..f1cd9a77c 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,6 @@ }, "optionalDependencies": {}, "engines": { - "node": ">=4" + "node": ">=6" } } diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index ca499c009..d8828b286 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -8,7 +8,7 @@ var yaml = require('js-yaml'); var shell = require('..'); // This is the authoritative list of supported node versions. -var MIN_NODE_VERSION = 4; +var MIN_NODE_VERSION = 6; var MAX_NODE_VERSION = 9; function checkReadme(minNodeVersion) { From e6067068559478d6b4fb735414a834f82f59b701 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 2 Dec 2018 21:52:54 -0800 Subject: [PATCH 206/338] fix(exec): consistent error message for maxBuffer (#919) * fix(exec): consistent error message for maxBuffer This explicitly checks for maxBuffer errors in exec-child.js and provides a consistent error message. This modifies the test to verify this. This also supports the change in Node v10, which emits this as a RangeError instead of a regular Error. Although the error message is now explicit, this is not part of our API, since it's just tacked onto the end of exec's stderr. Fixes #915 * Remove debugging log, ignore uncovered lines --- src/exec-child.js | 38 ++++++++++++++++++++++++++++++++++---- test/exec.js | 6 +++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/exec-child.js b/src/exec-child.js index eab86ed37..999618cb1 100644 --- a/src/exec-child.js +++ b/src/exec-child.js @@ -16,19 +16,49 @@ var pipe = params.pipe; var stdoutFile = params.stdoutFile; var stderrFile = params.stderrFile; +function isMaxBufferError(err) { + var maxBufferErrorPattern = /^.*\bmaxBuffer\b.*exceeded.*$/; + if (err instanceof Error && err.message && + err.message.match(maxBufferErrorPattern)) { + // < v10 + // Error: stdout maxBuffer exceeded + return true; + } else if (err instanceof RangeError && err.message && + err.message.match(maxBufferErrorPattern)) { + // >= v10 + // RangeError [ERR_CHILD_PROCESS_STDIO_MAXBUFFER]: stdout maxBuffer length + // exceeded + // TODO(nfischer): remove when we add v10 CI (Github issue #856). + /* istanbul ignore next */ + return true; + } + return false; +} + +var stdoutStream = fs.createWriteStream(stdoutFile); +var stderrStream = fs.createWriteStream(stderrFile); + +function appendError(message, code) { + stderrStream.write(message); + process.exitCode = code; +} + var c = childProcess.exec(cmd, execOptions, function (err) { if (!err) { process.exitCode = 0; + } else if (isMaxBufferError(err)) { + appendError('maxBuffer exceeded', 1); + } else if (err.code === undefined && err.message) { + /* istanbul ignore next */ + appendError(err.message, 1); } else if (err.code === undefined) { - process.exitCode = 1; + /* istanbul ignore next */ + appendError('Unknown issue', 1); } else { process.exitCode = err.code; } }); -var stdoutStream = fs.createWriteStream(stdoutFile); -var stderrStream = fs.createWriteStream(stderrFile); - c.stdout.pipe(stdoutStream); c.stderr.pipe(stderrStream); c.stdout.pipe(process.stdout); diff --git a/test/exec.js b/test/exec.js index 18c9b1b53..2e09658a2 100644 --- a/test/exec.js +++ b/test/exec.js @@ -133,8 +133,12 @@ test('set maxBuffer (very small)', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, '1234567890' + os.EOL); - shell.exec('echo 1234567890', { maxBuffer: 6 }); + const result2 = shell.exec('echo 1234567890', { maxBuffer: 6 }); t.truthy(shell.error()); + t.is(result2.code, 1); + t.is(result2.stdout, '1234567890' + os.EOL); + const maxBufferErrorPattern = /.*\bmaxBuffer\b.*\bexceeded\b.*/; + t.regex(result2.stderr, maxBufferErrorPattern); }); test('set timeout option', t => { From 5cab915f70762be707a7eb56aaeb06d49e8cbbf4 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 2 Dec 2018 22:40:33 -0800 Subject: [PATCH 207/338] chore(test): no coverage by default (#920) NYC takes forever on my local machine, and I generally prefer to look at coverage reports on the website anyway. This changes `npm test` to run without coverage, and changes our CI to run `npm run test-with-coverage` instead. --- .travis.yml | 2 +- appveyor.yml | 2 +- package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8df349a8f..4c7fc96db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ os: - linux - osx script: - - npm test + - npm run test-with-coverage # make sure when the docs are generated nothing changes (a.k.a. the docs have already been generated) - npm run gendocs - npm run check-node-support diff --git a/appveyor.yml b/appveyor.yml index e6fdf5d95..f7490c661 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,7 +22,7 @@ matrix: build: off test_script: - - npm test + - npm run test-with-coverage on_success: - npm run codecov -- -f coverage/lcov.info diff --git a/package.json b/package.json index f1cd9a77c..7e3a88ad1 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "scripts": { "check-node-support": "node scripts/check-node-support", "posttest": "npm run lint", - "test": "nyc --reporter=text --reporter=lcov ava test/*.js", - "test-no-coverage": "ava test/*.js", + "test": "ava test/*.js", + "test-with-coverage": "nyc --reporter=text --reporter=lcov ava test/*.js", "gendocs": "node scripts/generate-docs", "lint": "eslint .", "after-travis": "travis-check-changes", From 355287e2ff8d46dc69803fde9223332b6074719c Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 3 Dec 2018 00:20:38 -0800 Subject: [PATCH 208/338] chore(node): add v10 and v11 to CI (#921) This adds support for v10 and v11, and removes a TODO. --- .travis.yml | 2 ++ appveyor.yml | 2 ++ scripts/check-node-support.js | 2 +- src/exec-child.js | 2 -- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4c7fc96db..38730b133 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,8 @@ node_js: - 7 - 8 - 9 + - 10 + - 11 os: - linux diff --git a/appveyor.yml b/appveyor.yml index f7490c661..c90735916 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,7 @@ environment: matrix: + - nodejs_version: '11' + - nodejs_version: '10' - nodejs_version: '9' - nodejs_version: '8' - nodejs_version: '7' diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index d8828b286..f6f532082 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -9,7 +9,7 @@ var shell = require('..'); // This is the authoritative list of supported node versions. var MIN_NODE_VERSION = 6; -var MAX_NODE_VERSION = 9; +var MAX_NODE_VERSION = 11; function checkReadme(minNodeVersion) { var start = ''; diff --git a/src/exec-child.js b/src/exec-child.js index 999618cb1..cc844e4b6 100644 --- a/src/exec-child.js +++ b/src/exec-child.js @@ -28,8 +28,6 @@ function isMaxBufferError(err) { // >= v10 // RangeError [ERR_CHILD_PROCESS_STDIO_MAXBUFFER]: stdout maxBuffer length // exceeded - // TODO(nfischer): remove when we add v10 CI (Github issue #856). - /* istanbul ignore next */ return true; } return false; From 5371e1629f6e4a73a400f9a0b92c21cfbdf5bfa9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 4 Jan 2019 02:02:04 -0800 Subject: [PATCH 209/338] test(touch): add coverage for -d option (#925) No change to production logic. We never had coverage for `touch({'-d': ...})`, so this adds test coverage. This also updates documentation to clarify the parameter should be an instance of the `Date` type. Test: `handles date argument` case --- README.md | 13 +++++++------ src/touch.js | 13 +++++++------ test/touch.js | 11 +++++++++++ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index fde0b4438..04879742a 100644 --- a/README.md +++ b/README.md @@ -647,19 +647,20 @@ Available options: + `-a`: Change only the access time + `-c`: Do not create any files + `-m`: Change only the modification time -+ `-d DATE`: Parse `DATE` and use it instead of current time -+ `-r FILE`: Use `FILE`'s times instead of current time ++ `{'-d': date}`: Use `date` (instance of `Date`) instead of current time ++ `{'-r': file}`: Use `file`'s times instead of current time Examples: ```javascript touch('source.js'); -touch('-c', '/path/to/some/dir/source.js'); -touch({ '-r': FILE }, '/path/to/some/dir/source.js'); +touch('-c', 'path/to/file.js'); +touch({ '-r': 'referenceFile.txt' }, 'path/to/file.js'); +touch({ '-d': new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); ``` -Update the access and modification times of each `FILE` to the current time. -A `FILE` argument that does not exist is created empty, unless `-c` is supplied. +Update the access and modification times of each file to the current time. +A file argument that does not exist is created empty, unless `-c` is supplied. This is a partial implementation of [`touch(1)`](http://linux.die.net/man/1/touch). diff --git a/src/touch.js b/src/touch.js index 7b7033cd4..a8611b5c8 100644 --- a/src/touch.js +++ b/src/touch.js @@ -20,19 +20,20 @@ common.register('touch', _touch, { //@ + `-a`: Change only the access time //@ + `-c`: Do not create any files //@ + `-m`: Change only the modification time -//@ + `-d DATE`: Parse `DATE` and use it instead of current time -//@ + `-r FILE`: Use `FILE`'s times instead of current time +//@ + `{'-d': date}`: Use `date` (instance of `Date`) instead of current time +//@ + `{'-r': file}`: Use `file`'s times instead of current time //@ //@ Examples: //@ //@ ```javascript //@ touch('source.js'); -//@ touch('-c', '/path/to/some/dir/source.js'); -//@ touch({ '-r': FILE }, '/path/to/some/dir/source.js'); +//@ touch('-c', 'path/to/file.js'); +//@ touch({ '-r': 'referenceFile.txt' }, 'path/to/file.js'); +//@ touch({ '-d': new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); //@ ``` //@ -//@ Update the access and modification times of each `FILE` to the current time. -//@ A `FILE` argument that does not exist is created empty, unless `-c` is supplied. +//@ Update the access and modification times of each file to the current time. +//@ A file argument that does not exist is created empty, unless `-c` is supplied. //@ This is a partial implementation of [`touch(1)`](http://linux.die.net/man/1/touch). function _touch(opts, files) { if (!files) { diff --git a/test/touch.js b/test/touch.js index 41b2107b1..32e283e8f 100644 --- a/test/touch.js +++ b/test/touch.js @@ -119,6 +119,17 @@ test('uses a reference file for mtime', t => { ); }); +test('accepts -d flag', t => { + const testFile = tmpFile(t); + const oldStat = resetUtimes(testFile); + const date = new Date('December 17, 1995 03:24:00'); + const result = shell.touch({'-d': date}, testFile); + t.is(result.code, 0); + // Compare getTime(), because Date can't be compared with triple-equals. + t.is(common.statFollowLinks(testFile).mtime.getTime(), date.getTime()); + t.is(common.statFollowLinks(testFile).atime.getTime(), date.getTime()); +}); + test('sets mtime and atime by default', t => { const testFile = tmpFile(t); const oldStat = resetUtimes(testFile); From 1560ffdc5f1f1ab0299732adaba5bd324c0e0b25 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 5 Jan 2019 00:54:30 -0800 Subject: [PATCH 210/338] feat(options): initial support for long options (#926) * feat(options): initial support for long options This adds initial support for long options. This integration tests them with `shell.touch()` and unit tests them in `test/common.js`. This documents the new syntax. This also refactors some of the common internals: * Creates a new CommandError type to replace the `'earlyExit'` hack * Clearer Error types for `parseOptions()` exceptions * Removes side effects from a test which modifies `common.config` * Fixes appveyor and travis config to run lint (regressed in #920) Issue #924 Test: touch.js, common.js * small refactor for errorOptions --- .travis.yml | 1 + README.md | 8 +++++--- appveyor.yml | 1 + src/common.js | 51 +++++++++++++++++++++++++++++++++----------------- src/touch.js | 8 +++++--- test/common.js | 50 ++++++++++++++++++++++++++++++++++++++++--------- test/touch.js | 13 +++++++++++-- 7 files changed, 98 insertions(+), 34 deletions(-) diff --git a/.travis.yml b/.travis.yml index 38730b133..123a9000a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ os: - osx script: - npm run test-with-coverage + - npm run lint # make sure when the docs are generated nothing changes (a.k.a. the docs have already been generated) - npm run gendocs - npm run check-node-support diff --git a/README.md b/README.md index 04879742a..9cc680e73 100644 --- a/README.md +++ b/README.md @@ -647,8 +647,10 @@ Available options: + `-a`: Change only the access time + `-c`: Do not create any files + `-m`: Change only the modification time -+ `{'-d': date}`: Use `date` (instance of `Date`) instead of current time -+ `{'-r': file}`: Use `file`'s times instead of current time ++ `{'-d': someDate}`, `{date: someDate}`: Use `someDate` (instance of + `Date`) instead of current time ++ `{'-r': file}`, `{reference: file}`: Use `file`'s times instead of current + time Examples: @@ -656,7 +658,7 @@ Examples: touch('source.js'); touch('-c', 'path/to/file.js'); touch({ '-r': 'referenceFile.txt' }, 'path/to/file.js'); -touch({ '-d': new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); +touch({ date: new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); ``` Update the access and modification times of each file to the current time. diff --git a/appveyor.yml b/appveyor.yml index c90735916..2fb024455 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -25,6 +25,7 @@ build: off test_script: - npm run test-with-coverage + - npm run lint on_success: - npm run codecov -- -f coverage/lcov.info diff --git a/src/common.js b/src/common.js index 14a49fc58..2f262feee 100644 --- a/src/common.js +++ b/src/common.js @@ -77,6 +77,15 @@ function convertErrorOutput(msg) { } exports.convertErrorOutput = convertErrorOutput; +// An exception class to help propagate command errors (e.g., non-zero exit +// status) up to the top-level. {@param value} should be a ShellString. +function CommandError(value) { + this.returnValue = value; +} +CommandError.prototype = Object.create(Error.prototype); +CommandError.prototype.constructor = CommandError; +exports.CommandError = CommandError; // visible for testing + // Shows error message. Throws if config.fatal is true function error(msg, _code, options) { // Validate input @@ -111,10 +120,7 @@ function error(msg, _code, options) { if (msg.length > 0 && !options.silent) log(logEntry); if (!options.continue) { - throw { - msg: 'earlyExit', - retValue: (new ShellString('', state.error, state.errorCode)), - }; + throw new CommandError(new ShellString('', state.error, state.errorCode)); } } exports.error = error; @@ -159,13 +165,15 @@ exports.ShellString = ShellString; // Throws an error when passed a string that does not start with '-': // parseOptions('a', {'a':'alice'}); // throws function parseOptions(opt, map, errorOptions) { + errorOptions = errorOptions || {}; // Validate input if (typeof opt !== 'string' && !isObject(opt)) { - throw new Error('options must be strings or key-value pairs'); + throw new TypeError('options must be strings or key-value pairs'); } else if (!isObject(map)) { - throw new Error('parseOptions() internal error: map must be an object'); - } else if (errorOptions && !isObject(errorOptions)) { - throw new Error('parseOptions() internal error: errorOptions must be object'); + throw new TypeError('parseOptions() internal error: map must be an object'); + } else if (!isObject(errorOptions)) { + throw new TypeError( + 'parseOptions() internal error: errorOptions must be object'); } if (opt === '--') { @@ -201,18 +209,27 @@ function parseOptions(opt, map, errorOptions) { options[optionName] = true; } } else { - error('option not recognized: ' + c, errorOptions || {}); + error('option not recognized: ' + c, errorOptions); } }); } else { // opt is an Object Object.keys(opt).forEach(function (key) { - // key is a string of the form '-r', '-d', etc. - var c = key[1]; - if (c in map) { - var optionName = map[c]; - options[optionName] = opt[key]; // assign the given value + if (key[0] === '-') { + // key is a string of the form '-r', '-d', etc. + var c = key[1]; + if (c in map) { + var optionName = map[c]; + options[optionName] = opt[key]; // assign the given value + } else { + error('option not recognized: ' + c, errorOptions); + } } else { - error('option not recognized: ' + c, errorOptions || {}); + if (key in options) { + // key is a "long option", so it should be the same + options[key] = opt[key]; + } else { + error('option not recognized: {' + key + ':...}', errorOptions); + } } }); } @@ -384,8 +401,8 @@ function wrap(cmd, fn, options) { retValue = fn.apply(this, args); } catch (e) { /* istanbul ignore else */ - if (e.msg === 'earlyExit') { - retValue = e.retValue; + if (e instanceof CommandError) { + retValue = e.returnValue; } else { throw e; // this is probably a bug that should be thrown up the call stack } diff --git a/src/touch.js b/src/touch.js index a8611b5c8..a250d45b4 100644 --- a/src/touch.js +++ b/src/touch.js @@ -20,8 +20,10 @@ common.register('touch', _touch, { //@ + `-a`: Change only the access time //@ + `-c`: Do not create any files //@ + `-m`: Change only the modification time -//@ + `{'-d': date}`: Use `date` (instance of `Date`) instead of current time -//@ + `{'-r': file}`: Use `file`'s times instead of current time +//@ + `{'-d': someDate}`, `{date: someDate}`: Use `someDate` (instance of +//@ `Date`) instead of current time +//@ + `{'-r': file}`, `{reference: file}`: Use `file`'s times instead of current +//@ time //@ //@ Examples: //@ @@ -29,7 +31,7 @@ common.register('touch', _touch, { //@ touch('source.js'); //@ touch('-c', 'path/to/file.js'); //@ touch({ '-r': 'referenceFile.txt' }, 'path/to/file.js'); -//@ touch({ '-d': new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); +//@ touch({ date: new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); //@ ``` //@ //@ Update the access and modification times of each file to the current time. diff --git a/test/common.js b/test/common.js index 5e66c1b6c..814ec0744 100644 --- a/test/common.js +++ b/test/common.js @@ -4,13 +4,16 @@ import shell from '..'; import common from '../src/common'; import utils from './utils/utils'; -shell.config.silent = true; - test.beforeEach(() => { + shell.config.silent = true; common.state.error = null; common.state.errorCode = 0; }); +test.afterEach(() => { + common.config.resetForTesting(); +}); + // // Invalids // @@ -34,7 +37,7 @@ test('parseOptions (invalid option in options object)', t => { f: 'force', r: 'reverse', }); - }); + }, common.CommandError); }); test('parseOptions (without a hyphen in the string)', t => { @@ -42,7 +45,7 @@ test('parseOptions (without a hyphen in the string)', t => { common.parseOptions('f', { f: 'force', }); - }); + }, Error); }); test('parseOptions (opt is not a string/object)', t => { @@ -50,13 +53,13 @@ test('parseOptions (opt is not a string/object)', t => { common.parseOptions(1, { f: 'force', }); - }); + }, TypeError); }); test('parseOptions (map is not an object)', t => { t.throws(() => { common.parseOptions('-f', 27); - }); + }, TypeError); }); test('parseOptions (errorOptions is not an object)', t => { @@ -64,7 +67,7 @@ test('parseOptions (errorOptions is not an object)', t => { common.parseOptions('-f', { f: 'force', }, 'not a valid errorOptions'); - }); + }, TypeError); }); test('parseOptions (unrecognized string option)', t => { @@ -72,7 +75,7 @@ test('parseOptions (unrecognized string option)', t => { common.parseOptions('-z', { f: 'force', }); - }); + }, common.CommandError); }); test('parseOptions (unrecognized option in Object)', t => { @@ -200,7 +203,6 @@ test('common.buffer with different config.bufLength', t => { const buf = common.buffer(); t.truthy(buf instanceof Buffer); t.is(buf.length, 20); - common.config.reset(); }); test('common.parseOptions (normal case)', t => { @@ -264,6 +266,29 @@ test('common.parseOptions throws when passed a string not starting with "-"', t }, Error, "Options string must start with a '-'"); }); +test('common.parseOptions allows long options', t => { + const result = common.parseOptions({ value: true }, { + v: 'value', + }); + t.truthy(result.value); +}); + +test('common.parseOptions allows long options with values', t => { + const someObject = {}; + const result = common.parseOptions({ value: someObject }, { + v: 'value', + }); + t.is(result.value, someObject); +}); + +test('common.parseOptions throws for unknown long option', t => { + t.throws(() => { + common.parseOptions({ throws: true }, { + v: 'value', + }); + }, common.CommandError); +}); + test('common.parseOptions with -- argument', t => { const result = common.parseOptions('--', { R: 'recursive', @@ -307,3 +332,10 @@ test('Changing shell.config.execPath does not modify process', t => { shell.config.execPath = 'foo'; t.not(shell.config.execPath, process.execPath); }); + +test('CommandError is a subclass of Error', t => { + const e = new common.CommandError(new common.ShellString('some value')); + t.truthy(e instanceof common.CommandError); + t.truthy(e instanceof Error); + t.is(e.constructor, common.CommandError); +}); diff --git a/test/touch.js b/test/touch.js index 32e283e8f..a331bf70d 100644 --- a/test/touch.js +++ b/test/touch.js @@ -121,9 +121,18 @@ test('uses a reference file for mtime', t => { test('accepts -d flag', t => { const testFile = tmpFile(t); - const oldStat = resetUtimes(testFile); const date = new Date('December 17, 1995 03:24:00'); - const result = shell.touch({'-d': date}, testFile); + const result = shell.touch({ '-d': date }, testFile); + t.is(result.code, 0); + // Compare getTime(), because Date can't be compared with triple-equals. + t.is(common.statFollowLinks(testFile).mtime.getTime(), date.getTime()); + t.is(common.statFollowLinks(testFile).atime.getTime(), date.getTime()); +}); + +test('accepts long option (date)', t => { + const testFile = tmpFile(t); + const date = new Date('December 17, 1995 03:24:00'); + const result = shell.touch({ date }, testFile); t.is(result.code, 0); // Compare getTime(), because Date can't be compared with triple-equals. t.is(common.statFollowLinks(testFile).mtime.getTime(), date.getTime()); From a8775129f5dd668eeef48e3561046f1e1b31a7e2 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 5 Jan 2019 00:57:58 -0800 Subject: [PATCH 211/338] docs(changelog): updated by Nate Fischer [ci skip] --- CHANGELOG.md | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68c9ccfb5..3afb73026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,34 @@ ## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.2...HEAD) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.3...HEAD) + +**Closed issues:** + +- find returns empty array even though directory has files [\#922](https://github.com/shelljs/shelljs/issues/922) +- exec\(\) should support node v10 \(maxbuffer change\) [\#915](https://github.com/shelljs/shelljs/issues/915) +- grep exit status and extra newlines [\#900](https://github.com/shelljs/shelljs/issues/900) +- Travis CI currently broken [\#893](https://github.com/shelljs/shelljs/issues/893) +- Drop node v4 support [\#873](https://github.com/shelljs/shelljs/issues/873) +- cp -Ru respects the -R but not the -u [\#808](https://github.com/shelljs/shelljs/issues/808) + +**Merged pull requests:** + +- feat\(options\): initial support for long options [\#926](https://github.com/shelljs/shelljs/pull/926) ([nfischer](https://github.com/nfischer)) +- test\(touch\): add coverage for -d option [\#925](https://github.com/shelljs/shelljs/pull/925) ([nfischer](https://github.com/nfischer)) +- chore\(node\): add v10 and v11 to CI [\#921](https://github.com/shelljs/shelljs/pull/921) ([nfischer](https://github.com/nfischer)) +- chore\(test\): no coverage by default [\#920](https://github.com/shelljs/shelljs/pull/920) ([nfischer](https://github.com/nfischer)) +- fix\(exec\): consistent error message for maxBuffer [\#919](https://github.com/shelljs/shelljs/pull/919) ([nfischer](https://github.com/nfischer)) +- chore\(node\): drop node v4 and v5 [\#917](https://github.com/shelljs/shelljs/pull/917) ([nfischer](https://github.com/nfischer)) +- chore: script to bump supported node versions [\#913](https://github.com/shelljs/shelljs/pull/913) ([nfischer](https://github.com/nfischer)) +- chore\(npm\): remove lockfile [\#911](https://github.com/shelljs/shelljs/pull/911) ([nfischer](https://github.com/nfischer)) +- ci: change language to node\_js and remove obsolete scripts [\#910](https://github.com/shelljs/shelljs/pull/910) ([DanielRuf](https://github.com/DanielRuf)) +- chore: remove gitter integration [\#907](https://github.com/shelljs/shelljs/pull/907) ([nfischer](https://github.com/nfischer)) +- fix: Exit 1 with empty string if no match [\#901](https://github.com/shelljs/shelljs/pull/901) ([wyardley](https://github.com/wyardley)) +- feat\(cp\): support update flag when recursing [\#889](https://github.com/shelljs/shelljs/pull/889) ([joshi-sh](https://github.com/joshi-sh)) + +## [v0.8.3](https://github.com/shelljs/shelljs/tree/v0.8.3) (2018-11-13) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.2...v0.8.3) **Closed issues:** @@ -10,7 +37,6 @@ - refactor: remove common.state.tempDir [\#902](https://github.com/shelljs/shelljs/issues/902) - Can't suppress stdout for echo [\#899](https://github.com/shelljs/shelljs/issues/899) - exec\(\) doesn't apply the arguments correctly [\#895](https://github.com/shelljs/shelljs/issues/895) -- Travis CI currently broken [\#893](https://github.com/shelljs/shelljs/issues/893) - shell.exec\('npm pack'\) painfully slow [\#885](https://github.com/shelljs/shelljs/issues/885) - shelljs.exec cannot find app.asar/node\_modules/shelljs/src/exec-child.js [\#881](https://github.com/shelljs/shelljs/issues/881) - test infra: mocks and skipOnWin conflict [\#862](https://github.com/shelljs/shelljs/issues/862) @@ -34,6 +60,7 @@ **Merged pull requests:** +- Add test case for sed on empty file [\#904](https://github.com/shelljs/shelljs/pull/904) ([wyardley](https://github.com/wyardley)) - refactor: don't expose tempdir in common.state [\#903](https://github.com/shelljs/shelljs/pull/903) ([nfischer](https://github.com/nfischer)) - chore\(ci\): fix codecov on travis [\#897](https://github.com/shelljs/shelljs/pull/897) ([nfischer](https://github.com/nfischer)) - chore\(npm\): add ci-or-install script [\#896](https://github.com/shelljs/shelljs/pull/896) ([nfischer](https://github.com/nfischer)) From 9237f66c52e5daa40458f94f9565e18e8132f5a6 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 6 Mar 2019 03:39:08 -0800 Subject: [PATCH 212/338] docs: clarify which methods return ShellStrings (#934) No change to logic, only docs. In v0.7.0, we introduced ShellStrings and changed most methods to return them. Docs weren't appropriately updated, so this PR cross-links these methods to the ShellString docs. This also expands on the ShellString docs themselves, since there was room to make this clearer. Fixes #933 --- README.md | 100 ++++++++++++++++++++++++++++++++------------------ src/cat.js | 6 +-- src/cd.js | 3 +- src/chmod.js | 2 + src/common.js | 14 +++++-- src/cp.js | 3 +- src/echo.js | 3 +- src/exec.js | 8 ++-- src/find.js | 3 +- src/grep.js | 5 ++- src/head.js | 2 +- src/ln.js | 4 +- src/ls.js | 5 ++- src/mkdir.js | 5 ++- src/mv.js | 3 +- src/pwd.js | 2 +- src/rm.js | 3 +- src/sed.js | 5 ++- src/sort.js | 5 ++- src/tail.js | 2 +- src/test.js | 3 +- src/to.js | 3 +- src/toEnd.js | 3 +- src/touch.js | 4 +- src/uniq.js | 3 +- src/which.js | 3 +- 26 files changed, 129 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 9cc680e73..aa4b67206 100644 --- a/README.md +++ b/README.md @@ -151,15 +151,16 @@ var str = cat('file1', 'file2'); var str = cat(['file1', 'file2']); // same as above ``` -Returns a string containing the given file, or a concatenated string -containing the files if more than one file is given (a new line character is -introduced between each file). +Returns a [ShellString](#shellstringstr) containing the given file, or a +concatenated string containing the files if more than one file is given (a +new line character is introduced between each file). ### cd([dir]) Changes to directory `dir` for the duration of the script. Changes to home -directory if no argument is supplied. +directory if no argument is supplied. Returns a +[ShellString](#shellstringstr) to indicate success or failure. ### chmod([options,] octal_mode || octal_string, file) @@ -189,6 +190,8 @@ Notable exceptions: given to the `umask`. + There is no "quiet" option, since default behavior is to run silent. +Returns a [ShellString](#shellstringstr) indicating success or failure. + ### cp([options,] source [, source ...], dest) ### cp([options,] source_array, dest) @@ -211,7 +214,8 @@ cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above ``` -Copies files. +Copies files. Returns a [ShellString](#shellstringstr) indicating success +or failure. ### pushd([options,] [dir | '-N' | '+N']) @@ -295,8 +299,7 @@ var str = echo('hello world'); echo('-n', 'no newline at end'); ``` -Prints `string` to stdout, and returns string with additional utility methods -like `.to()`. +Prints `string` to stdout, and returns a [ShellString](#shellstringstr). ### exec(command [, options] [, callback]) @@ -328,10 +331,10 @@ exec('some_long_running_process', function(code, stdout, stderr) { }); ``` -Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -mode, this returns a `ShellString` (compatible with ShellJS v0.6.x, which returns an object -of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -object, and the `callback` receives the arguments `(code, stdout, stderr)`. +Executes the given `command` _synchronously_, unless otherwise specified. +When in synchronous mode, this returns a [ShellString](#shellstringstr). +Otherwise, this returns the child process object, and the `callback` +receives the arguments `(code, stdout, stderr)`. Not seeing the behavior you want? `exec()` runs everything through `sh` by default (or `cmd.exe` on Windows), which differs from `bash`. If you @@ -349,7 +352,8 @@ find(['src', 'lib']); // same as above find('.').filter(function(file) { return file.match(/\.js$/); }); ``` -Returns array of all files (however deep) in the given paths. +Returns a [ShellString](#shellstringstr) (with array-like properties) of all +files (however deep) in the given paths. The main difference from `ls('-R', path)` is that the resulting file names include the base directories (e.g., `lib/resources/file1` instead of just `file1`). @@ -371,8 +375,9 @@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); grep('GLOBAL_VARIABLE', '*.js'); ``` -Reads input string from given files and returns a string containing all lines of the -file that match the given `regex_filter`. +Reads input string from given files and returns a +[ShellString](#shellstringstr) containing all lines of the @ file that match +the given `regex_filter`. ### head([{'-n': \},] file [, file ...]) @@ -390,7 +395,7 @@ var str = head('file1', 'file2'); var str = head(['file1', 'file2']); // same as above ``` -Read the start of a file. +Read the start of a `file`. Returns a [ShellString](#shellstringstr). ### ln([options,] source, dest) @@ -407,7 +412,9 @@ ln('file', 'newlink'); ln('-sf', 'file', 'existing'); ``` -Links `source` to `dest`. Use `-f` to force the link, should `dest` already exist. +Links `source` to `dest`. Use `-f` to force the link, should `dest` already +exist. Returns a [ShellString](#shellstringstr) indicating success or +failure. ### ls([options,] [path, ...]) @@ -433,8 +440,9 @@ ls('-R', ['/users/me', '/tmp']); // same as above ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} ``` -Returns array of files in the given `path`, or files in -the current directory if no `path` is provided. +Returns a [ShellString](#shellstringstr) (with array-like properties) of all +the files in the given `path`, or files in the current directory if no +`path` is provided. ### mkdir([options,] dir [, dir ...]) @@ -451,7 +459,8 @@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above ``` -Creates directories. +Creates directories. Returns a [ShellString](#shellstringstr) indicating +success or failure. ### mv([options ,] source [, source ...], dest') @@ -470,12 +479,13 @@ mv('file1', 'file2', 'dir/'); mv(['file1', 'file2'], 'dir/'); // same as above ``` -Moves `source` file(s) to `dest`. +Moves `source` file(s) to `dest`. Returns a [ShellString](#shellstringstr) +indicating success or failure. ### pwd() -Returns the current directory. +Returns the current directory as a [ShellString](#shellstringstr). ### rm([options,] file [, file ...]) @@ -494,7 +504,8 @@ rm('some_file.txt', 'another_file.txt'); rm(['some_file.txt', 'another_file.txt']); // same as above ``` -Removes files. +Removes files. Returns a [ShellString](#shellstringstr) indicating success +or failure. ### sed([options,] search_regex, replacement, file [, file ...]) @@ -511,8 +522,9 @@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); ``` -Reads an input string from `file`s, and performs a JavaScript `replace()` on the input -using the given `search_regex` and `replacement` string or function. Returns the new string after replacement. +Reads an input string from `file`s, and performs a JavaScript `replace()` on +the input using the given `search_regex` and `replacement` string or +function. Returns the new [ShellString](#shellstringstr) after replacement. Note: @@ -557,8 +569,9 @@ sort('foo.txt', 'bar.txt'); sort('-r', 'foo.txt'); ``` -Return the contents of the `file`s, sorted line-by-line. Sorting multiple -files mixes their content (just as unix `sort` does). +Return the contents of the `file`s, sorted line-by-line as a +[ShellString](#shellstringstr). Sorting multiple files mixes their content +(just as unix `sort` does). ### tail([{'-n': \},] file [, file ...]) @@ -576,7 +589,7 @@ var str = tail('file1', 'file2'); var str = tail(['file1', 'file2']); // same as above ``` -Read the end of a `file`. +Read the end of a `file`. Returns a [ShellString](#shellstringstr). ### tempdir() @@ -611,7 +624,8 @@ if (test('-d', path)) { /* do something with dir */ }; if (!test('-f', path)) continue; // skip if it's a regular file ``` -Evaluates `expression` using the available primaries and returns corresponding value. +Evaluates `expression` using the available primaries and returns +corresponding boolean value. ### ShellString.prototype.to(file) @@ -624,7 +638,8 @@ cat('input.txt').to('output.txt'); Analogous to the redirection operator `>` in Unix, but works with `ShellStrings` (such as those returned by `cat`, `grep`, etc.). _Like Unix -redirections, `to()` will overwrite any existing file!_ +redirections, `to()` will overwrite any existing file!_ Returns the same +[ShellString](#shellstringstr) this operated on, to support chaining. ### ShellString.prototype.toEnd(file) @@ -636,7 +651,8 @@ cat('input.txt').toEnd('output.txt'); ``` Analogous to the redirect-and-append operator `>>` in Unix, but works with -`ShellStrings` (such as those returned by `cat`, `grep`, etc.). +`ShellStrings` (such as those returned by `cat`, `grep`, etc.). Returns the +same [ShellString](#shellstringstr) this operated on, to support chaining. ### touch([options,] file [, file ...]) @@ -663,7 +679,9 @@ touch({ date: new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); Update the access and modification times of each file to the current time. A file argument that does not exist is created empty, unless `-c` is supplied. -This is a partial implementation of [`touch(1)`](http://linux.die.net/man/1/touch). +This is a partial implementation of +[`touch(1)`](http://linux.die.net/man/1/touch). Returns a +[ShellString](#shellstringstr) indicating success or failure. ### uniq([options,] [input, [output]]) @@ -682,7 +700,8 @@ uniq('-i', 'foo.txt'); uniq('-cd', 'foo.txt', 'bar.txt'); ``` -Filter adjacent matching lines from `input`. +Filter adjacent matching lines from `input`. Returns a +[ShellString](#shellstringstr). ### which(command) @@ -695,7 +714,8 @@ var nodeExec = which('node'); Searches for `command` in the system's `PATH`. On Windows, this uses the `PATHEXT` variable to append the extension if it's not already executable. -Returns string containing the absolute path to `command`. +Returns a [ShellString](#shellstringstr) containing the absolute path to +`command`. ### exit(code) @@ -717,11 +737,19 @@ the `.stderr` attribute from the last command's return value instead. Examples: ```javascript -var foo = ShellString('hello world'); +var foo = new ShellString('hello world'); ``` -Turns a regular string into a string-like object similar to what each -command returns. This has special methods, like `.to()` and `.toEnd()`. +This is a dedicated type returned by most ShellJS methods, which wraps a +string (or array) value. This has all the string (or array) methods, but +also exposes extra methods: [`.to()`](#shellstringprototypetofile), +[`.toEnd()`](#shellstringprototypetoendfile), and all the pipe-able methods +(ex. `.cat()`, `.grep()`, etc.). This can be easily converted into a string +by calling `.toString()`. + +This type also exposes the corresponding command's stdout, stderr, and +return status code via the `.stdout` (string), `.stderr` (string), and +`.code` (number) properties respectively. ### env['VAR_NAME'] diff --git a/src/cat.js b/src/cat.js index c5c44347c..86214fac4 100644 --- a/src/cat.js +++ b/src/cat.js @@ -24,9 +24,9 @@ common.register('cat', _cat, { //@ var str = cat(['file1', 'file2']); // same as above //@ ``` //@ -//@ Returns a string containing the given file, or a concatenated string -//@ containing the files if more than one file is given (a new line character is -//@ introduced between each file). +//@ Returns a [ShellString](#shellstringstr) containing the given file, or a +//@ concatenated string containing the files if more than one file is given (a +//@ new line character is introduced between each file). function _cat(options, files) { var cat = common.readFromPipe(); diff --git a/src/cd.js b/src/cd.js index 27bc21075..1c6e73fff 100644 --- a/src/cd.js +++ b/src/cd.js @@ -7,7 +7,8 @@ common.register('cd', _cd, {}); //@ ### cd([dir]) //@ //@ Changes to directory `dir` for the duration of the script. Changes to home -//@ directory if no argument is supplied. +//@ directory if no argument is supplied. Returns a +//@ [ShellString](#shellstringstr) to indicate success or failure. function _cd(options, dir) { if (!dir) dir = os.homedir(); diff --git a/src/chmod.js b/src/chmod.js index bcc3a0370..f7a471032 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -59,6 +59,8 @@ common.register('chmod', _chmod, { //@ + In symbolic modes, `a-r` and `-r` are identical. No consideration is //@ given to the `umask`. //@ + There is no "quiet" option, since default behavior is to run silent. +//@ +//@ Returns a [ShellString](#shellstringstr) indicating success or failure. function _chmod(options, mode, filePattern) { if (!filePattern) { if (options.length > 0 && options.charAt(0) === '-') { diff --git a/src/common.js b/src/common.js index 2f262feee..43e81098f 100644 --- a/src/common.js +++ b/src/common.js @@ -131,11 +131,19 @@ exports.error = error; //@ Examples: //@ //@ ```javascript -//@ var foo = ShellString('hello world'); +//@ var foo = new ShellString('hello world'); //@ ``` //@ -//@ Turns a regular string into a string-like object similar to what each -//@ command returns. This has special methods, like `.to()` and `.toEnd()`. +//@ This is a dedicated type returned by most ShellJS methods, which wraps a +//@ string (or array) value. This has all the string (or array) methods, but +//@ also exposes extra methods: [`.to()`](#shellstringprototypetofile), +//@ [`.toEnd()`](#shellstringprototypetoendfile), and all the pipe-able methods +//@ (ex. `.cat()`, `.grep()`, etc.). This can be easily converted into a string +//@ by calling `.toString()`. +//@ +//@ This type also exposes the corresponding command's stdout, stderr, and +//@ return status code via the `.stdout` (string), `.stderr` (string), and +//@ `.code` (number) properties respectively. function ShellString(stdout, stderr, code) { var that; if (stdout instanceof Array) { diff --git a/src/cp.js b/src/cp.js index aa3c80efb..b0d214fc8 100644 --- a/src/cp.js +++ b/src/cp.js @@ -209,7 +209,8 @@ function cpcheckcycle(sourceDir, srcFile) { //@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above //@ ``` //@ -//@ Copies files. +//@ Copies files. Returns a [ShellString](#shellstringstr) indicating success +//@ or failure. function _cp(options, sources, dest) { // If we're missing -R, it actually implies -L (unless -P is explicit) if (options.followsymlink) { diff --git a/src/echo.js b/src/echo.js index 1b089d59c..da37f438a 100644 --- a/src/echo.js +++ b/src/echo.js @@ -22,8 +22,7 @@ common.register('echo', _echo, { //@ echo('-n', 'no newline at end'); //@ ``` //@ -//@ Prints `string` to stdout, and returns string with additional utility methods -//@ like `.to()`. +//@ Prints `string` to stdout, and returns a [ShellString](#shellstringstr). function _echo(opts) { // allow strings starting with '-', see issue #20 var messages = [].slice.call(arguments, opts ? 0 : 1); diff --git a/src/exec.js b/src/exec.js index de3322c81..f63fd5bb0 100644 --- a/src/exec.js +++ b/src/exec.js @@ -169,10 +169,10 @@ function execAsync(cmd, opts, pipe, callback) { //@ }); //@ ``` //@ -//@ Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -//@ mode, this returns a `ShellString` (compatible with ShellJS v0.6.x, which returns an object -//@ of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -//@ object, and the `callback` receives the arguments `(code, stdout, stderr)`. +//@ Executes the given `command` _synchronously_, unless otherwise specified. +//@ When in synchronous mode, this returns a [ShellString](#shellstringstr). +//@ Otherwise, this returns the child process object, and the `callback` +//@ receives the arguments `(code, stdout, stderr)`. //@ //@ Not seeing the behavior you want? `exec()` runs everything through `sh` //@ by default (or `cmd.exe` on Windows), which differs from `bash`. If you diff --git a/src/find.js b/src/find.js index 0de695ade..b6c882979 100644 --- a/src/find.js +++ b/src/find.js @@ -16,7 +16,8 @@ common.register('find', _find, {}); //@ find('.').filter(function(file) { return file.match(/\.js$/); }); //@ ``` //@ -//@ Returns array of all files (however deep) in the given paths. +//@ Returns a [ShellString](#shellstringstr) (with array-like properties) of all +//@ files (however deep) in the given paths. //@ //@ The main difference from `ls('-R', path)` is that the resulting file names //@ include the base directories (e.g., `lib/resources/file1` instead of just `file1`). diff --git a/src/grep.js b/src/grep.js index 8b3f0226b..57450d10d 100644 --- a/src/grep.js +++ b/src/grep.js @@ -28,8 +28,9 @@ common.register('grep', _grep, { //@ grep('GLOBAL_VARIABLE', '*.js'); //@ ``` //@ -//@ Reads input string from given files and returns a string containing all lines of the -//@ file that match the given `regex_filter`. +//@ Reads input string from given files and returns a +//@ [ShellString](#shellstringstr) containing all lines of the @ file that match +//@ the given `regex_filter`. function _grep(options, regex, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); diff --git a/src/head.js b/src/head.js index 7169fd393..ffb08fd7c 100644 --- a/src/head.js +++ b/src/head.js @@ -46,7 +46,7 @@ function readSomeLines(file, numLines) { //@ var str = head(['file1', 'file2']); // same as above //@ ``` //@ -//@ Read the start of a file. +//@ Read the start of a `file`. Returns a [ShellString](#shellstringstr). function _head(options, files) { var head = []; var pipe = common.readFromPipe(); diff --git a/src/ln.js b/src/ln.js index 2cf87cd89..1d3d0e745 100644 --- a/src/ln.js +++ b/src/ln.js @@ -24,7 +24,9 @@ common.register('ln', _ln, { //@ ln('-sf', 'file', 'existing'); //@ ``` //@ -//@ Links `source` to `dest`. Use `-f` to force the link, should `dest` already exist. +//@ Links `source` to `dest`. Use `-f` to force the link, should `dest` already +//@ exist. Returns a [ShellString](#shellstringstr) indicating success or +//@ failure. function _ln(options, source, dest) { if (!source || !dest) { common.error('Missing and/or '); diff --git a/src/ls.js b/src/ls.js index daebdf822..31495fbdc 100644 --- a/src/ls.js +++ b/src/ls.js @@ -40,8 +40,9 @@ common.register('ls', _ls, { //@ ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} //@ ``` //@ -//@ Returns array of files in the given `path`, or files in -//@ the current directory if no `path` is provided. +//@ Returns a [ShellString](#shellstringstr) (with array-like properties) of all +//@ the files in the given `path`, or files in the current directory if no +//@ `path` is provided. function _ls(options, paths) { if (options.all_deprecated) { // We won't support the -a option as it's hard to image why it's useful diff --git a/src/mkdir.js b/src/mkdir.js index 6168d592b..992df7c0d 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -47,7 +47,8 @@ function mkdirSyncRecursive(dir) { //@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above //@ ``` //@ -//@ Creates directories. +//@ Creates directories. Returns a [ShellString](#shellstringstr) indicating +//@ success or failure. function _mkdir(options, dirs) { if (!dirs) common.error('no paths given'); @@ -96,5 +97,5 @@ function _mkdir(options, dirs) { } }); return ''; -} // mkdir +} // man arraykdir module.exports = _mkdir; diff --git a/src/mv.js b/src/mv.js index ac28a24eb..d8fe2ed47 100644 --- a/src/mv.js +++ b/src/mv.js @@ -36,7 +36,8 @@ function checkRecentCreated(sources, index) { //@ mv(['file1', 'file2'], 'dir/'); // same as above //@ ``` //@ -//@ Moves `source` file(s) to `dest`. +//@ Moves `source` file(s) to `dest`. Returns a [ShellString](#shellstringstr) +//@ indicating success or failure. function _mv(options, sources, dest) { // Get sources, dest if (arguments.length < 3) { diff --git a/src/pwd.js b/src/pwd.js index 8fcf8fcec..8527d8b38 100644 --- a/src/pwd.js +++ b/src/pwd.js @@ -8,7 +8,7 @@ common.register('pwd', _pwd, { //@ //@ ### pwd() //@ -//@ Returns the current directory. +//@ Returns the current directory as a [ShellString](#shellstringstr). function _pwd() { var pwd = path.resolve(process.cwd()); return pwd; diff --git a/src/rm.js b/src/rm.js index 90409ac68..42e2f5195 100644 --- a/src/rm.js +++ b/src/rm.js @@ -163,7 +163,8 @@ function handleFIFO(file) { //@ rm(['some_file.txt', 'another_file.txt']); // same as above //@ ``` //@ -//@ Removes files. +//@ Removes files. Returns a [ShellString](#shellstringstr) indicating success +//@ or failure. function _rm(options, files) { if (!files) common.error('no paths given'); diff --git a/src/sed.js b/src/sed.js index f094e4442..6e681981a 100644 --- a/src/sed.js +++ b/src/sed.js @@ -24,8 +24,9 @@ common.register('sed', _sed, { //@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); //@ ``` //@ -//@ Reads an input string from `file`s, and performs a JavaScript `replace()` on the input -//@ using the given `search_regex` and `replacement` string or function. Returns the new string after replacement. +//@ Reads an input string from `file`s, and performs a JavaScript `replace()` on +//@ the input using the given `search_regex` and `replacement` string or +//@ function. Returns the new [ShellString](#shellstringstr) after replacement. //@ //@ Note: //@ diff --git a/src/sort.js b/src/sort.js index 0f42cb6a3..3468268ea 100644 --- a/src/sort.js +++ b/src/sort.js @@ -54,8 +54,9 @@ function numericalCmp(a, b) { //@ sort('-r', 'foo.txt'); //@ ``` //@ -//@ Return the contents of the `file`s, sorted line-by-line. Sorting multiple -//@ files mixes their content (just as unix `sort` does). +//@ Return the contents of the `file`s, sorted line-by-line as a +//@ [ShellString](#shellstringstr). Sorting multiple files mixes their content +//@ (just as unix `sort` does). function _sort(options, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); diff --git a/src/tail.js b/src/tail.js index 258412f73..10f5a3c32 100644 --- a/src/tail.js +++ b/src/tail.js @@ -24,7 +24,7 @@ common.register('tail', _tail, { //@ var str = tail(['file1', 'file2']); // same as above //@ ``` //@ -//@ Read the end of a `file`. +//@ Read the end of a `file`. Returns a [ShellString](#shellstringstr). function _tail(options, files) { var tail = []; var pipe = common.readFromPipe(); diff --git a/src/test.js b/src/test.js index 228c7471f..20fe886fc 100644 --- a/src/test.js +++ b/src/test.js @@ -38,7 +38,8 @@ common.register('test', _test, { //@ if (!test('-f', path)) continue; // skip if it's a regular file //@ ``` //@ -//@ Evaluates `expression` using the available primaries and returns corresponding value. +//@ Evaluates `expression` using the available primaries and returns +//@ corresponding boolean value. function _test(options, path) { if (!path) common.error('no path given'); diff --git a/src/to.js b/src/to.js index f1355bfc7..e7dcc50d7 100644 --- a/src/to.js +++ b/src/to.js @@ -18,7 +18,8 @@ common.register('to', _to, { //@ //@ Analogous to the redirection operator `>` in Unix, but works with //@ `ShellStrings` (such as those returned by `cat`, `grep`, etc.). _Like Unix -//@ redirections, `to()` will overwrite any existing file!_ +//@ redirections, `to()` will overwrite any existing file!_ Returns the same +//@ [ShellString](#shellstringstr) this operated on, to support chaining. function _to(options, file) { if (!file) common.error('wrong arguments'); diff --git a/src/toEnd.js b/src/toEnd.js index 63749d0b4..1d6e9609f 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -17,7 +17,8 @@ common.register('toEnd', _toEnd, { //@ ``` //@ //@ Analogous to the redirect-and-append operator `>>` in Unix, but works with -//@ `ShellStrings` (such as those returned by `cat`, `grep`, etc.). +//@ `ShellStrings` (such as those returned by `cat`, `grep`, etc.). Returns the +//@ same [ShellString](#shellstringstr) this operated on, to support chaining. function _toEnd(options, file) { if (!file) common.error('wrong arguments'); diff --git a/src/touch.js b/src/touch.js index a250d45b4..ed1839ae8 100644 --- a/src/touch.js +++ b/src/touch.js @@ -36,7 +36,9 @@ common.register('touch', _touch, { //@ //@ Update the access and modification times of each file to the current time. //@ A file argument that does not exist is created empty, unless `-c` is supplied. -//@ This is a partial implementation of [`touch(1)`](http://linux.die.net/man/1/touch). +//@ This is a partial implementation of +//@ [`touch(1)`](http://linux.die.net/man/1/touch). Returns a +//@ [ShellString](#shellstringstr) indicating success or failure. function _touch(opts, files) { if (!files) { common.error('no files given'); diff --git a/src/uniq.js b/src/uniq.js index a7e343bd3..eea381f48 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -36,7 +36,8 @@ common.register('uniq', _uniq, { //@ uniq('-cd', 'foo.txt', 'bar.txt'); //@ ``` //@ -//@ Filter adjacent matching lines from `input`. +//@ Filter adjacent matching lines from `input`. Returns a +//@ [ShellString](#shellstringstr). function _uniq(options, input, output) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); diff --git a/src/which.js b/src/which.js index cc497384e..120cb2e94 100644 --- a/src/which.js +++ b/src/which.js @@ -53,7 +53,8 @@ function checkPath(pathName) { //@ //@ Searches for `command` in the system's `PATH`. On Windows, this uses the //@ `PATHEXT` variable to append the extension if it's not already executable. -//@ Returns string containing the absolute path to `command`. +//@ Returns a [ShellString](#shellstringstr) containing the absolute path to +//@ `command`. function _which(options, cmd) { if (!cmd) common.error('must specify command'); From 6d83d3509b06effab20aae1baf0241fb79e92754 Mon Sep 17 00:00:00 2001 From: Jason Cooke Date: Sat, 8 Jun 2019 15:14:54 +1200 Subject: [PATCH 213/338] docs: fix typo (#943) --- README.md | 2 +- src/dirs.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aa4b67206..a1b1d4dab 100644 --- a/README.md +++ b/README.md @@ -223,7 +223,7 @@ or failure. Available options: + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. -+ `-q`: Supresses output to the console. ++ `-q`: Suppresses output to the console. Arguments: diff --git a/src/dirs.js b/src/dirs.js index 26547a5b3..41fc6ecba 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -40,7 +40,7 @@ function _actualDirStack() { //@ Available options: //@ //@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. -//@ + `-q`: Supresses output to the console. +//@ + `-q`: Suppresses output to the console. //@ //@ Arguments: //@ From f7dbc61d41ff7b5fef04791b172adb4629d43797 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 20 Jun 2019 22:52:47 -0700 Subject: [PATCH 214/338] chore(lint): alphabetize lint rules (#946) No change to the rules, this just reorders the eslintrc file so there's a sane way to add new rules. Test: npm run lint --- .eslintrc.json | 26 +++++++++++++------------- test/.eslintrc.json | 16 ++++++++-------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index f96d7f578..0b0048877 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,25 +5,25 @@ "extends": "airbnb-base/legacy", "rules": { "comma-dangle": ["error", "always-multiline"], - "global-require": "off", - "vars-on-top": "off", - "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], - "no-param-reassign": "off", - "no-console": "off", + "consistent-return": "off", "curly": ["error", "multi-line"], "func-names": "off", - "quote-props": "off", - "no-underscore-dangle": "off", + "global-require": "off", "max-len": "off", - "no-use-before-define": "off", - "no-empty": "off", - "no-else-return": "off", - "no-throw-literal": "off", "newline-per-chained-call": "off", - "consistent-return": "off", + "no-console": "off", + "no-else-return": "off", + "no-empty": "off", "no-mixed-operators": "off", - "no-prototype-builtins": "off", "no-multiple-empty-lines": ["error", { "max": 2, "maxBOF": 0, "maxEOF": 0 } ], + "no-param-reassign": "off", + "no-prototype-builtins": "off", + "no-throw-literal": "off", + "no-underscore-dangle": "off", + "no-use-before-define": "off", + "quote-props": "off", + "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], + "vars-on-top": "off", "new-cap": ["error", { "capIsNewExceptions": [ "ShellString" diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 6f23f8ec4..658eeb06e 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -4,19 +4,19 @@ }, "extends": "airbnb-base", "rules": { - "import/no-mutable-exports": "off", + "curly": "off", "global-require": "off", - "vars-on-top": "off", - "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], - "no-param-reassign": "off", + "import/no-mutable-exports": "off", + "max-len": "off", "no-console": "off", - "curly": "off", + "no-param-reassign": "off", + "no-underscore-dangle": "off", "no-var": "error", + "prefer-arrow-callback": "off", "prefer-const": "error", "prefer-template": "off", - "prefer-arrow-callback": "off", - "no-underscore-dangle": "off", - "max-len": "off", + "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], + "vars-on-top": "off", "new-cap": ["error", { "capIsNewExceptions": [ "ShellString" From a8e543a8d07f859d68c33ab9a796d01ccdc7be4b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 20 Jun 2019 23:34:41 -0700 Subject: [PATCH 215/338] chore(lint): upgrade eslint (#947) This upgrades eslint to a new version to resolve a security warning. This fixes a couple new lint errors, and disables some lint checks. The current version of the airbnb lint config triggers DeprecationWarnings in the new version of eslint. These warnings will be resolved in a follow-up. Test: npm run lint --- .eslintrc.json | 2 ++ package.json | 2 +- src/chmod.js | 2 +- src/dirs.js | 2 +- src/which.js | 2 +- test/.eslintrc.json | 1 + test/chmod.js | 2 +- 7 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 0b0048877..7de7d8f1b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -9,12 +9,14 @@ "curly": ["error", "multi-line"], "func-names": "off", "global-require": "off", + "indent": "off", "max-len": "off", "newline-per-chained-call": "off", "no-console": "off", "no-else-return": "off", "no-empty": "off", "no-mixed-operators": "off", + "no-multi-spaces": "off", "no-multiple-empty-lines": ["error", { "max": 2, "maxBOF": 0, "maxEOF": 0 } ], "no-param-reassign": "off", "no-prototype-builtins": "off", diff --git a/package.json b/package.json index 7e3a88ad1..44b5c1aff 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "chalk": "^1.1.3", "codecov": "^3.0.2", "coffee-script": "^1.10.0", - "eslint": "^2.0.0", + "eslint": "^5.16.0", "eslint-config-airbnb-base": "^3.0.0", "eslint-plugin-import": "^1.11.1", "js-yaml": "^3.12.0", diff --git a/src/chmod.js b/src/chmod.js index f7a471032..604453e7e 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -124,7 +124,7 @@ function _chmod(options, mode, filePattern) { if (isNaN(parseInt(mode, 8))) { // parse options mode.split(',').forEach(function (symbolicMode) { - var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; + var pattern = /([ugoa]*)([=+-])([rwxXst]*)/i; var matches = pattern.exec(symbolicMode); if (matches) { diff --git a/src/dirs.js b/src/dirs.js index 41fc6ecba..f3be3ac01 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -16,7 +16,7 @@ common.register('popd', _popd, { var _dirStack = []; function _isStackIndex(index) { - return (/^[\-+]\d+$/).test(index); + return (/^[-+]\d+$/).test(index); } function _parseStackIndex(index) { diff --git a/src/which.js b/src/which.js index 120cb2e94..28ba267df 100644 --- a/src/which.js +++ b/src/which.js @@ -86,7 +86,7 @@ function _which(options, cmd) { attempt = attempt.toUpperCase(); } - var match = attempt.match(/\.[^<>:"/\|?*.]+$/); + var match = attempt.match(/\.[^<>:"/|?*.]+$/); if (match && pathExtArray.indexOf(match[0]) >= 0) { // this is Windows-only // The user typed a query with the file extension, like // `which('node.exe')` diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 658eeb06e..2b1ab9b6c 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -7,6 +7,7 @@ "curly": "off", "global-require": "off", "import/no-mutable-exports": "off", + "indent": "off", "max-len": "off", "no-console": "off", "no-param-reassign": "off", diff --git a/test/chmod.js b/test/chmod.js index 5c0905e8b..1e3bdacd4 100644 --- a/test/chmod.js +++ b/test/chmod.js @@ -27,7 +27,7 @@ test('invalid permissions', t => { let result = shell.chmod('blah'); t.truthy(shell.error()); t.is(result.code, 1); - result = shell.chmod('893', `${TMP}/chmod`); // invalid permissions - mode must be in octal + result = shell.chmod('893', `${TMP}/chmod`); // invalid permissions - mode must be in octal t.truthy(shell.error()); t.is(result.code, 1); }); From 619d23493c7f945c299621b63506559026c698a9 Mon Sep 17 00:00:00 2001 From: st-sloth Date: Wed, 26 Jun 2019 11:08:09 +0300 Subject: [PATCH 216/338] docs(sed): clarify using `sed` with newlines (#949) Also remove example featuring line deletion as it does not work since the regex with '\n' will never match anything, because the file content is split by '\n' so there are no '\n's to match at all. --- README.md | 9 ++++++--- src/sed.js | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a1b1d4dab..e01d0fd6e 100644 --- a/README.md +++ b/README.md @@ -519,11 +519,10 @@ Examples: ```javascript sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); ``` -Reads an input string from `file`s, and performs a JavaScript `replace()` on -the input using the given `search_regex` and `replacement` string or +Reads an input string from `file`s, line by line, and performs a JavaScript `replace()` on +each of the lines from the input string using the given `search_regex` and `replacement` string or function. Returns the new [ShellString](#shellstringstr) after replacement. Note: @@ -535,6 +534,10 @@ using the `$n` syntax: sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); ``` +Also, like unix `sed`, ShellJS `sed` runs replacements on each line from the input file +(split by '\n') separately, so `search_regex`es that span more than one line (or inlclude '\n') +will not match anything and nothing will be replaced. + ### set(options) diff --git a/src/sed.js b/src/sed.js index 6e681981a..f616ba9ff 100644 --- a/src/sed.js +++ b/src/sed.js @@ -21,11 +21,10 @@ common.register('sed', _sed, { //@ //@ ```javascript //@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); //@ ``` //@ -//@ Reads an input string from `file`s, and performs a JavaScript `replace()` on -//@ the input using the given `search_regex` and `replacement` string or +//@ Reads an input string from `file`s, line by line, and performs a JavaScript `replace()` on +//@ each of the lines from the input string using the given `search_regex` and `replacement` string or //@ function. Returns the new [ShellString](#shellstringstr) after replacement. //@ //@ Note: @@ -36,6 +35,10 @@ common.register('sed', _sed, { //@ ```javascript //@ sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); //@ ``` +//@ +//@ Also, like unix `sed`, ShellJS `sed` runs replacements on each line from the input file +//@ (split by '\n') separately, so `search_regex`es that span more than one line (or inlclude '\n') +//@ will not match anything and nothing will be replaced. function _sed(options, regex, replacement, files) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); From 68c382221e4b2810d53f1a0277dccc9cc74b8a1f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 26 Jun 2019 08:10:59 -0700 Subject: [PATCH 217/338] docs(exec): document security concerns (#950) No change to logic. This adds documentation about `shell.exec()`'s inherent vulnerability to command injection and links to a more detailed security notice. Issue #103, #143, #495, #765, #766, #810, #842, #938, #945 --- README.md | 5 +++++ src/exec.js | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index e01d0fd6e..e0c31252d 100644 --- a/README.md +++ b/README.md @@ -340,6 +340,11 @@ Not seeing the behavior you want? `exec()` runs everything through `sh` by default (or `cmd.exe` on Windows), which differs from `bash`. If you need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. +**Note:** as `shell.exec()` executes an arbitrary string in the system +shell, it is **critical** to properly sanitize user input to avoid command +execution. For more context, consult the [Security +guidelines](https://github.com/shelljs/shelljs/wiki/Security-guidelines). + ### find(path [, path ...]) ### find(path_array) diff --git a/src/exec.js b/src/exec.js index f63fd5bb0..e6077a331 100644 --- a/src/exec.js +++ b/src/exec.js @@ -177,6 +177,11 @@ function execAsync(cmd, opts, pipe, callback) { //@ Not seeing the behavior you want? `exec()` runs everything through `sh` //@ by default (or `cmd.exe` on Windows), which differs from `bash`. If you //@ need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. +//@ +//@ **Note:** as `shell.exec()` executes an arbitrary string in the system +//@ shell, it is **critical** to properly sanitize user input to avoid command +//@ execution. For more context, consult the [Security +//@ guidelines](https://github.com/shelljs/shelljs/wiki/Security-guidelines). function _exec(command, options, callback) { options = options || {}; if (!command) common.error('must specify command'); From 7aa8ce4ebdcb42b95f59093772afce230f2a3ca0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 26 Jun 2019 09:39:24 -0700 Subject: [PATCH 218/338] docs(exec): minor wording changes on security doc (#951) This is a follow-up to #950, to emphasize the message. --- README.md | 8 ++++---- src/exec.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e0c31252d..602d6042b 100644 --- a/README.md +++ b/README.md @@ -340,10 +340,10 @@ Not seeing the behavior you want? `exec()` runs everything through `sh` by default (or `cmd.exe` on Windows), which differs from `bash`. If you need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. -**Note:** as `shell.exec()` executes an arbitrary string in the system -shell, it is **critical** to properly sanitize user input to avoid command -execution. For more context, consult the [Security -guidelines](https://github.com/shelljs/shelljs/wiki/Security-guidelines). +**Security note:** as `shell.exec()` executes an arbitrary string in the +system shell, it is **critical** to properly sanitize user input to avoid +**command injection**. For more context, consult the [Security +Guidelines](https://github.com/shelljs/shelljs/wiki/Security-guidelines). ### find(path [, path ...]) diff --git a/src/exec.js b/src/exec.js index e6077a331..e765cb1a0 100644 --- a/src/exec.js +++ b/src/exec.js @@ -178,10 +178,10 @@ function execAsync(cmd, opts, pipe, callback) { //@ by default (or `cmd.exe` on Windows), which differs from `bash`. If you //@ need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. //@ -//@ **Note:** as `shell.exec()` executes an arbitrary string in the system -//@ shell, it is **critical** to properly sanitize user input to avoid command -//@ execution. For more context, consult the [Security -//@ guidelines](https://github.com/shelljs/shelljs/wiki/Security-guidelines). +//@ **Security note:** as `shell.exec()` executes an arbitrary string in the +//@ system shell, it is **critical** to properly sanitize user input to avoid +//@ **command injection**. For more context, consult the [Security +//@ Guidelines](https://github.com/shelljs/shelljs/wiki/Security-guidelines). function _exec(command, options, callback) { options = options || {}; if (!command) common.error('must specify command'); From 57df38c6ea264493a4219547331f2be049494ed5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 12 Jul 2019 12:36:55 -0700 Subject: [PATCH 219/338] chore(lint): update lint dependencies (#948) This updates `eslint-config-airbnb-base` and `eslint-plugin-import`. This also addresses lint errors these updates raise, and excludes several rules. This also adds a minor simplification to the gendocs script. Test: npm run lint Test: npm run gendocs --- .eslintrc.json | 4 ++++ package.json | 4 ++-- scripts/check-node-support.js | 3 ++- scripts/generate-docs.js | 9 +++++---- shell.js | 4 ++-- src/chmod.js | 2 +- src/common.js | 19 ++++++++++--------- src/cp.js | 9 +++------ src/dirs.js | 8 +++----- src/rm.js | 19 +++++++++---------- src/set.js | 1 - src/uniq.js | 6 +++--- test/.eslintrc.json | 8 ++++++++ test/cp.js | 3 +-- test/global.js | 1 - test/set.js | 1 - 16 files changed, 53 insertions(+), 48 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 7de7d8f1b..d3759e0b2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -12,17 +12,21 @@ "indent": "off", "max-len": "off", "newline-per-chained-call": "off", + "no-bitwise": "off", "no-console": "off", + "no-continue": "off", "no-else-return": "off", "no-empty": "off", "no-mixed-operators": "off", "no-multi-spaces": "off", "no-multiple-empty-lines": ["error", { "max": 2, "maxBOF": 0, "maxEOF": 0 } ], "no-param-reassign": "off", + "no-plusplus": "off", "no-prototype-builtins": "off", "no-throw-literal": "off", "no-underscore-dangle": "off", "no-use-before-define": "off", + "operator-linebreak": "off", "quote-props": "off", "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], "vars-on-top": "off", diff --git a/package.json b/package.json index 44b5c1aff..e5533634b 100644 --- a/package.json +++ b/package.json @@ -64,8 +64,8 @@ "codecov": "^3.0.2", "coffee-script": "^1.10.0", "eslint": "^5.16.0", - "eslint-config-airbnb-base": "^3.0.0", - "eslint-plugin-import": "^1.11.1", + "eslint-config-airbnb-base": "^13.1.0", + "eslint-plugin-import": "^2.17.3", "js-yaml": "^3.12.0", "nyc": "^11.3.0", "shelljs-changelog": "^0.2.0", diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index f6f532082..a63959702 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -16,7 +16,8 @@ function checkReadme(minNodeVersion) { var stop = ''; var formattedMinVersion = '`v' + minNodeVersion + '`'; var expectedReadmeRegex = new RegExp( - start + '\\s*' + formattedMinVersion + '\\s*' + stop, ''); + start + '\\s*' + formattedMinVersion + '\\s*' + stop, '' + ); var readme = path.join(__dirname, '..', 'README.md'); var match = shell.grep(expectedReadmeRegex, readme); if (!match.toString()) { diff --git a/scripts/generate-docs.js b/scripts/generate-docs.js index 6f6b36de3..64f4aab3e 100755 --- a/scripts/generate-docs.js +++ b/scripts/generate-docs.js @@ -2,9 +2,11 @@ /* globals cat, cd, echo, grep, sed, ShellString */ require('../global'); +var path = require('path'); + echo('Appending docs to README.md'); -cd(__dirname + '/..'); +cd(path.join(__dirname, '..')); // Extract docs from shell.js var docs = grep('^//@', 'shell.js'); @@ -18,9 +20,8 @@ docs = docs.replace(/\/\/@commands\n/g, function () { }); // Now extract docs from the remaining src/*.js files -docs = docs.replace(/\/\/@include (.+)/g, function (match, path) { - var file = path.match('.js$') ? path : path + '.js'; - return grep('^//@', file); +docs = docs.replace(/\/\/@include (.+)/g, function (match, filename) { + return grep('^//@', filename); }); // Remove '//@' diff --git a/shell.js b/shell.js index f9c6f36df..e4c1c5df1 100644 --- a/shell.js +++ b/shell.js @@ -31,10 +31,10 @@ require('./commands').forEach(function (command) { //@ Exits the current process with the given exit `code`. exports.exit = process.exit; -//@include ./src/error +//@include ./src/error.js exports.error = require('./src/error'); -//@include ./src/common +//@include ./src/common.js exports.ShellString = common.ShellString; //@ diff --git a/src/chmod.js b/src/chmod.js index 604453e7e..5268cbce5 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -121,7 +121,7 @@ function _chmod(options, mode, filePattern) { var newPerms = perms; - if (isNaN(parseInt(mode, 8))) { + if (Number.isNaN(parseInt(mode, 8))) { // parse options mode.split(',').forEach(function (symbolicMode) { var pattern = /([ugoa]*)([=+-])([rwxXst]*)/i; diff --git a/src/common.js b/src/common.js index 43e81098f..998c73cb1 100644 --- a/src/common.js +++ b/src/common.js @@ -1,5 +1,7 @@ -// Ignore warning about 'new String()' -/* eslint no-new-wrappers: 0 */ +// Ignore warning about 'new String()' and use of the Buffer constructor +/* eslint no-new-wrappers: "off", + no-buffer-constructor: "off" */ + 'use strict'; var os = require('os'); @@ -181,7 +183,8 @@ function parseOptions(opt, map, errorOptions) { throw new TypeError('parseOptions() internal error: map must be an object'); } else if (!isObject(errorOptions)) { throw new TypeError( - 'parseOptions() internal error: errorOptions must be object'); + 'parseOptions() internal error: errorOptions must be object' + ); } if (opt === '--') { @@ -231,13 +234,11 @@ function parseOptions(opt, map, errorOptions) { } else { error('option not recognized: ' + c, errorOptions); } + } else if (key in options) { + // key is a "long option", so it should be the same + options[key] = opt[key]; } else { - if (key in options) { - // key is a "long option", so it should be the same - options[key] = opt[key]; - } else { - error('option not recognized: {' + key + ':...}', errorOptions); - } + error('option not recognized: {' + key + ':...}', errorOptions); } }); } diff --git a/src/cp.js b/src/cp.js index b0d214fc8..09bde25bc 100644 --- a/src/cp.js +++ b/src/cp.js @@ -141,13 +141,10 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { } else { copyFileSync(srcFile, destFile, opts); } + } else if (fs.existsSync(destFile) && opts.no_force) { + common.log('skipping existing file: ' + files[i]); } else { - /* At this point, we've hit a file actually worth copying... so copy it on over. */ - if (fs.existsSync(destFile) && opts.no_force) { - common.log('skipping existing file: ' + files[i]); - } else { - copyFileSync(srcFile, destFile, opts); - } + copyFileSync(srcFile, destFile, opts); } } // for files diff --git a/src/dirs.js b/src/dirs.js index f3be3ac01..0ff08783f 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -81,12 +81,10 @@ function _pushd(options, dir) { } else if (_isStackIndex(dir)) { var n = _parseStackIndex(dir); dirs = dirs.slice(n).concat(dirs.slice(0, n)); + } else if (options['no-cd']) { + dirs.splice(1, 0, dir); } else { - if (options['no-cd']) { - dirs.splice(1, 0, dir); - } else { - dirs.unshift(dir); - } + dirs.unshift(dir); } if (options['no-cd']) { diff --git a/src/rm.js b/src/rm.js index 42e2f5195..7cf07af07 100644 --- a/src/rm.js +++ b/src/rm.js @@ -29,16 +29,15 @@ function rmdirSyncRecursive(dir, force, fromSymlink) { if (currFile.isDirectory()) { // Recursive function back to the beginning rmdirSyncRecursive(file, force); - } else { // Assume it's a file - perhaps a try/catch belongs here? - if (force || isWriteable(file)) { - try { - common.unlinkSync(file); - } catch (e) { - /* istanbul ignore next */ - common.error('could not remove file (code ' + e.code + '): ' + file, { - continue: true, - }); - } + } else if (force || isWriteable(file)) { + // Assume it's a file - perhaps a try/catch belongs here? + try { + common.unlinkSync(file); + } catch (e) { + /* istanbul ignore next */ + common.error('could not remove file (code ' + e.code + '): ' + file, { + continue: true, + }); } } } diff --git a/src/set.js b/src/set.js index 1101b6ffa..6f37bc9a9 100644 --- a/src/set.js +++ b/src/set.js @@ -51,6 +51,5 @@ function _set(options) { common.config[key] = options[key]; } }); - return; } module.exports = _set; diff --git a/src/uniq.js b/src/uniq.js index eea381f48..e46f92b34 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -55,9 +55,9 @@ function _uniq(options, input, output) { common.error(output + ': Is a directory'); } - var lines = (input ? fs.readFileSync(input, 'utf8') : pipe). - trimRight(). - split('\n'); + var lines = (input ? fs.readFileSync(input, 'utf8') : pipe) + .trimRight() + .split('\n'); var compare = function (a, b) { return options.ignoreCase ? diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 2b1ab9b6c..cd6aa4739 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -4,17 +4,25 @@ }, "extends": "airbnb-base", "rules": { + "arrow-parens": "off", + "comma-dangle": "off", "curly": "off", "global-require": "off", + "import/no-dynamic-require": "off", "import/no-mutable-exports": "off", "indent": "off", "max-len": "off", + "no-bitwise": "off", "no-console": "off", "no-param-reassign": "off", + "no-plusplus": "off", "no-underscore-dangle": "off", "no-var": "error", + "operator-linebreak": "off", "prefer-arrow-callback": "off", "prefer-const": "error", + "prefer-destructuring": "off", + "prefer-numeric-literals": "off", "prefer-template": "off", "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], "vars-on-top": "off", diff --git a/test/cp.js b/test/cp.js index f3606a278..4677d3aff 100644 --- a/test/cp.js +++ b/test/cp.js @@ -292,8 +292,7 @@ test('recursive, copying one regular file', t => { t.is(result.code, 0); t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); t.falsy(common.statFollowLinks(`${t.context.tmp}/file1.txt`).isDirectory()); // don't let it be a dir -} -); +}); test('recursive, everything exists, no force flag', t => { const result = shell.cp('-R', 'test/resources/cp', t.context.tmp); diff --git a/test/global.js b/test/global.js index b11251c3f..c1b46e229 100644 --- a/test/global.js +++ b/test/global.js @@ -47,4 +47,3 @@ test('String.prototype is modified for global require', t => { 'bar'.toEnd(`${t.context.tmp}/testfile.txt`); t.is('foobar', cat(`${t.context.tmp}/testfile.txt`).toString()); }); - diff --git a/test/set.js b/test/set.js index 55337c1e5..39bcb6a2a 100644 --- a/test/set.js +++ b/test/set.js @@ -75,4 +75,3 @@ test('set -f', t => { shell.rm(`${t.context.tmp}/*.txt`); t.falsy(shell.error()); // globbing works, so rm succeeds }); - From 4e38240eda2f377e2219f61dcf53e8f9bff74c0a Mon Sep 17 00:00:00 2001 From: Wes Cossick Date: Wed, 2 Oct 2019 01:43:54 -0500 Subject: [PATCH 220/338] Add boolean `fatal` option to `exec()` function (#961) This PR introduces a new boolean fatal option for the exec() function. Like the existing silent option, this new option allows you to override the global fatal configuration parameter on a per-command basis. --- README.md | 1 + src/common.js | 8 +++++--- src/exec.js | 30 +++++++++++++++++++++++++++--- test/exec.js | 18 ++++++++++++++++++ 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 602d6042b..9f07f0cba 100644 --- a/README.md +++ b/README.md @@ -308,6 +308,7 @@ Available options: + `async`: Asynchronous execution. If a callback is provided, it will be set to `true`, regardless of the passed value (default: `false`). ++ `fatal`: Exit upon error (default: `false`). + `silent`: Do not echo program output to console (default: `false`). + `encoding`: Character encoding to use. Affects the values returned to stdout and stderr, and what is written to stdout and stderr when not in silent mode (default: `'utf8'`). diff --git a/src/common.js b/src/common.js index 998c73cb1..d65654e3a 100644 --- a/src/common.js +++ b/src/common.js @@ -88,7 +88,7 @@ CommandError.prototype = Object.create(Error.prototype); CommandError.prototype.constructor = CommandError; exports.CommandError = CommandError; // visible for testing -// Shows error message. Throws if config.fatal is true +// Shows error message. Throws if fatal is true (defaults to config.fatal, overridable with options.fatal) function error(msg, _code, options) { // Validate input if (typeof msg !== 'string') throw new Error('msg must be a string'); @@ -98,6 +98,7 @@ function error(msg, _code, options) { code: 1, prefix: state.currentCmd + ': ', silent: false, + fatal: config.fatal, }; if (typeof _code === 'number' && isObject(options)) { @@ -118,7 +119,7 @@ function error(msg, _code, options) { state.error += logEntry; // Throw an error, or log the entry - if (config.fatal) throw new Error(logEntry); + if (options.fatal) throw new Error(logEntry); if (msg.length > 0 && !options.silent) log(logEntry); if (!options.continue) { @@ -424,7 +425,7 @@ function wrap(cmd, fn, options) { e.name = 'ShellJSInternalError'; throw e; } - if (config.fatal) throw e; + if (config.fatal || options.handlesFatalDynamically) throw e; } if (options.wrapOutput && @@ -450,6 +451,7 @@ var DEFAULT_WRAP_OPTIONS = { canReceivePipe: false, cmdOptions: null, globStart: 1, + handlesFatalDynamically: false, pipeOnly: false, wrapOutput: true, unix: true, diff --git a/src/exec.js b/src/exec.js index e765cb1a0..fe8f38c80 100644 --- a/src/exec.js +++ b/src/exec.js @@ -12,13 +12,22 @@ common.register('exec', _exec, { unix: false, canReceivePipe: true, wrapOutput: false, + handlesFatalDynamically: true, }); // We use this function to run `exec` synchronously while also providing realtime // output. function execSync(cmd, opts, pipe) { if (!common.config.execPath) { - common.error('Unable to find a path to the node binary. Please manually set config.execPath'); + try { + common.error('Unable to find a path to the node binary. Please manually set config.execPath'); + } catch (e) { + if (opts.fatal) { + throw e; + } + + return; + } } var tempDir = _tempDir(); @@ -28,6 +37,7 @@ function execSync(cmd, opts, pipe) { opts = common.extend({ silent: common.config.silent, + fatal: common.config.fatal, // TODO(nfischer): this and the line above are probably unnecessary cwd: _pwd().toString(), env: process.env, maxBuffer: DEFAULT_MAXBUFFER_SIZE, @@ -99,7 +109,7 @@ function execSync(cmd, opts, pipe) { // Note: `silent` should be unconditionally true to avoid double-printing // the command's stderr, and to avoid printing any stderr when the user has // set `shell.config.silent`. - common.error(stderr, code, { continue: true, silent: true }); + common.error(stderr, code, { continue: true, silent: true, fatal: opts.fatal }); } var obj = common.ShellString(stdout, stderr, code); return obj; @@ -109,6 +119,7 @@ function execSync(cmd, opts, pipe) { function execAsync(cmd, opts, pipe, callback) { opts = common.extend({ silent: common.config.silent, + fatal: common.config.fatal, // TODO(nfischer): this and the line above are probably unnecessary cwd: _pwd().toString(), env: process.env, maxBuffer: DEFAULT_MAXBUFFER_SIZE, @@ -146,6 +157,7 @@ function execAsync(cmd, opts, pipe, callback) { //@ //@ + `async`: Asynchronous execution. If a callback is provided, it will be set to //@ `true`, regardless of the passed value (default: `false`). +//@ + `fatal`: Exit upon error (default: `false`). //@ + `silent`: Do not echo program output to console (default: `false`). //@ + `encoding`: Character encoding to use. Affects the values returned to stdout and stderr, and //@ what is written to stdout and stderr when not in silent mode (default: `'utf8'`). @@ -184,7 +196,6 @@ function execAsync(cmd, opts, pipe, callback) { //@ Guidelines](https://github.com/shelljs/shelljs/wiki/Security-guidelines). function _exec(command, options, callback) { options = options || {}; - if (!command) common.error('must specify command'); var pipe = common.readFromPipe(); @@ -201,9 +212,22 @@ function _exec(command, options, callback) { options = common.extend({ silent: common.config.silent, + fatal: common.config.fatal, async: false, }, options); + if (!command) { + try { + common.error('must specify command'); + } catch (e) { + if (options.fatal) { + throw e; + } + + return; + } + } + if (options.async) { return execAsync(command, options, pipe, callback); } else { diff --git a/test/exec.js b/test/exec.js index 2e09658a2..a8e79dfa4 100644 --- a/test/exec.js +++ b/test/exec.js @@ -45,6 +45,15 @@ test('config.fatal and unknown command', t => { shell.config.fatal = oldFatal; }); +test('options.fatal = true and unknown command', t => { + const oldFatal = shell.config.fatal; + shell.config.fatal = false; + t.throws(() => { + shell.exec('asdfasdf', { fatal: true }); // could not find command + }, /asdfasdf/); // name of command should be in error message + shell.config.fatal = oldFatal; // TODO(nfischer): this setting won't get reset if the assertion above fails +}); + test('exec exits gracefully if we cannot find the execPath', t => { shell.config.execPath = null; shell.exec('echo foo'); @@ -193,6 +202,15 @@ test('encoding option works', t => { t.is(result.stderr.toString(), ''); }); +test('options.fatal = false and unknown command', t => { + const oldFatal = shell.config.fatal; + shell.config.fatal = true; + const result = shell.exec('asdfasdf', { fatal: false }); // could not find command + shell.config.fatal = oldFatal; + t.truthy(shell.error()); + t.truthy(result.code); +}); + // // async // From 37b42fef25a82bc99b11af1ba1d033ada41f37e8 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 8 Oct 2019 22:41:16 -0700 Subject: [PATCH 221/338] test: misc test changes (#970) No change to production logic. This renames test cases with duplicate names, deletes a redundant test, and uses the public `t.title` API in favor of `t._test.title`. This is a prerequisite for updating ava. Issue #969 --- test/cp.js | 15 ++++----------- test/mkdir.js | 4 ++-- test/utils/utils.js | 2 +- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/test/cp.js b/test/cp.js index 4677d3aff..ba3a60468 100644 --- a/test/cp.js +++ b/test/cp.js @@ -421,17 +421,10 @@ test('Make sure hidden files are copied recursively', t => { }); test('no-recursive will copy regular files only', t => { - const result = shell.cp('test/resources/file1.txt', 'test/resources/ls/', t.context.tmp); - t.is(result.code, 1); - t.truthy(shell.error()); - t.falsy(fs.existsSync(`${t.context.tmp}/.hidden_file`)); // doesn't copy dir contents - t.falsy(fs.existsSync(`${t.context.tmp}/ls`)); // doesn't copy dir itself - t.truthy(fs.existsSync(`${t.context.tmp}/file1.txt`)); -}); - -test('no-recursive will copy regular files only', t => { - const result = shell.cp('test/resources/file1.txt', 'test/resources/file2.txt', 'test/resources/cp', - 'test/resources/ls/', t.context.tmp); + const result = shell.cp( + 'test/resources/file1.txt', 'test/resources/file2.txt', 'test/resources/cp', + 'test/resources/ls/', t.context.tmp + ); t.is(result.code, 1); t.truthy(shell.error()); diff --git a/test/mkdir.js b/test/mkdir.js index 5e5e75a0e..c3e4451ca 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -145,7 +145,7 @@ test('-p flag', t => { shell.rm('-Rf', `${t.context.tmp}/a`); // revert }); -test('multiple dirs', t => { +test('-p flag: multiple dirs', t => { const result = shell.mkdir('-p', `${t.context.tmp}/zzza`, `${t.context.tmp}/zzzb`, `${t.context.tmp}/zzzc`); t.falsy(shell.error()); @@ -155,7 +155,7 @@ test('multiple dirs', t => { t.truthy(fs.existsSync(`${t.context.tmp}/zzzc`)); }); -test('multiple dirs, array syntax', t => { +test('-p flag: multiple dirs, array syntax', t => { const result = shell.mkdir('-p', [`${t.context.tmp}/yyya`, `${t.context.tmp}/yyyb`, `${t.context.tmp}/yyyc`]); t.falsy(shell.error()); diff --git a/test/utils/utils.js b/test/utils/utils.js index 1a3020c1d..df13fa9e5 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -61,7 +61,7 @@ function skipIfTrue(booleanValue, t, closure) { if (booleanValue) { _processStderrWrite( chalk.yellow('Warning: skipping platform-dependent test ') + - chalk.bold.white(`'${t._test.title}'`) + + chalk.bold.white(`'${t.title}'`) + '\n' ); t.truthy(true); // dummy assertion to satisfy ava v0.19+ From 9aef0026d4abd515970943d0687c38c4f1cc3c0b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 9 Oct 2019 00:26:38 -0700 Subject: [PATCH 222/338] chore: update dev deps (#971) No change to logic. This updates ava and nyc, to suppress npm audit error messages. Fixes #969 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e5533634b..db7552565 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "powerAssert": false }, "devDependencies": { - "ava": "^0.21.0", + "ava": "^1.4.1", "chalk": "^1.1.3", "codecov": "^3.0.2", "coffee-script": "^1.10.0", @@ -67,7 +67,7 @@ "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.17.3", "js-yaml": "^3.12.0", - "nyc": "^11.3.0", + "nyc": "^14.1.1", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.3.0", "shx": "^0.2.0", From 05374a749992969bb6b853095f4c9308df69aa82 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 21 Oct 2019 00:17:10 +0200 Subject: [PATCH 223/338] Silence potentially upcoming circular dependency warning (#973) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Node.js is currently considering printing a warning when a non-existent property of `module.exports` is accessed while in a circular `require()` dependency, in order to make it easier to catch issues with circular dependencies. In order to avoid printing these warnings for shelljs, checking for the property’s existence rather than its truthiness suffices. Refs: https://github.com/nodejs/node/pull/29935 --- src/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common.js b/src/common.js index d65654e3a..0ec1f8131 100644 --- a/src/common.js +++ b/src/common.js @@ -478,7 +478,7 @@ function _register(name, implementation, wrapOptions) { // If an option isn't specified, use the default wrapOptions = Object.assign({}, DEFAULT_WRAP_OPTIONS, wrapOptions); - if (shell[name]) { + if (shell.hasOwnProperty(name)) { throw new Error('Command `' + name + '` already exists'); } From 12b8c4864ffc7a1c3a2dbf8cfd888fb62d373120 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 29 Oct 2019 01:35:11 -0700 Subject: [PATCH 224/338] fix(exec): join paths correctly (#975) Previously, we just concatenated _tempDir() with '/' and a random filename. Instead, we should join paths with path.join() to use the OS path separator. This is a speculative fix for issue #974, although this may not be enough to actually make Windows happy. Issue #974 --- src/exec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/exec.js b/src/exec.js index fe8f38c80..ab67f56cc 100644 --- a/src/exec.js +++ b/src/exec.js @@ -31,9 +31,9 @@ function execSync(cmd, opts, pipe) { } var tempDir = _tempDir(); - var paramsFile = path.resolve(tempDir + '/' + common.randomFileName()); - var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); - var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); + var paramsFile = path.join(tempDir, common.randomFileName()); + var stderrFile = path.join(tempDir, common.randomFileName()); + var stdoutFile = path.join(tempDir, common.randomFileName()); opts = common.extend({ silent: common.config.silent, From a421b9e3a570e86fe3d94ebe8118e5b1c05284e0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 29 Oct 2019 18:35:14 -0700 Subject: [PATCH 225/338] feat: add shell.cmd to replace exec (#866) This adds an initial implementation of shell.cmd(), which is intended as the eventual replacement for shell.exec(). This PR does not fully implement the API, but demonstrates a simple and secure alternative, and will allow further iteration to cover other use cases in follow-up PRs. Design doc: https://shelljs.page.link/cmd-design Issue #495 Test: automated test suite --- commands.js | 2 + package.json | 1 + src/cmd.js | 88 ++++++++++++++++++ test/cmd.js | 258 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 349 insertions(+) create mode 100644 src/cmd.js create mode 100644 test/cmd.js diff --git a/commands.js b/commands.js index f31adb214..884ff8ea4 100644 --- a/commands.js +++ b/commands.js @@ -2,6 +2,8 @@ module.exports = [ 'cat', 'cd', 'chmod', + // TODO(nfischer): uncomment this when shell.cmd() is finished. + // 'cmd', 'cp', 'dirs', 'echo', diff --git a/package.json b/package.json index db7552565..8ad2be672 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "shjs": "./bin/shjs" }, "dependencies": { + "execa": "^1.0.0", "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" diff --git a/src/cmd.js b/src/cmd.js new file mode 100644 index 000000000..9d19a92ed --- /dev/null +++ b/src/cmd.js @@ -0,0 +1,88 @@ +var common = require('./common'); +var execa = require('execa'); + +var DEFAULT_MAXBUFFER_SIZE = 20 * 1024 * 1024; +var COMMAND_NOT_FOUND_ERROR_CODE = 127; + +common.register('cmd', _cmd, { + cmdOptions: null, + globStart: 1, + canReceivePipe: true, + wrapOutput: true, +}); + +function commandNotFound(execaResult) { + if (process.platform === 'win32') { + var str = 'is not recognized as an internal or external command'; + return execaResult.code && execaResult.stderr.includes(str); + } else { + return execaResult.code && + execaResult.stdout === null && execaResult.stderr === null; + } +} + +function _cmd(options, command, commandArgs, userOptions) { + if (!command) { + common.error('Must specify a non-empty string as a command'); + } + + // `options` will usually not have a value: it's added by our commandline flag + // parsing engine. + commandArgs = [].slice.call(arguments, 2); + + // `userOptions` may or may not be provided. We need to check the last + // argument. If it's an object, assume it's meant to be passed as + // userOptions (since ShellStrings are already flattened to strings). + if (commandArgs.length === 0) { + userOptions = {}; + } else { + var lastArg = commandArgs.pop(); + if (common.isObject(lastArg)) { + userOptions = lastArg; + } else { + userOptions = {}; + commandArgs.push(lastArg); + } + } + + var pipe = common.readFromPipe(); + + // Some of our defaults differ from execa's defaults. These can be overridden + // by the user. + var defaultOptions = { + maxBuffer: DEFAULT_MAXBUFFER_SIZE, + stripEof: false, // Preserve trailing newlines for consistency with unix. + reject: false, // Use ShellJS's error handling system. + }; + + // For other options, we forbid the user from overriding them (either for + // correctness or security). + var requiredOptions = { + input: pipe, + shell: false, + }; + + var execaOptions = + Object.assign(defaultOptions, userOptions, requiredOptions); + + var result = execa.sync(command, commandArgs, execaOptions); + var stdout; + var stderr; + var code; + if (commandNotFound(result)) { + // This can happen if `command` is not an executable binary, or possibly + // under other conditions. + stdout = ''; + stderr = "'" + command + "': command not found"; + code = COMMAND_NOT_FOUND_ERROR_CODE; + } else { + stdout = result.stdout.toString(); + stderr = result.stderr.toString(); + code = result.code; + } + + // Pass `continue: true` so we can specify a value for stdout. + if (code) common.error(stderr, code, { silent: true, continue: true }); + return new common.ShellString(stdout, stderr, code); +} +module.exports = _cmd; diff --git a/test/cmd.js b/test/cmd.js new file mode 100644 index 000000000..bc47f3fdf --- /dev/null +++ b/test/cmd.js @@ -0,0 +1,258 @@ +import path from 'path'; + +import test from 'ava'; + +import shell from '..'; + +// TODO(nfischer): remove this when shell.cmd() is finished. For now, load it +// like any other plugin. +require('../src/cmd'); + +const CWD = process.cwd(); + +test.beforeEach(() => { + process.chdir(CWD); + shell.config.resetForTesting(); +}); + +// +// Invalids +// + +test('no args', t => { + shell.cmd(); + t.truthy(shell.error()); +}); + +test('unknown command', t => { + const result = shell.cmd('asdfasdf'); // could not find command + t.truthy(result.code > 0); + t.is(result.code, 127); +}); + +test('config.fatal and unknown command', t => { + shell.config.fatal = true; + t.throws(() => { + shell.cmd('asdfasdf'); // could not find command + }, /.*command not found.*/); +}); + +// TODO(nfischer): enable only if we implement realtime output + captured +// output. +test.skip('cmd exits gracefully if we cannot find the execPath', t => { + shell.config.execPath = null; + shell.cmd('shx', 'echo', 'foo'); + t.regex( + shell.error(), + /Unable to find a path to the node binary\. Please manually set config\.execPath/ + ); +}); + +// +// Valids +// + +// +// sync +// + +test('check if stdout goes to output', t => { + const result = shell.cmd('shx', 'echo', 'this is stdout'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'this is stdout\n'); +}); + +test('check if stderr goes to output', t => { + const result = shell.cmd(shell.config.execPath, '-e', 'console.error("1234");'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, ''); + t.is(result.stderr, '1234\n'); +}); + +test('check if stdout + stderr go to output', t => { + const result = shell.cmd(shell.config.execPath, '-e', 'console.error(1234); console.log(666);'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '666\n'); + t.is(result.stderr, '1234\n'); +}); + +test('check exit code', t => { + const result = shell.cmd(shell.config.execPath, '-e', 'process.exit(12);'); + t.truthy(shell.error()); + t.is(result.code, 12); +}); + +test('interaction with cd', t => { + shell.cd('test/resources/external'); + const result = shell.cmd(shell.config.execPath, 'node_script.js'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'node_script_1234\n'); +}); + +test('no need to escape quotes', t => { + const result = shell.cmd(shell.config.execPath, '-e', + `console.log("'+'_'+'");`); // eslint-disable-line quotes + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, "'+'_'+'\n"); +}); + +test('commands can contain newlines', t => { + // Github issue #175 + const result = shell.cmd(shell.config.execPath, '-e', ` +console.log('line1') +console.log('line2') +`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'line1\nline2\n'); +}); + +test('does not expand shell-style variables', t => { + shell.env.FOO = 'Hello world'; + const result = shell.cmd('shx', 'echo', '$FOO'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '$FOO\n'); +}); + +test('does not expand windows-style variables', t => { + shell.env.FOO = 'Hello world'; + let result = shell.cmd('shx', 'echo', '%FOO%'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '%FOO%\n'); + result = shell.cmd('shx', 'echo', '!FOO!'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '!FOO!\n'); +}); + +test('cannot inject multiple commands', t => { + const injection = '; echo semicolon && echo and || echo or'; + const result = shell.cmd('shx', 'echo', `hi${injection}`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, `hi${injection}\n`); +}); + +test('supports globbing by default', t => { + // `echo` on windows will not glob, so it depends on shell.cmd() to expand the + // glob before spawning the subprocess. + const result = shell.cmd('shx', 'echo', 'test/resources/*.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + const expectedFiles = [ + 'test/resources/a.txt', + 'test/resources/file1.txt', + 'test/resources/file2.txt', + ]; + t.is(result.stdout, `${expectedFiles.join(' ')}\n`); +}); + +test('globbing respects config.noglob', t => { + shell.config.noglob = true; + const result = shell.cmd('shx', 'echo', 'test/resources/*.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'test/resources/*.txt\n'); +}); + +test('set cwd', t => { + const result = shell.cmd('shx', 'pwd', { cwd: '..' }); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, path.resolve('..') + '\n'); +}); + +test('set maxBuffer (very small)', t => { + const result = shell.cmd('shx', 'echo', '1234567890'); // default maxBuffer is ok + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, '1234567890\n'); + shell.cmd('shx', 'echo', '1234567890', { maxBuffer: 6 }); + t.truthy(shell.error()); +}); + +test('set timeout option', t => { + const result = shell.cmd(shell.config.execPath, 'test/resources/exec/slow.js', '100'); // default timeout is ok + t.falsy(shell.error()); + t.is(result.code, 0); + shell.cmd(shell.config.execPath, 'test/resources/exec/slow.js', '2000', { timeout: 1000 }); // times out + t.truthy(shell.error()); +}); + +test('check process.env works', t => { + shell.env.FOO = 'Hello world'; + // Launch any sub process, and process.env should be propagated through. + const result = + shell.cmd(shell.config.execPath, '-p', 'process.env.FOO'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'Hello world\n'); + t.is(result.stderr, ''); +}); + +test('cmd returns a ShellString', t => { + const result = shell.cmd('shx', 'echo', 'foo'); + t.is(typeof result, 'object'); + t.truthy(result instanceof String); + t.is(typeof result.stdout, 'string'); + t.is(result.toString(), result.stdout); +}); + +// +// async +// + +// TODO(nfischer): enable after we implement async. +test.cb.skip('no callback', t => { + const c = shell.cmd(shell.config.execPath, '-e', 'console.log(1234)', { async: true }); + t.falsy(shell.error()); + t.truthy('stdout' in c, 'async exec returns child process object'); + t.end(); +}); + +// TODO(nfischer): enable after we implement async. +test.cb.skip('callback as 2nd argument', t => { + shell.cmd(shell.config.execPath, '-e', 'console.log(5678);', (code, stdout, stderr) => { + t.is(code, 0); + t.is(stdout, '5678\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +// TODO(nfischer): enable after we implement async. +test.cb.skip('callback as end argument', t => { + shell.cmd(shell.config.execPath, '-e', 'console.log(5566);', { async: true }, (code, stdout, stderr) => { + t.is(code, 0); + t.is(stdout, '5566\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +// TODO(nfischer): enable after we implement async. +test.cb.skip('callback as 3rd argument (silent:true)', t => { + shell.cmd(shell.config.execPath, '-e', 'console.log(5678);', { silent: true }, (code, stdout, stderr) => { + t.is(code, 0); + t.is(stdout, '5678\n'); + t.is(stderr, ''); + t.end(); + }); +}); + +// TODO(nfischer): enable after we implement async. +test.cb.skip('command that fails', t => { + shell.cmd('shx', 'cp', 'onlyOneCpArgument.txt', { silent: true }, (code, stdout, stderr) => { + t.is(code, 1); + t.is(stdout, ''); + t.is(stderr, 'cp: missing and/or \n'); + t.end(); + }); +}); From 9d0bdd630293d75172448b2b2dfd985e9570d3dd Mon Sep 17 00:00:00 2001 From: Jakob Krigovsky Date: Mon, 11 Nov 2019 21:28:39 +0100 Subject: [PATCH 226/338] =?UTF-8?q?Update=20=E2=80=9COS=20X=E2=80=9D=20to?= =?UTF-8?q?=20=E2=80=9CmacOS=E2=80=9D=20(#977)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This updates documentation to refer to the new name for the Apple operating system. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f07f0cba..6bb7c3fff 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) [![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) -ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell +ShellJS is a portable **(Windows/Linux/macOS)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node From aed6d994b57bccea313e85eeaa9650077b12f4de Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 13 Nov 2019 22:35:03 -0800 Subject: [PATCH 227/338] chore: support up to node v13 (#978) No change to logic. This just adds Travis and appveyor test support for up to node v13. No change to the minimum supported version. --- .travis.yml | 2 ++ appveyor.yml | 2 ++ scripts/check-node-support.js | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 123a9000a..ea1731437 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ node_js: - 9 - 10 - 11 + - 12 + - 13 os: - linux diff --git a/appveyor.yml b/appveyor.yml index 2fb024455..da92cbf2b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,7 @@ environment: matrix: + - nodejs_version: '13' + - nodejs_version: '12' - nodejs_version: '11' - nodejs_version: '10' - nodejs_version: '9' diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index a63959702..af8eec8f4 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -9,7 +9,7 @@ var shell = require('..'); // This is the authoritative list of supported node versions. var MIN_NODE_VERSION = 6; -var MAX_NODE_VERSION = 11; +var MAX_NODE_VERSION = 13; function checkReadme(minNodeVersion) { var start = ''; From a8452b89f2b9dd372da81e973a16074a5628b0b6 Mon Sep 17 00:00:00 2001 From: Chris Thielen Date: Tue, 7 Jan 2020 00:28:48 -0800 Subject: [PATCH 228/338] fix(mv): Fix moving files across volumes (#982) At some point options parsing happened inside `_mv()` and `_cp()` but that is no longer the case so a parsed options object should be used instead. --- src/mv.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mv.js b/src/mv.js index d8fe2ed47..6e89e2fae 100644 --- a/src/mv.js +++ b/src/mv.js @@ -109,8 +109,8 @@ function _mv(options, sources, dest) { // to perform a copy and then clean up the original file. If either the // copy or the rm fails with an exception, we should allow this // exception to pass up to the top level. - cp('-r', src, thisDest); - rm('-rf', src); + cp({ recursive: true }, src, thisDest); + rm({ recursive: true, force: true }, src); } } }); // forEach(src) From ba5d782fc24bfa927548298b1bd5a5ed073c7afe Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Thu, 3 Sep 2020 08:31:59 +0200 Subject: [PATCH 229/338] Update ls with glob example. (#1006) --- README.md | 1 + src/ls.js | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 6bb7c3fff..032819f47 100644 --- a/README.md +++ b/README.md @@ -441,6 +441,7 @@ Examples: ```javascript ls('projs/*.js'); +ls('projs/**/*.js'); // Find all js files recursively in projs ls('-R', '/users/me', '/tmp'); ls('-R', ['/users/me', '/tmp']); // same as above ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} diff --git a/src/ls.js b/src/ls.js index 31495fbdc..d2b2e0bd0 100644 --- a/src/ls.js +++ b/src/ls.js @@ -35,6 +35,7 @@ common.register('ls', _ls, { //@ //@ ```javascript //@ ls('projs/*.js'); +//@ ls('projs/**/*.js'); // Find all js files recursively in projs //@ ls('-R', '/users/me', '/tmp'); //@ ls('-R', ['/users/me', '/tmp']); // same as above //@ ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} From 54049d49d8fcfbc91c7c24cb0ac3e52e869c119b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 26 Oct 2020 16:44:47 -0700 Subject: [PATCH 230/338] chore: change supported node versions (#1011) This adds testing for node v14. This removes testing for node v6 and v7 because codecov breaks on these versions. This omits node v15 because appveyor doesn't seem to support this version. The nodejs org currently supports [10, 12, 14, 15]. This makes a couple minor edits to the check-node-support script for consistency with shelljs/shx#186. This bumps the shx dependency because it seems we're hitting issue #973 on node v14. Test: npm run check-node-support --- .travis.yml | 3 +-- README.md | 2 +- appveyor.yml | 3 +-- package.json | 4 ++-- scripts/check-node-support.js | 8 +++++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index ea1731437..1a3ed7ac7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,13 @@ language: node_js sudo: false node_js: - - 6 - - 7 - 8 - 9 - 10 - 11 - 12 - 13 + - 14 os: - linux diff --git a/README.md b/README.md index 032819f47..74b3df953 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! -ShellJS is proudly tested on every node release since `v6`! +ShellJS is proudly tested on every node release since `v8`! The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-tested in projects like: diff --git a/appveyor.yml b/appveyor.yml index da92cbf2b..bc8becc87 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,13 +1,12 @@ environment: matrix: + - nodejs_version: '14' - nodejs_version: '13' - nodejs_version: '12' - nodejs_version: '11' - nodejs_version: '10' - nodejs_version: '9' - nodejs_version: '8' - - nodejs_version: '7' - - nodejs_version: '6' version: '{build}' diff --git a/package.json b/package.json index 8ad2be672..ad2fe85eb 100644 --- a/package.json +++ b/package.json @@ -71,11 +71,11 @@ "nyc": "^14.1.1", "shelljs-changelog": "^0.2.0", "shelljs-release": "^0.3.0", - "shx": "^0.2.0", + "shx": "^0.3.3", "travis-check-changes": "^0.2.0" }, "optionalDependencies": {}, "engines": { - "node": ">=6" + "node": ">=8" } } diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index af8eec8f4..31d912288 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -8,8 +8,8 @@ var yaml = require('js-yaml'); var shell = require('..'); // This is the authoritative list of supported node versions. -var MIN_NODE_VERSION = 6; -var MAX_NODE_VERSION = 13; +var MIN_NODE_VERSION = 8; +var MAX_NODE_VERSION = 14; function checkReadme(minNodeVersion) { var start = ''; @@ -20,7 +20,7 @@ function checkReadme(minNodeVersion) { ); var readme = path.join(__dirname, '..', 'README.md'); var match = shell.grep(expectedReadmeRegex, readme); - if (!match.toString()) { + if (!match.toString().trim()) { var msg = 'Update README to specify the min supported version. Look for "' + start + '"'; throw new Error(msg); @@ -81,6 +81,8 @@ try { var appveyorFileName = path.join(__dirname, '..', 'appveyor.yml'); var appveyorYaml = yaml.safeLoad(shell.cat(appveyorFileName)); checkAppveyor(MIN_NODE_VERSION, MAX_NODE_VERSION, appveyorYaml); + console.log('All files look good (this project supports v' + + MIN_NODE_VERSION + '-v' + MAX_NODE_VERSION + ')!'); } catch (e) { console.error('Please check the files which declare our Node version'); console.error('support, as something is out-of-sync. This script failed'); From 355bc754d289b5b6be4ee8b5259dfe893c5a740e Mon Sep 17 00:00:00 2001 From: reviewher <24845478+reviewher@users.noreply.github.com> Date: Mon, 26 Oct 2020 19:46:43 -0400 Subject: [PATCH 231/338] Cleanup LICENSE (#966) --- LICENSE | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/LICENSE b/LICENSE index 0f0f119be..40a2bf650 100644 --- a/LICENSE +++ b/LICENSE @@ -1,26 +1,29 @@ +BSD 3-Clause License + Copyright (c) 2012, Artur Adib All rights reserved. -You may use this project under the terms of the New BSD license as follows: - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Artur Adib nor the - names of the contributors may be used to endorse or promote products - derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From cb64b92439de36012a936ea737cc849755e01dd9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 8 Feb 2021 09:37:50 -0800 Subject: [PATCH 232/338] test(cmd): add test for caret char (#1017) No change to logic. This adds a test case to make sure the caret character ('^') is passed through to the command. This is to make sure the character is not treated specially on Windows, where it's an escape character in the shell. Fixes #1015 --- test/cmd.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/cmd.js b/test/cmd.js index bc47f3fdf..59bce65e3 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -132,6 +132,14 @@ test('does not expand windows-style variables', t => { t.is(result.stdout, '!FOO!\n'); }); +test('caret character is passed through to the command', t => { + // '^' is a special character on Windows, see issue #1015 + const result = shell.cmd('shx', 'echo', 'shelljs@^0.8.4'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.stdout, 'shelljs@^0.8.4\n'); +}); + test('cannot inject multiple commands', t => { const injection = '; echo semicolon && echo and || echo or'; const result = shell.cmd('shx', 'echo', `hi${injection}`); From 71085dba6527f86ff89ddbf62f07d8656190aa74 Mon Sep 17 00:00:00 2001 From: Roy Ivy III Date: Mon, 8 Mar 2021 12:12:32 -0600 Subject: [PATCH 233/338] fix(mkdir): mitigate directory creation race condition (#1019) --- src/mkdir.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/mkdir.js b/src/mkdir.js index 992df7c0d..644fe4a57 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -19,17 +19,18 @@ function mkdirSyncRecursive(dir) { common.error('dirname() failed: [' + dir + ']'); } - // Base dir exists, no recursion necessary - if (fs.existsSync(baseDir)) { - fs.mkdirSync(dir, parseInt('0777', 8)); - return; - } - // Base dir does not exist, go recursive - mkdirSyncRecursive(baseDir); + if (!fs.existsSync(baseDir)) { + mkdirSyncRecursive(baseDir); + } - // Base dir created, can create dir - fs.mkdirSync(dir, parseInt('0777', 8)); + try { + // Base dir created, can create dir + fs.mkdirSync(dir, parseInt('0777', 8)); + } catch (e) { + // swallow error if dir already exists + if (e.code !== 'EEXIST' || common.statNoFollowLinks(dir).isFile()) { throw e; } + } } //@ From 124d3349af42cb794ae8f78fc9b0b538109f7ca7 Mon Sep 17 00:00:00 2001 From: JessieFrance <64499366+JessieFrance@users.noreply.github.com> Date: Wed, 31 Mar 2021 18:44:20 -0600 Subject: [PATCH 234/338] Added mkdir -p tests for subdirectories (#1026) --- test/mkdir.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/mkdir.js b/test/mkdir.js index c3e4451ca..5a6f185fc 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -165,6 +165,26 @@ test('-p flag: multiple dirs, array syntax', t => { t.truthy(fs.existsSync(`${t.context.tmp}/yyyc`)); }); +test('-p flag: subdirectory already exists', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/d1`)); + shell.mkdir('-p', `${t.context.tmp}/d1/d2/d3`); + t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`)); + const result = shell.mkdir('-p', `${t.context.tmp}/d1/d2`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`)); +}); + +test('-p flag: create directory in subdirectory', t => { + t.falsy(fs.existsSync(`${t.context.tmp}/d1`)); + shell.mkdir('-p', `${t.context.tmp}/d1/d2`); + t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2`)); + const result = shell.mkdir('-p', `${t.context.tmp}/d1/d2/d3`); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`)); +}); + test('globbed dir', t => { let result = shell.mkdir('-p', `${t.context.tmp}/mydir`); t.falsy(shell.error()); From 79ae14d30d7ce4064de05d41c7889885326b6754 Mon Sep 17 00:00:00 2001 From: JessieFrance <64499366+JessieFrance@users.noreply.github.com> Date: Wed, 2 Jun 2021 17:23:58 -0600 Subject: [PATCH 235/338] remove file extension (#1033) --- test/exec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/exec.js b/test/exec.js index a8e79dfa4..99fd356bc 100644 --- a/test/exec.js +++ b/test/exec.js @@ -65,7 +65,7 @@ test('exec exits gracefully if we cannot find the execPath', t => { test('cannot require exec-child.js', t => { t.throws(() => { - require('../src/exec-child.js'); + require('../src/exec-child'); }, /This file should not be required/); }); From 0ae1dd681e2d79498c1b099e0c2763ac1a47a3a2 Mon Sep 17 00:00:00 2001 From: TagawaHirotaka Date: Fri, 3 Sep 2021 15:34:41 +0900 Subject: [PATCH 236/338] Fix test command example (#1043) --- README.md | 2 +- src/test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 74b3df953..6abf1f972 100644 --- a/README.md +++ b/README.md @@ -631,7 +631,7 @@ Examples: ```javascript if (test('-d', path)) { /* do something with dir */ }; -if (!test('-f', path)) continue; // skip if it's a regular file +if (!test('-f', path)) continue; // skip if it's not a regular file ``` Evaluates `expression` using the available primaries and returns diff --git a/src/test.js b/src/test.js index 20fe886fc..0ab34e155 100644 --- a/src/test.js +++ b/src/test.js @@ -35,7 +35,7 @@ common.register('test', _test, { //@ //@ ```javascript //@ if (test('-d', path)) { /* do something with dir */ }; -//@ if (!test('-f', path)) continue; // skip if it's a regular file +//@ if (!test('-f', path)) continue; // skip if it's not a regular file //@ ``` //@ //@ Evaluates `expression` using the available primaries and returns From d0a45166fd24dcea72fdf1b30435fa7ed1c6fd71 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 29 Nov 2021 23:34:38 -0800 Subject: [PATCH 237/338] chore: set up GitHub Actions CI (#1055) --- .github/workflows/main.yml | 39 +++++++++++++++++++++++++++++++++++ .travis.yml | 26 ----------------------- CONTRIBUTING.md | 5 ++--- README.md | 5 ++--- appveyor.yml | 32 ---------------------------- scripts/check-node-support.js | 30 ++++++++------------------- 6 files changed, 52 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/main.yml delete mode 100644 .travis.yml delete mode 100644 appveyor.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..72ffd3ea2 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,39 @@ +name: CI +on: + - push + - pull_request +jobs: + test: + name: Node.js ${{ matrix.node-version }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + node-version: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + os: + - ubuntu-latest + - macos-latest + - windows-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm run test-with-coverage + - run: npm run lint + - run: npm run gendocs + - run: npm run check-node-support + - name: Check for modified files (skip on Windows) + run: npm run after-travis + if: matrix.os != 'windows-latest' + - uses: codecov/codecov-action@v2 + with: + fail_ci_if_error: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1a3ed7ac7..000000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: node_js -sudo: false -node_js: - - 8 - - 9 - - 10 - - 11 - - 12 - - 13 - - 14 - -os: - - linux - - osx -script: - - npm run test-with-coverage - - npm run lint - # make sure when the docs are generated nothing changes (a.k.a. the docs have already been generated) - - npm run gendocs - - npm run check-node-support - - npm run after-travis "Make sure to generate docs!" -after_success: - - npm run codecov -- -f coverage/lcov.info - -notifications: - email: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a6b32ba32..1559b4d77 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,9 +15,8 @@ stable). If you've found a bug, please follow these steps: PRs are welcome! However, we ask that you follow a few guidelines: - Please add tests for all changes/new features. - - Make sure your code passes `npm test`. Please check the CI (both Appveyor and - Travis). If you can't figure out why something doesn't work, feel free to ask - for help. + - Make sure your code passes `npm test`. Please check the CI. If you can't + figure out why something doesn't work, feel free to ask for help. - Make sure you conform to our style guidelines. You can run `npm run lint` to check style, and `npm run lint -- --fix` to automatically fix some issues. - Make documentation changes *within the source files*, not in the README. diff --git a/README.md b/README.md index 6abf1f972..a87c7afdc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # ShellJS - Unix shell commands for Node.js -[![Travis](https://img.shields.io/travis/shelljs/shelljs/master.svg?style=flat-square&label=unix)](https://travis-ci.org/shelljs/shelljs) -[![AppVeyor](https://img.shields.io/appveyor/ci/shelljs/shelljs/master.svg?style=flat-square&label=windows)](https://ci.appveyor.com/project/shelljs/shelljs/branch/master) +[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fshelljs%2Fshelljs%2Fbadge%3Fref%3Dmaster&style=flat-square)](https://actions-badge.atrox.dev/shelljs/shelljs/goto?ref=master) [![Codecov](https://img.shields.io/codecov/c/github/shelljs/shelljs/master.svg?style=flat-square&label=coverage)](https://codecov.io/gh/shelljs/shelljs) [![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) [![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) @@ -14,7 +13,7 @@ projects - say goodbye to those gnarly Bash scripts! ShellJS is proudly tested on every node release since `v8`! -The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battle-tested in projects like: +The project is unit-tested and battle-tested in projects like: + [Firebug](http://getfirebug.com/) - Firefox's infamous debugger + [JSHint](http://jshint.com) & [ESLint](http://eslint.org/) - popular JavaScript linters diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index bc8becc87..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,32 +0,0 @@ -environment: - matrix: - - nodejs_version: '14' - - nodejs_version: '13' - - nodejs_version: '12' - - nodejs_version: '11' - - nodejs_version: '10' - - nodejs_version: '9' - - nodejs_version: '8' - -version: '{build}' - -# Install scripts. (runs after repo cloning) -install: - - ps: Install-Product node $env:nodejs_version - - set PATH=%APPDATA%\npm;%PATH% - - node --version - - npm --version - - npm install - -matrix: - fast_finish: false - -# No need for MSBuild on this project -build: off - -test_script: - - npm run test-with-coverage - - npm run lint - -on_success: - - npm run codecov -- -f coverage/lcov.info diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 31d912288..e2db445dd 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -51,21 +51,11 @@ function range(start, stop) { return ret; } -function checkTravis(minNodeVersion, maxNodeVersion, travisYaml) { - var expectedTravisVersions = range(minNodeVersion, maxNodeVersion); - var msg = 'Check Travis node_js versions'; - assertDeepEquals(travisYaml.node_js, expectedTravisVersions, msg); -} - -function checkAppveyor(minNodeVersion, maxNodeVersion, appveyorYaml) { - var expectedAppveyorVersions = range(minNodeVersion, maxNodeVersion) - .map(function (num) { - return { nodejs_version: num.toString() }; - }) - .reverse(); // Arbitrarily, we store appveyor in reverse order. - var msg = 'Check Appveyor environment.matrix versions'; - assertDeepEquals(appveyorYaml.environment.matrix, expectedAppveyorVersions, - msg); +function checkGithubActions(minNodeVersion, maxNodeVersion, githubActionsYaml) { + var expectedVersions = range(minNodeVersion, maxNodeVersion); + var msg = 'Check GitHub Actions node_js versions'; + assertDeepEquals(githubActionsYaml.jobs.test.strategy.matrix['node-version'], + expectedVersions, msg); } try { @@ -74,13 +64,11 @@ try { var package = require('../package.json'); checkEngines(MIN_NODE_VERSION, package); - var travisFileName = path.join(__dirname, '..', '.travis.yml'); - var travisYaml = yaml.safeLoad(shell.cat(travisFileName)); - checkTravis(MIN_NODE_VERSION, MAX_NODE_VERSION, travisYaml); + var githubActionsFileName = path.join(__dirname, '..', '.github', 'workflows', + 'main.yml'); + var githubActionsYaml = yaml.safeLoad(shell.cat(githubActionsFileName)); + checkGithubActions(MIN_NODE_VERSION, MAX_NODE_VERSION, githubActionsYaml); - var appveyorFileName = path.join(__dirname, '..', 'appveyor.yml'); - var appveyorYaml = yaml.safeLoad(shell.cat(appveyorFileName)); - checkAppveyor(MIN_NODE_VERSION, MAX_NODE_VERSION, appveyorYaml); console.log('All files look good (this project supports v' + MIN_NODE_VERSION + '-v' + MAX_NODE_VERSION + ')!'); } catch (e) { From ad911973cdbe1a6f5f3192d215c78ce3a9060492 Mon Sep 17 00:00:00 2001 From: Ian <38566281+fineon@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:31:18 -0800 Subject: [PATCH 238/338] Removed mentions of documentup website (#1056) --- .documentup.json | 6 ------ README.md | 3 +-- RELEASE.md | 2 -- 3 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 .documentup.json diff --git a/.documentup.json b/.documentup.json deleted file mode 100644 index 57fe30116..000000000 --- a/.documentup.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ShellJS", - "twitter": [ - "r2r" - ] -} diff --git a/README.md b/README.md index a87c7afdc..05076e63c 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,7 @@ wiki](https://github.com/shelljs/shelljs/wiki/Using-ShellJS-Plugins). For documentation on all the latest features, check out our [README](https://github.com/shelljs/shelljs). To read docs that are consistent with the latest release, check out [the npm -page](https://www.npmjs.com/package/shelljs) or -[shelljs.org](http://documentup.com/shelljs/shelljs). +page](https://www.npmjs.com/package/shelljs). ## Installing diff --git a/RELEASE.md b/RELEASE.md index 80aae7f7b..f0a46bec3 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -10,5 +10,3 @@ - `$ npm run changelog` - Manually verify that the changelog makes sense - `$ git push` -4. Generate the documentup website by visiting - http://documentup.com/shelljs/shelljs/__recompile in your browser From 003a39d652039f2171aca66770d1d7326dd3b216 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 6 Jan 2022 21:14:23 -0800 Subject: [PATCH 239/338] fix(exec): lockdown file permissions (#1060) This locks down file permissions used by the internal implementation of `shell.exec()`. Issue #1058 Tested manually using the documented scenarios --- src/exec.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/exec.js b/src/exec.js index ab67f56cc..f2d58c2ea 100644 --- a/src/exec.js +++ b/src/exec.js @@ -58,7 +58,24 @@ function execSync(cmd, opts, pipe) { stderrFile: stderrFile, }; - fs.writeFileSync(paramsFile, JSON.stringify(paramsToSerialize), 'utf8'); + // Create the files and ensure these are locked down (for read and write) to + // the current user. The main concerns here are: + // + // * If we execute a command which prints sensitive output, then + // stdoutFile/stderrFile must not be readable by other users. + // * paramsFile must not be readable by other users, or else they can read it + // to figure out the path for stdoutFile/stderrFile and create these first + // (locked down to their own access), which will crash exec() when it tries + // to write to the files. + function writeFileLockedDown(filePath, data) { + fs.writeFileSync(filePath, data, { + encoding: 'utf8', + mode: parseInt('600', 8), + }); + } + writeFileLockedDown(stdoutFile, ''); + writeFileLockedDown(stderrFile, ''); + writeFileLockedDown(paramsFile, JSON.stringify(paramsToSerialize)); var execArgs = [ path.join(__dirname, 'exec-child.js'), @@ -101,6 +118,7 @@ function execSync(cmd, opts, pipe) { } // No biggie if we can't erase the files now -- they're in a temp dir anyway + // and we locked down permissions (see the note above). try { common.unlinkSync(paramsFile); } catch (e) {} try { common.unlinkSync(stderrFile); } catch (e) {} try { common.unlinkSync(stdoutFile); } catch (e) {} From b4daff5fd2aa92cbe9cf50d329a20aed3925682a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 6 Jan 2022 22:39:44 -0800 Subject: [PATCH 240/338] chore: add SECURITY.md (#1061) No change to code. This adds a security policy. Issue #1058 --- .github/SECURITY.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/SECURITY.md diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 000000000..1496889b2 --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,31 @@ +# ShellJS Security Policy + +Thank you for reaching out regarding the security of the ShellJS module! Please +note that this project is maintained on a best-effort basis, however I still +intend to prioritize reviewing and addressing security issues. + +## Supported Versions + +I generally only support the latest ShellJS release (see +https://www.npmjs.com/package/shelljs). My goal is to release security fixes as +patch releases on top of whatever was most recently shipped. + +If breaking changes have already landed on the main development branch, I may +apply the patch on the relevant release branch (ex. +[`0.8-release`](https://github.com/shelljs/shelljs/commits/0.8-release) and +create a new release from there. + +## Reporting a Vulnerability + +Please report security vulnerabilities to ntfschr@gmail.com. I should respond +within a few days. Although it's not strictly required, it helps me out if you +can include any proof of concept exploit code, suggested fix, etc. + +**Please do not publicly disclose the suspected vulnerability** until I have a +chance to review your report. I'd like a chance to patch the code before the +issue is known to the public. + +Please **only** use this email for security issues. It's also OK to use the +email if you're legitimately unsure if this is a security issue (better safe +than sorry). But for all other non-security issues, please use the GitHub issue +tracker. From f45d2569408d90699a278f4cb2a02ffab4db8fa3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 15 Jan 2022 12:29:57 -0800 Subject: [PATCH 241/338] docs(ls): document the toString() override No change to logic. This documents `shell.ls('-l')`'s `.toString()` override. I noticed this feature was not documented. This string format should not be depended on by programmatic usage, but it's useful to make things more human readable. --- README.md | 12 ++++++++---- src/ls.js | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 05076e63c..6b094269e 100644 --- a/README.md +++ b/README.md @@ -430,10 +430,14 @@ Available options: + `-A`: all files (include files beginning with `.`, except for `.` and `..`) + `-L`: follow symlinks + `-d`: list directories themselves, not their contents -+ `-l`: list objects representing each file, each with fields containing `ls - -l` output fields. See - [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) - for more info ++ `-l`: provides more details for each file. Specifically, each file is + represented by a structured object with separate fields for file + metadata (see + [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats)). The + return value also overrides `.toString()` to resemble `ls -l`'s + output format for human readability, but programmatic usage should + depend on the stable object format rather than the `.toString()` + representation. Examples: diff --git a/src/ls.js b/src/ls.js index d2b2e0bd0..4faa30b0d 100644 --- a/src/ls.js +++ b/src/ls.js @@ -26,10 +26,14 @@ common.register('ls', _ls, { //@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) //@ + `-L`: follow symlinks //@ + `-d`: list directories themselves, not their contents -//@ + `-l`: list objects representing each file, each with fields containing `ls -//@ -l` output fields. See -//@ [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) -//@ for more info +//@ + `-l`: provides more details for each file. Specifically, each file is +//@ represented by a structured object with separate fields for file +//@ metadata (see +//@ [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats)). The +//@ return value also overrides `.toString()` to resemble `ls -l`'s +//@ output format for human readability, but programmatic usage should +//@ depend on the stable object format rather than the `.toString()` +//@ representation. //@ //@ Examples: //@ From 1a8e38d6f2491f45ae360f61c1a12e51a0d3d194 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 15 Jan 2022 12:11:59 -0800 Subject: [PATCH 242/338] docs(chmod): briefly mention Windows file perms File permissions on Windows are weird. This adds a brief note into the README that this is something to watch out for. As far as I'm aware, WSL completely avoids the weirdness because it's actually Linux (and so it follows POSIX). --- README.md | 4 ++++ src/chmod.js | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 6b094269e..38f25feab 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,10 @@ Notable exceptions: + In symbolic modes, `a-r` and `-r` are identical. No consideration is given to the `umask`. + There is no "quiet" option, since default behavior is to run silent. ++ Windows OS uses a very different permission model than POSIX. `chmod()` + does its best on Windows, but there are limits to how file permissions can + be set. Note that WSL (Windows subsystem for Linux) **does** follow POSIX, + so cross-platform compatibility should not be a concern there. Returns a [ShellString](#shellstringstr) indicating success or failure. diff --git a/src/chmod.js b/src/chmod.js index 5268cbce5..a6216c25e 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -59,6 +59,10 @@ common.register('chmod', _chmod, { //@ + In symbolic modes, `a-r` and `-r` are identical. No consideration is //@ given to the `umask`. //@ + There is no "quiet" option, since default behavior is to run silent. +//@ + Windows OS uses a very different permission model than POSIX. `chmod()` +//@ does its best on Windows, but there are limits to how file permissions can +//@ be set. Note that WSL (Windows subsystem for Linux) **does** follow POSIX, +//@ so cross-platform compatibility should not be a concern there. //@ //@ Returns a [ShellString](#shellstringstr) indicating success or failure. function _chmod(options, mode, filePattern) { From b473f2eab9e35842b8438b3f9661ad03e3066168 Mon Sep 17 00:00:00 2001 From: Shubham Joshi Date: Sat, 15 Jan 2022 13:09:02 -0800 Subject: [PATCH 243/338] sed with -i option now runs silently (#959) --- src/sed.js | 6 +++++- test/sed.js | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/sed.js b/src/sed.js index f616ba9ff..696774c7f 100644 --- a/src/sed.js +++ b/src/sed.js @@ -86,6 +86,10 @@ function _sed(options, regex, replacement, files) { } }); - return sed.join('\n'); + if (options.inplace) { + return ''; + } else { + return sed.join('\n'); + } } module.exports = _sed; diff --git a/test/sed.js b/test/sed.js index b2dc655aa..7010e0851 100644 --- a/test/sed.js +++ b/test/sed.js @@ -94,7 +94,7 @@ test('-i option', t => { const result = shell.sed('-i', /test1/, 'hello', `${t.context.tmp}/file1`); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), 'hello'); + t.is(result.toString(), ''); t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'hello'); }); @@ -159,7 +159,7 @@ test('multiple file names, with in-place-replacement', t => { `${t.context.tmp}/file2`]); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), 'hello1\nhello2'); + t.is(result.toString(), ''); t.is(shell.cat(`${t.context.tmp}/file1`).toString(), 'hello1'); t.is(shell.cat(`${t.context.tmp}/file2`).toString(), 'hello2'); }); @@ -170,7 +170,7 @@ test('glob file names, with in-place-replacement', t => { const result = shell.sed('-i', 'test', 'hello', `${t.context.tmp}/file*.txt`); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.toString(), 'hello1\n\nhello2\n'); // TODO: fix sed's behavior + t.is(result.toString(), ''); t.is(shell.cat(`${t.context.tmp}/file1.txt`).toString(), 'hello1\n'); t.is(shell.cat(`${t.context.tmp}/file2.txt`).toString(), 'hello2\n'); }); From 403a57cb9f9994c88243d0d005dc0ad44355c87c Mon Sep 17 00:00:00 2001 From: JessieFrance <64499366+JessieFrance@users.noreply.github.com> Date: Sat, 15 Jan 2022 14:19:47 -0700 Subject: [PATCH 244/338] Feature: Expose Error Code (#1036) --- README.md | 5 +++++ shell.js | 3 +++ src/errorCode.js | 10 ++++++++++ test/grep.js | 1 + test/ls.js | 1 + 5 files changed, 20 insertions(+) create mode 100644 src/errorCode.js diff --git a/README.md b/README.md index 38f25feab..6465dbc30 100644 --- a/README.md +++ b/README.md @@ -748,6 +748,11 @@ return value to be an error message. If you need the last error message, use the `.stderr` attribute from the last command's return value instead. +### errorCode() + +Returns the error code from the last command. + + ### ShellString(str) Examples: diff --git a/shell.js b/shell.js index e4c1c5df1..acc770325 100644 --- a/shell.js +++ b/shell.js @@ -34,6 +34,9 @@ exports.exit = process.exit; //@include ./src/error.js exports.error = require('./src/error'); +//@include ./src/errorCode.js +exports.errorCode = require('./src/errorCode'); + //@include ./src/common.js exports.ShellString = common.ShellString; diff --git a/src/errorCode.js b/src/errorCode.js new file mode 100644 index 000000000..a1c7fd23f --- /dev/null +++ b/src/errorCode.js @@ -0,0 +1,10 @@ +var common = require('./common'); + +//@ +//@ ### errorCode() +//@ +//@ Returns the error code from the last command. +function errorCode() { + return common.state.errorCode; +} +module.exports = errorCode; diff --git a/test/grep.js b/test/grep.js index 8f6a0c6a8..d5e696cad 100644 --- a/test/grep.js +++ b/test/grep.js @@ -24,6 +24,7 @@ test('no args', t => { const result = shell.grep(); t.truthy(shell.error()); t.is(result.code, 2); + t.is(shell.errorCode(), 2); }); test('too few args', t => { diff --git a/test/ls.js b/test/ls.js index 0163f6f73..987ecf763 100644 --- a/test/ls.js +++ b/test/ls.js @@ -40,6 +40,7 @@ test('it\'s ok to use no arguments', t => { const result = shell.ls(); t.falsy(shell.error()); t.is(result.code, 0); + t.is(shell.errorCode(), 0); }); test('root directory', t => { From 5af16d5c38a9bc7cf407fd05997b3a31876f856f Mon Sep 17 00:00:00 2001 From: fhanrath <33193081+fhanrath@users.noreply.github.com> Date: Sat, 15 Jan 2022 22:39:41 +0100 Subject: [PATCH 245/338] Feature/grep n (#1057) --- README.md | 1 + src/grep.js | 10 ++++++++-- test/grep.js | 6 ++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6465dbc30..041ec42d7 100644 --- a/README.md +++ b/README.md @@ -375,6 +375,7 @@ Available options: + `-v`: Invert `regex_filter` (only print non-matching lines). + `-l`: Print only filenames of matching files. + `-i`: Ignore case. ++ `-n`: Print line numbers. Examples: diff --git a/src/grep.js b/src/grep.js index 57450d10d..27e84011b 100644 --- a/src/grep.js +++ b/src/grep.js @@ -8,6 +8,7 @@ common.register('grep', _grep, { 'v': 'inverse', 'l': 'nameOnly', 'i': 'ignoreCase', + 'n': 'lineNumber', }, }); @@ -20,6 +21,7 @@ common.register('grep', _grep, { //@ + `-v`: Invert `regex_filter` (only print non-matching lines). //@ + `-l`: Print only filenames of matching files. //@ + `-i`: Ignore case. +//@ + `-n`: Print line numbers. //@ //@ Examples: //@ @@ -60,10 +62,14 @@ function _grep(options, regex, files) { } } else { var lines = contents.split('\n'); - lines.forEach(function (line) { + lines.forEach(function (line, index) { var matched = line.match(regex); if ((options.inverse && !matched) || (!options.inverse && matched)) { - grep.push(line); + var result = line; + if (options.lineNumber) { + result = '' + (index + 1) + ':' + line; + } + grep.push(result); } }); } diff --git a/test/grep.js b/test/grep.js index d5e696cad..d632e737e 100644 --- a/test/grep.js +++ b/test/grep.js @@ -163,6 +163,12 @@ test('-i option', t => { t.is(result.split('\n').length - 1, 3); }); +test('-n option', t => { + const result = shell.grep('-n', /alpha*beta/, 'test/resources/grep/file'); + t.falsy(shell.error()); + t.is(result.toString(), '1:alphaaaaaaabeta\n3:alphbeta\n'); +}); + test('the pattern looks like an option', t => { const result = shell.grep('--', '-v', 'test/resources/grep/file2'); t.falsy(shell.error()); From 42754c14ec5f4fedb7232670dba2838b1891b3e1 Mon Sep 17 00:00:00 2001 From: Andrea Canepa <32621046+A-725-K@users.noreply.github.com> Date: Sat, 15 Jan 2022 22:44:54 +0100 Subject: [PATCH 246/338] Added support for -n +NUM in tail.js (with sign) (#1027) --- src/tail.js | 12 +++++++++++- test/tail.js | 32 +++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/tail.js b/src/tail.js index 10f5a3c32..0545355b2 100644 --- a/src/tail.js +++ b/src/tail.js @@ -32,12 +32,20 @@ function _tail(options, files) { if (!files && !pipe) common.error('no paths given'); var idx = 1; + var plusOption = false; if (options.numLines === true) { idx = 2; + if (arguments[1][0] === '+') { + plusOption = true; + } options.numLines = Number(arguments[1]); } else if (options.numLines === false) { options.numLines = 10; } + // arguments[0] is a json object + if (arguments[0].numLines[0] === '+') { + plusOption = true; + } options.numLines = -1 * Math.abs(options.numLines); files = [].slice.call(arguments, idx); @@ -69,12 +77,14 @@ function _tail(options, files) { shouldAppendNewline = false; } - tail = tail.concat(lines.slice(options.numLines)); + tail = tail.concat(plusOption ? lines.slice(-options.numLines - 1) : lines.slice(options.numLines)); }); if (shouldAppendNewline) { tail.push(''); // to add a trailing newline once we join } + return tail.join('\n'); } + module.exports = _tail; diff --git a/test/tail.js b/test/tail.js index 0942aabf8..d0b82c715 100644 --- a/test/tail.js +++ b/test/tail.js @@ -90,7 +90,7 @@ test('reading more lines than are in the file (with trailing newline)', t => { t.is(result.toString(), 'short2\nshort1\n'); // these files only have one line (with \n) }); -test('Globbed file', t => { +test('globbed file', t => { const result = shell.tail('test/resources/head/file?.txt'); t.falsy(shell.error()); t.is(result.code, 0); @@ -102,7 +102,7 @@ test('Globbed file', t => { .join('\n') + '\n'); }); -test('With `\'-n\' ` option', t => { +test('with `\'-n\' ` option', t => { const result = shell.tail('-n', 4, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); @@ -115,7 +115,20 @@ test('With `\'-n\' ` option', t => { .join('\n') + '\n'); }); -test('With `{\'-n\': }` option', t => { +test('with `\'-n\' +` option', t => { + const result = shell.tail('-n', '+48', 'test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile2 + .slice(0, 3) + .reverse() + .concat(bottomOfFile1.slice(0, 3).reverse()) + .join('\n') + '\n'); +}); + +test('with `{\'-n\': }` option', t => { const result = shell.tail({ '-n': 4 }, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); @@ -128,6 +141,19 @@ test('With `{\'-n\': }` option', t => { .join('\n') + '\n'); }); +test('with `{\'-n\': +}` option', t => { + const result = shell.tail({ '-n': '+48' }, 'test/resources/head/file2.txt', + 'test/resources/head/file1.txt'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.is(result.toString(), + bottomOfFile2 + .slice(0, 3) + .reverse() + .concat(bottomOfFile1.slice(0, 3).reverse()) + .join('\n') + '\n'); +}); + test('negative values are the same as positive values', t => { const result = shell.tail('-n', -4, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); From 624e53d6dfa9e2aff00ff9811cb8a4e15c735ccc Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 16 Jan 2022 18:56:09 -0800 Subject: [PATCH 247/338] chore: remove codecov devDependency No change to logic. This removes the codecov package dependency because this is provided through GitHub Actions now. --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index ad2fe85eb..c684fd4bc 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "lint": "eslint .", "after-travis": "travis-check-changes", "changelog": "shelljs-changelog", - "codecov": "codecov", "release:major": "shelljs-release major", "release:minor": "shelljs-release minor", "release:patch": "shelljs-release patch" @@ -62,7 +61,6 @@ "devDependencies": { "ava": "^1.4.1", "chalk": "^1.1.3", - "codecov": "^3.0.2", "coffee-script": "^1.10.0", "eslint": "^5.16.0", "eslint-config-airbnb-base": "^13.1.0", From 5d25e9b25f776c6509171d9f197b933baeb40df9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 25 Jan 2022 21:30:05 -0800 Subject: [PATCH 248/338] chore: update deps No change to logic. This updates a bunch of devDependencies. --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c684fd4bc..645602dba 100644 --- a/package.json +++ b/package.json @@ -61,16 +61,16 @@ "devDependencies": { "ava": "^1.4.1", "chalk": "^1.1.3", - "coffee-script": "^1.10.0", + "coffee-script": "^1.12.7", "eslint": "^5.16.0", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.17.3", - "js-yaml": "^3.12.0", + "js-yaml": "^3.14.1", "nyc": "^14.1.1", - "shelljs-changelog": "^0.2.0", - "shelljs-release": "^0.3.0", - "shx": "^0.3.3", - "travis-check-changes": "^0.2.0" + "shelljs-changelog": "^0.2.6", + "shelljs-release": "^0.5.2", + "shx": "^0.3.4", + "travis-check-changes": "^0.4.0" }, "optionalDependencies": {}, "engines": { From a329b497807a3df4ff248427d83358c594a5c001 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 25 Jan 2022 23:56:59 -0800 Subject: [PATCH 249/338] test(cp): fix cp -Ru test cases This fixes several issues with the cp -Ru test cases: * Originally, I noticed the touch syntax looked wrong * After fixing that, I was trying to figure out how the test case was even passing before. I realized one of the assertions was wrong (it was asserting sourceFile contents, but should have asserted destFile contents) * I realized the test should have created a nested destination directory; without proper nesting, the sourceFile never actually collided with destFile during the copy * Lastly, I swapped touch() usage to use hardcoded timestamps for test consistency --- test/cp.js | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/test/cp.js b/test/cp.js index ba3a60468..512e27199 100644 --- a/test/cp.js +++ b/test/cp.js @@ -445,21 +445,22 @@ test('-R implies -P', t => { test('-Ru respects the -u flag recursively (don\'t update newer file)', t => { // Setup code - const TWO_DAYS_IN_MS = 2 * 24 * 60 * 60 * 1000; const dir = `${t.context.tmp}/cp-Ru`; - const sourceDir = `${dir}/old`; + const sourceDir = `${dir}/original`; const sourceFile = `${sourceDir}/file`; const destDir = `${dir}/new`; - const destFile = `${destDir}/file`; - [sourceDir, destDir].forEach(d => shell.mkdir('-p', d)); + const nestedDestDir = `${dir}/new/original`; + const destFile = `${nestedDestDir}/file`; + [sourceDir, destDir, nestedDestDir].forEach(d => shell.mkdir('-p', d)); shell.ShellString('Source File Contents\n').to(sourceFile); shell.ShellString('Destination File Contents\n').to(destFile); + const oldModifyTimeMs = 12345000; + const newModifyTimeMs = 67890000; // End setup - // Get the old mtime for dest - const oldTime = fs.statSync(destFile).mtimeMs; - // Set the source file to be older than the destination file - shell.touch('-m', oldTime - TWO_DAYS_IN_MS, sourceFile); - // Now, copy the old dir to the new one + + // Set the source file to be OLDER than the destination file + shell.touch({ '-m': true, '-d': new Date(oldModifyTimeMs) }, sourceFile); + shell.touch({ '-m': true, '-d': new Date(newModifyTimeMs) }, destFile); shell.cp('-Ru', sourceDir, destDir); // Check that dest has not been updated t.is(shell.cat(destFile).stdout, 'Destination File Contents\n'); @@ -467,24 +468,25 @@ test('-Ru respects the -u flag recursively (don\'t update newer file)', t => { test('-Ru respects the -u flag recursively (update older file)', t => { // Setup code - const TWO_DAYS_IN_MS = 2 * 24 * 60 * 60 * 1000; const dir = `${t.context.tmp}/cp-Ru`; - const sourceDir = `${dir}/old`; + const sourceDir = `${dir}/original`; const sourceFile = `${sourceDir}/file`; const destDir = `${dir}/new`; - const destFile = `${destDir}/file`; - [sourceDir, destDir].forEach(d => shell.mkdir('-p', d)); + const nestedDestDir = `${dir}/new/original`; + const destFile = `${nestedDestDir}/file`; + [sourceDir, destDir, nestedDestDir].forEach(d => shell.mkdir('-p', d)); shell.ShellString('Source File Contents\n').to(sourceFile); shell.ShellString('Destination File Contents\n').to(destFile); + const oldModifyTimeMs = 12345000; + const newModifyTimeMs = 67890000; // End setup - // Get the old mtime for dest - const oldTime = fs.statSync(destFile).mtimeMs; - // Set the destination file to be older than the source file - shell.touch('-m', oldTime + TWO_DAYS_IN_MS, sourceFile); - // Now, copy the old dir to the new one + + // Set the source file to be NEWER than the destination file + shell.touch({ '-m': true, '-d': new Date(newModifyTimeMs) }, sourceFile); + shell.touch({ '-m': true, '-d': new Date(oldModifyTimeMs) }, destFile); shell.cp('-Ru', sourceDir, destDir); - // Check that dest has been updated - t.is(shell.cat(sourceFile).stdout, 'Source File Contents\n'); + // Check that dest has been overwritten + t.is(shell.cat(destFile).stdout, 'Source File Contents\n'); }); test('using -P explicitly works', t => { From 9a0e5f6694c2250b5409bfdcf1654a99c2daa883 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 26 Jan 2022 22:41:40 -0800 Subject: [PATCH 250/338] Add preserve option to cp (#869) Co-authored-by: dwi2 --- README.md | 1 + src/cp.js | 26 ++++++++---- test/cp.js | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 041ec42d7..9aadcef12 100644 --- a/README.md +++ b/README.md @@ -206,6 +206,7 @@ Available options: + `-r`, `-R`: recursive + `-L`: follow symlinks + `-P`: don't follow symlinks ++ `-p`: preserve file mode, ownership, and timestamps Examples: diff --git a/src/cp.js b/src/cp.js index 09bde25bc..af4a0a1b5 100644 --- a/src/cp.js +++ b/src/cp.js @@ -11,6 +11,7 @@ common.register('cp', _cp, { 'r': 'recursive', 'L': 'followsymlink', 'P': 'noFollowsymlink', + 'p': 'preserve', }, wrapOutput: false, }); @@ -51,6 +52,7 @@ function copyFileSync(srcFile, destFile, options) { var pos = 0; var fdr = null; var fdw = null; + var srcStat = common.statFollowLinks(srcFile); try { fdr = fs.openSync(srcFile, 'r'); @@ -60,7 +62,7 @@ function copyFileSync(srcFile, destFile, options) { } try { - fdw = fs.openSync(destFile, 'w'); + fdw = fs.openSync(destFile, 'w', srcStat.mode); } catch (e) { /* istanbul ignore next */ common.error('copyFileSync: could not write to dest file (code=' + e.code + '):' + destFile); @@ -72,10 +74,15 @@ function copyFileSync(srcFile, destFile, options) { pos += bytesRead; } + if (options.preserve) { + fs.fchownSync(fdw, srcStat.uid, srcStat.gid); + // Note: utimesSync does not work (rounds to seconds), but futimesSync has + // millisecond precision. + fs.futimesSync(fdw, srcStat.atime, srcStat.mtime); + } + fs.closeSync(fdr); fs.closeSync(fdw); - - fs.chmodSync(destFile, common.statFollowLinks(srcFile).mode); } } @@ -96,8 +103,9 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { var isWindows = process.platform === 'win32'; - // Create the directory where all our junk is moving to; read the mode of the - // source directory and mirror it + // Create the directory where all our junk is moving to; read the mode/etc. of + // the source directory (we'll set this on the destDir at the end). + var checkDir = common.statFollowLinks(sourceDir); try { fs.mkdirSync(destDir); } catch (e) { @@ -150,7 +158,10 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { // finally change the mode for the newly created directory (otherwise, we // couldn't add files to a read-only directory). - var checkDir = common.statFollowLinks(sourceDir); + // var checkDir = common.statFollowLinks(sourceDir); + if (opts.preserve) { + fs.utimesSync(destDir, checkDir.atime, checkDir.mtime); + } fs.chmodSync(destDir, checkDir.mode); } // cpdirSyncRecursive @@ -196,6 +207,7 @@ function cpcheckcycle(sourceDir, srcFile) { //@ + `-r`, `-R`: recursive //@ + `-L`: follow symlinks //@ + `-P`: don't follow symlinks +//@ + `-p`: preserve file mode, ownership, and timestamps //@ //@ Examples: //@ @@ -258,7 +270,7 @@ function _cp(options, sources, dest) { try { common.statFollowLinks(path.dirname(dest)); - cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink, update: options.update }); + cpdirSyncRecursive(src, newDest, 0, options); } catch (e) { /* istanbul ignore next */ common.error("cannot create directory '" + dest + "': No such file or directory"); diff --git a/test/cp.js b/test/cp.js index 512e27199..a0f6e28ef 100644 --- a/test/cp.js +++ b/test/cp.js @@ -805,3 +805,117 @@ test('cp -R should be able to copy a readonly src. issue #98; (Non window platfo shell.chmod('-R', '755', t.context.tmp); }); }); + +test('cp -p should preserve mode, ownership, and timestamp (regular file)', t => { + // Setup: copy to srcFile and modify mode and timestamp + const srcFile = `${t.context.tmp}/srcFile`; + shell.cp('test/resources/cp/file1', srcFile); + // Make this a round number of seconds, since the underlying system may not + // have millisecond precision. + const newModifyTimeMs = 12345000; + const newAccessTimeMs = 67890000; + shell.touch({ '-d': new Date(newModifyTimeMs), '-m': true }, srcFile); + shell.touch({ '-d': new Date(newAccessTimeMs), '-a': true }, srcFile); + const mode = '444'; + shell.chmod(mode, srcFile); + + // Now re-copy with '-p' and verify metadata. + const result = shell.cp('-p', srcFile, `${t.context.tmp}/preservedFile1`); + const stat = common.statFollowLinks(srcFile); + const statOfResult = common.statFollowLinks(`${t.context.tmp}/preservedFile1`); + + t.is(result.code, 0); + + // Original file should be unchanged: + t.is(stat.mtime.getTime(), newModifyTimeMs); + // cp appears to update the atime, but only of the srcFile + t.is(stat.mode.toString(8), '100' + mode); + + // New file should keep same attributes + t.is(statOfResult.mtime.getTime(), newModifyTimeMs); + t.is(statOfResult.atime.getTime(), newAccessTimeMs); + t.is(statOfResult.mode.toString(8), '100' + mode); + + t.is(stat.uid, statOfResult.uid); + t.is(stat.gid, statOfResult.gid); +}); + +test('cp -p should preserve mode, ownership, and timestamp (directory)', t => { + // Setup: copy to srcFile and modify mode and timestamp + const srcDir = `${t.context.tmp}/srcDir`; + const srcFile = `${srcDir}/srcFile`; + shell.mkdir(srcDir); + shell.cp('test/resources/cp/file1', srcFile); + // Make this a round number of seconds, since the underlying system may not + // have millisecond precision. + const newModifyTimeMs = 12345000; + const newAccessTimeMs = 67890000; + shell.touch({ '-d': new Date(newModifyTimeMs), '-m': true }, srcFile); + shell.touch({ '-d': new Date(newAccessTimeMs), '-a': true }, srcFile); + fs.utimesSync(srcDir, new Date(newAccessTimeMs), new Date(newModifyTimeMs)); + const mode = '444'; + shell.chmod(mode, srcFile); + + // Now re-copy (the whole dir) with '-p' and verify metadata of file contents. + const result = shell.cp('-pr', srcDir, `${t.context.tmp}/preservedDir`); + const stat = common.statFollowLinks(srcFile); + const statDir = common.statFollowLinks(srcDir); + const statOfResult = common.statFollowLinks(`${t.context.tmp}/preservedDir/srcFile`); + const statOfResultDir = common.statFollowLinks(`${t.context.tmp}/preservedDir`); + + t.is(result.code, 0); + + // Both original file and original dir should be unchanged: + t.is(statDir.mtime.getTime(), newModifyTimeMs); + t.is(stat.mtime.getTime(), newModifyTimeMs); + // cp appears to update the atime, but only of the srcFile & srcDir + t.is(stat.mode.toString(8), '100' + mode); + + // Both new file and new dir should keep same attributes + t.is(statOfResultDir.mtime.getTime(), newModifyTimeMs); + t.is(statOfResultDir.atime.getTime(), newAccessTimeMs); + t.is(statOfResult.mtime.getTime(), newModifyTimeMs); + t.is(statOfResult.atime.getTime(), newAccessTimeMs); + t.is(statOfResult.mode.toString(8), '100' + mode); + + t.is(stat.uid, statOfResult.uid); + t.is(stat.gid, statOfResult.gid); +}); + +test('cp -p should preserve mode, ownership, and timestamp (symlink)', t => { + // Skip in Windows because symlinks require elevated permissions. + utils.skipOnWin(t, () => { + // Setup: copy to srcFile, create srcLink, and modify mode and timestamp + shell.cp('test/resources/cp/file1', `${t.context.tmp}/srcFile`); + const srcLink = `${t.context.tmp}/srcLink`; + shell.ln('-s', 'srcFile', `${t.context.tmp}/srcLink`); + // Make this a round number of seconds, since the underlying system may not + // have millisecond precision. + const newModifyTimeMs = 12345000; + const newAccessTimeMs = 67890000; + shell.touch({ '-d': new Date(newModifyTimeMs), '-m': true }, srcLink); + shell.touch({ '-d': new Date(newAccessTimeMs), '-a': true }, srcLink); + const mode = '444'; + shell.chmod(mode, srcLink); + + // Now re-copy with '-p' and verify metadata. + const result = shell.cp('-p', srcLink, `${t.context.tmp}/preservedLink`); + const stat = common.statFollowLinks(srcLink); + const statOfResult = common.statFollowLinks(`${t.context.tmp}/preservedLink`); + + t.is(result.code, 0); + + // Original file should be unchanged: + t.is(stat.mtime.getTime(), newModifyTimeMs); + // cp appears to update the atime, but only of the srcFile + t.is(stat.mode.toString(8), '100' + mode); + + // New file should keep same attributes + t.is(statOfResult.mtime.getTime(), newModifyTimeMs); + t.is(statOfResult.atime.getTime(), newAccessTimeMs); + t.is(statOfResult.mode.toString(8), '100' + mode); + + t.is(stat.uid, statOfResult.uid); + t.is(stat.gid, statOfResult.gid); + }); +}); From 5f0eab152c72721b0ed3d0b3d7b2e726dade0f23 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 13 Feb 2022 17:07:30 -0800 Subject: [PATCH 251/338] docs(import): document es6 import command No change to logic. This documents that we support importing via `import shell from 'shelljs'`. Related to issue #1071, although some more investigation is required to understand why the other syntax doesn't work. --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 9aadcef12..e88f69652 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,13 @@ var shell = require('shelljs'); shell.echo('hello world'); ``` +Alternatively, we also support importing as a module with: + +```javascript +import shell from 'shelljs'; +shell.echo('hello world'); +``` + From 4b6b17a6356c6db2b01ad6822e8771c00c4ea730 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 13 Feb 2022 17:21:58 -0800 Subject: [PATCH 252/338] docs(touch): clarify docs for touch() command No change to logic. This expands on the `touch()` command documentation to make it more obvious how to use multiple options, long options, etc. This also renames a variable in a test case to make the usage more obvious. --- README.md | 7 ++++--- src/touch.js | 7 ++++--- test/touch.js | 10 +++++----- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e88f69652..0f642e424 100644 --- a/README.md +++ b/README.md @@ -688,10 +688,10 @@ Available options: + `-a`: Change only the access time + `-c`: Do not create any files + `-m`: Change only the modification time -+ `{'-d': someDate}`, `{date: someDate}`: Use `someDate` (instance of - `Date`) instead of current time ++ `{'-d': someDate}`, `{date: someDate}`: Use a `Date` instance (ex. `someDate`) + instead of current time + `{'-r': file}`, `{reference: file}`: Use `file`'s times instead of current - time + time Examples: @@ -699,6 +699,7 @@ Examples: touch('source.js'); touch('-c', 'path/to/file.js'); touch({ '-r': 'referenceFile.txt' }, 'path/to/file.js'); +touch({ '-d': new Date('December 17, 1995 03:24:00'), '-m': true }, 'path/to/file.js'); touch({ date: new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); ``` diff --git a/src/touch.js b/src/touch.js index ed1839ae8..cff7b71e9 100644 --- a/src/touch.js +++ b/src/touch.js @@ -20,10 +20,10 @@ common.register('touch', _touch, { //@ + `-a`: Change only the access time //@ + `-c`: Do not create any files //@ + `-m`: Change only the modification time -//@ + `{'-d': someDate}`, `{date: someDate}`: Use `someDate` (instance of -//@ `Date`) instead of current time +//@ + `{'-d': someDate}`, `{date: someDate}`: Use a `Date` instance (ex. `someDate`) +//@ instead of current time //@ + `{'-r': file}`, `{reference: file}`: Use `file`'s times instead of current -//@ time +//@ time //@ //@ Examples: //@ @@ -31,6 +31,7 @@ common.register('touch', _touch, { //@ touch('source.js'); //@ touch('-c', 'path/to/file.js'); //@ touch({ '-r': 'referenceFile.txt' }, 'path/to/file.js'); +//@ touch({ '-d': new Date('December 17, 1995 03:24:00'), '-m': true }, 'path/to/file.js'); //@ touch({ date: new Date('December 17, 1995 03:24:00') }, 'path/to/file.js'); //@ ``` //@ diff --git a/test/touch.js b/test/touch.js index a331bf70d..7ca36516d 100644 --- a/test/touch.js +++ b/test/touch.js @@ -129,14 +129,14 @@ test('accepts -d flag', t => { t.is(common.statFollowLinks(testFile).atime.getTime(), date.getTime()); }); -test('accepts long option (date)', t => { +test('accepts long option (--date)', t => { const testFile = tmpFile(t); - const date = new Date('December 17, 1995 03:24:00'); - const result = shell.touch({ date }, testFile); + const someDate = new Date('December 17, 1995 03:24:00'); + const result = shell.touch({ date: someDate }, testFile); t.is(result.code, 0); // Compare getTime(), because Date can't be compared with triple-equals. - t.is(common.statFollowLinks(testFile).mtime.getTime(), date.getTime()); - t.is(common.statFollowLinks(testFile).atime.getTime(), date.getTime()); + t.is(common.statFollowLinks(testFile).mtime.getTime(), someDate.getTime()); + t.is(common.statFollowLinks(testFile).atime.getTime(), someDate.getTime()); }); test('sets mtime and atime by default', t => { From 8c926df43a998403b67ce2fc992476a2e9e991db Mon Sep 17 00:00:00 2001 From: Marco Perrando Date: Fri, 25 Feb 2022 04:18:29 +0100 Subject: [PATCH 253/338] Added -L to find to visit symlinked folders too. (#1080) --- src/find.js | 8 ++++++-- test/find.js | 12 ++++++++++-- test/resources/find/dir2_link | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) create mode 120000 test/resources/find/dir2_link diff --git a/src/find.js b/src/find.js index b6c882979..80db9935b 100644 --- a/src/find.js +++ b/src/find.js @@ -2,7 +2,11 @@ var path = require('path'); var common = require('./common'); var _ls = require('./ls'); -common.register('find', _find, {}); +common.register('find', _find, { + cmdOptions: { + 'L': 'link', + }, +}); //@ //@ ### find(path [, path ...]) @@ -51,7 +55,7 @@ function _find(options, paths) { pushFile(file); if (stat.isDirectory()) { - _ls({ recursive: true, all: true }, file).forEach(function (subfile) { + _ls({ recursive: true, all: true, link: options.link }, file).forEach(function (subfile) { pushFile(path.join(file, subfile)); }); } diff --git a/test/find.js b/test/find.js index 2f9e0aa6c..b9a14d01f 100644 --- a/test/find.js +++ b/test/find.js @@ -30,7 +30,7 @@ test('current path', t => { t.is(result.code, 0); t.truthy(result.indexOf('.hidden') > -1); t.truthy(result.indexOf('dir1/dir11/a_dir11') > -1); - t.is(result.length, 11); + t.is(result.length, 12); shell.cd('../..'); }); @@ -40,7 +40,7 @@ test('simple path', t => { t.is(result.code, 0); t.truthy(result.indexOf('test/resources/find/.hidden') > -1); t.truthy(result.indexOf('test/resources/find/dir1/dir11/a_dir11') > -1); - t.is(result.length, 11); + t.is(result.length, 12); }); test('multiple paths - comma', t => { @@ -66,3 +66,11 @@ test('nonexistent path', t => { t.is(shell.error(), 'find: no such file or directory: test/resources/find/nonexistent'); t.is(result.code, 1); }); + +test('-L flag, folder is symlinked', t => { + const result = shell.find('-L', 'test/resources/find'); + t.falsy(shell.error()); + t.is(result.code, 0); + t.truthy(result.indexOf('test/resources/find/dir2_link/a_dir1') > -1); + t.is(result.length, 13); +}); diff --git a/test/resources/find/dir2_link b/test/resources/find/dir2_link new file mode 120000 index 000000000..1e039be90 --- /dev/null +++ b/test/resources/find/dir2_link @@ -0,0 +1 @@ +dir2 \ No newline at end of file From a3a7e7496dd29ee91e5bbc74e2117ba0c3e920b3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 9 Aug 2022 21:21:10 -0700 Subject: [PATCH 254/338] chore: update CI to include v18 No change to logic. This updates GitHub actions to test up through node v18. --- .github/workflows/main.yml | 4 ++++ scripts/check-node-support.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 72ffd3ea2..e115e9614 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,6 +17,10 @@ jobs: - 12 - 13 - 14 + - 15 + - 16 + - 17 + - 18 os: - ubuntu-latest - macos-latest diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index e2db445dd..0e80dddf2 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -9,7 +9,7 @@ var shell = require('..'); // This is the authoritative list of supported node versions. var MIN_NODE_VERSION = 8; -var MAX_NODE_VERSION = 14; +var MAX_NODE_VERSION = 18; function checkReadme(minNodeVersion) { var start = ''; From 1a1a820569f0883a317944973c15cf34431dd6c2 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 26 Jun 2023 16:26:26 -0700 Subject: [PATCH 255/338] chore: add codecov token This is supposed to fix codecov. Fixes #1124 --- .github/workflows/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e115e9614..78093cff3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,6 +38,8 @@ jobs: - name: Check for modified files (skip on Windows) run: npm run after-travis if: matrix.os != 'windows-latest' - - uses: codecov/codecov-action@v2 + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 with: + token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From 547a739d61f6687fba475eda364f3a64b4c7bd06 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 26 Jun 2023 16:14:51 -0700 Subject: [PATCH 256/338] chore: update CI to test against node v20 No change to logic. This updates GitHub actions CI to test on node v19 and v20. --- .github/workflows/main.yml | 2 ++ scripts/check-node-support.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 78093cff3..7c71a314c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,6 +21,8 @@ jobs: - 16 - 17 - 18 + - 19 + - 20 os: - ubuntu-latest - macos-latest diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 0e80dddf2..6775a5665 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -9,7 +9,7 @@ var shell = require('..'); // This is the authoritative list of supported node versions. var MIN_NODE_VERSION = 8; -var MAX_NODE_VERSION = 18; +var MAX_NODE_VERSION = 20; function checkReadme(minNodeVersion) { var start = ''; From f7a7c75d4d315fc9fada1b148668811cf505f152 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 26 Jun 2023 15:49:31 -0700 Subject: [PATCH 257/338] fix: shell.errorCode() honors shell.exit(code) This changes shell.exit() to use a wrapper function. This is so that shell.errorCode() will have the correct error code after invoking shell.exit(code). This isn't normally relevant, however a caller may be listening for the exit status: ``` process.on('exit', code => { shell.exit(shell.errorCode()); }); ``` Issue #1013 --- shell.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/shell.js b/shell.js index acc770325..017a7a87f 100644 --- a/shell.js +++ b/shell.js @@ -29,7 +29,20 @@ require('./commands').forEach(function (command) { //@ ### exit(code) //@ //@ Exits the current process with the given exit `code`. -exports.exit = process.exit; +exports.exit = function exit(code) { + if (code) { + common.error('exit', { + continue: true, + code: code, + prefix: '', + silent: true, + fatal: false, + }); + process.exit(code); + } else { + process.exit(); + } +}; //@include ./src/error.js exports.error = require('./src/error'); From e7ce4df63f174a7e368a0bc76c592fb5fe02357e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 6 Sep 2023 22:28:45 -0700 Subject: [PATCH 258/338] docs: fix typo in security policy No change to content. This fixes a missing ')' character. --- .github/SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 1496889b2..4c96dd513 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -12,7 +12,7 @@ patch releases on top of whatever was most recently shipped. If breaking changes have already landed on the main development branch, I may apply the patch on the relevant release branch (ex. -[`0.8-release`](https://github.com/shelljs/shelljs/commits/0.8-release) and +[`0.8-release`](https://github.com/shelljs/shelljs/commits/0.8-release)) and create a new release from there. ## Reporting a Vulnerability From a987ecfab2a9978847d933e740a199e56d1a29fd Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 11 Nov 2023 16:34:27 -0800 Subject: [PATCH 259/338] chore: update nyc to v15 No change to logic. This updates nyc (code coverage tool) to version 15, which works around a breaking change that snuck into the latest Node LTS versions. Unfortunately, this version of nyc appears to break Node 8 and 9. We need to work around this problem by skipping test coverage on those versions. Fixes #1130 --- .github/workflows/main.yml | 8 +++++++- package.json | 3 +-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7c71a314c..ac23375be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,7 +33,12 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm install - - run: npm run test-with-coverage + - name: test with coverage + run: npm run test-with-coverage + if: matrix.node-version >= 10 + - name: test without coverage (coverage broken on node < 10) + run: npm run test + if: matrix.node-version < 10 - run: npm run lint - run: npm run gendocs - run: npm run check-node-support @@ -41,6 +46,7 @@ jobs: run: npm run after-travis if: matrix.os != 'windows-latest' - name: Upload coverage reports to Codecov + if: matrix.node-version >= 10 uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/package.json b/package.json index 645602dba..dcd073c0e 100644 --- a/package.json +++ b/package.json @@ -66,13 +66,12 @@ "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.17.3", "js-yaml": "^3.14.1", - "nyc": "^14.1.1", + "nyc": "^15.1.0", "shelljs-changelog": "^0.2.6", "shelljs-release": "^0.5.2", "shx": "^0.3.4", "travis-check-changes": "^0.4.0" }, - "optionalDependencies": {}, "engines": { "node": ">=8" } From b704489221f13c9cfd06f488906d98b2c10118e3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 11 Nov 2023 16:50:36 -0800 Subject: [PATCH 260/338] chore: keep node < 16 around longer GitHub is removing all versions < v16 from GitHub actions. I'm trying to keep Node coverage for as long as possible. Issue #1140 --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ac23375be..3f70e958f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,6 +2,8 @@ name: CI on: - push - pull_request +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true jobs: test: name: Node.js ${{ matrix.node-version }} on ${{ matrix.os }} From b8b1c4224d0ec7d631d26c78922c018dd5b895f5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 11 Nov 2023 12:34:09 -0800 Subject: [PATCH 261/338] chore: remove codecov token It looks like 1a1a820569f0883a317944973c15cf34431dd6c2 actually broke codecov. Codecov is currently trying to diff all PRs against the commit before that one, which leads to flagging previously-added lines of code as needing coverage in the current PR. Let's try removing the token and see if codecov is happy again. Fixes #1124 --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3f70e958f..b90b2beb0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,5 +51,4 @@ jobs: if: matrix.node-version >= 10 uses: codecov/codecov-action@v3 with: - token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From 39ebb7184682b8e30195afb6ccbae077de57dfb2 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 11 Nov 2023 18:11:33 -0800 Subject: [PATCH 262/338] test: add coverage for exit function This adds test coverage for the shell.exit() function. This also refactors how we mock stdout/stderr and adds support for mocking process.exit() (which was needed for this change). While I was writing these tests, I realized there was an edge case I missed in PR #1122. This change fixes that edge case. Issue #1013 --- shell.js | 2 ++ test/echo.js | 50 ++++++++++++++++++----------------- test/exec.js | 10 ++++--- test/exit.js | 57 ++++++++++++++++++++++++++++++++++++++++ test/popd.js | 20 ++++++++------ test/pushd.js | 20 ++++++++------ test/utils/mocks.js | 64 +++++++++++++++++++++++++++++++-------------- 7 files changed, 159 insertions(+), 64 deletions(-) create mode 100644 test/exit.js diff --git a/shell.js b/shell.js index 017a7a87f..ad40740b5 100644 --- a/shell.js +++ b/shell.js @@ -30,6 +30,8 @@ require('./commands').forEach(function (command) { //@ //@ Exits the current process with the given exit `code`. exports.exit = function exit(code) { + common.state.error = null; + common.state.errorCode = 0; if (code) { common.error('exit', { continue: true, diff --git a/test/echo.js b/test/echo.js index 1d571e49b..9ae45139d 100644 --- a/test/echo.js +++ b/test/echo.js @@ -8,12 +8,14 @@ shell.config.silent = true; test.beforeEach(t => { t.context.tmp = utils.getTempDir(); - mocks.init(); + mocks.stdout.init(); + mocks.stderr.init(); }); test.afterEach.always(t => { shell.rm('-rf', t.context.tmp); - mocks.restore(); + mocks.stdout.restore(); + mocks.stderr.restore(); }); // @@ -22,8 +24,8 @@ test.afterEach.always(t => { test('simple test with defaults', t => { const result = shell.echo('hello', 'world'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 0); t.is(stdout, 'hello world\n'); @@ -33,8 +35,8 @@ test('simple test with defaults', t => { test('allow arguments to begin with a hyphen', t => { // Github issue #20 const result = shell.echo('-asdf', '111'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 1); t.is(stdout, '-asdf 111\n'); @@ -43,8 +45,8 @@ test('allow arguments to begin with a hyphen', t => { test("using null as an explicit argument doesn't crash the function", t => { const result = shell.echo(null); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 0); t.is(stdout, 'null\n'); @@ -53,8 +55,8 @@ test("using null as an explicit argument doesn't crash the function", t => { test('-e option', t => { const result = shell.echo('-e', '\tmessage'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 0); t.is(stdout, '\tmessage\n'); @@ -72,8 +74,8 @@ test('piping to a file', t => { t.falsy(shell.error()); t.is(resultB.code, 0); const result = shell.cat(tmp); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(stdout, 'A\nB\n'); t.is(stderr, ''); @@ -82,8 +84,8 @@ test('piping to a file', t => { test('-n option', t => { const result = shell.echo('-n', 'message'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 0); t.is(stdout, 'message'); @@ -92,8 +94,8 @@ test('-n option', t => { test('-ne option', t => { const result = shell.echo('-ne', 'message'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 0); t.is(stdout, 'message'); @@ -102,8 +104,8 @@ test('-ne option', t => { test('-en option', t => { const result = shell.echo('-en', 'message'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 0); t.is(stdout, 'message'); @@ -112,8 +114,8 @@ test('-en option', t => { test('-en option with escaped characters', t => { const result = shell.echo('-en', '\tmessage\n'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 0); t.is(stdout, '\tmessage\n'); @@ -131,8 +133,8 @@ test('piping to a file with -n', t => { t.falsy(shell.error()); t.is(resultB.code, 0); const result = shell.cat(tmp); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(stdout, 'AB'); t.is(stderr, ''); @@ -141,8 +143,8 @@ test('piping to a file with -n', t => { test('stderr with unrecognized options is empty', t => { const result = shell.echo('-asdf'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(result.code, 1); t.falsy(result.stderr); diff --git a/test/exec.js b/test/exec.js index 99fd356bc..9c9d9e715 100644 --- a/test/exec.js +++ b/test/exec.js @@ -13,13 +13,15 @@ const ORIG_EXEC_PATH = shell.config.execPath; shell.config.silent = true; test.beforeEach(() => { - mocks.init(); + mocks.stdout.init(); + mocks.stderr.init(); }); test.afterEach.always(() => { process.chdir(CWD); shell.config.execPath = ORIG_EXEC_PATH; - mocks.restore(); + mocks.stdout.restore(); + mocks.stderr.restore(); }); // @@ -102,8 +104,8 @@ test('check if stdout + stderr go to output', t => { test('check if stdout + stderr should not be printed to console if silent', t => { shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.error(1234); console.log(666); process.exit(12);"`, { silent: true }); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.is(stdout, ''); t.is(stderr, ''); }); diff --git a/test/exit.js b/test/exit.js new file mode 100644 index 000000000..494f3c229 --- /dev/null +++ b/test/exit.js @@ -0,0 +1,57 @@ +import test from 'ava'; + +import shell from '..'; + +import mocks from './utils/mocks'; + +// +// Valids +// + +function runExitInSubprocess(code) { + const script = code !== undefined + ? `var shell = require("."); shell.exit(${code});` + : 'var shell = require("."); shell.exit();'; + const result = shell.exec( + `${JSON.stringify(shell.config.execPath)} -e ${JSON.stringify(script)}` + ); + const actualReturnCode = result.code; + return actualReturnCode; +} + +test('exit with success status code', t => { + t.is(runExitInSubprocess(0), 0); +}); + +test('exit without explicit code should be success', t => { + t.is(runExitInSubprocess(), 0); +}); + +test('exit with failure status code', t => { + t.is(runExitInSubprocess(5), 5); + t.is(runExitInSubprocess(2), 2); + t.is(runExitInSubprocess(25), 25); +}); + +test('exit correctly sets the shell.errorCode()', t => { + try { + mocks.exit.init(); + shell.exit(5); // Safe to call shell.exit() because it's mocked. + t.is(shell.errorCode(), 5); + t.is(mocks.exit.getValue(), 5); + t.truthy(shell.error()); + + shell.exit(0); // Safe to call shell.exit() because it's mocked. + t.is(shell.errorCode(), 0); + t.falsy(mocks.exit.getValue()); + t.falsy(shell.error()); + + // Also try it without an explicit argument. + shell.exit(); // Safe to call shell.exit() because it's mocked. + t.is(shell.errorCode(), 0); + t.falsy(mocks.exit.getValue()); + t.falsy(shell.error()); + } finally { + mocks.exit.restore(); + } +}); diff --git a/test/popd.js b/test/popd.js index 0626a0bec..7b66f40c6 100644 --- a/test/popd.js +++ b/test/popd.js @@ -120,10 +120,11 @@ test('quiet mode off', t => { try { shell.pushd('test/resources/pushd'); shell.config.silent = false; - mocks.init(); + mocks.stdout.init(); + mocks.stderr.init(); const trail = shell.popd(); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(stdout, ''); t.is(stderr, `${rootDir}\n`); @@ -131,7 +132,8 @@ test('quiet mode off', t => { t.deepEqual(trail, [rootDir]); } finally { shell.config.silent = true; - mocks.restore(); + mocks.stdout.restore(); + mocks.stderr.restore(); } }); @@ -139,10 +141,11 @@ test('quiet mode on', t => { try { shell.pushd('test/resources/pushd'); shell.config.silent = false; - mocks.init(); + mocks.stdout.init(); + mocks.stderr.init(); const trail = shell.popd('-q'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(stdout, ''); t.is(stderr, ''); @@ -150,6 +153,7 @@ test('quiet mode on', t => { t.deepEqual(trail, [rootDir]); } finally { shell.config.silent = true; - mocks.restore(); + mocks.stdout.restore(); + mocks.stderr.restore(); } }); diff --git a/test/pushd.js b/test/pushd.js index d24b321fc..b6766c422 100644 --- a/test/pushd.js +++ b/test/pushd.js @@ -333,10 +333,11 @@ test('Push without arguments invalid when stack is empty', t => { test('quiet mode off', t => { try { shell.config.silent = false; - mocks.init(); + mocks.stdout.init(); + mocks.stderr.init(); const trail = shell.pushd('test/resources/pushd'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(stdout, ''); t.is(stderr, `${path.resolve(rootDir, 'test/resources/pushd')} ${rootDir}\n`); @@ -347,17 +348,19 @@ test('quiet mode off', t => { ]); } finally { shell.config.silent = true; - mocks.restore(); + mocks.stdout.restore(); + mocks.stderr.restore(); } }); test('quiet mode on', t => { try { shell.config.silent = false; - mocks.init(); + mocks.stdout.init(); + mocks.stderr.init(); const trail = shell.pushd('-q', 'test/resources/pushd'); - const stdout = mocks.stdout(); - const stderr = mocks.stderr(); + const stdout = mocks.stdout.getValue(); + const stderr = mocks.stderr.getValue(); t.falsy(shell.error()); t.is(stdout, ''); t.is(stderr, ''); @@ -368,6 +371,7 @@ test('quiet mode on', t => { ]); } finally { shell.config.silent = true; - mocks.restore(); + mocks.stdout.restore(); + mocks.stderr.restore(); } }); diff --git a/test/utils/mocks.js b/test/utils/mocks.js index 79dc55087..a55e6d298 100644 --- a/test/utils/mocks.js +++ b/test/utils/mocks.js @@ -16,29 +16,53 @@ function wrapWrite(target) { }; } -const _processStdoutWrite = process.stdout.write; -const _processStderrWrite = process.stderr.write; -const _stdout = []; -const _stderr = []; -const _stdoutWrite = wrapWrite(_stdout); -const _stderrWrite = wrapWrite(_stderr); - -exports.stdout = function stdout() { - return joinData(_stdout); +const stdout = { + original: process.stdout.write, + value: [], + init: function init() { + this.value = []; + process.stdout.write = wrapWrite(this.value); + }, + restore: function restore() { + process.stdout.write = this.original; + }, + getValue: function getValue() { + return joinData(this.value); + } }; -exports.stderr = function stderr() { - return joinData(_stderr); +const stderr = { + original: process.stderr.write, + value: [], + init: function init() { + this.value = []; + process.stderr.write = wrapWrite(this.value); + }, + restore: function restore() { + process.stderr.write = this.original; + }, + getValue: function getValue() { + return joinData(this.value); + } }; -exports.init = function init() { - process.stdout.write = _stdoutWrite; - process.stderr.write = _stderrWrite; +const exit = { + original: process.exit, + value: undefined, + init: function init() { + this.value = undefined; + process.exit = (newCode) => { + this.value = newCode; + }; + }, + restore: function restore() { + process.exit = this.original; + }, + getValue: function getValue() { + return this.value; + } }; -exports.restore = function restore() { - process.stdout.write = _processStdoutWrite; - process.stderr.write = _processStderrWrite; - _stdout.splice(0); - _stderr.splice(0); -}; +exports.stdout = stdout; +exports.stderr = stderr; +exports.exit = exit; From b5e53ebd12b5d2491615adfe4dfba496a3d25701 Mon Sep 17 00:00:00 2001 From: Andreas Deininger Date: Mon, 13 Nov 2023 06:05:27 +0100 Subject: [PATCH 263/338] Bump GitHub workflow actions to latest versions (#1136) This PR bumps two GitHub workflow actions to their latest versions. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b90b2beb0..415374bdd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,8 +30,8 @@ jobs: - macos-latest - windows-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm install From 626973367f26aaf305fa5aa0537154430ef39fbc Mon Sep 17 00:00:00 2001 From: Andreas Deininger Date: Mon, 13 Nov 2023 06:06:23 +0100 Subject: [PATCH 264/338] Fixing typos (#1137) This PR fixes a few typos that I spotted in the project. --- README.md | 6 +++--- plugin.js | 2 +- src/dirs.js | 4 ++-- src/sed.js | 2 +- test/cp.js | 2 +- test/rm.js | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0f642e424..3c13ac2a7 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ Save the current directory on the top of the directory stack and then `cd` to `d Available options: + `-n`: Suppress the normal directory change when removing directories from the stack, so that only the stack is manipulated. -+ `-q`: Supresses output to the console. ++ `-q`: Suppresses output to the console. Arguments: @@ -282,7 +282,7 @@ When no arguments are given, `popd` removes the top directory from the stack and Available options: + `-c`: Clears the directory stack by deleting all of the elements. -+ `-q`: Supresses output to the console. ++ `-q`: Suppresses output to the console. Arguments: @@ -557,7 +557,7 @@ sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); ``` Also, like unix `sed`, ShellJS `sed` runs replacements on each line from the input file -(split by '\n') separately, so `search_regex`es that span more than one line (or inlclude '\n') +(split by '\n') separately, so `search_regex`es that span more than one line (or include '\n') will not match anything and nothing will be replaced. diff --git a/plugin.js b/plugin.js index f879ab320..2e1585092 100644 --- a/plugin.js +++ b/plugin.js @@ -1,4 +1,4 @@ -// Various utilties exposed to plugins +// Various utilities exposed to plugins require('./shell'); // Create the ShellJS instance (mandatory) diff --git a/src/dirs.js b/src/dirs.js index 0ff08783f..9e5f9a233 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -106,7 +106,7 @@ exports.pushd = _pushd; //@ Available options: //@ //@ + `-n`: Suppress the normal directory change when removing directories from the stack, so that only the stack is manipulated. -//@ + `-q`: Supresses output to the console. +//@ + `-q`: Suppresses output to the console. //@ //@ Arguments: //@ @@ -160,7 +160,7 @@ exports.popd = _popd; //@ Available options: //@ //@ + `-c`: Clears the directory stack by deleting all of the elements. -//@ + `-q`: Supresses output to the console. +//@ + `-q`: Suppresses output to the console. //@ //@ Arguments: //@ diff --git a/src/sed.js b/src/sed.js index 696774c7f..115d0ea55 100644 --- a/src/sed.js +++ b/src/sed.js @@ -37,7 +37,7 @@ common.register('sed', _sed, { //@ ``` //@ //@ Also, like unix `sed`, ShellJS `sed` runs replacements on each line from the input file -//@ (split by '\n') separately, so `search_regex`es that span more than one line (or inlclude '\n') +//@ (split by '\n') separately, so `search_regex`es that span more than one line (or include '\n') //@ will not match anything and nothing will be replaced. function _sed(options, regex, replacement, files) { // Check if this is coming from a pipe diff --git a/test/cp.js b/test/cp.js index a0f6e28ef..67b775f5f 100644 --- a/test/cp.js +++ b/test/cp.js @@ -735,7 +735,7 @@ test('copy file to same directory', t => { t.is(result.stderr, "cp: 'test/resources/file1' and 'test/resources/file1' are the same file"); }); -test('copy mutliple files to same location', t => { +test('copy multiple files to same location', t => { const result = shell.cp('test/resources/file1', 'test/resources/file2', 'test/resources'); t.truthy(shell.error()); t.is(result.code, 1); diff --git a/test/rm.js b/test/rm.js index ccd2c6ba6..0001d9a23 100644 --- a/test/rm.js +++ b/test/rm.js @@ -35,7 +35,7 @@ test('file does not exist', t => { t.is(result.stderr, 'rm: no such file or directory: asdfasdf'); }); -test('cannot delete a directoy without recursive flag', t => { +test('cannot delete a directory without recursive flag', t => { const result = shell.rm(`${t.context.tmp}/rm`); t.truthy(shell.error()); t.is(result.code, 1); From 78ed036573cb2800f9dc88b86a41b03f6b2fd3e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Ojeda=20Guti=C3=A9rrez?= <63747287+alexojegu@users.noreply.github.com> Date: Fri, 17 Nov 2023 06:18:40 +0100 Subject: [PATCH 265/338] Exports shell.js and make.js on package.json (#1135) Exports shell.js and make.js on package.json so make.js can be imported as "shelljs/make" without require file extension when using ESM. --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index dcd073c0e..40619da41 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,11 @@ "license": "BSD-3-Clause", "homepage": "http://github.com/shelljs/shelljs", "main": "./shell.js", + "exports": { + ".": "./shell.js", + "./make": "./make.js", + "./make.js": "./make.js" + }, "files": [ "commands.js", "global.js", From 85dd4729ddf3d4feb558d2575178b2ee72098b74 Mon Sep 17 00:00:00 2001 From: Murph Murphy Date: Wed, 6 Dec 2023 23:48:30 -0700 Subject: [PATCH 266/338] test: make a test more forgiving for systems with non-standard bash and sh paths (#1144) Made a test more forgiving so it passes on systems that have non-standard `bash` and `sh` binary paths. --- test/exec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/exec.js b/test/exec.js index 9c9d9e715..cc7d35827 100644 --- a/test/exec.js +++ b/test/exec.js @@ -178,10 +178,10 @@ test('set shell option (TODO: add tests for Windows)', t => { t.is(result.stdout, '/bin/sh\n'); // sh by default const bashPath = shell.which('bash').trim(); if (bashPath) { - result = shell.exec('echo $0', { shell: '/bin/bash' }); + result = shell.exec('echo $0', { shell: bashPath }); t.falsy(shell.error()); t.is(result.code, 0); - t.is(result.stdout, '/bin/bash\n'); + t.is(result.stdout, `${bashPath}\n`); } }); }); From a6d1e49f180a495d83bcf67bd85782c626aae029 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 6 Dec 2023 22:44:42 -0800 Subject: [PATCH 267/338] docs: change GitHub Actions README badge This changes the README to use a standard shields.io badge for GitHub Actions. The custom badge (https://github.com/Atrox/github-actions-badge) was cool, but the atrox.dev link doesn't work reliably. I noticed that shields has support for this now, so there's no reason to use a custom badge. One notably difference is that this badge says the build is passing even if there's a job still in progress. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c13ac2a7..357e5a470 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ShellJS - Unix shell commands for Node.js -[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fshelljs%2Fshelljs%2Fbadge%3Fref%3Dmaster&style=flat-square)](https://actions-badge.atrox.dev/shelljs/shelljs/goto?ref=master) +[![GitHub Actions](https://img.shields.io/github/actions/workflow/status/shelljs/shelljs/main.yml?style=flat-square&logo=github)](https://github.com/shelljs/shelljs/actions/workflows/main.yml) [![Codecov](https://img.shields.io/codecov/c/github/shelljs/shelljs/master.svg?style=flat-square&label=coverage)](https://codecov.io/gh/shelljs/shelljs) [![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) [![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) From ec3e12bf37cd1c478add8b155e2be3380516c41e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 17 Feb 2024 17:17:42 -0800 Subject: [PATCH 268/338] chore: try codecov token again I tried this recently in 1a1a820569f0883a317944973c15cf34431dd6c2 and then reverted in b8b1c4224d0ec7d631d26c78922c018dd5b895f5. Unfortunately I'm still seeing spurious failures from codecov, so let's try the token one more time. This time I double checked the token is provided by https://app.codecov.io/gh/shelljs/shelljs/settings. I regenerated the token for good measure. --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 415374bdd..31d3fb262 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,4 +51,5 @@ jobs: if: matrix.node-version >= 10 uses: codecov/codecov-action@v3 with: + token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From 2ff87eff00456ac5f21c67d3bb0699e5bdfa8851 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 17 Feb 2024 16:52:12 -0800 Subject: [PATCH 269/338] test: create test files inside temp directory No change to logic. This updates some test cases to create the files they need inside the temp directory instead of in the repo itself. This is helpful in case the test case fails early, that way we don't leave this file behind. This contributes toward #828, since the change to fast-glob made it clear that this test was mishandling link files and leaving side effects in the git repo. However this change is desirably independent of fast-glob. --- test/mkdir.js | 6 ++---- test/touch.js | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/test/mkdir.js b/test/mkdir.js index 5a6f185fc..92ab513e2 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -87,7 +87,7 @@ test('try to make a subdirectory of a file', t => { test('Check for invalid permissions', t => { utils.skipOnWin(t, () => { // This test case only works on unix, but should work on Windows as well - const dirName = 'nowritedir'; + const dirName = `${t.context.tmp}/nowritedir`; shell.mkdir(dirName); t.falsy(shell.error()); shell.chmod('-w', dirName); @@ -95,11 +95,10 @@ test('Check for invalid permissions', t => { t.is(result.code, 1); t.is( result.stderr, - 'mkdir: cannot create directory nowritedir/foo: Permission denied' + `mkdir: cannot create directory ${t.context.tmp}/nowritedir/foo: Permission denied` ); t.truthy(shell.error()); t.falsy(fs.existsSync(dirName + '/foo')); - shell.rm('-rf', dirName); // clean up }); }); @@ -142,7 +141,6 @@ test('-p flag', t => { t.falsy(shell.error()); t.is(result.code, 0); t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`)); - shell.rm('-Rf', `${t.context.tmp}/a`); // revert }); test('-p flag: multiple dirs', t => { diff --git a/test/touch.js b/test/touch.js index 7ca36516d..703ea2a5f 100644 --- a/test/touch.js +++ b/test/touch.js @@ -186,10 +186,10 @@ test('file array', t => { test('touching broken link creates a new file', t => { utils.skipOnWin(t, () => { - const result = shell.touch('test/resources/badlink'); + shell.ln('-s', 'not_existed_file', `${t.context.tmp}/badlink2`); + const result = shell.touch(`${t.context.tmp}/badlink2`); t.is(result.code, 0); t.falsy(shell.error()); - t.truthy(fs.existsSync('test/resources/not_existed_file')); - shell.rm('test/resources/not_existed_file'); + t.truthy(fs.existsSync(`${t.context.tmp}/not_existed_file`)); }); }); From 3529d5095f5331d126e8b0c0dbc4812f9ae1a34f Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 1 Jun 2024 11:56:08 -0700 Subject: [PATCH 270/338] chore: remove unsupported node configs from CI No change to logic. GitHub Actions recently dropped some NodeJS configurations from their service. This excludes those configs from our CI. This also adds Node versions up through v22. Test: npm run check-node-support --- .github/workflows/main.yml | 19 +++++++++++++++++++ scripts/check-node-support.js | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 31d3fb262..4e421b242 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,10 +25,29 @@ jobs: - 18 - 19 - 20 + - 21 + - 22 os: - ubuntu-latest - macos-latest - windows-latest + exclude: + - node-version: 8 + os: macos-latest + - node-version: 9 + os: macos-latest + - node-version: 10 + os: macos-latest + - node-version: 11 + os: macos-latest + - node-version: 12 + os: macos-latest + - node-version: 13 + os: macos-latest + - node-version: 14 + os: macos-latest + - node-version: 15 + os: macos-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 6775a5665..1c9e9ef26 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -9,7 +9,7 @@ var shell = require('..'); // This is the authoritative list of supported node versions. var MIN_NODE_VERSION = 8; -var MAX_NODE_VERSION = 20; +var MAX_NODE_VERSION = 22; function checkReadme(minNodeVersion) { var start = ''; From d14782914f240e6522fcd36e2fe0dfe7f8c6df79 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 14 Jun 2024 09:39:08 -0700 Subject: [PATCH 271/338] test: add test coverage for some globOptions No change to logic. This adds test coverage support for all of the globOptions which share the same name between node-glob and fast-glob. See https://github.com/mrmlnc/fast-glob?tab=readme-ov-file#compatible-with-node-glob Issue #828 --- test/config.js | 101 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/test/config.js b/test/config.js index 743df3561..2078cb266 100644 --- a/test/config.js +++ b/test/config.js @@ -1,3 +1,5 @@ +import path from 'path'; + import test from 'ava'; import shell from '..'; @@ -51,25 +53,88 @@ test.cb('config.fatal = true', t => { // config.globOptions // -test('Expands to directories by default', t => { +test('config.globOptions expands directories by default', t => { const result = common.expand(['test/resources/*a*']); - t.is(result.length, 5); - t.truthy(result.indexOf('test/resources/a.txt') > -1); - t.truthy(result.indexOf('test/resources/badlink') > -1); - t.truthy(result.indexOf('test/resources/cat') > -1); - t.truthy(result.indexOf('test/resources/head') > -1); - t.truthy(result.indexOf('test/resources/external') > -1); + const expected = [ + 'test/resources/a.txt', + 'test/resources/badlink', + 'test/resources/cat', + 'test/resources/external', + 'test/resources/head', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions respects cwd', t => { + // Both node-glob and fast-glob call this option 'cwd'. + shell.config.globOptions = { cwd: 'test' }; + const result = common.expand(['resources/*a*']); + const expected = [ + 'resources/a.txt', + 'resources/badlink', + 'resources/cat', + 'resources/external', + 'resources/head', + ]; + t.deepEqual(result, expected); }); -test( - 'Check to make sure options get passed through (nodir is an example)', - t => { - shell.config.globOptions = { nodir: true }; - const result = common.expand(['test/resources/*a*']); - t.is(result.length, 2); - t.truthy(result.indexOf('test/resources/a.txt') > -1); - t.truthy(result.indexOf('test/resources/badlink') > -1); - t.truthy(result.indexOf('test/resources/cat') < 0); - t.truthy(result.indexOf('test/resources/external') < 0); +test('config.globOptions respects dot', t => { + // Both node-glob and fast-glob call this option 'dot'. + shell.config.globOptions = { dot: true }; + const result = common.expand(['test/resources/ls/*']); + t.is(result.length, 8); + t.truthy(result.indexOf('test/resources/ls/.hidden_dir') > -1); + t.truthy(result.indexOf('test/resources/ls/.hidden_file') > -1); +}); + +test('config.globOptions respects ignore', t => { + // Both node-glob and fast-glob call this option 'ignore'. + shell.config.globOptions = { ignore: ['test/resources/external'] }; + const result = common.expand(['test/resources/*a*']); + const expected = [ + 'test/resources/a.txt', + 'test/resources/badlink', + 'test/resources/cat', + 'test/resources/head', + ]; + t.deepEqual(result, expected); + // Does not include the result that we chose to ignore + t.truthy(result.indexOf('test/resources/external') < 0); +}); + +test('config.globOptions respects absolute', t => { + // Both node-glob and fast-glob call this option 'absolute'. + shell.config.globOptions = { absolute: true }; + const result = common.expand(['test/resources/*a*']); + function abs(file) { + // Normalize to posix-style path separators on all platforms. + const CWD = process.platform === 'win32' ? + process.cwd().replace(/\\/g, '/') : + process.cwd(); + return path.posix.join(CWD, file); } -); + const expected = [ + abs('test/resources/a.txt'), + abs('test/resources/badlink'), + abs('test/resources/cat'), + abs('test/resources/external'), + abs('test/resources/head'), + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions respects nodir', t => { + shell.config.globOptions = { nodir: true }; + const result = common.expand(['test/resources/*a*']); + // Includes files and symlinks. + const expected = [ + 'test/resources/a.txt', + 'test/resources/badlink', + ]; + t.deepEqual(result, expected); + // Does not include the directories. + t.truthy(result.indexOf('test/resources/cat') < 0); + t.truthy(result.indexOf('test/resources/head') < 0); + t.truthy(result.indexOf('test/resources/external') < 0); +}); From c3797a9258f28371a97ebae6b307055a5ab25c98 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 14 Jun 2024 11:03:54 -0700 Subject: [PATCH 272/338] test: add more coverage for globOptions No change to logic. This adds tests for more `config.globOptions` values. This aims to cover the options which appear to be supported by both node-glob and fast-glob, however the options have different names in each module. This is a followup to PR #1163. See https://github.com/mrmlnc/fast-glob?tab=readme-ov-file#compatible-with-node-glob Issue #828 --- test/config.js | 135 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/test/config.js b/test/config.js index 2078cb266..97d667841 100644 --- a/test/config.js +++ b/test/config.js @@ -138,3 +138,138 @@ test('config.globOptions respects nodir', t => { t.truthy(result.indexOf('test/resources/head') < 0); t.truthy(result.indexOf('test/resources/external') < 0); }); + +test('config.globOptions respects mark', t => { + shell.config.globOptions = { mark: true }; + const result = common.expand(['test/resources/*a*']); + // Directories get a '/' character at the end. + const expected = [ + 'test/resources/a.txt', + 'test/resources/badlink', + 'test/resources/cat/', + 'test/resources/external/', + 'test/resources/head/', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions respects nobrace', t => { + // Default behavior is to expand "file{1..2}.txt" to ["file1.txt", + // "file2.txt"]. + let result = common.expand(['test/resources/file{1..2}.txt']); + let expected = [ + 'test/resources/file1.txt', + 'test/resources/file2.txt', + ]; + t.deepEqual(result, expected); + + // When 'nobrace' is true, brace expressions will expand as literals. + shell.config.globOptions = { nobrace: true }; + result = common.expand(['test/resources/file{1..2}.txt']); + expected = [ + 'test/resources/file{1..2}.txt', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions respects noglobstar', t => { + // Default behavior is to expand "**" to match zero or more directories. + let result = common.expand(['test/**/file1']); + let expected = [ + 'test/resources/cat/file1', + 'test/resources/chmod/file1', + 'test/resources/cp/file1', + 'test/resources/file1', + 'test/resources/ls/file1', + 'test/resources/sort/file1', + 'test/resources/uniq/file1', + ]; + t.deepEqual(result, expected); + + // When 'noglobstar' is true, "**" will behave like a regular "*" and matches + // exactly 1 directory. + shell.config.globOptions = { noglobstar: true }; + result = common.expand(['test/**/file1']); + expected = [ + 'test/resources/file1', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions respects noext', t => { + // Default behavior is to support fancy glob patterns (like "file1.+(js|txt)"). + let result = common.expand([ + 'test/resources/file1.+(js|txt)', + 'test/resources/file2.*', + ]); + let expected = [ + 'test/resources/file1.js', + 'test/resources/file1.txt', + 'test/resources/file2.js', + 'test/resources/file2.txt', + ]; + t.deepEqual(result, expected); + + // When 'noext' is true, this only matches regular globs (like "file2.*"). + shell.config.globOptions = { noext: true }; + result = common.expand([ + 'test/resources/file1.+(js|txt)', + 'test/resources/file2.*', + ]); + expected = [ + 'test/resources/file1.+(js|txt)', + 'test/resources/file2.js', + 'test/resources/file2.txt', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions respects nocase', t => { + // Default behavior will change depending on macOS, Windows, or Linux. This is + // difficult to test in a cross-platform way. + + // When 'nocase' is true, we should be able to match files even if we use the + // wrong case in the pattern. + shell.config.globOptions = { nocase: true }; + let result = common.expand(['test/resources/FILE*.TXT']); + let expected = [ + 'test/resources/file1.txt', + 'test/resources/file2.txt', + ]; + t.deepEqual(result, expected); + + // When 'nocase' is false, using the wrong case will fail to match any files. + shell.config.globOptions = { nocase: false }; + result = common.expand(['test/resources/FILE*.TXT']); + expected = [ + 'test/resources/FILE*.TXT', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions respects matchBase', t => { + // By default, "*" expressions only match inside of the same directory. + shell.config.globOptions = { cwd: 'test/resources' }; + let result = common.expand(['*ile1']); + let expected = [ + 'file1', + ]; + t.deepEqual(result, expected); + + // When 'matchBase' is true (and the pattern contains no slashes), the + // pattern is implicitly treated like "**/*" and will expand to + // subdirectories. + shell.config.globOptions = { cwd: 'test/resources', matchBase: true }; + result = common.expand(['*ile1']); + expected = [ + 'cat/file1', + 'chmod/file1', + 'cp/file1', + 'file1', + 'head/shortfile1', + 'ls/file1', + 'sort/file1', + 'uniq/file1', + ]; + t.deepEqual(result, expected); +}); From d81c32535b613f3deab0ca1df27e9264bcfba9a5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 18 Feb 2024 01:04:02 -0800 Subject: [PATCH 273/338] deprecate config.globOptions This deprecates support for configuring `config.globOptions`. Exposing this variable makes it difficult to change (or upgrade) our glob library. This discourages users from depending on this config option going forward. If anyone is using `config.globOptions` then it should continue to function, however this support is not promised for the long-term. As far as I know, this is not a commonly used option: https://github.com/shelljs/shelljs/issues?q=globOptions currently shows no GitHub issues of users using this option, and there was never really a motivation for why this needed to be exposed (#400 exposed the option just because we could, not because we should). This is one step toward supporting Issue #828. --- README.md | 12 ++++++++++-- shell.js | 12 ++++++++++-- src/common.js | 8 +++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 357e5a470..a467327d6 100644 --- a/README.md +++ b/README.md @@ -854,7 +854,11 @@ rm -rf foo.txt bar.txt exec echo hello ``` -### config.globOptions +### config.globOptions (deprecated) + +**Deprecated**: we recommend that you do not edit `config.globOptions`. +Support for this configuration option may be changed or removed in a future +ShellJS release. Example: @@ -862,7 +866,11 @@ Example: config.globOptions = {nodir: true}; ``` -Use this value for calls to `glob.sync()` instead of the default options. +`config.globOptions` changes how ShellJS expands glob (wildcard) +expressions. See +[node-glob](https://github.com/isaacs/node-glob?tab=readme-ov-file#options) +for available options. Be aware that modifying `config.globOptions` **may +break ShellJS functionality.** ### config.reset() diff --git a/shell.js b/shell.js index ad40740b5..24df39a96 100644 --- a/shell.js +++ b/shell.js @@ -136,7 +136,11 @@ exports.config = common.config; //@ ``` //@ -//@ ### config.globOptions +//@ ### config.globOptions (deprecated) +//@ +//@ **Deprecated**: we recommend that you do not edit `config.globOptions`. +//@ Support for this configuration option may be changed or removed in a future +//@ ShellJS release. //@ //@ Example: //@ @@ -144,7 +148,11 @@ exports.config = common.config; //@ config.globOptions = {nodir: true}; //@ ``` //@ -//@ Use this value for calls to `glob.sync()` instead of the default options. +//@ `config.globOptions` changes how ShellJS expands glob (wildcard) +//@ expressions. See +//@ [node-glob](https://github.com/isaacs/node-glob?tab=readme-ov-file#options) +//@ for available options. Be aware that modifying `config.globOptions` **may +//@ break ShellJS functionality.** //@ //@ ### config.reset() diff --git a/src/common.js b/src/common.js index 0ec1f8131..1ddbfabdc 100644 --- a/src/common.js +++ b/src/common.js @@ -247,6 +247,12 @@ function parseOptions(opt, map, errorOptions) { } exports.parseOptions = parseOptions; +function globOptions() { + // TODO(nfischer): if this changes glob implementation in the future, convert + // options back to node-glob's option format for backward compatibility. + return config.globOptions; +} + // Expands wildcards with matching (ie. existing) file names. // For example: // expand(['file*.js']) = ['file1.js', 'file2.js', ...] @@ -263,7 +269,7 @@ function expand(list) { } else { var ret; try { - ret = glob.sync(listEl, config.globOptions); + ret = glob.sync(listEl, globOptions()); // if nothing matched, interpret the string literally ret = ret.length > 0 ? ret : [listEl]; } catch (e) { From edac78e40757f6d6c48080bcdd5ec59a0c14feaf Mon Sep 17 00:00:00 2001 From: Keith Mashinter Date: Sat, 22 Jun 2024 20:05:47 -0400 Subject: [PATCH 274/338] Fix Windows test errors in src/ls.js and test/cp.js. (#1166) --- src/ls.js | 3 ++- test/cp.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ls.js b/src/ls.js index 4faa30b0d..d5569ba5a 100644 --- a/src/ls.js +++ b/src/ls.js @@ -3,7 +3,8 @@ var fs = require('fs'); var common = require('./common'); var glob = require('glob'); -var globPatternRecursive = path.sep + '**'; +// glob patterns use the UNIX path seperator +var globPatternRecursive = '/**'; common.register('ls', _ls, { cmdOptions: { diff --git a/test/cp.js b/test/cp.js index 67b775f5f..1f3c5ee50 100644 --- a/test/cp.js +++ b/test/cp.js @@ -873,7 +873,10 @@ test('cp -p should preserve mode, ownership, and timestamp (directory)', t => { // Both new file and new dir should keep same attributes t.is(statOfResultDir.mtime.getTime(), newModifyTimeMs); - t.is(statOfResultDir.atime.getTime(), newAccessTimeMs); + utils.skipOnWin(t, () => { + // The resultDir atime may be updated on Windows as a side-effect, e.g. chmod(). + t.is(statOfResultDir.atime.getTime(), newAccessTimeMs); + }); t.is(statOfResult.mtime.getTime(), newModifyTimeMs); t.is(statOfResult.atime.getTime(), newAccessTimeMs); t.is(statOfResult.mode.toString(8), '100' + mode); From 9429aae203f12e1428452a07790173f8166865cc Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 22 Jun 2024 16:02:29 -0700 Subject: [PATCH 275/338] chore: switch to codecov v4 No change to logic. This updates codecov/codecov-action to v4. This version supposedly has better support for external contributors working from repository forks. Tested this out with PR #1168. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4e421b242..67058a598 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -68,7 +68,7 @@ jobs: if: matrix.os != 'windows-latest' - name: Upload coverage reports to Codecov if: matrix.node-version >= 10 - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From 8a960da8383666024bfdb2eff709a4fdf66333ee Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 23 Jun 2024 12:08:50 -0700 Subject: [PATCH 276/338] chore(dependencies): update js-yaml This updates js-yaml to 4.1.0 and swaps out `yaml.safeLoad()` for `yaml.load()` because the `safe*` functions are deprecated starting in 4.0.0 (the "regular" functions are considered safe). --- package.json | 2 +- scripts/check-node-support.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 40619da41..d5def62b6 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "eslint": "^5.16.0", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.17.3", - "js-yaml": "^3.14.1", + "js-yaml": "^4.1.0", "nyc": "^15.1.0", "shelljs-changelog": "^0.2.6", "shelljs-release": "^0.5.2", diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 1c9e9ef26..9f33c2dd3 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -66,7 +66,7 @@ try { var githubActionsFileName = path.join(__dirname, '..', '.github', 'workflows', 'main.yml'); - var githubActionsYaml = yaml.safeLoad(shell.cat(githubActionsFileName)); + var githubActionsYaml = yaml.load(shell.cat(githubActionsFileName)); checkGithubActions(MIN_NODE_VERSION, MAX_NODE_VERSION, githubActionsYaml); console.log('All files look good (this project supports v' From 81ed1226d2fe8bdaf60ad60233c62f3729cd2bbe Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 14 Feb 2025 11:21:19 -0800 Subject: [PATCH 277/338] chore: pin node v22.9.0 There's a bug when running on node v22.10. This temporarily pins 22 to 22.9.0 to workaround the problem and keep tests passing on CI. Mitigation for issue #1180. --- .github/workflows/main.yml | 2 +- scripts/check-node-support.js | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 67058a598..b88ed9206 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,7 +26,7 @@ jobs: - 19 - 20 - 21 - - 22 + - '22.9.0' os: - ubuntu-latest - macos-latest diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 9f33c2dd3..8ccf6daa8 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -11,6 +11,15 @@ var shell = require('..'); var MIN_NODE_VERSION = 8; var MAX_NODE_VERSION = 22; +// Ideally this map should be empty, however we can pin node releases to +// specific versions if necessary to workaround bugs. See +// https://github.com/shelljs/shelljs/issues/1180. +var pinnedNodeVersions = { + // Format: + // majorVersionInt: 'full.node.version', + 22: '22.9.0', +}; + function checkReadme(minNodeVersion) { var start = ''; var stop = ''; @@ -53,6 +62,9 @@ function range(start, stop) { function checkGithubActions(minNodeVersion, maxNodeVersion, githubActionsYaml) { var expectedVersions = range(minNodeVersion, maxNodeVersion); + expectedVersions = expectedVersions.map(function (majorVersion) { + return pinnedNodeVersions[majorVersion] || majorVersion; + }); var msg = 'Check GitHub Actions node_js versions'; assertDeepEquals(githubActionsYaml.jobs.test.strategy.matrix['node-version'], expectedVersions, msg); From 9e51217484fd72ea9bdfacac00da638128ce3681 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 14 Feb 2025 11:21:19 -0800 Subject: [PATCH 278/338] chore: switch to testing LTS releases only No change to official support. We will still accept patches for non-LTS versions when it's reasonable to support them, especially for the most recent Node release (whether that is odd-numbered or even-numbered). This just lightens up the workload on CI because most of our users are probably running node LTS. --- .github/workflows/main.yml | 7 ------- README.md | 2 +- scripts/check-node-support.js | 7 +++++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b88ed9206..3d52caa86 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,19 +13,12 @@ jobs: matrix: node-version: - 8 - - 9 - 10 - - 11 - 12 - - 13 - 14 - - 15 - 16 - - 17 - 18 - - 19 - 20 - - 21 - '22.9.0' os: - ubuntu-latest diff --git a/README.md b/README.md index a467327d6..2ab25a4b9 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! -ShellJS is proudly tested on every node release since `v8`! +ShellJS is proudly tested on every LTS node release since `v8`! The project is unit-tested and battle-tested in projects like: diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 8ccf6daa8..3b28f721f 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -54,7 +54,10 @@ function assertDeepEquals(arr1, arr2, msg) { function range(start, stop) { var ret = []; - for (var i = start; i <= stop; i++) { + for (var i = start; i <= stop; i += 2) { + if (i % 2 !== 0) { + console.warn('Warning: testing a non-LTS nodejs release: ' + i); + } ret.push(i); } return ret; @@ -81,7 +84,7 @@ try { var githubActionsYaml = yaml.load(shell.cat(githubActionsFileName)); checkGithubActions(MIN_NODE_VERSION, MAX_NODE_VERSION, githubActionsYaml); - console.log('All files look good (this project supports v' + console.log('All files look good (this project supports LTS releases v' + MIN_NODE_VERSION + '-v' + MAX_NODE_VERSION + ')!'); } catch (e) { console.error('Please check the files which declare our Node version'); From 7e71b2686d0927e68854695baf4ef0d06178fbce Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 14 Feb 2025 10:31:12 -0800 Subject: [PATCH 279/338] chore: drop support for old node versions Dropping support for everything before node v18, which is the current maintenance LTS and also the version in Ubuntu 24.04 LTS. This also updates all devDependencies while trying to minimize the required source code changes. Some devDependencies can go higher still (ava, chalk), but this is going to require extensive refactoring. Test: npm run test-with-coverage Test: npm run lint Test: npm run check-node-support --- .eslintrc.json | 3 +++ .github/workflows/main.yml | 27 --------------------------- README.md | 2 +- package.json | 12 ++++++------ scripts/check-node-support.js | 2 +- test/.eslintrc.json | 3 +++ 6 files changed, 14 insertions(+), 35 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index d3759e0b2..8e1e250d3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -8,6 +8,8 @@ "consistent-return": "off", "curly": ["error", "multi-line"], "func-names": "off", + "function-call-argument-newline": "off", + "function-paren-newline": "off", "global-require": "off", "indent": "off", "max-len": "off", @@ -29,6 +31,7 @@ "operator-linebreak": "off", "quote-props": "off", "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], + "strict": "off", "vars-on-top": "off", "new-cap": ["error", { "capIsNewExceptions": [ diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3d52caa86..f455517a9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,11 +12,6 @@ jobs: fail-fast: false matrix: node-version: - - 8 - - 10 - - 12 - - 14 - - 16 - 18 - 20 - '22.9.0' @@ -24,23 +19,6 @@ jobs: - ubuntu-latest - macos-latest - windows-latest - exclude: - - node-version: 8 - os: macos-latest - - node-version: 9 - os: macos-latest - - node-version: 10 - os: macos-latest - - node-version: 11 - os: macos-latest - - node-version: 12 - os: macos-latest - - node-version: 13 - os: macos-latest - - node-version: 14 - os: macos-latest - - node-version: 15 - os: macos-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -49,10 +27,6 @@ jobs: - run: npm install - name: test with coverage run: npm run test-with-coverage - if: matrix.node-version >= 10 - - name: test without coverage (coverage broken on node < 10) - run: npm run test - if: matrix.node-version < 10 - run: npm run lint - run: npm run gendocs - run: npm run check-node-support @@ -60,7 +34,6 @@ jobs: run: npm run after-travis if: matrix.os != 'windows-latest' - name: Upload coverage reports to Codecov - if: matrix.node-version >= 10 uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index 2ab25a4b9..9d804c99d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! -ShellJS is proudly tested on every LTS node release since `v8`! +ShellJS is proudly tested on every LTS node release since `v18`! The project is unit-tested and battle-tested in projects like: diff --git a/package.json b/package.json index d5def62b6..2a58bbd95 100644 --- a/package.json +++ b/package.json @@ -65,19 +65,19 @@ }, "devDependencies": { "ava": "^1.4.1", - "chalk": "^1.1.3", + "chalk": "^4.1.2", "coffee-script": "^1.12.7", - "eslint": "^5.16.0", - "eslint-config-airbnb-base": "^13.1.0", - "eslint-plugin-import": "^2.17.3", + "eslint": "^8.2.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.31.0", "js-yaml": "^4.1.0", - "nyc": "^15.1.0", + "nyc": "^17.1.0", "shelljs-changelog": "^0.2.6", "shelljs-release": "^0.5.2", "shx": "^0.3.4", "travis-check-changes": "^0.4.0" }, "engines": { - "node": ">=8" + "node": ">=18" } } diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 3b28f721f..b3b62347d 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -8,7 +8,7 @@ var yaml = require('js-yaml'); var shell = require('..'); // This is the authoritative list of supported node versions. -var MIN_NODE_VERSION = 8; +var MIN_NODE_VERSION = 18; var MAX_NODE_VERSION = 22; // Ideally this map should be empty, however we can pin node releases to diff --git a/test/.eslintrc.json b/test/.eslintrc.json index cd6aa4739..5c9396370 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -7,6 +7,8 @@ "arrow-parens": "off", "comma-dangle": "off", "curly": "off", + "function-call-argument-newline": "off", + "function-paren-newline": "off", "global-require": "off", "import/no-dynamic-require": "off", "import/no-mutable-exports": "off", @@ -14,6 +16,7 @@ "max-len": "off", "no-bitwise": "off", "no-console": "off", + "no-multiple-empty-lines": "off", "no-param-reassign": "off", "no-plusplus": "off", "no-underscore-dangle": "off", From d9d7f4d2112f18976868048663a24cd8bc7a0568 Mon Sep 17 00:00:00 2001 From: Keith Mashinter Date: Thu, 20 Feb 2025 00:41:54 -0500 Subject: [PATCH 280/338] Add the exit code to the fatal error thrown from common.error(). (#1179) Merged-by: Nate Fischer --- src/common.js | 6 +++++- test/config.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/common.js b/src/common.js index 1ddbfabdc..2be075a34 100644 --- a/src/common.js +++ b/src/common.js @@ -119,7 +119,11 @@ function error(msg, _code, options) { state.error += logEntry; // Throw an error, or log the entry - if (options.fatal) throw new Error(logEntry); + if (options.fatal) { + var err = new Error(logEntry); + err.code = options.code; + throw err; + } if (msg.length > 0 && !options.silent) log(logEntry); if (!options.continue) { diff --git a/test/config.js b/test/config.js index 97d667841..3f9d9a89d 100644 --- a/test/config.js +++ b/test/config.js @@ -49,6 +49,25 @@ test.cb('config.fatal = true', t => { }); }); +test('config.fatal = false with an exec() failure returns, does not throw', t => { + const expected = { code: 2 }; + t.notThrows(() => { + const result = shell.exec('exit 2'); + t.is(result.code, expected.code); + }); +}); + +test('config.fatal = true with an exec() failure includes a .code on the Error', t => { + shell.config.fatal = true; + try { + t.throws(() => { + shell.exec('exit 2'); + }, { code: 2 }); + } finally { + shell.config.fatal = false; + } +}); + // // config.globOptions // From 03d2f20e27a244c7f3f6875073bd57eb6752b629 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 19 Feb 2025 22:25:46 -0800 Subject: [PATCH 281/338] refactor: unescape quotes This swaps out quote characters to limit how often we need to escape strings. This is just to improve code readability. Almost all of the changes could be done without changes to .eslintrc, however this amends the lint rule to also permit backtick strings which can be useful to eliminate a few extra instances of quote escaping. Fixes issue #788 Test: npm run lint --- README.md | 2 +- shell.js | 2 +- test/.eslintrc.json | 8 ++++++-- test/common.js | 2 +- test/config.js | 4 ++-- test/cp.js | 6 +++--- test/head.js | 4 ++-- test/ls.js | 8 ++++---- test/mkdir.js | 2 +- test/mv.js | 2 +- test/plugin.js | 2 +- test/set.js | 10 +++++----- test/sort.js | 6 +++--- test/tail.js | 8 ++++---- test/to.js | 2 +- test/toEnd.js | 2 +- 16 files changed, 37 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 9d804c99d..4cd32e901 100644 --- a/README.md +++ b/README.md @@ -794,7 +794,7 @@ Examples: ```javascript grep('foo', 'file1.txt', 'file2.txt').sed(/o/g, 'a').to('output.txt'); -echo('files with o\'s in the name:\n' + ls().grep('o')); +echo("files with o's in the name:\n" + ls().grep('o')); cat('test.js').exec('node'); // pipe to exec() call ``` diff --git a/shell.js b/shell.js index 24df39a96..87d68c0bf 100644 --- a/shell.js +++ b/shell.js @@ -69,7 +69,7 @@ exports.env = process.env; //@ //@ ```javascript //@ grep('foo', 'file1.txt', 'file2.txt').sed(/o/g, 'a').to('output.txt'); -//@ echo('files with o\'s in the name:\n' + ls().grep('o')); +//@ echo("files with o's in the name:\n" + ls().grep('o')); //@ cat('test.js').exec('node'); // pipe to exec() call //@ ``` //@ diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 5c9396370..892272c83 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -32,7 +32,11 @@ "new-cap": ["error", { "capIsNewExceptions": [ "ShellString" - ]} - ] + ] + }], + "quotes": ["error", "single", { + "avoidEscape": true, + "allowTemplateLiterals": true + }] } } diff --git a/test/common.js b/test/common.js index 814ec0744..0c007db8c 100644 --- a/test/common.js +++ b/test/common.js @@ -311,7 +311,7 @@ test('Some basic tests on the ShellString type', t => { }); test.cb('Commands that fail will still output error messages to stderr', t => { - const script = 'require(\'./global\'); ls(\'noexist\'); cd(\'noexist\');'; + const script = "require('./global'); ls('noexist'); cd('noexist');"; utils.runScript(script, (err, stdout, stderr) => { t.is(stdout, ''); t.is( diff --git a/test/config.js b/test/config.js index 3f9d9a89d..de20eba5c 100644 --- a/test/config.js +++ b/test/config.js @@ -34,7 +34,7 @@ test('config.silent can be set to false', t => { test.cb('config.fatal = false', t => { t.falsy(shell.config.fatal); - const script = 'require(\'./global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; + const script = `require('./global.js'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");`; utils.runScript(script, (err, stdout) => { t.truthy(stdout.match('got here')); t.end(); @@ -42,7 +42,7 @@ test.cb('config.fatal = false', t => { }); test.cb('config.fatal = true', t => { - const script = 'require(\'./global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; + const script = `require('./global.js'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");`; utils.runScript(script, (err, stdout) => { t.falsy(stdout.match('got here')); t.end(); diff --git a/test/cp.js b/test/cp.js index 1f3c5ee50..6f1d37f0e 100644 --- a/test/cp.js +++ b/test/cp.js @@ -443,7 +443,7 @@ test('-R implies -P', t => { }); }); -test('-Ru respects the -u flag recursively (don\'t update newer file)', t => { +test("-Ru respects the -u flag recursively (don't update newer file)", t => { // Setup code const dir = `${t.context.tmp}/cp-Ru`; const sourceDir = `${dir}/original`; @@ -521,7 +521,7 @@ test('Recursive, copies entire directory with no symlinks and -L option does not }); }); -test('-u flag won\'t overwrite newer files', t => { +test("-u flag won't overwrite newer files", t => { shell.touch(`${t.context.tmp}/file1.js`); shell.cp('-u', 'test/resources/file1.js', t.context.tmp); t.falsy(shell.error()); @@ -535,7 +535,7 @@ test('-u flag does overwrite older files', t => { t.is(shell.cat('test/resources/file1.js').toString(), shell.cat(`${t.context.tmp}/file1.js`).toString()); }); -test('-u flag works even if it\'s not overwriting a file', t => { +test("-u flag works even if it's not overwriting a file", t => { t.falsy(fs.existsSync(`${t.context.tmp}/file1.js`)); shell.cp('-u', 'test/resources/file1.js', t.context.tmp); t.falsy(shell.error()); diff --git a/test/head.js b/test/head.js index 51b812686..57ec53a4e 100644 --- a/test/head.js +++ b/test/head.js @@ -100,7 +100,7 @@ test('Globbed file', t => { .join('\n') + '\n'); }); -test('With `\'-n\' ` option', t => { +test("With '-n ' option", t => { const result = shell.head('-n', 4, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); @@ -111,7 +111,7 @@ test('With `\'-n\' ` option', t => { .join('\n') + '\n'); }); -test('With `{\'-n\': }` option', t => { +test("With '{-n: }' option", t => { const result = shell.head({ '-n': 4 }, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); diff --git a/test/ls.js b/test/ls.js index 987ecf763..bc279daf5 100644 --- a/test/ls.js +++ b/test/ls.js @@ -36,7 +36,7 @@ test('no such file or dir', t => { // Valids // -test('it\'s ok to use no arguments', t => { +test("it's ok to use no arguments", t => { const result = shell.ls(); t.falsy(shell.error()); t.is(result.code, 0); @@ -205,7 +205,7 @@ test('wildcard, mid-file with dot (should escape dot for regex)', t => { t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); }); -test('one file that exists, one that doesn\'t', t => { +test("one file that exists, one that doesn't", t => { const result = shell.ls('test/resources/ls/file1.js', 'test/resources/ls/thisdoesntexist'); t.truthy(shell.error()); t.is(result.code, 2); @@ -213,7 +213,7 @@ test('one file that exists, one that doesn\'t', t => { t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); }); -test('one file that exists, one that doesn\'t (other order)', t => { +test("one file that exists, one that doesn't (other order)", t => { const result = shell.ls('test/resources/ls/thisdoesntexist', 'test/resources/ls/file1.js'); t.truthy(shell.error()); t.is(result.code, 2); @@ -364,7 +364,7 @@ test('directory option, single arg', t => { t.is(result.length, 1); }); -test('directory option, single arg with trailing \'/\'', t => { +test("directory option, single arg with trailing '/'", t => { const result = shell.ls('-d', 'test/resources/ls/'); t.falsy(shell.error()); t.is(result.code, 0); diff --git a/test/mkdir.js b/test/mkdir.js index 92ab513e2..55e12fa3a 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -37,7 +37,7 @@ test('dir already exists', t => { t.is(common.statFollowLinks(t.context.tmp).mtime.toString(), mtime); // didn't mess with dir }); -test('Can\'t overwrite a broken link', t => { +test("Can't overwrite a broken link", t => { const mtime = common.statNoFollowLinks('test/resources/badlink').mtime.toString(); const result = shell.mkdir('test/resources/badlink'); t.truthy(shell.error()); diff --git a/test/mv.js b/test/mv.js index eb68bd708..e7de32eb5 100644 --- a/test/mv.js +++ b/test/mv.js @@ -121,7 +121,7 @@ test('too many sources (exist, but dest is file)', t => { t.is(result.stderr, 'mv: dest is not a directory (too many sources)'); }); -test('can\'t use wildcard when dest is file', t => { +test("can't use wildcard when dest is file", t => { const result = shell.mv('file*', 'file1'); t.truthy(shell.error()); t.truthy(fs.existsSync('file1')); diff --git a/test/plugin.js b/test/plugin.js index bafe2a050..2f79ca15c 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -70,7 +70,7 @@ test('All plugin utils exist', t => { t.is(typeof plugin.register, 'function'); }); -test('The plugin does not exist before it\'s registered', t => { +test("The plugin does not exist before it's registered", t => { t.falsy(shell.foo); }); diff --git a/test/set.js b/test/set.js index 39bcb6a2a..7f89aa21e 100644 --- a/test/set.js +++ b/test/set.js @@ -28,21 +28,21 @@ test('initial values', t => { }); test('default behavior', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ` -e "require('./global'); ls('file_doesnt_exist'); echo(1234);"`); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); }); test('set -e', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ` -e "require('./global'); set('-e'); ls('file_doesnt_exist'); echo(1234);"`); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); }); test('set -v', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ` -e "require('./global'); set('-v'); ls('file_doesnt_exist'); echo(1234);"`); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is( @@ -52,7 +52,7 @@ test('set -v', t => { }); test('set -ev', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ` -e "require('./global'); set('-ev'); ls('file_doesnt_exist'); echo(1234);"`); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); @@ -61,7 +61,7 @@ test('set -ev', t => { }); test('set -e, set +e', t => { - const result = shell.exec(JSON.stringify(shell.config.execPath) + ' -e "require(\'./global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);"'); + const result = shell.exec(JSON.stringify(shell.config.execPath) + ` -e "require('./global'); set('-e'); set('+e'); ls('file_doesnt_exist'); echo(1234);"`); t.is(result.code, 0); t.is(result.stdout, '1234\n'); t.is(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n'); diff --git a/test/sort.js b/test/sort.js index 82015e41c..d5bdc3477 100644 --- a/test/sort.js +++ b/test/sort.js @@ -78,14 +78,14 @@ test('Globbed file', t => { t.is(result.toString(), doubleSorted); }); -test('With \'-n\' option', t => { +test("With '-n' option", t => { const result = shell.sort('-n', 'test/resources/sort/file2'); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.toString(), shell.cat('test/resources/sort/sortedDashN').toString()); }); -test('With \'-r\' option', t => { +test("With '-r' option", t => { const result = shell.sort('-r', 'test/resources/sort/file2'); t.falsy(shell.error()); t.is(result.code, 0); @@ -96,7 +96,7 @@ test('With \'-r\' option', t => { .join('\n') + '\n'); }); -test('With \'-rn\' option', t => { +test("With '-rn' option", t => { const result = shell.sort('-rn', 'test/resources/sort/file2'); t.falsy(shell.error()); t.is(result.code, 0); diff --git a/test/tail.js b/test/tail.js index d0b82c715..c45417148 100644 --- a/test/tail.js +++ b/test/tail.js @@ -102,7 +102,7 @@ test('globbed file', t => { .join('\n') + '\n'); }); -test('with `\'-n\' ` option', t => { +test("with '-n ' option", t => { const result = shell.tail('-n', 4, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); @@ -115,7 +115,7 @@ test('with `\'-n\' ` option', t => { .join('\n') + '\n'); }); -test('with `\'-n\' +` option', t => { +test("with '-n +' option", t => { const result = shell.tail('-n', '+48', 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); @@ -128,7 +128,7 @@ test('with `\'-n\' +` option', t => { .join('\n') + '\n'); }); -test('with `{\'-n\': }` option', t => { +test("with '{-n: }' option", t => { const result = shell.tail({ '-n': 4 }, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); @@ -141,7 +141,7 @@ test('with `{\'-n\': }` option', t => { .join('\n') + '\n'); }); -test('with `{\'-n\': +}` option', t => { +test("with '{-n: +}' option", t => { const result = shell.tail({ '-n': '+48' }, 'test/resources/head/file2.txt', 'test/resources/head/file1.txt'); t.falsy(shell.error()); diff --git a/test/to.js b/test/to.js index 9774b8331..d1d813515 100644 --- a/test/to.js +++ b/test/to.js @@ -20,7 +20,7 @@ test.afterEach.always(t => { // Invalids // -test('Normal strings don\'t have \'.to()\' anymore', t => { +test("Normal strings don't have '.to()' anymore", t => { const str = 'hello world'; t.is(str.to, undefined); }); diff --git a/test/toEnd.js b/test/toEnd.js index cf3aec4f9..17781d0fd 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -20,7 +20,7 @@ test.afterEach.always(t => { // Invalids // -test('Normal strings don\'t have \'.toEnd()\' anymore', t => { +test("Normal strings don't have '.toEnd()' anymore", t => { const str = 'hello world'; t.is(str.toEnd, undefined); }); From 13cfe8a258b891d865871b8b443358f04f0043af Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 18 Feb 2024 01:12:31 -0800 Subject: [PATCH 282/338] refactor: switch to fast-glob This removes `node-glob` in favor of `fast-glob`. The main motivation for this is because `node-glob` has a security warning and I can't update to `node-glob@9` unless we drop compatibility for node v8. Switching to `fast-glob` seems to be fairly straightforward, although some options need to be changed by default for bash compatibility. Fixes #828 Fixes #1149 --- README.md | 7 +++++-- package.json | 2 +- shell.js | 7 +++++-- src/common.js | 50 +++++++++++++++++++++++++++++++++++++++++++------- src/ls.js | 23 +++++++++++++++-------- 5 files changed, 69 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 4cd32e901..b62cd7600 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ shell.echo('hello world'); All commands run synchronously, unless otherwise stated. All commands accept standard bash globbing characters (`*`, `?`, etc.), -compatible with the [node `glob` module](https://github.com/isaacs/node-glob). +compatible with [`fast-glob`](https://www.npmjs.com/package/fast-glob). For less-commonly used commands and features, please check out our [wiki page](https://github.com/shelljs/shelljs/wiki). @@ -860,6 +860,9 @@ exec echo hello Support for this configuration option may be changed or removed in a future ShellJS release. +**Breaking change**: ShellJS v0.8.x uses `node-glob`. Starting with ShellJS +v0.9.x, `config.globOptions` is compatible with `fast-glob`. + Example: ```javascript @@ -868,7 +871,7 @@ config.globOptions = {nodir: true}; `config.globOptions` changes how ShellJS expands glob (wildcard) expressions. See -[node-glob](https://github.com/isaacs/node-glob?tab=readme-ov-file#options) +[fast-glob](https://github.com/mrmlnc/fast-glob?tab=readme-ov-file#options-3) for available options. Be aware that modifying `config.globOptions` **may break ShellJS functionality.** diff --git a/package.json b/package.json index 2a58bbd95..2340c32c9 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ }, "dependencies": { "execa": "^1.0.0", - "glob": "^7.0.0", + "fast-glob": "^3.3.2", "interpret": "^1.0.0", "rechoir": "^0.6.2" }, diff --git a/shell.js b/shell.js index 87d68c0bf..4b7ab8486 100644 --- a/shell.js +++ b/shell.js @@ -11,7 +11,7 @@ var common = require('./src/common'); //@ //@ All commands run synchronously, unless otherwise stated. //@ All commands accept standard bash globbing characters (`*`, `?`, etc.), -//@ compatible with the [node `glob` module](https://github.com/isaacs/node-glob). +//@ compatible with [`fast-glob`](https://www.npmjs.com/package/fast-glob). //@ //@ For less-commonly used commands and features, please check out our [wiki //@ page](https://github.com/shelljs/shelljs/wiki). @@ -142,6 +142,9 @@ exports.config = common.config; //@ Support for this configuration option may be changed or removed in a future //@ ShellJS release. //@ +//@ **Breaking change**: ShellJS v0.8.x uses `node-glob`. Starting with ShellJS +//@ v0.9.x, `config.globOptions` is compatible with `fast-glob`. +//@ //@ Example: //@ //@ ```javascript @@ -150,7 +153,7 @@ exports.config = common.config; //@ //@ `config.globOptions` changes how ShellJS expands glob (wildcard) //@ expressions. See -//@ [node-glob](https://github.com/isaacs/node-glob?tab=readme-ov-file#options) +//@ [fast-glob](https://github.com/mrmlnc/fast-glob?tab=readme-ov-file#options-3) //@ for available options. Be aware that modifying `config.globOptions` **may //@ break ShellJS functionality.** diff --git a/src/common.js b/src/common.js index 2be075a34..ecaf04471 100644 --- a/src/common.js +++ b/src/common.js @@ -6,7 +6,7 @@ var os = require('os'); var fs = require('fs'); -var glob = require('glob'); +var glob = require('fast-glob'); var shell = require('..'); var shellMethods = Object.create(shell); @@ -252,9 +252,39 @@ function parseOptions(opt, map, errorOptions) { exports.parseOptions = parseOptions; function globOptions() { - // TODO(nfischer): if this changes glob implementation in the future, convert - // options back to node-glob's option format for backward compatibility. - return config.globOptions; + // These options are just to make fast-glob be compatible with POSIX (bash) + // wildcard behavior. + var defaultGlobOptions = { + onlyFiles: false, + followSymbolicLinks: false, + }; + + var newGlobOptions = Object.assign({}, config.globOptions); + var optionRenames = { + // node-glob's 'nodir' is not quote the same as fast-glob's 'onlyFiles'. + // Compatibility for this is implemented at the call site. + mark: 'markDirectories', + matchBase: 'baseNameMatch', + }; + Object.keys(optionRenames).forEach(function (oldKey) { + var newKey = optionRenames[oldKey]; + if (oldKey in config.globOptions) { + newGlobOptions[newKey] = config.globOptions[oldKey]; + } + }); + var invertedOptionRenames = { + nobrace: 'braceExpansion', + noglobstar: 'globstar', + noext: 'extglob', + nocase: 'caseSensitiveMatch', + }; + Object.keys(invertedOptionRenames).forEach(function (oldKey) { + var newKey = invertedOptionRenames[oldKey]; + if (oldKey in config.globOptions) { + newGlobOptions[newKey] = !config.globOptions[oldKey]; + } + }); + return Object.assign({}, defaultGlobOptions, newGlobOptions); } // Expands wildcards with matching (ie. existing) file names. @@ -272,14 +302,20 @@ function expand(list) { expanded.push(listEl); } else { var ret; + var globOpts = globOptions(); try { - ret = glob.sync(listEl, globOptions()); - // if nothing matched, interpret the string literally - ret = ret.length > 0 ? ret : [listEl]; + ret = glob.sync(listEl, globOpts); } catch (e) { // if glob fails, interpret the string literally ret = [listEl]; } + // if nothing matched, interpret the string literally + ret = ret.length > 0 ? ret.sort() : [listEl]; + if (globOpts.nodir) { + ret = ret.filter(function (file) { + return !statNoFollowLinks(file).isDirectory(); + }); + } expanded = expanded.concat(ret); } }); diff --git a/src/ls.js b/src/ls.js index d5569ba5a..66385e459 100644 --- a/src/ls.js +++ b/src/ls.js @@ -1,7 +1,7 @@ var path = require('path'); var fs = require('fs'); var common = require('./common'); -var glob = require('glob'); +var glob = require('fast-glob'); // glob patterns use the UNIX path seperator var globPatternRecursive = '/**'; @@ -106,13 +106,20 @@ function _ls(options, paths) { if (stat.isDirectory() && !options.directory) { if (options.recursive) { // use glob, because it's simple - glob.sync(p + globPatternRecursive, { dot: options.all, follow: options.link }) - .forEach(function (item) { - // Glob pattern returns the directory itself and needs to be filtered out. - if (path.relative(p, item)) { - pushFile(item, path.relative(p, item)); - } - }); + glob.sync(p + globPatternRecursive, { + // These options are just to make fast-glob be compatible with POSIX + // (bash) wildcard behavior. + onlyFiles: false, + + // These options depend on the cmdOptions provided to ls. + dot: options.all, + followSymbolicLinks: options.link, + }).forEach(function (item) { + // Glob pattern returns the directory itself and needs to be filtered out. + if (path.relative(p, item)) { + pushFile(item, path.relative(p, item)); + } + }); } else if (options.all) { // use fs.readdirSync, because it's fast fs.readdirSync(p).forEach(function (item) { From 65baedbf52a00b5a6180bfb99a9d9f2f98c0d7d2 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Wed, 19 Feb 2025 22:58:45 -0800 Subject: [PATCH 283/338] feat: expose new shell.cmd() shell.cmd() was originally implemented in #866, however was not yet exposed. This command should be ready for people to try out, so this exposes the command by default. This is still not a full implementation of everything in the https://shelljs.page.link/cmd-design design doc, however this completes the initial phase and is likely good enough to replace most use cases of synchronous shell.exec(). Fixes #495 --- README.md | 35 +++++++++++++++++++++++++++++++++++ commands.js | 3 +-- src/cmd.js | 34 ++++++++++++++++++++++++++++++++++ test/cmd.js | 4 ---- 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b62cd7600..72f9ad821 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,41 @@ Notable exceptions: Returns a [ShellString](#shellstringstr) indicating success or failure. +### cmd(arg1[, arg2, ...] [, options]) + +Available options: + ++ `cwd: directoryPath`: change the current working directory only for this + cmd() invocation. ++ `maxBuffer: num`: Raise or decrease the default buffer size for + stdout/stderr. ++ `timeout`: Change the default timeout. + +Examples: + +```javascript +var version = cmd('node', '--version').stdout; +cmd('git', 'commit', '-am', `Add suport for node ${version}`); +console.log(cmd('echo', '1st arg', '2nd arg', '3rd arg').stdout) +console.log(cmd('echo', 'this handles ;, |, &, etc. as literal characters').stdout) +``` + +Executes the given command synchronously. This is intended as an easier +alternative for [exec()](#execcommand--options--callback), with better +security around globbing, comamnd injection, and variable expansion. This is +guaranteed to only run one external command, and won't give special +treatment for any shell characters (ex. this treats `|` as a literal +character, not as a shell pipeline). +This returns a [ShellString](#shellstringstr). + +By default, this performs globbing on all platforms, but you can disable +this with `set('-f')`. + +This **does not** support asynchronous mode. If you need asynchronous +command execution, check out [execa](https://www.npmjs.com/package/execa) or +the node builtin `child_process.execFile()` instead. + + ### cp([options,] source [, source ...], dest) ### cp([options,] source_array, dest) diff --git a/commands.js b/commands.js index 884ff8ea4..48f1505c6 100644 --- a/commands.js +++ b/commands.js @@ -2,8 +2,7 @@ module.exports = [ 'cat', 'cd', 'chmod', - // TODO(nfischer): uncomment this when shell.cmd() is finished. - // 'cmd', + 'cmd', 'cp', 'dirs', 'echo', diff --git a/src/cmd.js b/src/cmd.js index 9d19a92ed..774395b87 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -21,6 +21,40 @@ function commandNotFound(execaResult) { } } +//@ +//@ ### cmd(arg1[, arg2, ...] [, options]) +//@ +//@ Available options: +//@ +//@ + `cwd: directoryPath`: change the current working directory only for this +//@ cmd() invocation. +//@ + `maxBuffer: num`: Raise or decrease the default buffer size for +//@ stdout/stderr. +//@ + `timeout`: Change the default timeout. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var version = cmd('node', '--version').stdout; +//@ cmd('git', 'commit', '-am', `Add suport for node ${version}`); +//@ console.log(cmd('echo', '1st arg', '2nd arg', '3rd arg').stdout) +//@ console.log(cmd('echo', 'this handles ;, |, &, etc. as literal characters').stdout) +//@ ``` +//@ +//@ Executes the given command synchronously. This is intended as an easier +//@ alternative for [exec()](#execcommand--options--callback), with better +//@ security around globbing, comamnd injection, and variable expansion. This is +//@ guaranteed to only run one external command, and won't give special +//@ treatment for any shell characters (ex. this treats `|` as a literal +//@ character, not as a shell pipeline). +//@ This returns a [ShellString](#shellstringstr). +//@ +//@ By default, this performs globbing on all platforms, but you can disable +//@ this with `set('-f')`. +//@ +//@ This **does not** support asynchronous mode. If you need asynchronous +//@ command execution, check out [execa](https://www.npmjs.com/package/execa) or +//@ the node builtin `child_process.execFile()` instead. function _cmd(options, command, commandArgs, userOptions) { if (!command) { common.error('Must specify a non-empty string as a command'); diff --git a/test/cmd.js b/test/cmd.js index 59bce65e3..bd300a0ba 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -4,10 +4,6 @@ import test from 'ava'; import shell from '..'; -// TODO(nfischer): remove this when shell.cmd() is finished. For now, load it -// like any other plugin. -require('../src/cmd'); - const CWD = process.cwd(); test.beforeEach(() => { From 519308489c3e2e4175c2ca19fc66197560730032 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 20 Feb 2025 00:00:35 -0800 Subject: [PATCH 284/338] refactor: move exec-child logic into main function No change to logic. This refactors the exec-child.js script to move all of its main logic into a main() function. This function is only invoked if the script is executed, not when it is imported. Importing the script is now a NOOP instead of throwing an exception. It's still not advisable to import the script, however this can be done if absolutely necessary to trick JavaScript bundlers which try to prune non-imported code files. Partially related to issue #1160 and #1172. --- commands.js | 1 + scripts/generate-docs.js | 6 ++- src/exec-child.js | 112 ++++++++++++++++++++------------------- test/exec.js | 7 ++- 4 files changed, 67 insertions(+), 59 deletions(-) diff --git a/commands.js b/commands.js index 48f1505c6..fa6405388 100644 --- a/commands.js +++ b/commands.js @@ -7,6 +7,7 @@ module.exports = [ 'dirs', 'echo', 'exec', + 'exec-child', 'find', 'grep', 'head', diff --git a/scripts/generate-docs.js b/scripts/generate-docs.js index 64f4aab3e..4b7aa5c70 100755 --- a/scripts/generate-docs.js +++ b/scripts/generate-docs.js @@ -15,7 +15,11 @@ var docs = grep('^//@', 'shell.js'); docs = docs.replace(/\/\/@commands\n/g, function () { return require('../commands').map(function (commandName) { var file = './src/' + commandName + '.js'; - return grep('^//@', file) + '\n'; + var commandDoc = grep('^//@', file).toString(); + if (commandDoc !== '') { + commandDoc += '\n'; + } + return commandDoc; }).join(''); }); diff --git a/src/exec-child.js b/src/exec-child.js index cc844e4b6..e8446f6f0 100644 --- a/src/exec-child.js +++ b/src/exec-child.js @@ -1,67 +1,71 @@ -if (require.main !== module) { - throw new Error('This file should not be required'); -} - var childProcess = require('child_process'); var fs = require('fs'); -var paramFilePath = process.argv[2]; +function main() { + var paramFilePath = process.argv[2]; -var serializedParams = fs.readFileSync(paramFilePath, 'utf8'); -var params = JSON.parse(serializedParams); + var serializedParams = fs.readFileSync(paramFilePath, 'utf8'); + var params = JSON.parse(serializedParams); -var cmd = params.command; -var execOptions = params.execOptions; -var pipe = params.pipe; -var stdoutFile = params.stdoutFile; -var stderrFile = params.stderrFile; + var cmd = params.command; + var execOptions = params.execOptions; + var pipe = params.pipe; + var stdoutFile = params.stdoutFile; + var stderrFile = params.stderrFile; -function isMaxBufferError(err) { - var maxBufferErrorPattern = /^.*\bmaxBuffer\b.*exceeded.*$/; - if (err instanceof Error && err.message && - err.message.match(maxBufferErrorPattern)) { - // < v10 - // Error: stdout maxBuffer exceeded - return true; - } else if (err instanceof RangeError && err.message && - err.message.match(maxBufferErrorPattern)) { - // >= v10 - // RangeError [ERR_CHILD_PROCESS_STDIO_MAXBUFFER]: stdout maxBuffer length - // exceeded - return true; + function isMaxBufferError(err) { + var maxBufferErrorPattern = /^.*\bmaxBuffer\b.*exceeded.*$/; + if (err instanceof Error && err.message && + err.message.match(maxBufferErrorPattern)) { + // < v10 + // Error: stdout maxBuffer exceeded + return true; + } else if (err instanceof RangeError && err.message && + err.message.match(maxBufferErrorPattern)) { + // >= v10 + // RangeError [ERR_CHILD_PROCESS_STDIO_MAXBUFFER]: stdout maxBuffer length + // exceeded + return true; + } + return false; } - return false; -} -var stdoutStream = fs.createWriteStream(stdoutFile); -var stderrStream = fs.createWriteStream(stderrFile); - -function appendError(message, code) { - stderrStream.write(message); - process.exitCode = code; -} + var stdoutStream = fs.createWriteStream(stdoutFile); + var stderrStream = fs.createWriteStream(stderrFile); -var c = childProcess.exec(cmd, execOptions, function (err) { - if (!err) { - process.exitCode = 0; - } else if (isMaxBufferError(err)) { - appendError('maxBuffer exceeded', 1); - } else if (err.code === undefined && err.message) { - /* istanbul ignore next */ - appendError(err.message, 1); - } else if (err.code === undefined) { - /* istanbul ignore next */ - appendError('Unknown issue', 1); - } else { - process.exitCode = err.code; + function appendError(message, code) { + stderrStream.write(message); + process.exitCode = code; } -}); -c.stdout.pipe(stdoutStream); -c.stderr.pipe(stderrStream); -c.stdout.pipe(process.stdout); -c.stderr.pipe(process.stderr); + var c = childProcess.exec(cmd, execOptions, function (err) { + if (!err) { + process.exitCode = 0; + } else if (isMaxBufferError(err)) { + appendError('maxBuffer exceeded', 1); + } else if (err.code === undefined && err.message) { + /* istanbul ignore next */ + appendError(err.message, 1); + } else if (err.code === undefined) { + /* istanbul ignore next */ + appendError('Unknown issue', 1); + } else { + process.exitCode = err.code; + } + }); + + c.stdout.pipe(stdoutStream); + c.stderr.pipe(stderrStream); + c.stdout.pipe(process.stdout); + c.stderr.pipe(process.stderr); + + if (pipe) { + c.stdin.end(pipe); + } +} -if (pipe) { - c.stdin.end(pipe); +// This file should only be executed. This module does not export anything. +/* istanbul ignore else */ +if (require.main === module) { + main(); } diff --git a/test/exec.js b/test/exec.js index cc7d35827..a146fed38 100644 --- a/test/exec.js +++ b/test/exec.js @@ -65,10 +65,9 @@ test('exec exits gracefully if we cannot find the execPath', t => { ); }); -test('cannot require exec-child.js', t => { - t.throws(() => { - require('../src/exec-child'); - }, /This file should not be required/); +test('exec-child.js should not be imported', t => { + const execChild = require('../src/exec-child'); + t.deepEqual([], Object.keys(execChild)); }); // From fca5f1b74d7bb933a1a1ade24d7dc05fc0f00768 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 20 Feb 2025 00:29:33 -0800 Subject: [PATCH 285/338] refactor: rewrite gendocs script without commands.js The gendocs script no longer depends on commands.js. This now works by iterating over source files and parsing them directly. Partially related to issue #1160 and #1172. Test: npm run gendocs --- scripts/generate-docs.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scripts/generate-docs.js b/scripts/generate-docs.js index 4b7aa5c70..089e0cbbf 100755 --- a/scripts/generate-docs.js +++ b/scripts/generate-docs.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -/* globals cat, cd, echo, grep, sed, ShellString */ +/* globals cat, cd, echo, grep, ls, sed, ShellString */ require('../global'); var path = require('path'); @@ -12,9 +12,16 @@ cd(path.join(__dirname, '..')); var docs = grep('^//@', 'shell.js'); // Insert the docs for all the registered commands +var blocklist = [ + './src/common.js', + './src/error.js', + './src/errorCode.js', +]; docs = docs.replace(/\/\/@commands\n/g, function () { - return require('../commands').map(function (commandName) { - var file = './src/' + commandName + '.js'; + return ls('./src/*.js').map(function (file) { + if (blocklist.includes(file)) { + return ''; + } var commandDoc = grep('^//@', file).toString(); if (commandDoc !== '') { commandDoc += '\n'; From c3d6ce62bf991c858b265270b8868d339143fda9 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 20 Feb 2025 01:58:19 -0800 Subject: [PATCH 286/338] chore: update maintainers list Update list of project maintainers. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 72f9ad821..f5d622e2d 100644 --- a/README.md +++ b/README.md @@ -938,6 +938,6 @@ Reset `shell.config` to the defaults: ## Team -| [![Nate Fischer](https://avatars.githubusercontent.com/u/5801521?s=130)](https://github.com/nfischer) | [![Brandon Freitag](https://avatars1.githubusercontent.com/u/5988055?v=3&s=130)](http://github.com/freitagbr) | -|:---:|:---:| -| [Nate Fischer](https://github.com/nfischer) | [Brandon Freitag](http://github.com/freitagbr) | +| [![Nate Fischer](https://avatars.githubusercontent.com/u/5801521?s=130)](https://github.com/nfischer) | +|:---:| +| [Nate Fischer](https://github.com/nfischer) | From f29a7a85af631c06cdca444a5ac9cf5d15a331ab Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 21 Feb 2025 23:35:18 -0800 Subject: [PATCH 287/338] test: document test for newline in cmd() function No change to logic. This adds documentation for the test case for handling newlines. This also removes a nearby eslint suppression which is no longer necessary after PR #1184. Fixes #175 --- test/cmd.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/cmd.js b/test/cmd.js index bd300a0ba..e455effd6 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -91,14 +91,18 @@ test('interaction with cd', t => { test('no need to escape quotes', t => { const result = shell.cmd(shell.config.execPath, '-e', - `console.log("'+'_'+'");`); // eslint-disable-line quotes + `console.log("'+'_'+'");`); t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, "'+'_'+'\n"); }); test('commands can contain newlines', t => { - // Github issue #175 + // GitHub issue #175. This test uses a nodejs script rather than a shell + // command because Windows 'echo' doesn't handle \n the same way as Unix + // 'echo'. This test case proves the newline is passed correctly to the + // underlying program because otherwise node would not parse the two lines as + // separate statements and it would throw a JavaScript syntax error. const result = shell.cmd(shell.config.execPath, '-e', ` console.log('line1') console.log('line2') From ea57f4ee78a11a4d355c2b02910e11a5106df3db Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 24 Feb 2022 01:41:16 -0800 Subject: [PATCH 288/338] refactor: prefer includes() over indexOf() No change to logic. This swaps out Array.prototype.indexOf in favor for Array.prototype.includes() to simplify logic. This does the same for the equivalent String.prototype functions. Test: npm test --- src/chmod.js | 20 ++-- src/which.js | 4 +- test/config.js | 12 +-- test/find.js | 18 ++-- test/ls.js | 242 ++++++++++++++++++++++++------------------------- test/set.js | 8 +- test/touch.js | 4 +- test/which.js | 2 +- 8 files changed, 155 insertions(+), 155 deletions(-) diff --git a/src/chmod.js b/src/chmod.js index a6216c25e..24cc82456 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -136,16 +136,16 @@ function _chmod(options, mode, filePattern) { var operator = matches[2]; var change = matches[3]; - var changeOwner = applyTo.indexOf('u') !== -1 || applyTo === 'a' || applyTo === ''; - var changeGroup = applyTo.indexOf('g') !== -1 || applyTo === 'a' || applyTo === ''; - var changeOther = applyTo.indexOf('o') !== -1 || applyTo === 'a' || applyTo === ''; - - var changeRead = change.indexOf('r') !== -1; - var changeWrite = change.indexOf('w') !== -1; - var changeExec = change.indexOf('x') !== -1; - var changeExecDir = change.indexOf('X') !== -1; - var changeSticky = change.indexOf('t') !== -1; - var changeSetuid = change.indexOf('s') !== -1; + var changeOwner = applyTo.includes('u') || applyTo === 'a' || applyTo === ''; + var changeGroup = applyTo.includes('g') || applyTo === 'a' || applyTo === ''; + var changeOther = applyTo.includes('o') || applyTo === 'a' || applyTo === ''; + + var changeRead = change.includes('r'); + var changeWrite = change.includes('w'); + var changeExec = change.includes('x'); + var changeExecDir = change.includes('X'); + var changeSticky = change.includes('t'); + var changeSetuid = change.includes('s'); if (changeExecDir && isDir) { changeExec = true; diff --git a/src/which.js b/src/which.js index 28ba267df..4733d1b7e 100644 --- a/src/which.js +++ b/src/which.js @@ -64,7 +64,7 @@ function _which(options, cmd) { var queryMatches = []; // No relative/absolute paths provided? - if (cmd.indexOf('/') === -1) { + if (!cmd.includes('/')) { // Assume that there are no extensions to append to queries (this is the // case for unix) var pathExtArray = ['']; @@ -87,7 +87,7 @@ function _which(options, cmd) { } var match = attempt.match(/\.[^<>:"/|?*.]+$/); - if (match && pathExtArray.indexOf(match[0]) >= 0) { // this is Windows-only + if (match && pathExtArray.includes(match[0])) { // this is Windows-only // The user typed a query with the file extension, like // `which('node.exe')` if (checkPath(attempt)) { diff --git a/test/config.js b/test/config.js index de20eba5c..30ee84e61 100644 --- a/test/config.js +++ b/test/config.js @@ -103,8 +103,8 @@ test('config.globOptions respects dot', t => { shell.config.globOptions = { dot: true }; const result = common.expand(['test/resources/ls/*']); t.is(result.length, 8); - t.truthy(result.indexOf('test/resources/ls/.hidden_dir') > -1); - t.truthy(result.indexOf('test/resources/ls/.hidden_file') > -1); + t.truthy(result.includes('test/resources/ls/.hidden_dir')); + t.truthy(result.includes('test/resources/ls/.hidden_file')); }); test('config.globOptions respects ignore', t => { @@ -119,7 +119,7 @@ test('config.globOptions respects ignore', t => { ]; t.deepEqual(result, expected); // Does not include the result that we chose to ignore - t.truthy(result.indexOf('test/resources/external') < 0); + t.falsy(result.includes('test/resources/external')); }); test('config.globOptions respects absolute', t => { @@ -153,9 +153,9 @@ test('config.globOptions respects nodir', t => { ]; t.deepEqual(result, expected); // Does not include the directories. - t.truthy(result.indexOf('test/resources/cat') < 0); - t.truthy(result.indexOf('test/resources/head') < 0); - t.truthy(result.indexOf('test/resources/external') < 0); + t.falsy(result.includes('test/resources/cat')); + t.falsy(result.includes('test/resources/head')); + t.falsy(result.includes('test/resources/external')); }); test('config.globOptions respects mark', t => { diff --git a/test/find.js b/test/find.js index b9a14d01f..b658c1b06 100644 --- a/test/find.js +++ b/test/find.js @@ -28,8 +28,8 @@ test('current path', t => { const result = shell.find('.'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('.hidden') > -1); - t.truthy(result.indexOf('dir1/dir11/a_dir11') > -1); + t.truthy(result.includes('.hidden')); + t.truthy(result.includes('dir1/dir11/a_dir11')); t.is(result.length, 12); shell.cd('../..'); }); @@ -38,8 +38,8 @@ test('simple path', t => { const result = shell.find('test/resources/find'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/find/.hidden') > -1); - t.truthy(result.indexOf('test/resources/find/dir1/dir11/a_dir11') > -1); + t.truthy(result.includes('test/resources/find/.hidden')); + t.truthy(result.includes('test/resources/find/dir1/dir11/a_dir11')); t.is(result.length, 12); }); @@ -47,8 +47,8 @@ test('multiple paths - comma', t => { const result = shell.find('test/resources/find/dir1', 'test/resources/find/dir2'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/find/dir1/dir11/a_dir11') > -1); - t.truthy(result.indexOf('test/resources/find/dir2/a_dir1') > -1); + t.truthy(result.includes('test/resources/find/dir1/dir11/a_dir11')); + t.truthy(result.includes('test/resources/find/dir2/a_dir1')); t.is(result.length, 6); }); @@ -56,8 +56,8 @@ test('multiple paths - array', t => { const result = shell.find(['test/resources/find/dir1', 'test/resources/find/dir2']); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/find/dir1/dir11/a_dir11') > -1); - t.truthy(result.indexOf('test/resources/find/dir2/a_dir1') > -1); + t.truthy(result.includes('test/resources/find/dir1/dir11/a_dir11')); + t.truthy(result.includes('test/resources/find/dir2/a_dir1')); t.is(result.length, 6); }); @@ -71,6 +71,6 @@ test('-L flag, folder is symlinked', t => { const result = shell.find('-L', 'test/resources/find'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/find/dir2_link/a_dir1') > -1); + t.truthy(result.includes('test/resources/find/dir2_link/a_dir1')); t.is(result.length, 13); }); diff --git a/test/ls.js b/test/ls.js index bc279daf5..3f97393bc 100644 --- a/test/ls.js +++ b/test/ls.js @@ -54,12 +54,12 @@ test('no args provides the correct result', t => { const result = shell.ls(); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('file1') > -1); - t.truthy(result.indexOf('file2') > -1); - t.truthy(result.indexOf('file1.js') > -1); - t.truthy(result.indexOf('file2.js') > -1); - t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); - t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.includes('file1')); + t.truthy(result.includes('file2')); + t.truthy(result.includes('file1.js')); + t.truthy(result.includes('file2.js')); + t.truthy(result.includes('filename(with)[chars$]^that.must+be-escaped')); + t.truthy(result.includes('a_dir')); t.is(result.length, 6); }); @@ -67,12 +67,12 @@ test('simple arg', t => { const result = shell.ls('test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('file1') > -1); - t.truthy(result.indexOf('file2') > -1); - t.truthy(result.indexOf('file1.js') > -1); - t.truthy(result.indexOf('file2.js') > -1); - t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); - t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.includes('file1')); + t.truthy(result.includes('file2')); + t.truthy(result.includes('file1.js')); + t.truthy(result.includes('file2.js')); + t.truthy(result.includes('filename(with)[chars$]^that.must+be-escaped')); + t.truthy(result.includes('a_dir')); t.is(result.length, 6); }); @@ -80,12 +80,12 @@ test('simple arg, with a trailing slash', t => { const result = shell.ls('test/resources/ls/'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('file1') > -1); - t.truthy(result.indexOf('file2') > -1); - t.truthy(result.indexOf('file1.js') > -1); - t.truthy(result.indexOf('file2.js') > -1); - t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); - t.truthy(result.indexOf('a_dir') > -1); + t.truthy(result.includes('file1')); + t.truthy(result.includes('file2')); + t.truthy(result.includes('file1.js')); + t.truthy(result.includes('file2.js')); + t.truthy(result.includes('filename(with)[chars$]^that.must+be-escaped')); + t.truthy(result.includes('a_dir')); t.is(result.length, 6); }); @@ -93,7 +93,7 @@ test('simple arg, a file', t => { const result = shell.ls('test/resources/ls/file1'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/ls/file1') > -1); + t.truthy(result.includes('test/resources/ls/file1')); t.is(result.length, 1); }); @@ -102,14 +102,14 @@ test('no args, -A option', t => { const result = shell.ls('-A'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('file1') > -1); - t.truthy(result.indexOf('file2') > -1); - t.truthy(result.indexOf('file1.js') > -1); - t.truthy(result.indexOf('file2.js') > -1); - t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('.hidden_file') > -1); - t.truthy(result.indexOf('.hidden_dir') > -1); + t.truthy(result.includes('file1')); + t.truthy(result.includes('file2')); + t.truthy(result.includes('file1.js')); + t.truthy(result.includes('file2.js')); + t.truthy(result.includes('filename(with)[chars$]^that.must+be-escaped')); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('.hidden_file')); + t.truthy(result.includes('.hidden_dir')); t.is(result.length, 8); }); @@ -118,14 +118,14 @@ test('no args, deprecated -a option', t => { const result = shell.ls('-a'); // (deprecated) backwards compatibility test t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('file1') > -1); - t.truthy(result.indexOf('file2') > -1); - t.truthy(result.indexOf('file1.js') > -1); - t.truthy(result.indexOf('file2.js') > -1); - t.truthy(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('.hidden_file') > -1); - t.truthy(result.indexOf('.hidden_dir') > -1); + t.truthy(result.includes('file1')); + t.truthy(result.includes('file2')); + t.truthy(result.includes('file1.js')); + t.truthy(result.includes('file2.js')); + t.truthy(result.includes('filename(with)[chars$]^that.must+be-escaped')); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('.hidden_file')); + t.truthy(result.includes('.hidden_dir')); t.is(result.length, 8); }); @@ -133,11 +133,11 @@ test('wildcard, very simple', t => { const result = shell.ls('test/resources/cat/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/cat/file1') > -1); - t.truthy(result.indexOf('test/resources/cat/file2') > -1); - t.truthy(result.indexOf('test/resources/cat/file3') > -1); - t.truthy(result.indexOf('test/resources/cat/file4') > -1); - t.truthy(result.indexOf('test/resources/cat/file5') > -1); + t.truthy(result.includes('test/resources/cat/file1')); + t.truthy(result.includes('test/resources/cat/file2')); + t.truthy(result.includes('test/resources/cat/file3')); + t.truthy(result.includes('test/resources/cat/file4')); + t.truthy(result.includes('test/resources/cat/file5')); t.is(result.length, 5); }); @@ -145,16 +145,16 @@ test('wildcard, simple', t => { const result = shell.ls('test/resources/ls/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/ls/file1') > -1); - t.truthy(result.indexOf('test/resources/ls/file2') > -1); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); + t.truthy(result.includes('test/resources/ls/file1')); + t.truthy(result.includes('test/resources/ls/file2')); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); t.truthy( - result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.includes('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') ); - t.is(result.indexOf('test/resources/ls/a_dir'), -1); // this shouldn't be there - t.truthy(result.indexOf('nada') > -1); - t.truthy(result.indexOf('b_dir') > -1); + t.falsy(result.includes('test/resources/ls/a_dir')); // this shouldn't be there + t.truthy(result.includes('nada')); + t.truthy(result.includes('b_dir')); t.is(result.length, 7); }); @@ -162,14 +162,14 @@ test('wildcard, simple, with -d', t => { const result = shell.ls('-d', 'test/resources/ls/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/ls/file1') > -1); - t.truthy(result.indexOf('test/resources/ls/file2') > -1); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); + t.truthy(result.includes('test/resources/ls/file1')); + t.truthy(result.includes('test/resources/ls/file2')); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); t.truthy( - result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.includes('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') ); - t.truthy(result.indexOf('test/resources/ls/a_dir') > -1); + t.truthy(result.includes('test/resources/ls/a_dir')); t.is(result.length, 6); }); @@ -177,8 +177,8 @@ test('wildcard, hidden only', t => { const result = shell.ls('-d', 'test/resources/ls/.*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/ls/.hidden_file') > -1); - t.truthy(result.indexOf('test/resources/ls/.hidden_dir') > -1); + t.truthy(result.includes('test/resources/ls/.hidden_file')); + t.truthy(result.includes('test/resources/ls/.hidden_dir')); t.is(result.length, 2); }); @@ -187,12 +187,12 @@ test('wildcard, mid-file', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 5); - t.truthy(result.indexOf('test/resources/ls/file1') > -1); - t.truthy(result.indexOf('test/resources/ls/file2') > -1); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); + t.truthy(result.includes('test/resources/ls/file1')); + t.truthy(result.includes('test/resources/ls/file2')); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); t.truthy( - result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.includes('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') ); }); @@ -201,8 +201,8 @@ test('wildcard, mid-file with dot (should escape dot for regex)', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 2); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); }); test("one file that exists, one that doesn't", t => { @@ -210,7 +210,7 @@ test("one file that exists, one that doesn't", t => { t.truthy(shell.error()); t.is(result.code, 2); t.is(result.length, 1); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.includes('test/resources/ls/file1.js')); }); test("one file that exists, one that doesn't (other order)", t => { @@ -218,7 +218,7 @@ test("one file that exists, one that doesn't (other order)", t => { t.truthy(shell.error()); t.is(result.code, 2); t.is(result.length, 1); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); + t.truthy(result.includes('test/resources/ls/file1.js')); }); test('wildcard, should not do partial matches', t => { @@ -233,10 +233,10 @@ test('wildcard, all files with extension', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 3); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); t.truthy( - result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.includes('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') ); }); @@ -245,10 +245,10 @@ test('wildcard, with additional path', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 4); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); - t.truthy(result.indexOf('b_dir') > -1); // no wildcard == no path prefix - t.truthy(result.indexOf('nada') > -1); // no wildcard == no path prefix + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); + t.truthy(result.includes('b_dir')); // no wildcard == no path prefix + t.truthy(result.includes('nada')); // no wildcard == no path prefix }); test('wildcard for both paths', t => { @@ -256,10 +256,10 @@ test('wildcard for both paths', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 4); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); - t.truthy(result.indexOf('z') > -1); - t.truthy(result.indexOf('test/resources/ls/a_dir/nada') > -1); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); + t.truthy(result.includes('z')); + t.truthy(result.includes('test/resources/ls/a_dir/nada')); }); test('wildcard for both paths, array', t => { @@ -267,10 +267,10 @@ test('wildcard for both paths, array', t => { t.falsy(shell.error()); t.is(result.code, 0); t.is(result.length, 4); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); - t.truthy(result.indexOf('z') > -1); - t.truthy(result.indexOf('test/resources/ls/a_dir/nada') > -1); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2.js')); + t.truthy(result.includes('z')); + t.truthy(result.includes('test/resources/ls/a_dir/nada')); }); test('recursive, no path', t => { @@ -278,9 +278,9 @@ test('recursive, no path', t => { const result = shell.ls('-R'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('a_dir/b_dir')); + t.truthy(result.includes('a_dir/b_dir/z')); t.is(result.length, 9); }); @@ -288,9 +288,9 @@ test('recursive, path given', t => { const result = shell.ls('-R', 'test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('a_dir/b_dir')); + t.truthy(result.includes('a_dir/b_dir/z')); t.is(result.length, 9); }); @@ -298,10 +298,10 @@ test('-RA flag, path given', t => { const result = shell.ls('-RA', 'test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir/z') > -1); - t.truthy(result.indexOf('a_dir/.hidden_dir/nada') > -1); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('a_dir/b_dir')); + t.truthy(result.includes('a_dir/b_dir/z')); + t.truthy(result.includes('a_dir/.hidden_dir/nada')); t.is(result.length, 14); }); @@ -309,11 +309,11 @@ test('-RA flag, symlinks are not followed', t => { const result = shell.ls('-RA', 'test/resources/rm'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('a_dir/a_file') > -1); - t.truthy(result.indexOf('link_to_a_dir') > -1); - t.is(result.indexOf('link_to_a_dir/a_file'), -1); - t.truthy(result.indexOf('fake.lnk') > -1); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('a_dir/a_file')); + t.truthy(result.includes('link_to_a_dir')); + t.falsy(result.includes('link_to_a_dir/a_file')); + t.truthy(result.includes('fake.lnk')); t.is(result.length, 4); }); @@ -322,11 +322,11 @@ test('-RAL flag, follows symlinks', t => { const result = shell.ls('-RAL', 'test/resources/rm'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('a_dir/a_file') > -1); - t.truthy(result.indexOf('link_to_a_dir') > -1); - t.truthy(result.indexOf('link_to_a_dir/a_file') > -1); - t.truthy(result.indexOf('fake.lnk') > -1); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('a_dir/a_file')); + t.truthy(result.includes('link_to_a_dir')); + t.truthy(result.includes('link_to_a_dir/a_file')); + t.truthy(result.includes('fake.lnk')); t.is(result.length, 5); }); }); @@ -336,7 +336,7 @@ test('-L flag, path is symlink', t => { const result = shell.ls('-L', 'test/resources/rm/link_to_a_dir'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_file') > -1); + t.truthy(result.includes('a_file')); t.is(result.length, 1); }); }); @@ -346,7 +346,7 @@ test('follow links to directories by default', t => { const result = shell.ls('test/resources/rm/link_to_a_dir'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_file') > -1); + t.truthy(result.includes('a_file')); t.is(result.length, 1); }); }); @@ -375,8 +375,8 @@ test('directory option, multiple args', t => { const result = shell.ls('-d', 'test/resources/ls/a_dir', 'test/resources/ls/file1'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/ls/a_dir') > -1); - t.truthy(result.indexOf('test/resources/ls/file1') > -1); + t.truthy(result.includes('test/resources/ls/a_dir')); + t.truthy(result.includes('test/resources/ls/file1')); t.is(result.length, 2); }); @@ -384,14 +384,14 @@ test('directory option, globbed arg', t => { const result = shell.ls('-d', 'test/resources/ls/*'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/ls/a_dir') > -1); - t.truthy(result.indexOf('test/resources/ls/file1') > -1); - t.truthy(result.indexOf('test/resources/ls/file1.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2') > -1); - t.truthy(result.indexOf('test/resources/ls/file2.js') > -1); - t.truthy(result.indexOf('test/resources/ls/file2') > -1); + t.truthy(result.includes('test/resources/ls/a_dir')); + t.truthy(result.includes('test/resources/ls/file1')); + t.truthy(result.includes('test/resources/ls/file1.js')); + t.truthy(result.includes('test/resources/ls/file2')); + t.truthy(result.includes('test/resources/ls/file2.js')); + t.truthy(result.includes('test/resources/ls/file2')); t.truthy( - result.indexOf('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1 + result.includes('test/resources/ls/filename(with)[chars$]^that.must+be-escaped') ); t.is(result.length, 6); }); @@ -483,7 +483,7 @@ test('still lists broken links', t => { const result = shell.ls('test/resources/badlink'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('test/resources/badlink') > -1); + t.truthy(result.includes('test/resources/badlink')); t.is(result.length, 1); }); @@ -491,14 +491,14 @@ test('Test new ShellString-like attributes', t => { const result = shell.ls('test/resources/ls'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.stdout.indexOf('file1') > -1); - t.truthy(result.stdout.indexOf('file2') > -1); - t.truthy(result.stdout.indexOf('file1.js') > -1); - t.truthy(result.stdout.indexOf('file2.js') > -1); + t.truthy(result.stdout.includes('file1')); + t.truthy(result.stdout.includes('file2')); + t.truthy(result.stdout.includes('file1.js')); + t.truthy(result.stdout.includes('file2.js')); t.truthy( - result.stdout.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1 + result.stdout.includes('filename(with)[chars$]^that.must+be-escaped') ); - t.truthy(result.stdout.indexOf('a_dir') > -1); + t.truthy(result.stdout.includes('a_dir')); t.is(typeof result.stdout, 'string'); t.truthy(result.to); t.truthy(result.toEnd); @@ -528,8 +528,8 @@ test('non-normalized paths are still ok with -R', t => { const result = shell.ls('-R', 'test/resources/./ls/../ls'); t.falsy(shell.error()); t.is(result.code, 0); - t.truthy(result.indexOf('a_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir') > -1); - t.truthy(result.indexOf('a_dir/b_dir/z') > -1); + t.truthy(result.includes('a_dir')); + t.truthy(result.includes('a_dir/b_dir')); + t.truthy(result.includes('a_dir/b_dir/z')); t.is(result.length, 9); }); diff --git a/test/set.js b/test/set.js index 7f89aa21e..218c4c7eb 100644 --- a/test/set.js +++ b/test/set.js @@ -38,7 +38,7 @@ test('set -e', t => { const result = shell.exec(JSON.stringify(shell.config.execPath) + ` -e "require('./global'); set('-e'); ls('file_doesnt_exist'); echo(1234);"`); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); - t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); + t.truthy(result.stderr.includes('Error: ls: no such file or directory: file_doesnt_exist')); }); test('set -v', t => { @@ -55,9 +55,9 @@ test('set -ev', t => { const result = shell.exec(JSON.stringify(shell.config.execPath) + ` -e "require('./global'); set('-ev'); ls('file_doesnt_exist'); echo(1234);"`); t.is(result.code, uncaughtErrorExitCode); t.is(result.stdout, ''); - t.truthy(result.stderr.indexOf('Error: ls: no such file or directory: file_doesnt_exist') >= 0); - t.truthy(result.stderr.indexOf('ls file_doesnt_exist\n') >= 0); - t.is(result.stderr.indexOf('echo 1234\n'), -1); + t.truthy(result.stderr.includes('Error: ls: no such file or directory: file_doesnt_exist')); + t.truthy(result.stderr.includes('ls file_doesnt_exist\n')); + t.falsy(result.stderr.includes('echo 1234\n')); }); test('set -e, set +e', t => { diff --git a/test/touch.js b/test/touch.js index 703ea2a5f..ee490041c 100644 --- a/test/touch.js +++ b/test/touch.js @@ -77,8 +77,8 @@ test('handles globs correctly', t => { const result = shell.touch(`${t.context.tmp}/file*`); t.is(result.code, 0); const files = shell.ls(`${t.context.tmp}/file*`); - t.truthy(files.indexOf(`${t.context.tmp}/file.txt`) > -1); - t.truthy(files.indexOf(`${t.context.tmp}/file.js`) > -1); + t.truthy(files.includes(`${t.context.tmp}/file.txt`)); + t.truthy(files.includes(`${t.context.tmp}/file.js`)); t.is(files.length, 2); }); diff --git a/test/which.js b/test/which.js index f81d9e0e2..1a41da9d4 100644 --- a/test/which.js +++ b/test/which.js @@ -90,7 +90,7 @@ test('None executable files does not appear in the result list', t => { t.truthy(resultForWhichA); t.truthy(resultForWhichA.length); t.not(resultForWhich.toString(), matchingFile); - t.is(resultForWhichA.indexOf(matchingFile), -1); + t.falsy(resultForWhichA.includes(matchingFile)); process.env.PATH = pathEnv; }); From ea621f5afc72d9de452c9caf1294c874b2ce0283 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 13:45:58 -0800 Subject: [PATCH 289/338] chore: commit package-lock.json No change to logic. This commits the package-lock.json file because we've since dropped support for old Node versions. --- .npmrc | 3 - package-lock.json | 9354 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 9354 insertions(+), 3 deletions(-) delete mode 100644 .npmrc create mode 100644 package-lock.json diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 2be0a0afb..000000000 --- a/.npmrc +++ /dev/null @@ -1,3 +0,0 @@ -# We can't use lockfiles because npm@5 and npm@6 disagree about the syntax (and -# will modify the lockfile when we run `npm install`). -package-lock=false diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..05accd511 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9354 @@ +{ + "name": "shelljs", + "version": "0.8.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shelljs", + "version": "0.8.3", + "license": "BSD-3-Clause", + "dependencies": { + "execa": "^1.0.0", + "fast-glob": "^3.3.2", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "devDependencies": { + "ava": "^1.4.1", + "chalk": "^4.1.2", + "coffee-script": "^1.12.7", + "eslint": "^8.2.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.31.0", + "js-yaml": "^4.1.0", + "nyc": "^17.1.0", + "shelljs-changelog": "^0.2.6", + "shelljs-release": "^0.5.2", + "shx": "^0.3.4", + "travis-check-changes": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ava/babel-plugin-throws-helper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-3.0.0.tgz", + "integrity": "sha512-mN9UolOs4WX09QkheU1ELkVy2WPnwonlO3XMdN8JF8fQqRVgVTR21xDbvEOUsbwz6Zwjq7ji9yzyjuXqDPalxg==", + "dev": true, + "engines": { + "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + } + }, + "node_modules/@ava/babel-preset-stage-4": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-2.0.0.tgz", + "integrity": "sha512-OWqMYeTSZ16AfLx0Vn0Uj7tcu+uMRlbKmks+DVCFlln7vomVsOtst+Oz+HCussDSFGpE+30VtHAUHLy6pLDpHQ==", + "dev": true, + "dependencies": { + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-dotall-regex": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0" + }, + "engines": { + "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + } + }, + "node_modules/@ava/babel-preset-transform-test-files": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-5.0.0.tgz", + "integrity": "sha512-rqgyQwkT0+j2JzYP51dOv80u33rzAvjBtXRzUON+7+6u26mjoudRXci2+1s18rat8r4uOlZfbzm114YS6pwmYw==", + "dev": true, + "dependencies": { + "@ava/babel-plugin-throws-helper": "^3.0.0", + "babel-plugin-espower": "^3.0.1" + }, + "engines": { + "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + } + }, + "node_modules/@ava/write-file-atomic": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz", + "integrity": "sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.9" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@concordance/react": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", + "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1" + }, + "engines": { + "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.14.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", + "dev": true, + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-differ": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", + "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union/node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", + "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/ava": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ava/-/ava-1.4.1.tgz", + "integrity": "sha512-wKpgOPTL7hJSBWpfbU4SA8rlsTZrph9g9g7qYDV7M6uK1rKeW8oCUJWRwCd8B24S4N0Y5myf6cTEnA66WIk0sA==", + "dev": true, + "dependencies": { + "@ava/babel-preset-stage-4": "^2.0.0", + "@ava/babel-preset-transform-test-files": "^5.0.0", + "@ava/write-file-atomic": "^2.2.0", + "@babel/core": "^7.4.0", + "@babel/generator": "^7.4.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@concordance/react": "^2.0.0", + "ansi-escapes": "^3.2.0", + "ansi-styles": "^3.2.1", + "arr-flatten": "^1.1.0", + "array-union": "^1.0.1", + "array-uniq": "^2.0.0", + "arrify": "^1.0.0", + "bluebird": "^3.5.3", + "chalk": "^2.4.2", + "chokidar": "^2.1.5", + "chunkd": "^1.0.0", + "ci-parallel-vars": "^1.0.0", + "clean-stack": "^2.0.0", + "clean-yaml-object": "^0.1.0", + "cli-cursor": "^2.1.0", + "cli-truncate": "^1.1.0", + "code-excerpt": "^2.1.1", + "common-path-prefix": "^1.0.0", + "concordance": "^4.0.0", + "convert-source-map": "^1.6.0", + "currently-unhandled": "^0.4.1", + "debug": "^4.1.1", + "del": "^4.0.0", + "dot-prop": "^4.2.0", + "emittery": "^0.4.1", + "empower-core": "^1.2.0", + "equal-length": "^1.0.0", + "escape-string-regexp": "^1.0.5", + "esm": "^3.2.20", + "figures": "^2.0.0", + "find-up": "^3.0.0", + "get-port": "^4.2.0", + "globby": "^7.1.1", + "ignore-by-default": "^1.0.0", + "import-local": "^2.0.0", + "indent-string": "^3.2.0", + "is-ci": "^2.0.0", + "is-error": "^2.2.1", + "is-observable": "^1.1.0", + "is-plain-object": "^2.0.4", + "is-promise": "^2.1.0", + "lodash.clone": "^4.5.0", + "lodash.clonedeep": "^4.5.0", + "lodash.clonedeepwith": "^4.5.0", + "lodash.debounce": "^4.0.3", + "lodash.difference": "^4.3.0", + "lodash.flatten": "^4.2.0", + "loud-rejection": "^1.2.0", + "make-dir": "^2.1.0", + "matcher": "^1.1.1", + "md5-hex": "^2.0.0", + "meow": "^5.0.0", + "ms": "^2.1.1", + "multimatch": "^3.0.0", + "observable-to-promise": "^0.5.0", + "ora": "^3.2.0", + "package-hash": "^3.0.0", + "pkg-conf": "^3.0.0", + "plur": "^3.0.1", + "pretty-ms": "^4.0.0", + "require-precompiled": "^0.1.0", + "resolve-cwd": "^2.0.0", + "slash": "^2.0.0", + "source-map-support": "^0.5.11", + "stack-utils": "^1.0.2", + "strip-ansi": "^5.2.0", + "strip-bom-buf": "^1.0.0", + "supertap": "^1.0.0", + "supports-color": "^6.1.0", + "trim-off-newlines": "^1.0.1", + "trim-right": "^1.0.1", + "unique-temp-dir": "^1.0.0", + "update-notifier": "^2.5.0" + }, + "bin": { + "ava": "cli.js" + }, + "engines": { + "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + } + }, + "node_modules/ava/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ava/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-plugin-espower": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-3.0.1.tgz", + "integrity": "sha512-Ms49U7VIAtQ/TtcqRbD6UBmJBUCSxiC3+zPc+eGqxKUIFO1lTshyEDRUjhoAbd2rWfwYf3cZ62oXozrd8W6J0A==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "call-matcher": "^1.0.0", + "core-js": "^2.0.0", + "espower-location-detector": "^1.0.0", + "espurify": "^1.6.0", + "estraverse": "^4.1.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caching-transform/node_modules/package-hash": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.1.0.tgz", + "integrity": "sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw==", + "dev": true, + "dependencies": { + "core-js": "^2.0.0", + "deep-equal": "^1.0.0", + "espurify": "^1.6.0", + "estraverse": "^4.0.0" + } + }, + "node_modules/call-signature": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", + "integrity": "sha512-qvYvkAVcoae0obt8OsZn0VEBHeEpvYIZDy1gGYtZDJG0fHawew+Mi0dBjieFz8F8dzQ2Kr19+nsDm+T5XFVs+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001702", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chunkd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-1.0.0.tgz", + "integrity": "sha512-xx3Pb5VF9QaqCotolyZ1ywFBgyuJmu6+9dLiqBxgelEse9Xsr3yUlpoX3O4Oh11M00GT2kYMsRByTKIMJW2Lkg==", + "dev": true + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", + "dev": true, + "dependencies": { + "slice-ansi": "^1.0.0", + "string-width": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/code-excerpt": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.1.tgz", + "integrity": "sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw==", + "dev": true, + "dependencies": { + "convert-to-spaces": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coffee-script": { + "version": "1.12.7", + "dev": true, + "license": "MIT", + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/common-path-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", + "integrity": "sha512-StWMCZw9nTO+RnxMCcapnQQqeZpaDvCD9+0Rrl8ZphFKWcJPyUGiEl64WoAkA+WJIxwKYzxldhYHU+EW1fQ2mQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concordance": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-4.0.0.tgz", + "integrity": "sha512-l0RFuB8RLfCS0Pt2Id39/oCPykE01pyxgAFypWTlaGRgvLkZrtczZ8atEHpTeEIW+zYWXTBuA9cCSeEOScxReQ==", + "dev": true, + "dependencies": { + "date-time": "^2.1.0", + "esutils": "^2.0.2", + "fast-diff": "^1.1.2", + "js-string-escape": "^1.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.flattendeep": "^4.4.0", + "lodash.islength": "^4.0.1", + "lodash.merge": "^4.6.1", + "md5-hex": "^2.0.0", + "semver": "^5.5.1", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + } + }, + "node_modules/concordance/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dev": true, + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-to-spaces": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "dev": true, + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-time": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", + "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", + "dev": true, + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "dev": true, + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.113", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz", + "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/empower-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz", + "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==", + "dev": true, + "dependencies": { + "call-signature": "0.0.2", + "core-js": "^2.0.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/equal-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", + "integrity": "sha512-TK2m7MvWPt/v3dan0BCNp99pytIE5UGrUj7F0KZirNX8xz8fDFUAZfgm8uB5FuQq9u0sMeDocYBfEhsd1nwGoA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/espower-location-detector": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", + "integrity": "sha512-Y/3H6ytYwqC3YcOc0gOU22Lp3eI5GAFGOymTdzFyfaiglKgtsw2dePOgXY3yrV+QcLPMPiVYwBU9RKaDoh2bbQ==", + "dev": true, + "dependencies": { + "is-url": "^1.2.1", + "path-is-absolute": "^1.0.0", + "source-map": "^0.5.0", + "xtend": "^4.0.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/espurify": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", + "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", + "dev": true, + "dependencies": { + "core-js": "^2.0.0" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.6", + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "dev": true, + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/irregular-plurals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "dependencies": { + "symbol-observable": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", + "dev": true, + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==", + "deprecated": "This package is deprecated. Use structuredClone instead.", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.islength": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.islength/-/lodash.islength-4.0.1.tgz", + "integrity": "sha512-FlJtdcHNU8YEXbzZXYWMEHLkQOpvmlnGr5o2N1iQKB7hNyr6qPkWAe+Ceczz6JYlIzD4AlTD2igvt/2/0Pb3Zw==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matcher": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", + "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5-hex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", + "integrity": "sha512-0HLfzJTZ7707VBNM1ydr5sTb+IZLhmU4u2TVA+Eenfn/Ed42/gn10smbAPiuEm/jNgjvWKUiMNihqJQ6flus9w==", + "dev": true, + "dependencies": { + "md5-o-matic": "^0.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha512-QBJSFpsedXUl/Lgs4ySdB2XCzUEcJ3ujpbagdZCkRaYIaC0kFnID8jhc84KEiVv6dNFtIrmW7bqow0lDxgJi6A==", + "dev": true + }, + "node_modules/meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "dependencies": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", + "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", + "dev": true, + "dependencies": { + "array-differ": "^2.0.3", + "array-union": "^1.0.2", + "arrify": "^1.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/node-preload": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc": { + "version": "17.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/observable-to-promise": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", + "integrity": "sha512-B3ZhUUBClpKKhfU7Y6gbmlG5o1HhinxcvH+KyFTSdKPw4xzvShYwqrze0b1hqGXInJrtqz8K11y9v8CMEWJzWQ==", + "dev": true, + "dependencies": { + "is-observable": "^0.2.0", + "symbol-observable": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/observable-to-promise/node_modules/is-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha512-4JymFIKLU+QyN0J+Q1YMWGXGF/FbL/RPkr5R9UlTdvWmSYRQPeoub00WZ4EiWOEVxWz/djoPxNFF+iuBSJzYCw==", + "dev": true, + "dependencies": { + "symbol-observable": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/observable-to-promise/node_modules/is-observable/node_modules/symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha512-6WFhZ1sqIAG3g55T6RJcOYldJmFrdsnM7adeuFUp1aJwo9EWwMFC0zYHNGGyDvJU/aqPzkQyIsMdNek1u9oRzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash/node_modules/hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==", + "dev": true, + "dependencies": { + "is-stream": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "dev": true, + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/plur": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", + "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "dev": true, + "dependencies": { + "irregular-plurals": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-4.0.0.tgz", + "integrity": "sha512-qG66ahoLCwpLXD09ZPHSCbUWYTqdosB7SMP4OffgTgL2PBKXMuUsrk5Bwg8q4qPkjTXsKBMr+YK3Ltd/6F9s/Q==", + "dev": true, + "dependencies": { + "parse-ms": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", + "dev": true, + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/require-precompiled": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", + "integrity": "sha512-UWQr7MdatK8cF0JXrrqVPal2sUdhpCj8f4sC7VMDONA/+WSVv5ElRku3qDEZ+FIqoN91zhhfB+t1P3+qQNaYGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "dev": true, + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs-changelog": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "shelljs": "^0.8.5", + "shelljs-plugin-sleep": "^0.2.1" + }, + "bin": { + "shelljs-changelog": "index.js" + } + }, + "node_modules/shelljs-plugin-sleep": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + }, + "optionalDependencies": { + "sleep": "^3.0.1" + }, + "peerDependencies": { + "shelljs": "^0.8.5" + } + }, + "node_modules/shelljs-release": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "minimist": "^1.2.0", + "shelljs": "^0.8.5" + }, + "bin": { + "shelljs-release": "index.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs-release/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs-release/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shx": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supertap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-1.0.0.tgz", + "integrity": "sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "indent-string": "^3.2.0", + "js-yaml": "^3.10.0", + "serialize-error": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supertap/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supertap/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/supertap/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/supertap/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "dev": true, + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/term-size/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/term-size/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/term-size/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/travis-check-changes": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shelljs": "^0.8.5" + }, + "bin": { + "travis-check-changes": "travis-check-changes.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/trim-off-newlines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", + "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha512-5gSP1liv10Gjp8cMEnFd6shzkL/D6W1uhXSFNCxDC+YI8+L8wkCYCbJ7n77Ezb4wE/xzMogecE+DtamEe9PZjg==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", + "integrity": "sha512-tE68ki2FndoVdPioyiz8mYaJeX3xU/9lk4dml7KlLKEkWLtDGAYeg5LGjE2dMkzB8d6R3HbcKTn/I14nukP2dw==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1", + "os-tmpdir": "^1.0.1", + "uid2": "0.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/update-notifier/node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dev": true, + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} From 495933f13ae62a342ed18cc942ab14bbbb65e5fd Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 13:49:29 -0800 Subject: [PATCH 290/338] chore: update ava dep No change to logic. This updates ava to major version 2. This is not the latest version, however updating to version 3 is not trivial because of some breaking changes. This removes the commandline options from the ava invocation in favor of moving this into the well-supported ava JSON configuration. This is required for Windows compatibility, because otherwise Windows won't properly expand "test/*.js" on the commandline and ava v2 won't expand this unless it's specified in the JSON config. Test: npm test Test: npm run test-with-coverage --- package-lock.json | 3208 +++++++++++++++------------------------------ package.json | 15 +- 2 files changed, 1043 insertions(+), 2180 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05accd511..d54c75dbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "shjs": "bin/shjs" }, "devDependencies": { - "ava": "^1.4.1", + "ava": "^2.4.0", "chalk": "^4.1.2", "coffee-script": "^1.12.7", "eslint": "^8.2.0", @@ -48,54 +48,41 @@ } }, "node_modules/@ava/babel-plugin-throws-helper": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-3.0.0.tgz", - "integrity": "sha512-mN9UolOs4WX09QkheU1ELkVy2WPnwonlO3XMdN8JF8fQqRVgVTR21xDbvEOUsbwz6Zwjq7ji9yzyjuXqDPalxg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-4.0.0.tgz", + "integrity": "sha512-3diBLIVBPPh3j4+hb5lo0I1D+S/O/VDJPI4Y502apBxmwEqjyXG4gTSPFUlm41sSZeZzMarT/Gzovw9kV7An0w==", "dev": true, "engines": { - "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" } }, "node_modules/@ava/babel-preset-stage-4": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-2.0.0.tgz", - "integrity": "sha512-OWqMYeTSZ16AfLx0Vn0Uj7tcu+uMRlbKmks+DVCFlln7vomVsOtst+Oz+HCussDSFGpE+30VtHAUHLy6pLDpHQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-4.0.0.tgz", + "integrity": "sha512-lZEV1ZANzfzSYBU6WHSErsy7jLPbD1iIgAboASPMcKo7woVni5/5IKWeT0RxC8rY802MFktur3OKEw2JY1Tv2w==", "dev": true, "dependencies": { - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.0.0", - "@babel/plugin-transform-dotall-regex": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0" + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-modules-commonjs": "^7.5.0" }, "engines": { - "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" } }, "node_modules/@ava/babel-preset-transform-test-files": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-5.0.0.tgz", - "integrity": "sha512-rqgyQwkT0+j2JzYP51dOv80u33rzAvjBtXRzUON+7+6u26mjoudRXci2+1s18rat8r4uOlZfbzm114YS6pwmYw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-6.0.0.tgz", + "integrity": "sha512-8eKhFzZp7Qcq1VLfoC75ggGT8nQs9q8fIxltU47yCB7Wi7Y8Qf6oqY1Bm0z04fIec24vEgr0ENhDHEOUGVDqnA==", "dev": true, "dependencies": { - "@ava/babel-plugin-throws-helper": "^3.0.0", + "@ava/babel-plugin-throws-helper": "^4.0.0", "babel-plugin-espower": "^3.0.1" }, "engines": { - "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" - } - }, - "node_modules/@ava/write-file-atomic": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz", - "integrity": "sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" } }, "node_modules/@babel/code-frame": { @@ -361,18 +348,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -410,10 +394,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -434,23 +418,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", @@ -467,21 +434,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.26.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", @@ -498,21 +450,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/template": { "version": "7.26.9", "dev": true, @@ -855,6 +792,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -945,21 +903,39 @@ } }, "node_modules/ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { - "string-width": "^2.0.0" + "string-width": "^4.1.0" } }, "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { @@ -983,25 +959,16 @@ } }, "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/append-transform": { @@ -1025,15 +992,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", @@ -1043,15 +1001,6 @@ "node": ">=0.10.0" } }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "dev": true, @@ -1067,15 +1016,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -1134,15 +1074,6 @@ "node": ">=6" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.findlastindex": { "version": "1.2.5", "dev": true, @@ -1225,27 +1156,15 @@ "node": ">=0.10.0" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/async-each": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", - "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, "node_modules/async-function": { "version": "1.0.0", "dev": true, @@ -1254,111 +1173,124 @@ "node": ">= 0.4" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/ava": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ava/-/ava-1.4.1.tgz", - "integrity": "sha512-wKpgOPTL7hJSBWpfbU4SA8rlsTZrph9g9g7qYDV7M6uK1rKeW8oCUJWRwCd8B24S4N0Y5myf6cTEnA66WIk0sA==", - "dev": true, - "dependencies": { - "@ava/babel-preset-stage-4": "^2.0.0", - "@ava/babel-preset-transform-test-files": "^5.0.0", - "@ava/write-file-atomic": "^2.2.0", - "@babel/core": "^7.4.0", - "@babel/generator": "^7.4.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-2.4.0.tgz", + "integrity": "sha512-CQWtzZZZeU2g4StojRv6MO9RIRi4sLxGSB9+3C3hv0ttUEG1tkJLTLyrBQeFS4WEeK12Z4ovE3f2iPVhSy8elA==", + "dev": true, + "dependencies": { + "@ava/babel-preset-stage-4": "^4.0.0", + "@ava/babel-preset-transform-test-files": "^6.0.0", + "@babel/core": "^7.6.0", + "@babel/generator": "^7.6.0", "@concordance/react": "^2.0.0", - "ansi-escapes": "^3.2.0", - "ansi-styles": "^3.2.1", + "ansi-escapes": "^4.2.1", + "ansi-styles": "^4.1.0", "arr-flatten": "^1.1.0", - "array-union": "^1.0.1", - "array-uniq": "^2.0.0", - "arrify": "^1.0.0", - "bluebird": "^3.5.3", + "array-union": "^2.1.0", + "array-uniq": "^2.1.0", + "arrify": "^2.0.1", + "bluebird": "^3.5.5", "chalk": "^2.4.2", - "chokidar": "^2.1.5", + "chokidar": "^3.0.2", "chunkd": "^1.0.0", "ci-parallel-vars": "^1.0.0", - "clean-stack": "^2.0.0", + "clean-stack": "^2.2.0", "clean-yaml-object": "^0.1.0", - "cli-cursor": "^2.1.0", - "cli-truncate": "^1.1.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.0.0", "code-excerpt": "^2.1.1", "common-path-prefix": "^1.0.0", "concordance": "^4.0.0", "convert-source-map": "^1.6.0", "currently-unhandled": "^0.4.1", "debug": "^4.1.1", - "del": "^4.0.0", - "dot-prop": "^4.2.0", + "del": "^4.1.1", + "dot-prop": "^5.1.0", "emittery": "^0.4.1", "empower-core": "^1.2.0", "equal-length": "^1.0.0", - "escape-string-regexp": "^1.0.5", - "esm": "^3.2.20", - "figures": "^2.0.0", - "find-up": "^3.0.0", - "get-port": "^4.2.0", - "globby": "^7.1.1", + "escape-string-regexp": "^2.0.0", + "esm": "^3.2.25", + "figures": "^3.0.0", + "find-up": "^4.1.0", + "get-port": "^5.0.0", + "globby": "^10.0.1", "ignore-by-default": "^1.0.0", - "import-local": "^2.0.0", - "indent-string": "^3.2.0", + "import-local": "^3.0.2", + "indent-string": "^4.0.0", "is-ci": "^2.0.0", - "is-error": "^2.2.1", - "is-observable": "^1.1.0", - "is-plain-object": "^2.0.4", + "is-error": "^2.2.2", + "is-observable": "^2.0.0", + "is-plain-object": "^3.0.0", "is-promise": "^2.1.0", - "lodash.clone": "^4.5.0", - "lodash.clonedeep": "^4.5.0", - "lodash.clonedeepwith": "^4.5.0", - "lodash.debounce": "^4.0.3", - "lodash.difference": "^4.3.0", - "lodash.flatten": "^4.2.0", - "loud-rejection": "^1.2.0", - "make-dir": "^2.1.0", - "matcher": "^1.1.1", - "md5-hex": "^2.0.0", + "lodash": "^4.17.15", + "loud-rejection": "^2.1.0", + "make-dir": "^3.0.0", + "matcher": "^2.0.0", + "md5-hex": "^3.0.1", "meow": "^5.0.0", - "ms": "^2.1.1", - "multimatch": "^3.0.0", - "observable-to-promise": "^0.5.0", - "ora": "^3.2.0", - "package-hash": "^3.0.0", - "pkg-conf": "^3.0.0", - "plur": "^3.0.1", - "pretty-ms": "^4.0.0", + "micromatch": "^4.0.2", + "ms": "^2.1.2", + "observable-to-promise": "^1.0.0", + "ora": "^3.4.0", + "package-hash": "^4.0.0", + "pkg-conf": "^3.1.0", + "plur": "^3.1.1", + "pretty-ms": "^5.0.0", "require-precompiled": "^0.1.0", - "resolve-cwd": "^2.0.0", - "slash": "^2.0.0", - "source-map-support": "^0.5.11", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "source-map-support": "^0.5.13", "stack-utils": "^1.0.2", "strip-ansi": "^5.2.0", - "strip-bom-buf": "^1.0.0", + "strip-bom-buf": "^2.0.0", "supertap": "^1.0.0", - "supports-color": "^6.1.0", + "supports-color": "^7.0.0", "trim-off-newlines": "^1.0.1", "trim-right": "^1.0.1", "unique-temp-dir": "^1.0.0", - "update-notifier": "^2.5.0" + "update-notifier": "^3.0.1", + "write-file-atomic": "^3.0.0" }, "bin": { "ava": "cli.js" }, "engines": { - "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" + } + }, + "node_modules/ava/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ava/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/ava/node_modules/chalk": { @@ -1375,6 +1307,42 @@ "node": ">=4" } }, + "node_modules/ava/node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ava/node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ava/node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/ava/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/ava/node_modules/chalk/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1387,88 +1355,207 @@ "node": ">=4" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", + "node_modules/ava/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/babel-plugin-espower": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-3.0.1.tgz", - "integrity": "sha512-Ms49U7VIAtQ/TtcqRbD6UBmJBUCSxiC3+zPc+eGqxKUIFO1lTshyEDRUjhoAbd2rWfwYf3cZ62oXozrd8W6J0A==", + "node_modules/ava/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "call-matcher": "^1.0.0", - "core-js": "^2.0.0", - "espower-location-detector": "^1.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.1.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" + "node_modules/ava/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/ava/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "node_modules/ava/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "node_modules/ava/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "node_modules/ava/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "optional": true, "dependencies": { - "file-uri-to-path": "1.0.0" - } + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/loud-rejection": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", + "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ava/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-plugin-espower": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-3.0.1.tgz", + "integrity": "sha512-Ms49U7VIAtQ/TtcqRbD6UBmJBUCSxiC3+zPc+eGqxKUIFO1lTshyEDRUjhoAbd2rWfwYf3cZ62oXozrd8W6J0A==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "call-matcher": "^1.0.0", + "core-js": "^2.0.0", + "espower-location-detector": "^1.0.0", + "espurify": "^1.6.0", + "estraverse": "^4.1.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/bluebird": { "version": "3.7.2", @@ -1476,22 +1563,38 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true + }, "node_modules/boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", "dev": true, "dependencies": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", "term-size": "^1.2.0", + "type-fest": "^0.3.0", "widest-line": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/boxen/node_modules/chalk": { @@ -1508,6 +1611,35 @@ "node": ">=4" } }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/boxen/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/boxen/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1520,6 +1652,15 @@ "node": ">=4" } }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -1530,24 +1671,14 @@ } }, "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/browserslist": { @@ -1587,63 +1718,72 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/caching-transform": { - "version": "4.0.0", + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, - "license": "MIT", "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "pump": "^3.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caching-transform/node_modules/make-dir": { + "node_modules/cacheable-request/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "node_modules/cacheable-request/node_modules/keyv": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, - "license": "MIT", "dependencies": { - "semver": "^6.0.0" - }, + "json-buffer": "3.0.0" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caching-transform/node_modules/package-hash": { + "node_modules/caching-transform": { "version": "4.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.15", "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, "engines": { "node": ">=8" @@ -1764,18 +1904,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/capture-stack-trace": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", - "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -1821,45 +1949,28 @@ "dev": true, "license": "MIT" }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" }, "optionalDependencies": { - "fsevents": "^1.2.7" + "fsevents": "~2.3.2" } }, "node_modules/chunkd": { @@ -1879,46 +1990,6 @@ "dev": true, "license": "MIT" }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "dev": true, @@ -1937,12 +2008,15 @@ } }, "node_modules/cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-cursor": { @@ -1970,16 +2044,19 @@ } }, "node_modules/cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "dependencies": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { @@ -2000,27 +2077,6 @@ "node": ">=8" } }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", "dev": true, @@ -2041,6 +2097,18 @@ "node": ">=0.8" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/code-excerpt": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.1.tgz", @@ -2065,19 +2133,6 @@ "node": ">=0.8.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "dev": true, @@ -2102,15 +2157,6 @@ "dev": true, "license": "MIT" }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -2148,22 +2194,43 @@ } }, "node_modules/configstore": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", - "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "dev": true, + "dependencies": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/configstore/node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dev": true, "dependencies": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "is-obj": "^1.0.0" }, "engines": { "node": ">=4" } }, + "node_modules/configstore/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/configstore/node_modules/make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -2215,15 +2282,6 @@ "node": ">= 4" } }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -2232,24 +2290,6 @@ "dev": true, "hasInstallScript": true }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", - "dev": true, - "dependencies": { - "capture-stack-trace": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "dev": true, @@ -2393,13 +2433,16 @@ "node": ">=0.10.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, "engines": { - "node": ">=0.10" + "node": ">=4" } }, "node_modules/deep-equal": { @@ -2462,6 +2505,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, "node_modules/define-data-property": { "version": "1.1.4", "dev": true, @@ -2494,19 +2543,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -2551,15 +2587,24 @@ } }, "node_modules/dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { - "path-type": "^3.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/doctrine": { @@ -2574,15 +2619,15 @@ } }, "node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "dependencies": { - "is-obj": "^1.0.0" + "is-obj": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/dunder-proto": { @@ -3325,107 +3370,6 @@ "which": "bin/which" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "dev": true, @@ -3451,64 +3395,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/braces": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/fill-range": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-glob/node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/fast-glob/node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "dev": true, @@ -3527,15 +3413,18 @@ } }, "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { @@ -3549,26 +3438,15 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/find-cache-dir": { @@ -3587,73 +3465,6 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -3707,18 +3518,9 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { @@ -3747,18 +3549,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fromentries": { "version": "1.3.2", "dev": true, @@ -3784,22 +3574,17 @@ "license": "ISC" }, "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, "engines": { - "node": ">= 4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { @@ -3884,12 +3669,15 @@ } }, "node_modules/get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-proto": { @@ -3930,15 +3718,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/glob": { "version": "7.2.3", "dev": true, @@ -3959,25 +3738,14 @@ } }, "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "is-extglob": "^2.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, "node_modules/global-dirs": { @@ -4016,44 +3784,31 @@ } }, "node_modules/globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "node_modules/globby/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/globby/node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "node_modules/globby/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/gopd": { @@ -4068,34 +3823,25 @@ } }, "node_modules/got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "dependencies": { - "create-error-class": "^3.0.0", + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=8.6" } }, "node_modules/graceful-fs": { @@ -4177,43 +3923,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/hasha": { @@ -4263,6 +3979,12 @@ "dev": true, "license": "MIT" }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "node_modules/ignore": { "version": "5.3.2", "dev": true, @@ -4302,19 +4024,22 @@ } }, "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { @@ -4383,18 +4108,6 @@ "node": ">=6" } }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", - "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-arguments": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", @@ -4466,15 +4179,15 @@ } }, "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-boolean-object": { @@ -4492,12 +4205,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "node_modules/is-callable": { "version": "1.2.7", "dev": true, @@ -4534,18 +4241,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", - "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/is-data-view": { "version": "1.0.2", "dev": true, @@ -4577,34 +4272,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/is-error": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", "dev": true }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "license": "MIT", @@ -4627,12 +4300,12 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/is-generator-function": { @@ -4699,24 +4372,20 @@ } }, "node_modules/is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, "node_modules/is-number-object": { @@ -4735,24 +4404,24 @@ } }, "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", "dev": true, - "dependencies": { - "symbol-observable": "^1.1.0" - }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-path-cwd": { @@ -4806,13 +4475,10 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } @@ -4823,15 +4489,6 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, - "node_modules/is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.2.1", "dev": true, @@ -4849,15 +4506,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-set": { "version": "2.0.3", "dev": true, @@ -5000,25 +4648,16 @@ "node": ">=0.10.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "dev": true, @@ -5118,14 +4757,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "dev": true, @@ -5151,17 +4782,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "dev": true, @@ -5271,28 +4891,16 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dev": true, "dependencies": { - "package-json": "^4.0.0" + "package-json": "^6.3.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/levn": { @@ -5354,11 +4962,10 @@ "node": ">=6" } }, - "node_modules/lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==", - "deprecated": "This package is deprecated. Use structuredClone instead.", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "node_modules/lodash.clonedeep": { @@ -5367,30 +4974,6 @@ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true }, - "node_modules/lodash.clonedeepwith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "dev": true, @@ -5476,34 +5059,18 @@ } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/map-obj": { @@ -5515,28 +5082,25 @@ "node": ">=4" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "node_modules/matcher": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", + "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", "dev": true, "dependencies": { - "object-visit": "^1.0.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.4" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/math-intrinsics": { @@ -5593,61 +5157,15 @@ } }, "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "is-plain-object": "^2.0.4" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, "node_modules/mimic-fn": { @@ -5659,6 +5177,15 @@ "node": ">=4" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -5691,31 +5218,6 @@ "node": ">= 4" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -5733,84 +5235,6 @@ "dev": true, "license": "MIT" }, - "node_modules/multimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", - "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", - "dev": true, - "dependencies": { - "array-differ": "^2.0.3", - "array-union": "^1.0.2", - "arrify": "^1.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -5866,6 +5290,15 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/npm-run-path": { "version": "2.0.2", "license": "MIT", @@ -5946,20 +5379,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", "dev": true, @@ -6021,45 +5440,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "dev": true, @@ -6095,18 +5475,6 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.7", "dev": true, @@ -6169,18 +5537,6 @@ "node": ">= 0.4" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.values": { "version": "1.2.1", "dev": true, @@ -6199,37 +5555,16 @@ } }, "node_modules/observable-to-promise": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", - "integrity": "sha512-B3ZhUUBClpKKhfU7Y6gbmlG5o1HhinxcvH+KyFTSdKPw4xzvShYwqrze0b1hqGXInJrtqz8K11y9v8CMEWJzWQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-1.0.0.tgz", + "integrity": "sha512-cqnGUrNsE6vdVDTPAX9/WeVzwy/z37vdxupdQXU8vgTXRFH72KCZiZga8aca2ulRPIeem8W3vW9rQHBwfIl2WA==", "dev": true, "dependencies": { - "is-observable": "^0.2.0", + "is-observable": "^2.0.0", "symbol-observable": "^1.0.4" }, "engines": { - "node": ">=4" - } - }, - "node_modules/observable-to-promise/node_modules/is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha512-4JymFIKLU+QyN0J+Q1YMWGXGF/FbL/RPkr5R9UlTdvWmSYRQPeoub00WZ4EiWOEVxWz/djoPxNFF+iuBSJzYCw==", - "dev": true, - "dependencies": { - "symbol-observable": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/observable-to-promise/node_modules/is-observable/node_modules/symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha512-6WFhZ1sqIAG3g55T6RJcOYldJmFrdsnM7adeuFUp1aJwo9EWwMFC0zYHNGGyDvJU/aqPzkQyIsMdNek1u9oRzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/once": { @@ -6335,6 +5670,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/p-finally": { "version": "1.0.0", "license": "MIT", @@ -6386,54 +5730,33 @@ } }, "node_modules/package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "dependencies": { "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", + "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash/node_modules/hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==", - "dev": true, - "dependencies": { - "is-stream": "^1.0.1" - }, - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dev": true, "dependencies": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">=8" } }, "node_modules/parent-module": { @@ -6469,21 +5792,6 @@ "node": ">=6" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -6591,23 +5899,69 @@ "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", "dev": true, "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/plur": { @@ -6622,15 +5976,6 @@ "node": ">=6" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "dev": true, @@ -6648,32 +5993,29 @@ } }, "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/pretty-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-4.0.0.tgz", - "integrity": "sha512-qG66ahoLCwpLXD09ZPHSCbUWYTqdosB7SMP4OffgTgL2PBKXMuUsrk5Bwg8q4qPkjTXsKBMr+YK3Ltd/6F9s/Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz", + "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==", "dev": true, "dependencies": { - "parse-ms": "^2.0.0" + "parse-ms": "^2.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "node_modules/process-on-spawn": { "version": "1.1.0", "dev": true, @@ -6876,33 +6218,16 @@ "node": ">=4" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=0.10" + "node": ">=8.10.0" } }, "node_modules/rechoir": { @@ -6966,44 +6291,6 @@ "node": ">=4" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "dev": true, @@ -7041,25 +6328,27 @@ } }, "node_modules/registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "dev": true, "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "dev": true, "dependencies": { - "rc": "^1.0.1" + "rc": "^1.2.8" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/regjsgen": { @@ -7103,30 +6392,6 @@ "node": ">=4" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "dev": true, @@ -7168,24 +6433,24 @@ } }, "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/resolve-from": { @@ -7196,12 +6461,14 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } }, "node_modules/restore-cursor": { "version": "2.0.0", @@ -7216,15 +6483,6 @@ "node": ">=4" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/reusify": { "version": "1.1.0", "license": "MIT", @@ -7290,12 +6548,6 @@ "dev": true, "license": "MIT" }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/safe-push-apply": { "version": "1.0.0", "dev": true, @@ -7316,15 +6568,6 @@ "dev": true, "license": "MIT" }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safe-regex-test": { "version": "1.1.0", "dev": true, @@ -7427,21 +6670,6 @@ "node": ">= 0.4" } }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "dev": true, @@ -7631,130 +6859,59 @@ "license": "ISC" }, "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "kind-of": "^3.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" + "node": ">=8" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" + "node": ">=7.0.0" } }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/source-map": { @@ -7766,20 +6923,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -7799,13 +6942,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, "node_modules/spawn-wrap": { "version": "2.0.0", "dev": true, @@ -7834,20 +6970,6 @@ "node": ">=8.0.0" } }, - "node_modules/spawn-wrap/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/spawn-wrap/node_modules/rimraf": { "version": "3.0.2", "dev": true, @@ -7894,43 +7016,6 @@ "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, @@ -7957,85 +7042,39 @@ "node": ">=8" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/string.prototype.trim": { @@ -8112,15 +7151,15 @@ } }, "node_modules/strip-bom-buf": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", - "integrity": "sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz", + "integrity": "sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==", "dev": true, "dependencies": { "is-utf8": "^0.2.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-eof": { @@ -8210,15 +7249,24 @@ } }, "node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -8366,78 +7414,24 @@ "node": ">=4" } }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { - "is-plain-object": "^2.0.4" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, "node_modules/travis-check-changes": { @@ -8677,21 +7671,6 @@ "node": ">=4" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -8718,73 +7697,6 @@ "node": ">=0.10.0" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.3", "dev": true, @@ -8815,24 +7727,26 @@ } }, "node_modules/update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", "dev": true, "dependencies": { - "boxen": "^1.2.1", + "boxen": "^3.0.0", "chalk": "^2.0.1", - "configstore": "^3.0.0", + "configstore": "^4.0.0", + "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", + "is-ci": "^2.0.0", "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", + "is-npm": "^3.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/update-notifier/node_modules/chalk": { @@ -8849,24 +7763,6 @@ "node": ">=4" } }, - "node_modules/update-notifier/node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "node_modules/update-notifier/node_modules/is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "dependencies": { - "ci-info": "^1.5.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/update-notifier/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -8887,40 +7783,18 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dev": true, "dependencies": { - "prepend-http": "^1.0.1" + "prepend-http": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, "node_modules/uuid": { "version": "8.3.2", "dev": true, @@ -9073,6 +7947,49 @@ "node": ">=4" } }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "dev": true, @@ -9132,27 +8049,6 @@ "dev": true, "license": "MIT" }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", "dev": true, @@ -9237,14 +8133,6 @@ "camelcase": "^4.1.0" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/camelcase": { "version": "5.3.1", "dev": true, @@ -9265,14 +8153,6 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/locate-path": { "version": "5.0.0", "dev": true, @@ -9303,30 +8183,6 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/yargs-parser": { "version": "18.1.3", "dev": true, diff --git a/package.json b/package.json index 2340c32c9..b34fd6dfe 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,8 @@ "scripts": { "check-node-support": "node scripts/check-node-support", "posttest": "npm run lint", - "test": "ava test/*.js", - "test-with-coverage": "nyc --reporter=text --reporter=lcov ava test/*.js", + "test": "ava", + "test-with-coverage": "nyc --reporter=text --reporter=lcov ava", "gendocs": "node scripts/generate-docs", "lint": "eslint .", "after-travis": "travis-check-changes", @@ -61,10 +61,17 @@ }, "ava": { "serial": true, - "powerAssert": false + "powerAssert": false, + "files": [ + "test/*.js" + ], + "helpers": [ + "test/resources/**", + "test/utils/**" + ] }, "devDependencies": { - "ava": "^1.4.1", + "ava": "^2.4.0", "chalk": "^4.1.2", "coffee-script": "^1.12.7", "eslint": "^8.2.0", From 127409cad8836ce9b467538709f1e785fc609f98 Mon Sep 17 00:00:00 2001 From: Aaron Haaf <7560635+Everspace@users.noreply.github.com> Date: Sat, 8 Mar 2025 14:33:52 -0800 Subject: [PATCH 291/338] Explicitly require commands (#1119) Currently anything that includes shelljs in it's chain cannot be bundled into a singular file due to the dynamic require. By explicitly requiring everything in src, this allows singular bundles through things like esbuild. --- shell.js | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/shell.js b/shell.js index 4b7ab8486..fe689f119 100644 --- a/shell.js +++ b/shell.js @@ -21,9 +21,40 @@ var common = require('./src/common'); //@commands // Load all default commands -require('./commands').forEach(function (command) { - require('./src/' + command); -}); +require('./src/cat'); +require('./src/cd'); +require('./src/chmod'); +require('./src/cmd'); +require('./src/common'); +require('./src/cp'); +require('./src/dirs'); +require('./src/echo'); +require('./src/error'); +require('./src/errorCode'); +// require('./src/exec-child'); excluded since it is for commandline only +require('./src/exec'); +require('./src/find'); +require('./src/grep'); +require('./src/head'); +require('./src/ln'); +require('./src/ls'); +require('./src/mkdir'); +require('./src/mv'); +require('./src/popd'); +require('./src/pushd'); +require('./src/pwd'); +require('./src/rm'); +require('./src/sed'); +require('./src/set'); +require('./src/sort'); +require('./src/tail'); +require('./src/tempdir'); +require('./src/test'); +require('./src/to'); +require('./src/toEnd'); +require('./src/touch'); +require('./src/uniq'); +require('./src/which'); //@ //@ ### exit(code) From 1b3904aa8e96123b2589dc4bbeb062f8ac398df8 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 14:35:34 -0800 Subject: [PATCH 292/338] refactor: follow up fixes for static imports No change to logic. This is a follow up to PR #1119. This change: * Deletes commands.js entirely and edits the 'files' section of package.json * Undoes some duplicate imports (ex. src/error) * Adds an explicit import for exec-child.js as a hint for the bundler After this change, I expect that bundlers/minifiers such as esbuild will now correctly process shelljs. Fixes #1160 --- commands.js | 31 ------------------------------- package.json | 1 - shell.js | 8 +++----- 3 files changed, 3 insertions(+), 37 deletions(-) delete mode 100644 commands.js diff --git a/commands.js b/commands.js deleted file mode 100644 index fa6405388..000000000 --- a/commands.js +++ /dev/null @@ -1,31 +0,0 @@ -module.exports = [ - 'cat', - 'cd', - 'chmod', - 'cmd', - 'cp', - 'dirs', - 'echo', - 'exec', - 'exec-child', - 'find', - 'grep', - 'head', - 'ln', - 'ls', - 'mkdir', - 'mv', - 'pwd', - 'rm', - 'sed', - 'set', - 'sort', - 'tail', - 'tempdir', - 'test', - 'to', - 'toEnd', - 'touch', - 'uniq', - 'which', -]; diff --git a/package.json b/package.json index b34fd6dfe..da4a966b9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "./make.js": "./make.js" }, "files": [ - "commands.js", "global.js", "make.js", "plugin.js", diff --git a/shell.js b/shell.js index fe689f119..fc4bbfa55 100644 --- a/shell.js +++ b/shell.js @@ -20,19 +20,17 @@ var common = require('./src/common'); // Include the docs for all the default commands //@commands -// Load all default commands +// Load all default commands. We import these for their side effect of loading +// using the plugin architecture via `common.register()`. require('./src/cat'); require('./src/cd'); require('./src/chmod'); require('./src/cmd'); -require('./src/common'); require('./src/cp'); require('./src/dirs'); require('./src/echo'); -require('./src/error'); -require('./src/errorCode'); -// require('./src/exec-child'); excluded since it is for commandline only require('./src/exec'); +require('./src/exec-child'); // A hint to the bundler to keep exec-child.js require('./src/find'); require('./src/grep'); require('./src/head'); From b6f26c50cbdc50f09d546f137aa28a4682187628 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 14:57:53 -0800 Subject: [PATCH 293/338] docs(changelog): updated by Nate Fischer Manual changelog update for v0.8.4 and v0.8.5 releases. This also removes the 'Unreleased' section since it isn't that useful in a changelog document. I'm manually updating because it looks like https://github.com/skywinder/gitlab-changelog-generator is not working at the moment (this is what shelljs-changelog depends on). --- CHANGELOG.md | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3afb73026..c30d70896 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,32 +1,14 @@ # Change Log -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) +## [v0.8.5](https://github.com/shelljs/shelljs/tree/v0.8.5) (2022-01-13) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.4...v0.8.5) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.3...HEAD) +This was a small security fix for [\#1058](https://github.com/shelljs/shelljs/issues/1058). -**Closed issues:** - -- find returns empty array even though directory has files [\#922](https://github.com/shelljs/shelljs/issues/922) -- exec\(\) should support node v10 \(maxbuffer change\) [\#915](https://github.com/shelljs/shelljs/issues/915) -- grep exit status and extra newlines [\#900](https://github.com/shelljs/shelljs/issues/900) -- Travis CI currently broken [\#893](https://github.com/shelljs/shelljs/issues/893) -- Drop node v4 support [\#873](https://github.com/shelljs/shelljs/issues/873) -- cp -Ru respects the -R but not the -u [\#808](https://github.com/shelljs/shelljs/issues/808) - -**Merged pull requests:** +## [v0.8.4](https://github.com/shelljs/shelljs/tree/v0.8.4) (2020-04-24) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.3...v0.8.4) -- feat\(options\): initial support for long options [\#926](https://github.com/shelljs/shelljs/pull/926) ([nfischer](https://github.com/nfischer)) -- test\(touch\): add coverage for -d option [\#925](https://github.com/shelljs/shelljs/pull/925) ([nfischer](https://github.com/nfischer)) -- chore\(node\): add v10 and v11 to CI [\#921](https://github.com/shelljs/shelljs/pull/921) ([nfischer](https://github.com/nfischer)) -- chore\(test\): no coverage by default [\#920](https://github.com/shelljs/shelljs/pull/920) ([nfischer](https://github.com/nfischer)) -- fix\(exec\): consistent error message for maxBuffer [\#919](https://github.com/shelljs/shelljs/pull/919) ([nfischer](https://github.com/nfischer)) -- chore\(node\): drop node v4 and v5 [\#917](https://github.com/shelljs/shelljs/pull/917) ([nfischer](https://github.com/nfischer)) -- chore: script to bump supported node versions [\#913](https://github.com/shelljs/shelljs/pull/913) ([nfischer](https://github.com/nfischer)) -- chore\(npm\): remove lockfile [\#911](https://github.com/shelljs/shelljs/pull/911) ([nfischer](https://github.com/nfischer)) -- ci: change language to node\_js and remove obsolete scripts [\#910](https://github.com/shelljs/shelljs/pull/910) ([DanielRuf](https://github.com/DanielRuf)) -- chore: remove gitter integration [\#907](https://github.com/shelljs/shelljs/pull/907) ([nfischer](https://github.com/nfischer)) -- fix: Exit 1 with empty string if no match [\#901](https://github.com/shelljs/shelljs/pull/901) ([wyardley](https://github.com/wyardley)) -- feat\(cp\): support update flag when recursing [\#889](https://github.com/shelljs/shelljs/pull/889) ([joshi-sh](https://github.com/joshi-sh)) +Small patch release to fix a circular dependency warning in node v14. See [\#973](https://github.com/shelljs/shelljs/issues/973). ## [v0.8.3](https://github.com/shelljs/shelljs/tree/v0.8.3) (2018-11-13) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.8.2...v0.8.3) @@ -966,4 +948,4 @@ ## [v0.0.2pre1](https://github.com/shelljs/shelljs/tree/v0.0.2pre1) (2012-03-03) -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* From 7d8839300630678feacf3c3a66bd016a97503659 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 15:02:06 -0800 Subject: [PATCH 294/338] 0.9.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d54c75dbc..ae1dd4028 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "shelljs", - "version": "0.8.3", + "version": "0.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "shelljs", - "version": "0.8.3", + "version": "0.9.0", "license": "BSD-3-Clause", "dependencies": { "execa": "^1.0.0", diff --git a/package.json b/package.json index da4a966b9..eba177337 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.8.3", + "version": "0.9.0", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From f08195a1fd45e0e036770fddb36103527404c5eb Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 15:28:24 -0800 Subject: [PATCH 295/338] fix: add global.js and plugin.js to exports list We intend for dependent projects to be able to import these files, so this adds them to the explicit list of supported exports. Fixes #1195 Test: tested this by running shelljs-plugin-open's test suite. --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index eba177337..addfe28ca 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,12 @@ "main": "./shell.js", "exports": { ".": "./shell.js", + "./global": "./global.js", + "./global.js": "./global.js", "./make": "./make.js", - "./make.js": "./make.js" + "./make.js": "./make.js", + "./plugin": "./plugin.js", + "./plugin.js": "./plugin.js" }, "files": [ "global.js", From 8c3c2ac38528a388ad27a5df758126a9d69a205a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 15:42:37 -0800 Subject: [PATCH 296/338] 0.9.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae1dd4028..aab7c3406 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "shelljs", - "version": "0.9.0", + "version": "0.9.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "shelljs", - "version": "0.9.0", + "version": "0.9.1", "license": "BSD-3-Clause", "dependencies": { "execa": "^1.0.0", diff --git a/package.json b/package.json index addfe28ca..d6e8c0160 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.9.0", + "version": "0.9.1", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 4fe8897b398deb4fe17a5e6712196e9093b3c3d3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 17:01:01 -0800 Subject: [PATCH 297/338] test: add tests for shelljs glob expansion No change to logic. This adds unit tests for glob expansion. This includes one test case for behavior which was broken by v0.9.0 (probably due to the switch to fastglob). This behavior hasn't been fixed yet, so the test is marked as skipped. Issue #1197 --- test/config.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/config.js b/test/config.js index 30ee84e61..b505a643d 100644 --- a/test/config.js +++ b/test/config.js @@ -84,6 +84,42 @@ test('config.globOptions expands directories by default', t => { t.deepEqual(result, expected); }); +test('config.globOptions handles non-wildcards by default', t => { + const result = common.expand(['test/resources/a.txt']); + const expected = [ + 'test/resources/a.txt', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions expands "?" symbol by default', t => { + const result = common.expand(['test/resources/file?.t*']); + const expected = [ + 'test/resources/file1.txt', + 'test/resources/file2.txt', + ]; + t.deepEqual(result, expected); +}); + +test('config.globOptions expands "*" in multiple path segments by default', t => { + const result = common.expand(['test/r*sources/file?.txt']); + const expected = [ + 'test/resources/file1.txt', + 'test/resources/file2.txt', + ]; + t.deepEqual(result, expected); +}); + +// https://github.com/shelljs/shelljs/issues/1197 +test.skip('config.globOptions expands "?" in folder path by default', t => { + const result = common.expand(['test/r?sources/file*.txt']); + const expected = [ + 'test/resources/file1.txt', + 'test/resources/file2.txt', + ]; + t.deepEqual(result, expected); +}); + test('config.globOptions respects cwd', t => { // Both node-glob and fast-glob call this option 'cwd'. shell.config.globOptions = { cwd: 'test' }; From c94a3979d0d1ce9d1918d16793b1b2b34b535e4a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 17:55:52 -0800 Subject: [PATCH 298/338] chore: remove unused env var No change to logic. This env variable isn't relevant since we dropped support for older node versions. --- .github/workflows/main.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f455517a9..7cede0ecb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,8 +2,6 @@ name: CI on: - push - pull_request -env: - ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true jobs: test: name: Node.js ${{ matrix.node-version }} on ${{ matrix.os }} From 0a47587c92f1d77789d670ce7b27e11a3bc4a103 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 8 Mar 2025 22:41:15 -0800 Subject: [PATCH 299/338] fix: add package.json to exports list No change to logic. shx has a dependency on shelljs/package.json so that it can read the ShellJS version number. This is useful for shx and probably harmless for other packages (we need to ship the package.json file anyway), so this adds it to the exports list as an optional export. Fixes #1195 Test: I ran `shx --version` with this copy of shelljs as the dependency --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index d6e8c0160..89a5319f6 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,8 @@ "./global.js": "./global.js", "./make": "./make.js", "./make.js": "./make.js", + "./package": "./package.json", + "./package.json": "./package.json", "./plugin": "./plugin.js", "./plugin.js": "./plugin.js" }, From b90139fb62b3188c290932d16169dd73e7643a85 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 16 Mar 2025 17:50:04 -0700 Subject: [PATCH 300/338] 0.9.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index aab7c3406..a50d8907a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "shelljs", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "shelljs", - "version": "0.9.1", + "version": "0.9.2", "license": "BSD-3-Clause", "dependencies": { "execa": "^1.0.0", diff --git a/package.json b/package.json index 89a5319f6..732ef887f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.9.1", + "version": "0.9.2", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 6434b5fed366e9f254b32a752ee98f57a44d5bd5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 16 Mar 2025 18:25:41 -0700 Subject: [PATCH 301/338] chore: update deps This updates shelljs-release, shx, and travis-check-changes to the latest versions. --- package-lock.json | 67 +++++++++++++++++++++++++++++++++++++---------- package.json | 6 ++--- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index a50d8907a..65a28c214 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,9 +27,9 @@ "js-yaml": "^4.1.0", "nyc": "^17.1.0", "shelljs-changelog": "^0.2.6", - "shelljs-release": "^0.5.2", - "shx": "^0.3.4", - "travis-check-changes": "^0.4.0" + "shelljs-release": "^0.5.3", + "shx": "^0.4.0", + "travis-check-changes": "^0.5.1" }, "engines": { "node": ">=18" @@ -6732,9 +6732,10 @@ } }, "node_modules/shelljs-release": { - "version": "0.5.2", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/shelljs-release/-/shelljs-release-0.5.3.tgz", + "integrity": "sha512-9L15opORTyWZSn7eIm+rmdo4hwgwf99bXqIAPS572KdX9KjqBcdex7FvOrCI8YxaAxosYfS73rVeJ22SkWIxGA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^2.4.1", "minimist": "^1.2.0", @@ -6772,18 +6773,37 @@ } }, "node_modules/shx": { - "version": "0.3.4", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", + "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", "dev": true, - "license": "MIT", "dependencies": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" + "minimist": "^1.2.8", + "shelljs": "^0.9.2" }, "bin": { "shx": "lib/cli.js" }, "engines": { - "node": ">=6" + "node": ">=18" + } + }, + "node_modules/shx/node_modules/shelljs": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", + "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "fast-glob": "^3.3.2", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=18" } }, "node_modules/side-channel": { @@ -7435,17 +7455,36 @@ } }, "node_modules/travis-check-changes": { - "version": "0.4.0", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.5.1.tgz", + "integrity": "sha512-nzhjOUiN8S+5lxzTV/208tQYkSSfB07sWrobSExj+/5hWOGFPxaz5DztZbku98ggsKXFd/wREOKVvWOyLl/JrQ==", "dev": true, - "license": "MIT", "dependencies": { - "shelljs": "^0.8.5" + "shelljs": "^0.9.2" }, "bin": { "travis-check-changes": "travis-check-changes.js" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/travis-check-changes/node_modules/shelljs": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", + "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "fast-glob": "^3.3.2", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=18" } }, "node_modules/trim-newlines": { diff --git a/package.json b/package.json index 732ef887f..b4872d32d 100644 --- a/package.json +++ b/package.json @@ -85,9 +85,9 @@ "js-yaml": "^4.1.0", "nyc": "^17.1.0", "shelljs-changelog": "^0.2.6", - "shelljs-release": "^0.5.2", - "shx": "^0.3.4", - "travis-check-changes": "^0.4.0" + "shelljs-release": "^0.5.3", + "shx": "^0.4.0", + "travis-check-changes": "^0.5.1" }, "engines": { "node": ">=18" From d43d91533ee0aea900b4c3527bd54e124b35032b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 23 Mar 2025 16:11:58 -0700 Subject: [PATCH 302/338] chore: rename master -> main No change to logic. This updates the main branch name. --- README.md | 2 +- RELEASE.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f5d622e2d..e585e4be2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ShellJS - Unix shell commands for Node.js [![GitHub Actions](https://img.shields.io/github/actions/workflow/status/shelljs/shelljs/main.yml?style=flat-square&logo=github)](https://github.com/shelljs/shelljs/actions/workflows/main.yml) -[![Codecov](https://img.shields.io/codecov/c/github/shelljs/shelljs/master.svg?style=flat-square&label=coverage)](https://codecov.io/gh/shelljs/shelljs) +[![Codecov](https://img.shields.io/codecov/c/github/shelljs/shelljs/main.svg?style=flat-square&label=coverage)](https://codecov.io/gh/shelljs/shelljs) [![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) [![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) diff --git a/RELEASE.md b/RELEASE.md index f0a46bec3..751cad391 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,6 +1,6 @@ # Release steps -1. Ensure master passes CI tests +1. Ensure main branch passes CI tests 2. Bump version, create tags, push, and release: - `$ npm run ` - `major` - breaking API changes @@ -10,3 +10,5 @@ - `$ npm run changelog` - Manually verify that the changelog makes sense - `$ git push` +4. Update https://github.com/shelljs/shelljs/releases to create a new release + from the latest git tag From 24ba6e24d278d7450b0cf4d54986b742059d2ec0 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 25 Mar 2025 16:27:15 -0700 Subject: [PATCH 303/338] refactor: avoid dependency cycle Prior to this change, there was a dependency cycle between shell.js and common.js. This refactors code to avoid the cycle. This was previously reported in #1133. Node.js already worked around the issue in v20.6.1, but it's simpler if we can avoid the dependency cycle on our end anyway. I tested this with `npm test` and also by running my own script which uses a shelljs plugin. This seems to work correctly in both cases. --- shell.js | 13 +++++++------ src/common.js | 4 +++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/shell.js b/shell.js index fc4bbfa55..af67968eb 100644 --- a/shell.js +++ b/shell.js @@ -7,6 +7,7 @@ // var common = require('./src/common'); +module.exports = common.shell; //@ //@ All commands run synchronously, unless otherwise stated. @@ -58,7 +59,7 @@ require('./src/which'); //@ ### exit(code) //@ //@ Exits the current process with the given exit `code`. -exports.exit = function exit(code) { +module.exports.exit = function exit(code) { common.state.error = null; common.state.errorCode = 0; if (code) { @@ -76,20 +77,20 @@ exports.exit = function exit(code) { }; //@include ./src/error.js -exports.error = require('./src/error'); +module.exports.error = require('./src/error'); //@include ./src/errorCode.js -exports.errorCode = require('./src/errorCode'); +module.exports.errorCode = require('./src/errorCode'); //@include ./src/common.js -exports.ShellString = common.ShellString; +module.exports.ShellString = common.ShellString; //@ //@ ### env['VAR_NAME'] //@ //@ Object containing environment variables (both getter and setter). Shortcut //@ to `process.env`. -exports.env = process.env; +module.exports.env = process.env; //@ //@ ### Pipes @@ -110,7 +111,7 @@ exports.env = process.env; //@ ## Configuration //@ -exports.config = common.config; +module.exports.config = common.config; //@ //@ ### config.silent diff --git a/src/common.js b/src/common.js index ecaf04471..1a19c741e 100644 --- a/src/common.js +++ b/src/common.js @@ -7,7 +7,9 @@ var os = require('os'); var fs = require('fs'); var glob = require('fast-glob'); -var shell = require('..'); + +var shell = {}; +exports.shell = shell; var shellMethods = Object.create(shell); From c836c7b6f3f7f7d75befa9e249d4a4f953e4fbb8 Mon Sep 17 00:00:00 2001 From: Alana Gilston Date: Fri, 4 Apr 2025 17:15:50 -0700 Subject: [PATCH 304/338] Enforce single quotes --- .editorconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.editorconfig b/.editorconfig index a35cd0dca..afe97de28 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,5 +10,8 @@ indent_style = space insert_final_newline = true trim_trailing_whitespace = true +[*.js] +quote_type = single + [*.{md,markdown}] trim_trailing_whitespace = false From 6ce29393d762a134397dcf648f72898374b463a3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 7 Apr 2025 21:31:05 -0700 Subject: [PATCH 305/338] chore: update deps --- package-lock.json | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65a28c214..4e7a54368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -304,23 +304,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -451,13 +453,14 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -481,9 +484,10 @@ } }, "node_modules/@babel/types": { - "version": "7.26.9", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" From 1a31356343f6ce50119cbfba9ba3a89bd08126af Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 7 Apr 2025 22:24:04 -0700 Subject: [PATCH 306/338] refactor: use require instead of import No change to logic. This swaps over tests to use require() since everything is currently designed for the commonjs module system. --- test/cat.js | 6 +++--- test/cd.js | 12 ++++++------ test/chmod.js | 10 +++++----- test/cmd.js | 6 +++--- test/common.js | 8 ++++---- test/config.js | 10 +++++----- test/cp.js | 10 +++++----- test/dirs.js | 6 +++--- test/echo.js | 8 ++++---- test/env.js | 4 ++-- test/exec.js | 14 +++++++------- test/exit.js | 6 +++--- test/find.js | 4 ++-- test/global.js | 8 ++++---- test/grep.js | 8 ++++---- test/head.js | 8 ++++---- test/ln.js | 10 +++++----- test/ls.js | 10 +++++----- test/mkdir.js | 10 +++++----- test/mv.js | 8 ++++---- test/pipe.js | 4 ++-- test/plugin.js | 6 +++--- test/popd.js | 8 ++++---- test/pushd.js | 8 ++++---- test/pwd.js | 8 ++++---- test/rm.js | 10 +++++----- test/sed.js | 8 ++++---- test/set.js | 6 +++--- test/shjs.js | 6 +++--- test/sort.js | 8 ++++---- test/tail.js | 8 ++++---- test/tempdir.js | 8 ++++---- test/test.js | 6 +++--- test/to.js | 8 ++++---- test/toEnd.js | 8 ++++---- test/touch.js | 12 ++++++------ test/uniq.js | 8 ++++---- test/which.js | 10 +++++----- 38 files changed, 153 insertions(+), 153 deletions(-) diff --git a/test/cat.js b/test/cat.js index cc21ce575..e077b9be9 100644 --- a/test/cat.js +++ b/test/cat.js @@ -1,8 +1,8 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); shell.config.silent = true; diff --git a/test/cd.js b/test/cd.js index c472973da..53404e249 100644 --- a/test/cd.js +++ b/test/cd.js @@ -1,11 +1,11 @@ -import fs from 'fs'; -import os from 'os'; -import path from 'path'; +const fs = require('fs'); +const os = require('os'); +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); const cur = shell.pwd().toString(); diff --git a/test/chmod.js b/test/chmod.js index 1e3bdacd4..660972c91 100644 --- a/test/chmod.js +++ b/test/chmod.js @@ -1,10 +1,10 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; -import utils from './utils/utils'; +const shell = require('..'); +const common = require('../src/common'); +const utils = require('./utils/utils'); let TMP; const BITMASK = parseInt('777', 8); diff --git a/test/cmd.js b/test/cmd.js index e455effd6..09a5756d7 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -1,8 +1,8 @@ -import path from 'path'; +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); const CWD = process.cwd(); diff --git a/test/common.js b/test/common.js index 0c007db8c..5f020cb67 100644 --- a/test/common.js +++ b/test/common.js @@ -1,8 +1,8 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; -import utils from './utils/utils'; +const shell = require('..'); +const common = require('../src/common'); +const utils = require('./utils/utils'); test.beforeEach(() => { shell.config.silent = true; diff --git a/test/config.js b/test/config.js index b505a643d..f48a60bac 100644 --- a/test/config.js +++ b/test/config.js @@ -1,10 +1,10 @@ -import path from 'path'; +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; -import utils from './utils/utils'; +const shell = require('..'); +const common = require('../src/common'); +const utils = require('./utils/utils'); // // Valids diff --git a/test/cp.js b/test/cp.js index 6f1d37f0e..d21e42e54 100644 --- a/test/cp.js +++ b/test/cp.js @@ -1,10 +1,10 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; -import utils from './utils/utils'; +const shell = require('..'); +const common = require('../src/common'); +const utils = require('./utils/utils'); const oldMaxDepth = shell.config.maxdepth; const CWD = process.cwd(); diff --git a/test/dirs.js b/test/dirs.js index 10d6e4d7f..44f82486a 100644 --- a/test/dirs.js +++ b/test/dirs.js @@ -1,8 +1,8 @@ -import path from 'path'; +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); test.beforeEach(() => { shell.config.resetForTesting(); diff --git a/test/echo.js b/test/echo.js index 9ae45139d..c6989ac1e 100644 --- a/test/echo.js +++ b/test/echo.js @@ -1,8 +1,8 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; -import mocks from './utils/mocks'; +const shell = require('..'); +const utils = require('./utils/utils'); +const mocks = require('./utils/mocks'); shell.config.silent = true; diff --git a/test/env.js b/test/env.js index 50a143545..a9f2c009e 100644 --- a/test/env.js +++ b/test/env.js @@ -1,6 +1,6 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); shell.config.silent = true; diff --git a/test/exec.js b/test/exec.js index a146fed38..6e59a1736 100644 --- a/test/exec.js +++ b/test/exec.js @@ -1,12 +1,12 @@ -import os from 'os'; -import path from 'path'; -import util from 'util'; +const os = require('os'); +const path = require('path'); +const util = require('util'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; -import mocks from './utils/mocks'; +const shell = require('..'); +const utils = require('./utils/utils'); +const mocks = require('./utils/mocks'); const CWD = process.cwd(); const ORIG_EXEC_PATH = shell.config.execPath; diff --git a/test/exit.js b/test/exit.js index 494f3c229..b0add2552 100644 --- a/test/exit.js +++ b/test/exit.js @@ -1,8 +1,8 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); -import mocks from './utils/mocks'; +const mocks = require('./utils/mocks'); // // Valids diff --git a/test/find.js b/test/find.js index b658c1b06..f698028df 100644 --- a/test/find.js +++ b/test/find.js @@ -1,6 +1,6 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); const CWD = process.cwd(); diff --git a/test/global.js b/test/global.js index c1b46e229..81227f00a 100644 --- a/test/global.js +++ b/test/global.js @@ -1,10 +1,10 @@ /* globals cat, config, cp, env, error, mkdir, rm */ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import '../global'; -import utils from './utils/utils'; +require('../global'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/grep.js b/test/grep.js index d632e737e..e12ab80f9 100644 --- a/test/grep.js +++ b/test/grep.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/head.js b/test/head.js index 57ec53a4e..8f5f91574 100644 --- a/test/head.js +++ b/test/head.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; +const shell = require('..'); +const common = require('../src/common'); shell.config.silent = true; diff --git a/test/ln.js b/test/ln.js index b16820584..1ef01eef4 100644 --- a/test/ln.js +++ b/test/ln.js @@ -1,10 +1,10 @@ -import fs from 'fs'; -import path from 'path'; +const fs = require('fs'); +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); const CWD = process.cwd(); diff --git a/test/ls.js b/test/ls.js index 3f97393bc..1c8ef6276 100644 --- a/test/ls.js +++ b/test/ls.js @@ -1,10 +1,10 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; -import utils from './utils/utils'; +const shell = require('..'); +const common = require('../src/common'); +const utils = require('./utils/utils'); const CWD = process.cwd(); diff --git a/test/mkdir.js b/test/mkdir.js index 55e12fa3a..f37b9f047 100644 --- a/test/mkdir.js +++ b/test/mkdir.js @@ -1,10 +1,10 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; -import utils from './utils/utils'; +const shell = require('..'); +const common = require('../src/common'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/mv.js b/test/mv.js index e7de32eb5..f6c34e6aa 100644 --- a/test/mv.js +++ b/test/mv.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); const CWD = process.cwd(); const numLines = utils.numLines; diff --git a/test/pipe.js b/test/pipe.js index ab75d944a..503de352e 100644 --- a/test/pipe.js +++ b/test/pipe.js @@ -1,6 +1,6 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); shell.config.silent = true; diff --git a/test/plugin.js b/test/plugin.js index 2f79ca15c..a6aad1555 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -1,8 +1,8 @@ -import test from 'ava'; +const test = require('ava'); // This is the supported order for importing these files -import plugin from '../plugin'; -import shell from '..'; +const plugin = require('../plugin'); +const shell = require('..'); let data = 0; let fname; diff --git a/test/popd.js b/test/popd.js index 7b66f40c6..e02880b75 100644 --- a/test/popd.js +++ b/test/popd.js @@ -1,9 +1,9 @@ -import path from 'path'; +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import mocks from './utils/mocks'; +const shell = require('..'); +const mocks = require('./utils/mocks'); const rootDir = path.resolve(); diff --git a/test/pushd.js b/test/pushd.js index b6766c422..987dc093d 100644 --- a/test/pushd.js +++ b/test/pushd.js @@ -1,9 +1,9 @@ -import path from 'path'; +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import mocks from './utils/mocks'; +const shell = require('..'); +const mocks = require('./utils/mocks'); const rootDir = path.resolve(); diff --git a/test/pwd.js b/test/pwd.js index ce55b76ce..6e6534cc5 100644 --- a/test/pwd.js +++ b/test/pwd.js @@ -1,9 +1,9 @@ -import path from 'path'; +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); const cur = process.cwd(); diff --git a/test/rm.js b/test/rm.js index 0001d9a23..01efd7c0b 100644 --- a/test/rm.js +++ b/test/rm.js @@ -1,10 +1,10 @@ -import fs from 'fs'; -import path from 'path'; +const fs = require('fs'); +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/sed.js b/test/sed.js index 7010e0851..fa0d41810 100644 --- a/test/sed.js +++ b/test/sed.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/set.js b/test/set.js index 218c4c7eb..94c0a0bfa 100644 --- a/test/set.js +++ b/test/set.js @@ -1,7 +1,7 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); const oldConfigSilent = shell.config.silent; const uncaughtErrorExitCode = 1; diff --git a/test/shjs.js b/test/shjs.js index 850a60f93..50ff61462 100644 --- a/test/shjs.js +++ b/test/shjs.js @@ -1,8 +1,8 @@ -import path from 'path'; +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; +const shell = require('..'); const binPath = path.resolve(__dirname, '../bin/shjs'); diff --git a/test/sort.js b/test/sort.js index d5bdc3477..ac716e87c 100644 --- a/test/sort.js +++ b/test/sort.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; +const shell = require('..'); +const common = require('../src/common'); shell.config.silent = true; diff --git a/test/tail.js b/test/tail.js index c45417148..158b45d8f 100644 --- a/test/tail.js +++ b/test/tail.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; +const shell = require('..'); +const common = require('../src/common'); shell.config.silent = true; diff --git a/test/tempdir.js b/test/tempdir.js index c9c24754f..5590667e7 100644 --- a/test/tempdir.js +++ b/test/tempdir.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import { isCached, clearCache } from '../src/tempdir'; +const shell = require('..'); +const { isCached, clearCache } = require('../src/tempdir'); shell.config.silent = true; diff --git a/test/test.js b/test/test.js index 40a1778cb..1b42057ae 100644 --- a/test/test.js +++ b/test/test.js @@ -1,7 +1,7 @@ -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); shell.config.silent = true; diff --git a/test/to.js b/test/to.js index d1d813515..4669052eb 100644 --- a/test/to.js +++ b/test/to.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/toEnd.js b/test/toEnd.js index 17781d0fd..4e8417396 100644 --- a/test/toEnd.js +++ b/test/toEnd.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/touch.js b/test/touch.js index ee490041c..c767eafcd 100644 --- a/test/touch.js +++ b/test/touch.js @@ -1,11 +1,11 @@ -import crypto from 'crypto'; -import fs from 'fs'; +const crypto = require('crypto'); +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; -import utils from './utils/utils'; +const shell = require('..'); +const common = require('../src/common'); +const utils = require('./utils/utils'); test.beforeEach(t => { t.context.tmp = utils.getTempDir(); diff --git a/test/uniq.js b/test/uniq.js index 51881ff90..72611df83 100644 --- a/test/uniq.js +++ b/test/uniq.js @@ -1,9 +1,9 @@ -import fs from 'fs'; +const fs = require('fs'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import common from '../src/common'; +const shell = require('..'); +const common = require('../src/common'); shell.config.silent = true; diff --git a/test/which.js b/test/which.js index 1a41da9d4..c49eb06d4 100644 --- a/test/which.js +++ b/test/which.js @@ -1,10 +1,10 @@ -import fs from 'fs'; -import path from 'path'; +const fs = require('fs'); +const path = require('path'); -import test from 'ava'; +const test = require('ava'); -import shell from '..'; -import utils from './utils/utils'; +const shell = require('..'); +const utils = require('./utils/utils'); shell.config.silent = true; From dbac0a724d3d8e8579903c8ae427880e193712a5 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 7 Apr 2025 22:36:23 -0700 Subject: [PATCH 307/338] refactor: use promises for utils.runScript No change to logic. This swaps out utils.runScript() to return a Promise instead of taking a callback. This also moves some of `test.cb()` cases over to async functions instead. --- test/common.js | 16 +++++++--------- test/config.js | 16 ++++++---------- test/utils/utils.js | 6 ++++-- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/test/common.js b/test/common.js index 5f020cb67..76e292be2 100644 --- a/test/common.js +++ b/test/common.js @@ -310,16 +310,14 @@ test('Some basic tests on the ShellString type', t => { t.truthy(result.toEnd); }); -test.cb('Commands that fail will still output error messages to stderr', t => { +test('Commands that fail will still output error messages to stderr', async t => { const script = "require('./global'); ls('noexist'); cd('noexist');"; - utils.runScript(script, (err, stdout, stderr) => { - t.is(stdout, ''); - t.is( - stderr, - 'ls: no such file or directory: noexist\ncd: no such file or directory: noexist\n' - ); - t.end(); - }); + const result = await utils.runScript(script); + t.is(result.stdout, ''); + t.is( + result.stderr, + 'ls: no such file or directory: noexist\ncd: no such file or directory: noexist\n' + ); }); test('execPath value makes sense', t => { diff --git a/test/config.js b/test/config.js index f48a60bac..3d73ef64f 100644 --- a/test/config.js +++ b/test/config.js @@ -32,21 +32,17 @@ test('config.silent can be set to false', t => { // config.fatal // -test.cb('config.fatal = false', t => { +test('config.fatal = false', async t => { t.falsy(shell.config.fatal); const script = `require('./global.js'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");`; - utils.runScript(script, (err, stdout) => { - t.truthy(stdout.match('got here')); - t.end(); - }); + const result = await utils.runScript(script); + t.truthy(result.stdout.match('got here')); }); -test.cb('config.fatal = true', t => { +test('config.fatal = true', async t => { const script = `require('./global.js'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");`; - utils.runScript(script, (err, stdout) => { - t.falsy(stdout.match('got here')); - t.end(); - }); + await t.throwsAsync(utils.runScript(script), + { message: /this_file_doesnt_exist/ }); }); test('config.fatal = false with an exec() failure returns, does not throw', t => { diff --git a/test/utils/utils.js b/test/utils/utils.js index df13fa9e5..9c20e5db3 100644 --- a/test/utils/utils.js +++ b/test/utils/utils.js @@ -1,5 +1,6 @@ const child = require('child_process'); const path = require('path'); +const { promisify } = require('node:util'); const chalk = require('chalk'); @@ -33,8 +34,9 @@ function skipOnWinForEPERM(action, testCase) { } exports.skipOnWinForEPERM = skipOnWinForEPERM; -function runScript(script, cb) { - child.execFile(common.config.execPath, ['-e', script], cb); +function runScript(script) { + const promiseExec = promisify(child.execFile); + return promiseExec(common.config.execPath, ['-e', script]); } exports.runScript = runScript; From ffdd60b3b622729787822e90eb1d87ff4736ed5a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 7 Apr 2025 22:45:10 -0700 Subject: [PATCH 308/338] refactor: use expectations for t.throws No change to logic. This is a small refactor to use stricter "expectation" arguments for calls to t.throws(). --- test/cmd.js | 2 +- test/common.js | 26 +++++++++++++------------- test/exec.js | 4 ++-- test/plugin.js | 6 +++--- test/shjs.js | 4 +++- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/test/cmd.js b/test/cmd.js index 09a5756d7..28cfade7f 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -30,7 +30,7 @@ test('config.fatal and unknown command', t => { shell.config.fatal = true; t.throws(() => { shell.cmd('asdfasdf'); // could not find command - }, /.*command not found.*/); + }, { message: /.*command not found.*/ }); }); // TODO(nfischer): enable only if we implement realtime output + captured diff --git a/test/common.js b/test/common.js index 76e292be2..e12fdc777 100644 --- a/test/common.js +++ b/test/common.js @@ -21,13 +21,13 @@ test.afterEach(() => { test('too few args', t => { t.throws(() => { common.expand(); - }, TypeError); + }, { instanceOf: TypeError }); }); test('should be a list', t => { t.throws(() => { common.expand('test/resources'); - }, TypeError); + }, { instanceOf: TypeError }); }); test('parseOptions (invalid option in options object)', t => { @@ -37,7 +37,7 @@ test('parseOptions (invalid option in options object)', t => { f: 'force', r: 'reverse', }); - }, common.CommandError); + }, { instanceOf: common.CommandError }); }); test('parseOptions (without a hyphen in the string)', t => { @@ -45,7 +45,7 @@ test('parseOptions (without a hyphen in the string)', t => { common.parseOptions('f', { f: 'force', }); - }, Error); + }, { instanceOf: Error }); }); test('parseOptions (opt is not a string/object)', t => { @@ -53,13 +53,13 @@ test('parseOptions (opt is not a string/object)', t => { common.parseOptions(1, { f: 'force', }); - }, TypeError); + }, { instanceOf: TypeError }); }); test('parseOptions (map is not an object)', t => { t.throws(() => { common.parseOptions('-f', 27); - }, TypeError); + }, { instanceOf: TypeError }); }); test('parseOptions (errorOptions is not an object)', t => { @@ -67,7 +67,7 @@ test('parseOptions (errorOptions is not an object)', t => { common.parseOptions('-f', { f: 'force', }, 'not a valid errorOptions'); - }, TypeError); + }, { instanceOf: TypeError }); }); test('parseOptions (unrecognized string option)', t => { @@ -75,7 +75,7 @@ test('parseOptions (unrecognized string option)', t => { common.parseOptions('-z', { f: 'force', }); - }, common.CommandError); + }, { instanceOf: common.CommandError }); }); test('parseOptions (unrecognized option in Object)', t => { @@ -99,17 +99,17 @@ test('parseOptions (invalid type)', t => { test('convertErrorOutput: no args', t => { t.throws(() => { common.convertErrorOutput(); - }, TypeError); + }, { instanceOf: TypeError }); }); test('convertErrorOutput: input must be a vanilla string', t => { t.throws(() => { common.convertErrorOutput(3); - }, TypeError); + }, { instanceOf: TypeError }); t.throws(() => { common.convertErrorOutput({}); - }, TypeError); + }, { instanceOf: TypeError }); }); // @@ -263,7 +263,7 @@ test('common.parseOptions using an object to hold options', t => { test('common.parseOptions throws when passed a string not starting with "-"', t => { t.throws(() => { common.parseOptions('a', { '-a': 'throws' }); - }, Error, "Options string must start with a '-'"); + }, { instanceOf: Error }, "Options string must start with a '-'"); }); test('common.parseOptions allows long options', t => { @@ -286,7 +286,7 @@ test('common.parseOptions throws for unknown long option', t => { common.parseOptions({ throws: true }, { v: 'value', }); - }, common.CommandError); + }, { instanceOf: common.CommandError }); }); test('common.parseOptions with -- argument', t => { diff --git a/test/exec.js b/test/exec.js index 6e59a1736..510fac5a4 100644 --- a/test/exec.js +++ b/test/exec.js @@ -43,7 +43,7 @@ test('config.fatal and unknown command', t => { shell.config.fatal = true; t.throws(() => { shell.exec('asdfasdf'); // could not find command - }, /asdfasdf/); // name of command should be in error message + }, { message: /asdfasdf/ }); // name of command should be in error message shell.config.fatal = oldFatal; }); @@ -52,7 +52,7 @@ test('options.fatal = true and unknown command', t => { shell.config.fatal = false; t.throws(() => { shell.exec('asdfasdf', { fatal: true }); // could not find command - }, /asdfasdf/); // name of command should be in error message + }, { message: /asdfasdf/ }); // name of command should be in error message shell.config.fatal = oldFatal; // TODO(nfischer): this setting won't get reset if the assertion above fails }); diff --git a/test/plugin.js b/test/plugin.js index a6aad1555..59626c1c0 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -48,7 +48,7 @@ test('Unable to register a plugin with unknown options', t => { plugin.register('foo', fooImplementation, { foobar: true, }); - }, Error); + }, { instanceOf: Error }); }); test('Unable to register a plugin with wrong option types', t => { @@ -56,7 +56,7 @@ test('Unable to register a plugin with wrong option types', t => { plugin.register('foo', fooImplementation, { wrapOutput: 'true', // should be a boolean }); - }, TypeError); + }, { instanceOf: TypeError }); }); // @@ -162,6 +162,6 @@ test('Cannot overwrite an existing command', t => { const oldCat = shell.cat; t.throws(() => { plugin.register('cat', fooImplementation); - }, 'Command `cat` already exists'); + }, { message: 'Command `cat` already exists' }); t.is(shell.cat, oldCat); }); diff --git a/test/shjs.js b/test/shjs.js index 50ff61462..ff3aade5c 100644 --- a/test/shjs.js +++ b/test/shjs.js @@ -59,5 +59,7 @@ test('Extension detection', t => { // test('disallow require-ing', t => { - t.throws(() => require(binPath), 'Executable-only module should not be required'); + t.throws(() => require(binPath), + { instanceOf: Error }, + 'Executable-only module should not be required'); }); From 29eba085f78c1d321571f172b448572d134d145a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 7 Apr 2025 23:28:54 -0700 Subject: [PATCH 309/338] refactor: prefer promises over test.cb This is a followup to PR #1211 to use promises everywhere and migrate away from `test.cb()`. The `test.cb()` function is removed in a future version of ava. I made an attempt to convert the skipped shell.cmd() async test cases, but async functionality isn't implemented so it's possible the test conversion is not totally correct. --- test/cmd.js | 59 ++++++++++++++++++++--------------------- test/exec.js | 75 +++++++++++++++++++++++++--------------------------- test/pipe.js | 16 +++++++---- 3 files changed, 76 insertions(+), 74 deletions(-) diff --git a/test/cmd.js b/test/cmd.js index 28cfade7f..b8ae69cce 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -217,50 +217,49 @@ test('cmd returns a ShellString', t => { // async // +function cmdAsync(...commandArgs) { + return new Promise((resolve) => { + shell.cmd(...commandArgs, (code, stdout, stderr) => { + resolve({ code, stdout, stderr }); + }); + }); +} + // TODO(nfischer): enable after we implement async. -test.cb.skip('no callback', t => { +test.skip('no callback', t => { const c = shell.cmd(shell.config.execPath, '-e', 'console.log(1234)', { async: true }); t.falsy(shell.error()); t.truthy('stdout' in c, 'async exec returns child process object'); - t.end(); }); // TODO(nfischer): enable after we implement async. -test.cb.skip('callback as 2nd argument', t => { - shell.cmd(shell.config.execPath, '-e', 'console.log(5678);', (code, stdout, stderr) => { - t.is(code, 0); - t.is(stdout, '5678\n'); - t.is(stderr, ''); - t.end(); - }); +test.skip('callback as 2nd argument', async t => { + const result = await cmdAsync(shell.config.execPath, '-e', 'console.log(5678);'); + t.is(result.code, 0); + t.is(result.stdout, '5678\n'); + t.is(result.stderr, ''); }); // TODO(nfischer): enable after we implement async. -test.cb.skip('callback as end argument', t => { - shell.cmd(shell.config.execPath, '-e', 'console.log(5566);', { async: true }, (code, stdout, stderr) => { - t.is(code, 0); - t.is(stdout, '5566\n'); - t.is(stderr, ''); - t.end(); - }); +test.skip('callback as end argument', async t => { + const result = await cmdAsync(shell.config.execPath, '-e', 'console.log(5566);', { async: true }); + t.is(result.code, 0); + t.is(result.stdout, '5566\n'); + t.is(result.stderr, ''); }); // TODO(nfischer): enable after we implement async. -test.cb.skip('callback as 3rd argument (silent:true)', t => { - shell.cmd(shell.config.execPath, '-e', 'console.log(5678);', { silent: true }, (code, stdout, stderr) => { - t.is(code, 0); - t.is(stdout, '5678\n'); - t.is(stderr, ''); - t.end(); - }); +test.skip('callback as 3rd argument (silent:true)', async t => { + const result = await cmdAsync(shell.config.execPath, '-e', 'console.log(5678);', { silent: true }); + t.is(result.code, 0); + t.is(result.stdout, '5678\n'); + t.is(result.stderr, ''); }); // TODO(nfischer): enable after we implement async. -test.cb.skip('command that fails', t => { - shell.cmd('shx', 'cp', 'onlyOneCpArgument.txt', { silent: true }, (code, stdout, stderr) => { - t.is(code, 1); - t.is(stdout, ''); - t.is(stderr, 'cp: missing and/or \n'); - t.end(); - }); +test.skip('command that fails', async t => { + const result = await cmdAsync('shx', 'cp', 'onlyOneCpArgument.txt', { silent: true }); + t.is(result.code, 1); + t.is(result.stdout, ''); + t.is(result.stderr, 'cp: missing and/or \n'); }); diff --git a/test/exec.js b/test/exec.js index 510fac5a4..4f216639d 100644 --- a/test/exec.js +++ b/test/exec.js @@ -216,56 +216,53 @@ test('options.fatal = false and unknown command', t => { // async // -test.cb('no callback', t => { +function execAsync(...execArgs) { + return new Promise((resolve) => { + shell.exec(...execArgs, (code, stdout, stderr) => { + resolve({ code, stdout, stderr }); + }); + }); +} + +test('no callback', t => { const c = shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(1234)"`, { async: true }); t.falsy(shell.error()); t.truthy('stdout' in c, 'async exec returns child process object'); - t.end(); }); -test.cb('callback as 2nd argument', t => { - shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5678);"`, (code, stdout, stderr) => { - t.is(code, 0); - t.is(stdout, '5678\n'); - t.is(stderr, ''); - t.end(); - }); +test('callback as 2nd argument', async t => { + const result = await execAsync(`${JSON.stringify(shell.config.execPath)} -e "console.log(5678);"`); + t.is(result.code, 0); + t.is(result.stdout, '5678\n'); + t.is(result.stderr, ''); }); -test.cb('callback as end argument', t => { - shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5566);"`, { async: true }, (code, stdout, stderr) => { - t.is(code, 0); - t.is(stdout, '5566\n'); - t.is(stderr, ''); - t.end(); - }); +test('callback as end argument', async t => { + const result = await execAsync(`${JSON.stringify(shell.config.execPath)} -e "console.log(5566);"`, { async: true }); + t.is(result.code, 0); + t.is(result.stdout, '5566\n'); + t.is(result.stderr, ''); }); -test.cb('callback as 3rd argument (silent:true)', t => { - shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5678);"`, { silent: true }, (code, stdout, stderr) => { - t.is(code, 0); - t.is(stdout, '5678\n'); - t.is(stderr, ''); - t.end(); - }); +test('callback as 3rd argument (silent:true)', async t => { + const result = await execAsync(`${JSON.stringify(shell.config.execPath)} -e "console.log(5678);"`, { silent: true }); + t.is(result.code, 0); + t.is(result.stdout, '5678\n'); + t.is(result.stderr, ''); }); -test.cb('command that fails', t => { - shell.exec('shx cp onlyOneCpArgument.txt', { silent: true }, (code, stdout, stderr) => { - t.is(code, 1); - t.is(stdout, ''); - t.is(stderr, 'cp: missing and/or \n'); - t.end(); - }); +test('command that fails', async t => { + const result = await execAsync('shx cp onlyOneCpArgument.txt', { silent: true }); + t.is(result.code, 1); + t.is(result.stdout, ''); + t.is(result.stderr, 'cp: missing and/or \n'); }); -test.cb('encoding option works with async', t => { - shell.exec(`${JSON.stringify(shell.config.execPath)} -e "console.log(5566);"`, { async: true, encoding: 'buffer' }, (code, stdout, stderr) => { - t.is(code, 0); - t.truthy(Buffer.isBuffer(stdout)); - t.truthy(Buffer.isBuffer(stderr)); - t.is(stdout.toString(), '5566\n'); - t.is(stderr.toString(), ''); - t.end(); - }); +test('encoding option works with async', async t => { + const result = await execAsync(`${JSON.stringify(shell.config.execPath)} -e "console.log(5566);"`, { async: true, encoding: 'buffer' }); + t.is(result.code, 0); + t.truthy(Buffer.isBuffer(result.stdout)); + t.truthy(Buffer.isBuffer(result.stderr)); + t.is(result.stdout.toString(), '5566\n'); + t.is(result.stderr.toString(), ''); }); diff --git a/test/pipe.js b/test/pipe.js index 503de352e..a8aabb928 100644 --- a/test/pipe.js +++ b/test/pipe.js @@ -65,10 +65,16 @@ test('Synchronous exec', t => { t.is(result.toString(), 'alphaaaaaaabeta\nalphbeta\n'); }); -test.cb('Asynchronous exec', t => { - shell.cat('test/resources/grep/file').exec('shx grep "alpha*beta"', (code, stdout) => { - t.is(code, 0); - t.is(stdout, 'alphaaaaaaabeta\nalphbeta\n'); - t.end(); +test('Asynchronous exec', async t => { + const promise = new Promise(resolve => { + shell.cat('test/resources/grep/file') + .exec('shx grep "alpha*beta"', (code, stdout, stderr) => { + resolve({ code, stdout, stderr }); + }); }); + + const result = await promise; + t.is(result.code, 0); + t.is(result.stdout, 'alphaaaaaaabeta\nalphbeta\n'); + t.is(result.stderr, ''); }); From 697bcf67d94bc8c676223087a5c914cb3dc688c4 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 8 Apr 2025 00:17:32 -0700 Subject: [PATCH 310/338] refactor: allow es6 language features This configures the eslint config to allow ES6 features. This fixes some lint errors caught in the new config, but this mostly suppresses new warnings. --- .eslintrc.json | 11 ++++++++++- global.js | 5 ++++- scripts/check-node-support.js | 11 ++++++----- shell.js | 3 ++- src/cat.js | 2 +- src/chmod.js | 2 +- src/cmd.js | 2 +- src/common.js | 6 +++--- src/dirs.js | 2 +- src/exec.js | 12 ++++++------ src/grep.js | 2 +- src/head.js | 2 +- src/ls.js | 2 +- src/mkdir.js | 2 +- src/rm.js | 2 +- src/sed.js | 2 +- src/sort.js | 2 +- src/tail.js | 2 +- src/tempdir.js | 2 +- src/test.js | 2 +- src/to.js | 2 +- src/toEnd.js | 2 +- src/touch.js | 2 +- src/uniq.js | 2 +- src/which.js | 2 +- 25 files changed, 50 insertions(+), 36 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 8e1e250d3..4f40d77b8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,7 +2,7 @@ "env": { "node": true }, - "extends": "airbnb-base/legacy", + "extends": "airbnb-base", "rules": { "comma-dangle": ["error", "always-multiline"], "consistent-return": "off", @@ -11,6 +11,7 @@ "function-call-argument-newline": "off", "function-paren-newline": "off", "global-require": "off", + "import/no-unresolved": "off", "indent": "off", "max-len": "off", "newline-per-chained-call": "off", @@ -28,7 +29,15 @@ "no-throw-literal": "off", "no-underscore-dangle": "off", "no-use-before-define": "off", + "no-var": "off", "operator-linebreak": "off", + "prefer-arrow-callback": "off", + "prefer-destructuring": "off", + "prefer-numeric-literals": "off", + "prefer-object-spread": "off", + "prefer-rest-params": "off", + "prefer-spread": "off", + "prefer-template": "off", "quote-props": "off", "spaced-comment": ["error", "always", { "markers": ["@", "@include"], "exceptions": ["@", "@commands"] }], "strict": "off", diff --git a/global.js b/global.js index b232e66d5..e061f5a1e 100644 --- a/global.js +++ b/global.js @@ -1,12 +1,15 @@ /* eslint no-extend-native: 0 */ -var shell = require('./shell.js'); +var shell = require('./shell'); var common = require('./src/common'); + Object.keys(shell).forEach(function (cmd) { global[cmd] = shell[cmd]; }); var _to = require('./src/to'); + String.prototype.to = common.wrap('to', _to); var _toEnd = require('./src/toEnd'); + String.prototype.toEnd = common.wrap('toEnd', _toEnd); diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index b3b62347d..e33574f88 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -3,6 +3,7 @@ var assert = require('assert'); var path = require('path'); +// eslint-disable-next-line import/no-extraneous-dependencies var yaml = require('js-yaml'); var shell = require('..'); @@ -25,7 +26,7 @@ function checkReadme(minNodeVersion) { var stop = ''; var formattedMinVersion = '`v' + minNodeVersion + '`'; var expectedReadmeRegex = new RegExp( - start + '\\s*' + formattedMinVersion + '\\s*' + stop, '' + start + '\\s*' + formattedMinVersion + '\\s*' + stop, '', ); var readme = path.join(__dirname, '..', 'README.md'); var match = shell.grep(expectedReadmeRegex, readme); @@ -36,9 +37,9 @@ function checkReadme(minNodeVersion) { } } -function checkEngines(minNodeVersion, package) { +function checkEngines(minNodeVersion, packageJson) { var expectedEnginesNode = '>=' + minNodeVersion; - if (package.engines.node !== expectedEnginesNode) { + if (packageJson.engines.node !== expectedEnginesNode) { var msg = 'Update package.json to fix the "engines" attribute'; throw new Error(msg); } @@ -76,8 +77,8 @@ function checkGithubActions(minNodeVersion, maxNodeVersion, githubActionsYaml) { try { checkReadme(MIN_NODE_VERSION); - var package = require('../package.json'); - checkEngines(MIN_NODE_VERSION, package); + var packageJson = require('../package.json'); + checkEngines(MIN_NODE_VERSION, packageJson); var githubActionsFileName = path.join(__dirname, '..', '.github', 'workflows', 'main.yml'); diff --git a/shell.js b/shell.js index af67968eb..8a3a67d30 100644 --- a/shell.js +++ b/shell.js @@ -7,6 +7,7 @@ // var common = require('./src/common'); + module.exports = common.shell; //@ @@ -65,7 +66,7 @@ module.exports.exit = function exit(code) { if (code) { common.error('exit', { continue: true, - code: code, + code, prefix: '', silent: true, fatal: false, diff --git a/src/cat.js b/src/cat.js index 86214fac4..ca264a9d1 100644 --- a/src/cat.js +++ b/src/cat.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('cat', _cat, { canReceivePipe: true, diff --git a/src/chmod.js b/src/chmod.js index 24cc82456..b930cc764 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -1,6 +1,6 @@ -var common = require('./common'); var fs = require('fs'); var path = require('path'); +var common = require('./common'); var PERMS = (function (base) { return { diff --git a/src/cmd.js b/src/cmd.js index 774395b87..455fb3a65 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -1,5 +1,5 @@ -var common = require('./common'); var execa = require('execa'); +var common = require('./common'); var DEFAULT_MAXBUFFER_SIZE = 20 * 1024 * 1024; var COMMAND_NOT_FOUND_ERROR_CODE = 127; diff --git a/src/common.js b/src/common.js index 1a19c741e..aea437ec8 100644 --- a/src/common.js +++ b/src/common.js @@ -31,13 +31,13 @@ var DEFAULT_CONFIG = { }; var config = { - reset: function () { + reset() { Object.assign(this, DEFAULT_CONFIG); if (!isElectron) { this.execPath = process.execPath; } }, - resetForTesting: function () { + resetForTesting() { this.reset(); this.silent = true; }, @@ -190,7 +190,7 @@ function parseOptions(opt, map, errorOptions) { throw new TypeError('parseOptions() internal error: map must be an object'); } else if (!isObject(errorOptions)) { throw new TypeError( - 'parseOptions() internal error: errorOptions must be object' + 'parseOptions() internal error: errorOptions must be object', ); } diff --git a/src/dirs.js b/src/dirs.js index 9e5f9a233..9b7251d0e 100644 --- a/src/dirs.js +++ b/src/dirs.js @@ -1,6 +1,6 @@ +var path = require('path'); var common = require('./common'); var _cd = require('./cd'); -var path = require('path'); common.register('dirs', _dirs, { wrapOutput: false, diff --git a/src/exec.js b/src/exec.js index f2d58c2ea..390776902 100644 --- a/src/exec.js +++ b/src/exec.js @@ -1,9 +1,9 @@ -var common = require('./common'); -var _tempDir = require('./tempdir').tempDir; -var _pwd = require('./pwd'); var path = require('path'); var fs = require('fs'); var child = require('child_process'); +var common = require('./common'); +var _tempDir = require('./tempdir').tempDir; +var _pwd = require('./pwd'); var DEFAULT_MAXBUFFER_SIZE = 20 * 1024 * 1024; var DEFAULT_ERROR_CODE = 1; @@ -53,9 +53,9 @@ function execSync(cmd, opts, pipe) { var paramsToSerialize = { command: cmd, execOptions: opts, - pipe: pipe, - stdoutFile: stdoutFile, - stderrFile: stderrFile, + pipe, + stdoutFile, + stderrFile, }; // Create the files and ensure these are locked down (for read and write) to diff --git a/src/grep.js b/src/grep.js index 27e84011b..63792e640 100644 --- a/src/grep.js +++ b/src/grep.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('grep', _grep, { globStart: 2, // don't glob-expand the regex diff --git a/src/head.js b/src/head.js index ffb08fd7c..f3f4f2269 100644 --- a/src/head.js +++ b/src/head.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('head', _head, { canReceivePipe: true, diff --git a/src/ls.js b/src/ls.js index 66385e459..7f32c6e09 100644 --- a/src/ls.js +++ b/src/ls.js @@ -1,7 +1,7 @@ var path = require('path'); var fs = require('fs'); -var common = require('./common'); var glob = require('fast-glob'); +var common = require('./common'); // glob patterns use the UNIX path seperator var globPatternRecursive = '/**'; diff --git a/src/mkdir.js b/src/mkdir.js index 644fe4a57..021cad9c0 100644 --- a/src/mkdir.js +++ b/src/mkdir.js @@ -1,6 +1,6 @@ -var common = require('./common'); var fs = require('fs'); var path = require('path'); +var common = require('./common'); common.register('mkdir', _mkdir, { cmdOptions: { diff --git a/src/rm.js b/src/rm.js index 7cf07af07..6bb57558b 100644 --- a/src/rm.js +++ b/src/rm.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('rm', _rm, { cmdOptions: { diff --git a/src/sed.js b/src/sed.js index 115d0ea55..693652362 100644 --- a/src/sed.js +++ b/src/sed.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('sed', _sed, { globStart: 3, // don't glob-expand regexes diff --git a/src/sort.js b/src/sort.js index 3468268ea..66b042ce4 100644 --- a/src/sort.js +++ b/src/sort.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('sort', _sort, { canReceivePipe: true, diff --git a/src/tail.js b/src/tail.js index 0545355b2..eee75c570 100644 --- a/src/tail.js +++ b/src/tail.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('tail', _tail, { canReceivePipe: true, diff --git a/src/tempdir.js b/src/tempdir.js index b62032d7d..b6f7796ee 100644 --- a/src/tempdir.js +++ b/src/tempdir.js @@ -1,6 +1,6 @@ -var common = require('./common'); var os = require('os'); var fs = require('fs'); +var common = require('./common'); common.register('tempdir', _tempDir, { allowGlobbing: false, diff --git a/src/test.js b/src/test.js index 0ab34e155..7e769083d 100644 --- a/src/test.js +++ b/src/test.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('test', _test, { cmdOptions: { diff --git a/src/to.js b/src/to.js index e7dcc50d7..e4b064f49 100644 --- a/src/to.js +++ b/src/to.js @@ -1,6 +1,6 @@ -var common = require('./common'); var fs = require('fs'); var path = require('path'); +var common = require('./common'); common.register('to', _to, { pipeOnly: true, diff --git a/src/toEnd.js b/src/toEnd.js index 1d6e9609f..dc30e6264 100644 --- a/src/toEnd.js +++ b/src/toEnd.js @@ -1,6 +1,6 @@ -var common = require('./common'); var fs = require('fs'); var path = require('path'); +var common = require('./common'); common.register('toEnd', _toEnd, { pipeOnly: true, diff --git a/src/touch.js b/src/touch.js index cff7b71e9..a26858648 100644 --- a/src/touch.js +++ b/src/touch.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); common.register('touch', _touch, { cmdOptions: { diff --git a/src/uniq.js b/src/uniq.js index e46f92b34..580270651 100644 --- a/src/uniq.js +++ b/src/uniq.js @@ -1,5 +1,5 @@ -var common = require('./common'); var fs = require('fs'); +var common = require('./common'); // add c spaces to the left of str function lpad(c, str) { diff --git a/src/which.js b/src/which.js index 4733d1b7e..8ac7b77e5 100644 --- a/src/which.js +++ b/src/which.js @@ -1,6 +1,6 @@ -var common = require('./common'); var fs = require('fs'); var path = require('path'); +var common = require('./common'); common.register('which', _which, { allowGlobbing: false, From 168e8b5a08489868d4ad8152676f2b73f5e4fa6e Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 10 Apr 2025 00:46:31 -0700 Subject: [PATCH 311/338] refactor: use es6 class syntax for CommandError This is supposed to be a NOOP, although for some reason this makes a difference in the ava@6 test framework. This should not have a user-visible effect because CommandError is an implementation detail of this library (it's only thrown if `options.fatal` is off, and it's always caught inside of common.js). --- src/common.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/common.js b/src/common.js index aea437ec8..b9ffedab1 100644 --- a/src/common.js +++ b/src/common.js @@ -83,11 +83,12 @@ exports.convertErrorOutput = convertErrorOutput; // An exception class to help propagate command errors (e.g., non-zero exit // status) up to the top-level. {@param value} should be a ShellString. -function CommandError(value) { - this.returnValue = value; +class CommandError extends Error { + constructor(value) { + super(value.toString()); + this.returnValue = value; + } } -CommandError.prototype = Object.create(Error.prototype); -CommandError.prototype.constructor = CommandError; exports.CommandError = CommandError; // visible for testing // Shows error message. Throws if fatal is true (defaults to config.fatal, overridable with options.fatal) From 8bc5833828927b217124a956c859ec2a966219c1 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 8 Apr 2025 00:38:11 -0700 Subject: [PATCH 312/338] chore: update ava This updates ava to v6. This resolves some `npm audit` warnings in our project's devDependencies. This adds `workerThreads: false` because operations like `process.chdir()` don't work in workers (but are required for shelljs). This is a partial fix #1180, although I found more errors when I ran the tests locally on v22.10.0. Test: npm audit --- package-lock.json | 3942 ++++++++++--------------------------------- package.json | 4 +- test/.eslintrc.json | 1 + 3 files changed, 928 insertions(+), 3019 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e7a54368..0899b946f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.9.2", "license": "BSD-3-Clause", "dependencies": { + "audit": "^0.0.6", "execa": "^1.0.0", "fast-glob": "^3.3.2", "interpret": "^1.0.0", @@ -18,7 +19,7 @@ "shjs": "bin/shjs" }, "devDependencies": { - "ava": "^2.4.0", + "ava": "^6.2.0", "chalk": "^4.1.2", "coffee-script": "^1.12.7", "eslint": "^8.2.0", @@ -47,44 +48,6 @@ "node": ">=6.0.0" } }, - "node_modules/@ava/babel-plugin-throws-helper": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-4.0.0.tgz", - "integrity": "sha512-3diBLIVBPPh3j4+hb5lo0I1D+S/O/VDJPI4Y502apBxmwEqjyXG4gTSPFUlm41sSZeZzMarT/Gzovw9kV7An0w==", - "dev": true, - "engines": { - "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" - } - }, - "node_modules/@ava/babel-preset-stage-4": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-4.0.0.tgz", - "integrity": "sha512-lZEV1ZANzfzSYBU6WHSErsy7jLPbD1iIgAboASPMcKo7woVni5/5IKWeT0RxC8rY802MFktur3OKEw2JY1Tv2w==", - "dev": true, - "dependencies": { - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-modules-commonjs": "^7.5.0" - }, - "engines": { - "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" - } - }, - "node_modules/@ava/babel-preset-transform-test-files": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-6.0.0.tgz", - "integrity": "sha512-8eKhFzZp7Qcq1VLfoC75ggGT8nQs9q8fIxltU47yCB7Wi7Y8Qf6oqY1Bm0z04fIec24vEgr0ENhDHEOUGVDqnA==", - "dev": true, - "dependencies": { - "@ava/babel-plugin-throws-helper": "^4.0.0", - "babel-plugin-espower": "^3.0.1" - }, - "engines": { - "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "dev": true, @@ -155,18 +118,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.26.5", "dev": true, @@ -182,35 +133,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "dev": true, @@ -239,32 +161,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "dev": true, @@ -289,20 +185,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", - "dev": true, - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", @@ -331,127 +213,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/template": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", @@ -496,18 +257,6 @@ "node": ">=6.9.0" } }, - "node_modules/@concordance/react": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", - "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1" - }, - "engines": { - "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "dev": true, @@ -618,6 +367,18 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "dev": true, @@ -762,6 +523,39 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "dev": true, + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "license": "MIT", @@ -791,66 +585,128 @@ "node": ">= 8" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, "engines": { - "node": ">=6" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "dev": true, "license": "MIT" }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" }, - "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "node_modules/@vercel/nft": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz", + "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==", "dev": true, "dependencies": { - "undici-types": "~6.20.0" + "@mapbox/node-pre-gyp": "^2.0.0-rc.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "license": "ISC" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/abbrev": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, "node_modules/acorn": { "version": "8.14.1", @@ -863,6 +719,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "dev": true, @@ -871,19 +736,40 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, - "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "acorn": "^8.11.0" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/aggregate-error/node_modules/indent-string": { + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/indent-string": { "version": "4.0.0", "dev": true, "license": "MIT", @@ -906,49 +792,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -962,19 +815,6 @@ "node": ">=4" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/append-transform": { "version": "2.0.0", "dev": true, @@ -996,15 +836,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "dev": true, @@ -1048,36 +879,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-union/node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", - "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/array.prototype.findlastindex": { "version": "1.2.5", "dev": true, @@ -1151,22 +952,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/async-function": { @@ -1177,195 +981,148 @@ "node": ">= 0.4" } }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "dev": true + }, + "node_modules/audit": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/audit/-/audit-0.0.6.tgz", + "integrity": "sha512-xgv3Y3RIYE00N2/xk10VLlwFd1kjc7FRaX1vC8+CsOfDRe53a06vOSkp91BOSNijZfddYum47a1Fvju/2+JPcw==", + "engines": { + "node": ">= 0.5.0" + } + }, "node_modules/ava": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-2.4.0.tgz", - "integrity": "sha512-CQWtzZZZeU2g4StojRv6MO9RIRi4sLxGSB9+3C3hv0ttUEG1tkJLTLyrBQeFS4WEeK12Z4ovE3f2iPVhSy8elA==", - "dev": true, - "dependencies": { - "@ava/babel-preset-stage-4": "^4.0.0", - "@ava/babel-preset-transform-test-files": "^6.0.0", - "@babel/core": "^7.6.0", - "@babel/generator": "^7.6.0", - "@concordance/react": "^2.0.0", - "ansi-escapes": "^4.2.1", - "ansi-styles": "^4.1.0", - "arr-flatten": "^1.1.0", - "array-union": "^2.1.0", - "array-uniq": "^2.1.0", - "arrify": "^2.0.1", - "bluebird": "^3.5.5", - "chalk": "^2.4.2", - "chokidar": "^3.0.2", - "chunkd": "^1.0.0", - "ci-parallel-vars": "^1.0.0", - "clean-stack": "^2.2.0", - "clean-yaml-object": "^0.1.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.0.0", - "code-excerpt": "^2.1.1", - "common-path-prefix": "^1.0.0", - "concordance": "^4.0.0", - "convert-source-map": "^1.6.0", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-6.2.0.tgz", + "integrity": "sha512-+GZk5PbyepjiO/68hzCZCUepQOQauKfNnI7sA4JukBTg97jD7E+tDKEA7OhGOGr6EorNNMM9+jqvgHVOTOzG4w==", + "dev": true, + "dependencies": { + "@vercel/nft": "^0.27.5", + "acorn": "^8.13.0", + "acorn-walk": "^8.3.4", + "ansi-styles": "^6.2.1", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.2.0", + "cbor": "^9.0.2", + "chalk": "^5.3.0", + "chunkd": "^2.0.1", + "ci-info": "^4.0.0", + "ci-parallel-vars": "^1.0.1", + "cli-truncate": "^4.0.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", - "debug": "^4.1.1", - "del": "^4.1.1", - "dot-prop": "^5.1.0", - "emittery": "^0.4.1", - "empower-core": "^1.2.0", - "equal-length": "^1.0.0", - "escape-string-regexp": "^2.0.0", - "esm": "^3.2.25", - "figures": "^3.0.0", - "find-up": "^4.1.0", - "get-port": "^5.0.0", - "globby": "^10.0.1", - "ignore-by-default": "^1.0.0", - "import-local": "^3.0.2", - "indent-string": "^4.0.0", - "is-ci": "^2.0.0", - "is-error": "^2.2.2", - "is-observable": "^2.0.0", - "is-plain-object": "^3.0.0", - "is-promise": "^2.1.0", - "lodash": "^4.17.15", - "loud-rejection": "^2.1.0", - "make-dir": "^3.0.0", - "matcher": "^2.0.0", - "md5-hex": "^3.0.1", - "meow": "^5.0.0", - "micromatch": "^4.0.2", - "ms": "^2.1.2", - "observable-to-promise": "^1.0.0", - "ora": "^3.4.0", - "package-hash": "^4.0.0", - "pkg-conf": "^3.1.0", - "plur": "^3.1.1", - "pretty-ms": "^5.0.0", - "require-precompiled": "^0.1.0", + "debug": "^4.3.7", + "emittery": "^1.0.3", + "figures": "^6.1.0", + "globby": "^14.0.2", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "memoize": "^10.0.0", + "ms": "^2.1.3", + "p-map": "^7.0.2", + "package-config": "^5.0.0", + "picomatch": "^4.0.2", + "plur": "^5.1.0", + "pretty-ms": "^9.1.0", "resolve-cwd": "^3.0.0", - "slash": "^3.0.0", - "source-map-support": "^0.5.13", - "stack-utils": "^1.0.2", - "strip-ansi": "^5.2.0", - "strip-bom-buf": "^2.0.0", - "supertap": "^1.0.0", - "supports-color": "^7.0.0", - "trim-off-newlines": "^1.0.1", - "trim-right": "^1.0.1", - "unique-temp-dir": "^1.0.0", - "update-notifier": "^3.0.1", - "write-file-atomic": "^3.0.0" + "stack-utils": "^2.0.6", + "strip-ansi": "^7.1.0", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^6.0.0", + "yargs": "^17.7.2" }, "bin": { - "ava": "cli.js" + "ava": "entrypoints/cli.mjs" }, "engines": { - "node": ">=8.9.4 <9 || >=10.0.0 <11 || >=12.0.0" - } - }, - "node_modules/ava/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "node": "^18.18 || ^20.8 || ^22 || >=23" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@ava/typescript": "*" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } } }, - "node_modules/ava/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/ava/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/ava/node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "node_modules/ava/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/ava/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "node": ">=12" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ava/node_modules/chalk/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/ava/node_modules/callsites": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", + "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/ava/node_modules/chalk/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ava/node_modules/chalk/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/ava/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/ava/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ava/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/ava/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/ava/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/ava/node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -1389,159 +1146,126 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/ava/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/ava/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/ava/node_modules/find-up": { + "node_modules/ava/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ava/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/ava/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/ava/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/ava/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ava/node_modules/loud-rejection": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", - "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", + "node_modules/ava/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.2" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/ava/node_modules/md5-hex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "node_modules/ava/node_modules/write-file-atomic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", + "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", "dev": true, "dependencies": { - "blueimp-md5": "^2.10.0" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/ava/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/ava/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/ava/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/ava/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/ava/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/ava/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ava/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-plugin-espower": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-3.0.1.tgz", - "integrity": "sha512-Ms49U7VIAtQ/TtcqRbD6UBmJBUCSxiC3+zPc+eGqxKUIFO1lTshyEDRUjhoAbd2rWfwYf3cZ62oXozrd8W6J0A==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "call-matcher": "^1.0.0", - "core-js": "^2.0.0", - "espower-location-detector": "^1.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.1.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/balanced-match": { @@ -1549,122 +1273,21 @@ "dev": true, "license": "MIT" }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "file-uri-to-path": "1.0.0" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/blueimp-md5": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", "dev": true }, - "node_modules/boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -1716,69 +1339,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "node_modules/cacheable-request/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/caching-transform": { "version": "4.0.0", "dev": true, @@ -1837,27 +1397,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-matcher": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.1.0.tgz", - "integrity": "sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "deep-equal": "^1.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.0.0" - } - }, - "node_modules/call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha512-qvYvkAVcoae0obt8OsZn0VEBHeEpvYIZDy1gGYtZDJG0fHawew+Mi0dBjieFz8F8dzQ2Kr19+nsDm+T5XFVs+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/callsites": { "version": "3.1.0", "dev": true, @@ -1866,29 +1405,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001702", "dev": true, @@ -1908,6 +1424,18 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cbor": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -1953,41 +1481,35 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=18" } }, "node_modules/chunkd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-1.0.0.tgz", - "integrity": "sha512-xx3Pb5VF9QaqCotolyZ1ywFBgyuJmu6+9dLiqBxgelEse9Xsr3yUlpoX3O4Oh11M00GT2kYMsRByTKIMJW2Lkg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", "dev": true }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/ci-parallel-vars": { "version": "1.0.1", @@ -2002,62 +1524,40 @@ "node": ">=6" } }, - "node_modules/clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "dependencies": { - "restore-cursor": "^2.0.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2092,37 +1592,16 @@ "node": ">=8" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/code-excerpt": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.1.tgz", - "integrity": "sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, "dependencies": { - "convert-to-spaces": "^1.0.1" + "convert-to-spaces": "^2.0.1" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/coffee-script": { @@ -2151,9 +1630,9 @@ "license": "MIT" }, "node_modules/common-path-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", - "integrity": "sha512-StWMCZw9nTO+RnxMCcapnQQqeZpaDvCD9+0Rrl8ZphFKWcJPyUGiEl64WoAkA+WJIxwKYzxldhYHU+EW1fQ2mQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, "node_modules/commondir": { @@ -2167,133 +1646,64 @@ "license": "MIT" }, "node_modules/concordance": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-4.0.0.tgz", - "integrity": "sha512-l0RFuB8RLfCS0Pt2Id39/oCPykE01pyxgAFypWTlaGRgvLkZrtczZ8atEHpTeEIW+zYWXTBuA9cCSeEOScxReQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", "dev": true, "dependencies": { - "date-time": "^2.1.0", - "esutils": "^2.0.2", - "fast-diff": "^1.1.2", + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", "js-string-escape": "^1.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.flattendeep": "^4.4.0", - "lodash.islength": "^4.0.1", - "lodash.merge": "^4.6.1", - "md5-hex": "^2.0.0", - "semver": "^5.5.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", "well-known-symbols": "^2.0.0" }, "engines": { - "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" } }, "node_modules/concordance/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { - "semver": "bin/semver" - } - }, - "node_modules/configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", - "dev": true, - "dependencies": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/configstore/node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dev": true, - "dependencies": { - "is-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/configstore/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/configstore/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "node_modules/confusing-browser-globals": { + "version": "1.0.11", "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/configstore/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, "engines": { - "node": ">=4" - } - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "dev": true, - "license": "MIT" - }, "node_modules/convert-source-map": { "version": "1.9.0", "dev": true, "license": "MIT" }, "node_modules/convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, "engines": { - "node": ">= 4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, "node_modules/cross-spawn": { "version": "7.0.6", "dev": true, @@ -2307,15 +1717,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -2377,15 +1778,15 @@ } }, "node_modules/date-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", - "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", "dev": true, "dependencies": { "time-zone": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/debug": { @@ -2412,72 +1813,6 @@ "node": ">=0.10.0" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dev": true, - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -2497,24 +1832,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "node_modules/define-data-property": { "version": "1.1.4", "dev": true, @@ -2547,65 +1864,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "engines": { "node": ">=8" @@ -2622,18 +1884,6 @@ "node": ">=6.0.0" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "dev": true, @@ -2647,24 +1897,21 @@ "node": ">= 0.4" } }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, "node_modules/electron-to-chromium": { "version": "1.5.113", "dev": true, "license": "ISC" }, "node_modules/emittery": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz", - "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.1.0.tgz", + "integrity": "sha512-rsX7ktqARv/6UQDgMaLfIqUWAEzzbCQiVh7V9rhDXp6c37yoJcks12NVD+XPkgl4AEavmNhVfrhGoqYwIsMYYA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "node_modules/emoji-regex": { @@ -2672,16 +1919,6 @@ "dev": true, "license": "MIT" }, - "node_modules/empower-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz", - "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==", - "dev": true, - "dependencies": { - "call-signature": "0.0.2", - "core-js": "^2.0.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "license": "MIT", @@ -2689,24 +1926,6 @@ "once": "^1.4.0" } }, - "node_modules/equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha512-TK2m7MvWPt/v3dan0BCNp99pytIE5UGrUj7F0KZirNX8xz8fDFUAZfgm8uB5FuQq9u0sMeDocYBfEhsd1nwGoA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { "version": "1.23.9", "dev": true, @@ -3190,27 +2409,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/espower-location-detector": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", - "integrity": "sha512-Y/3H6ytYwqC3YcOc0gOU22Lp3eI5GAFGOymTdzFyfaiglKgtsw2dePOgXY3yrV+QcLPMPiVYwBU9RKaDoh2bbQ==", - "dev": true, - "dependencies": { - "is-url": "^1.2.1", - "path-is-absolute": "^1.0.0", - "source-map": "^0.5.0", - "xtend": "^4.0.0" - } - }, "node_modules/espree": { "version": "9.6.1", "dev": true, @@ -3239,15 +2437,6 @@ "node": ">=4" } }, - "node_modules/espurify": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", - "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0" - } - }, "node_modules/esquery": { "version": "1.6.0", "dev": true, @@ -3286,14 +2475,11 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "node_modules/esutils": { "version": "2.0.3", @@ -3417,15 +2603,15 @@ } }, "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "is-unicode-supported": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3442,6 +2628,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -3469,16 +2661,16 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -3577,20 +2769,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "license": "MIT", @@ -3641,6 +2819,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "dev": true, @@ -3672,18 +2862,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-proto": { "version": "1.0.1", "dev": true, @@ -3752,18 +2930,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/globals": { "version": "11.12.0", "dev": true, @@ -3788,31 +2954,32 @@ } }, "node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/globby/node_modules/ignore": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 4" } }, "node_modules/gopd": { @@ -3826,28 +2993,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "dev": true, @@ -3927,15 +3072,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hasha": { "version": "5.2.2", "dev": true, @@ -3972,22 +3108,23 @@ "node": ">= 0.4" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, "node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } }, "node_modules/ignore": { "version": "5.3.2", @@ -3998,10 +3135,13 @@ } }, "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "dev": true, + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } }, "node_modules/import-fresh": { "version": "3.3.1", @@ -4018,34 +3158,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "dev": true, @@ -4055,12 +3167,15 @@ } }, "node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inflight": { @@ -4077,12 +3192,6 @@ "dev": true, "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "node_modules/internal-slot": { "version": "1.1.0", "dev": true, @@ -4104,28 +3213,12 @@ } }, "node_modules/irregular-plurals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/is-array-buffer": { @@ -4144,12 +3237,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, "node_modules/is-async-function": { "version": "2.1.1", "dev": true, @@ -4182,18 +3269,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.2.2", "dev": true, @@ -4220,18 +3295,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.16.1", "license": "MIT", @@ -4276,12 +3339,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-error": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", - "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", - "dev": true - }, "node_modules/is-extglob": { "version": "2.1.1", "license": "MIT", @@ -4339,31 +3396,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-installed-globally/node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-map": { "version": "2.0.3", "dev": true, @@ -4375,15 +3407,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4407,60 +3430,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-observable": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", - "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd/node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "dev": true, @@ -4469,28 +3438,19 @@ "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-plain-object": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "dev": true }, "node_modules/is-regex": { @@ -4592,17 +3552,17 @@ "dev": true, "license": "MIT" }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/is-weakmap": { "version": "2.0.2", @@ -4652,12 +3612,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "node_modules/isexe": { "version": "2.0.0", "license": "ISC" @@ -4860,12 +3814,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "dev": true, @@ -4895,18 +3843,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/levn": { "version": "0.4.1", "dev": true, @@ -4920,50 +3856,15 @@ } }, "node_modules/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -4972,88 +3873,16 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "dev": true, "license": "MIT" }, - "node_modules/lodash.islength": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.islength/-/lodash.islength-4.0.1.tgz", - "integrity": "sha512-FlJtdcHNU8YEXbzZXYWMEHLkQOpvmlnGr5o2N1iQKB7hNyr6qPkWAe+Ceczz6JYlIzD4AlTD2igvt/2/0Pb3Zw==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", - "dev": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "dev": true, @@ -5077,34 +3906,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/matcher": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", - "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dev": true, "dependencies": { - "escape-string-regexp": "^2.0.0" + "escape-string-regexp": "^5.0.0" }, "engines": { - "node": ">=8" - } + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/matcher/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/math-intrinsics": { @@ -5116,41 +3942,30 @@ } }, "node_modules/md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha512-0HLfzJTZ7707VBNM1ydr5sTb+IZLhmU4u2TVA+Eenfn/Ed42/gn10smbAPiuEm/jNgjvWKUiMNihqJQ6flus9w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", "dev": true, "dependencies": { - "md5-o-matic": "^0.1.1" + "blueimp-md5": "^2.10.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha512-QBJSFpsedXUl/Lgs4ySdB2XCzUEcJ3ujpbagdZCkRaYIaC0kFnID8jhc84KEiVv6dNFtIrmW7bqow0lDxgJi6A==", - "dev": true - }, - "node_modules/meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "node_modules/memoize": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.1.0.tgz", + "integrity": "sha512-MMbFhJzh4Jlg/poq1si90XRlTZRDHVqdlz2mPyGJ6kqMpyHUyVpDd5gpFAvVehW64+RA1eKE9Yt8aSLY7w2Kgg==", "dev": true, "dependencies": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" + "mimic-function": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/memoize?sponsor=1" } }, "node_modules/merge2": { @@ -5172,22 +3987,16 @@ "node": ">=8.6" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { @@ -5209,29 +4018,40 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimist-options": { + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dev": true, "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">= 4" + "node": ">= 18" } }, "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, "bin": { - "mkdirp": "bin/cmd.js" + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ms": { @@ -5248,6 +4068,37 @@ "version": "1.0.5", "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-preload": { "version": "0.2.1", "dev": true, @@ -5264,43 +4115,28 @@ "dev": true, "license": "MIT" }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12.19" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-run-path": { @@ -5435,15 +4271,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "dev": true, @@ -5455,22 +4282,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "dev": true, @@ -5558,19 +4369,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/observable-to-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-1.0.0.tgz", - "integrity": "sha512-cqnGUrNsE6vdVDTPAX9/WeVzwy/z37vdxupdQXU8vgTXRFH72KCZiZga8aca2ulRPIeem8W3vW9rQHBwfIl2WA==", - "dev": true, - "dependencies": { - "is-observable": "^2.0.0", - "symbol-observable": "^1.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/once": { "version": "1.4.0", "license": "ISC", @@ -5578,18 +4376,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { "version": "0.9.4", "dev": true, @@ -5606,58 +4392,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/own-keys": { "version": "1.0.1", "dev": true, @@ -5674,15 +4408,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-finally": { "version": "1.0.0", "license": "MIT", @@ -5704,25 +4429,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -5733,6 +4449,22 @@ "node": ">=6" } }, + "node_modules/package-config": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/package-config/-/package-config-5.0.0.tgz", + "integrity": "sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==", + "dev": true, + "dependencies": { + "find-up-simple": "^1.0.0", + "load-json-file": "^7.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", @@ -5748,21 +4480,6 @@ "node": ">=8" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -5774,35 +4491,16 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/path-is-absolute": { @@ -5813,12 +4511,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "dev": true, @@ -5832,24 +4524,15 @@ "license": "MIT" }, "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-type/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/picocolors": { @@ -5867,49 +4550,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -5968,272 +4608,97 @@ "node": ">=8" } }, - "node_modules/plur": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", - "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", - "dev": true, - "dependencies": { - "irregular-plurals": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-ms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz", - "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==", - "dev": true, - "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process-on-spawn": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "dev": true, "dependencies": { - "p-try": "^1.0.0" + "irregular-plurals": "^3.3.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/possible-typed-array-names": { + "version": "1.1.0", "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/read-pkg/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "parse-ms": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/process-on-spawn": { + "version": "1.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/pump": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/punycode": { + "version": "2.3.1", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/rechoir": { "version": "0.6.2", "dependencies": { @@ -6243,19 +4708,6 @@ "node": ">= 0.10" } }, - "node_modules/redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", - "dev": true, - "dependencies": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "dev": true, @@ -6277,24 +4729,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "dev": true, @@ -6314,77 +4748,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "dev": true, @@ -6409,15 +4772,6 @@ "dev": true, "license": "ISC" }, - "node_modules/require-precompiled": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", - "integrity": "sha512-UWQr7MdatK8cF0JXrrqVPal2sUdhpCj8f4sC7VMDONA/+WSVv5ElRku3qDEZ+FIqoN91zhhfB+t1P3+qQNaYGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.10", "license": "MIT", @@ -6465,28 +4819,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/reusify": { "version": "1.1.0", "license": "MIT", @@ -6495,19 +4827,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ @@ -6596,34 +4915,31 @@ "semver": "bin/semver.js" } }, - "node_modules/semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, "dependencies": { - "semver": "^5.0.3" + "type-fest": "^0.13.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/set-blocking": { @@ -6883,87 +5199,55 @@ "license": "ISC" }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/spawn-wrap": { @@ -7008,53 +5292,21 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { @@ -7155,33 +5407,24 @@ } }, "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-bom": { "version": "4.0.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-buf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz", - "integrity": "sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.1" - }, + "license": "MIT", "engines": { "node": ">=8" } @@ -7193,15 +5436,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "dev": true, @@ -7214,28 +5448,18 @@ } }, "node_modules/supertap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-1.0.0.tgz", - "integrity": "sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", "dev": true, "dependencies": { - "arrify": "^1.0.1", - "indent-string": "^3.2.0", - "js-yaml": "^3.10.0", - "serialize-error": "^2.1.0", - "strip-ansi": "^4.0.0" + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/supertap/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/supertap/node_modules/argparse": { @@ -7260,18 +5484,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/supertap/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7303,114 +5515,41 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, "dependencies": { - "execa": "^0.7.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/term-size/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "node": ">=18" } }, - "node_modules/term-size/node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/term-size/node_modules/get-stream": { + "node_modules/temp-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/term-size/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/term-size/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/term-size/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/term-size/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">=14.16" } }, - "node_modules/term-size/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, "node_modules/test-exclude": { "version": "6.0.0", "dev": true, @@ -7438,15 +5577,6 @@ "node": ">=4" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7458,6 +5588,12 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "node_modules/travis-check-changes": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.5.1.tgz", @@ -7491,33 +5627,6 @@ "node": ">=18" } }, - "node_modules/trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/trim-off-newlines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", - "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "dev": true, @@ -7645,12 +5754,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha512-5gSP1liv10Gjp8cMEnFd6shzkL/D6W1uhXSFNCxDC+YI8+L8wkCYCbJ7n77Ezb4wE/xzMogecE+DtamEe9PZjg==", - "dev": true - }, "node_modules/unbox-primitive": { "version": "1.1.0", "dev": true, @@ -7668,76 +5771,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, - "dependencies": { - "crypto-random-string": "^1.0.0" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/unique-temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", - "integrity": "sha512-tE68ki2FndoVdPioyiz8mYaJeX3xU/9lk4dml7KlLKEkWLtDGAYeg5LGjE2dMkzB8d6R3HbcKTn/I14nukP2dw==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1", - "os-tmpdir": "^1.0.1", - "uid2": "0.0.3" + "node": ">=18" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/update-browserslist-db": { @@ -7769,55 +5812,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", - "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", - "dev": true, - "dependencies": { - "boxen": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.1.0", - "is-npm": "^3.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/uri-js": { "version": "4.4.1", "dev": true, @@ -7826,18 +5820,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/uuid": { "version": "8.3.2", "dev": true, @@ -7846,24 +5828,11 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/well-known-symbols": { "version": "2.0.0", @@ -7874,6 +5843,16 @@ "node": ">=6" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "dev": true, @@ -7978,61 +5957,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "dependencies": { - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "dev": true, @@ -8118,24 +6042,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "4.0.3", "dev": true, @@ -8168,12 +6074,12 @@ } }, "node_modules/yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "camelcase": "^4.1.0" + "engines": { + "node": ">=12" } }, "node_modules/yargs/node_modules/camelcase": { diff --git a/package.json b/package.json index b4872d32d..f7b4cf23a 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "shjs": "./bin/shjs" }, "dependencies": { + "audit": "^0.0.6", "execa": "^1.0.0", "fast-glob": "^3.3.2", "interpret": "^1.0.0", @@ -66,6 +67,7 @@ }, "ava": { "serial": true, + "workerThreads": false, "powerAssert": false, "files": [ "test/*.js" @@ -76,7 +78,7 @@ ] }, "devDependencies": { - "ava": "^2.4.0", + "ava": "^6.2.0", "chalk": "^4.1.2", "coffee-script": "^1.12.7", "eslint": "^8.2.0", diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 892272c83..1e28f5360 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -12,6 +12,7 @@ "global-require": "off", "import/no-dynamic-require": "off", "import/no-mutable-exports": "off", + "import/no-unresolved": "off", "indent": "off", "max-len": "off", "no-bitwise": "off", From 75d26de5b31f71bc8784e3d9329375e83c7b6d49 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 10 Apr 2025 01:19:14 -0700 Subject: [PATCH 313/338] fix: cmd is compatible with node 22.10 Starting in node >= 22.10.0, a commandNotFound error will have `undefined` values for stdout/stderr, whereas in earlier versions these values were `null`. Fixes #1180 --- .github/workflows/main.yml | 2 +- scripts/check-node-support.js | 3 ++- src/cmd.js | 9 ++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7cede0ecb..3ed26651a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: node-version: - 18 - 20 - - '22.9.0' + - 22 os: - ubuntu-latest - macos-latest diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index e33574f88..8ea89d80d 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -18,7 +18,8 @@ var MAX_NODE_VERSION = 22; var pinnedNodeVersions = { // Format: // majorVersionInt: 'full.node.version', - 22: '22.9.0', + // Example: + // 22: '22.9.0', }; function checkReadme(minNodeVersion) { diff --git a/src/cmd.js b/src/cmd.js index 455fb3a65..e1023cd5f 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -11,13 +11,20 @@ common.register('cmd', _cmd, { wrapOutput: true, }); +function isNullOrUndefined(val) { + return val === null || val === undefined; +} + function commandNotFound(execaResult) { if (process.platform === 'win32') { var str = 'is not recognized as an internal or external command'; return execaResult.code && execaResult.stderr.includes(str); } else { + // On node <= 22.9.0, stdout/stderr are 'null'. + // On node >= 22.10, stdout/stderr are 'undefined'. return execaResult.code && - execaResult.stdout === null && execaResult.stderr === null; + isNullOrUndefined(execaResult.stdout) && + isNullOrUndefined(execaResult.stderr); } } From 3149e09d5fb1c6af74ffc0128f0f7daf18d3c858 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 10 Apr 2025 10:52:13 -0700 Subject: [PATCH 314/338] refactor: explicit handling for execa errors This adds a dedicated if-condition to handle internal errors from execa (timeout, maxBuffer, etc.) and to distinguish these from "regular" errors (the command executed, but it failed with non-zero status). --- src/cmd.js | 12 +++++++++++- test/cmd.js | 14 ++++++++++---- test/exec.js | 7 +++++-- test/resources/exec/slow.js | 1 + 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/cmd.js b/src/cmd.js index e1023cd5f..a4b174361 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -116,10 +116,20 @@ function _cmd(options, command, commandArgs, userOptions) { stdout = ''; stderr = "'" + command + "': command not found"; code = COMMAND_NOT_FOUND_ERROR_CODE; - } else { + } else if (typeof result.stdout === 'string' && + typeof result.stderr === 'string' && + typeof result.code === 'number') { + // Normal exit: execa was able to execute `command` and get a return value. stdout = result.stdout.toString(); stderr = result.stderr.toString(); code = result.code; + } else { + // Catch-all: execa tried to run `command` but it encountered some error + // (ex. maxBuffer, timeout). + stdout = result.stdout || ''; + stderr = result.stderr || + `'${command}' encountered an error during execution`; + code = result.code > 0 ? result.code : 1; } // Pass `continue: true` so we can specify a value for stdout. diff --git a/test/cmd.js b/test/cmd.js index b8ae69cce..0165176ef 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -178,20 +178,26 @@ test('set cwd', t => { }); test('set maxBuffer (very small)', t => { - const result = shell.cmd('shx', 'echo', '1234567890'); // default maxBuffer is ok + let result = shell.cmd('shx', 'echo', '1234567890'); // default maxBuffer is ok t.falsy(shell.error()); t.is(result.code, 0); t.is(result.stdout, '1234567890\n'); - shell.cmd('shx', 'echo', '1234567890', { maxBuffer: 6 }); + result = shell.cmd('shx', 'echo', '1234567890', { maxBuffer: 6 }); t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stdout, '1234567890\n'); }); test('set timeout option', t => { - const result = shell.cmd(shell.config.execPath, 'test/resources/exec/slow.js', '100'); // default timeout is ok + let result = shell.cmd(shell.config.execPath, 'test/resources/exec/slow.js', '100'); // default timeout is ok t.falsy(shell.error()); + t.is(result.stdout, 'fast\nslow\n'); t.is(result.code, 0); - shell.cmd(shell.config.execPath, 'test/resources/exec/slow.js', '2000', { timeout: 1000 }); // times out + result = shell.cmd(shell.config.execPath, 'test/resources/exec/slow.js', '2000', { timeout: 1000 }); // times out t.truthy(shell.error()); + t.is(result.stdout, 'fast\n'); + t.truthy(result.stderr); + t.is(result.code, 1); }); test('check process.env works', t => { diff --git a/test/exec.js b/test/exec.js index 4f216639d..79caca5da 100644 --- a/test/exec.js +++ b/test/exec.js @@ -152,11 +152,14 @@ test('set maxBuffer (very small)', t => { }); test('set timeout option', t => { - const result = shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`); // default timeout is ok + let result = shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 100`); // default timeout is ok t.falsy(shell.error()); t.is(result.code, 0); - shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 2000`, { timeout: 1000 }); // times out + t.is(result.stdout, 'fast\nslow\n'); + result = shell.exec(`${JSON.stringify(shell.config.execPath)} test/resources/exec/slow.js 2000`, { timeout: 1000 }); // times out t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stdout, 'fast\n'); }); test('check process.env works', t => { diff --git a/test/resources/exec/slow.js b/test/resources/exec/slow.js index cffff43f5..d8f26becd 100644 --- a/test/resources/exec/slow.js +++ b/test/resources/exec/slow.js @@ -1,4 +1,5 @@ #!/usr/bin/env node +console.log('fast'); setTimeout(function() { console.log('slow'); }, parseInt(process.argv[2], 10)); From bfd06fa0967b441c5aecfcb992500b9ee240a267 Mon Sep 17 00:00:00 2001 From: Alana Gilston Date: Sat, 19 Apr 2025 08:26:51 -0700 Subject: [PATCH 315/338] Add -B, -A, and -C options to grep (#1206) Adds the -B (before context), -A (after context), and -C (before+after context) options to grep. Example usage: ``` grep -B [args...] grep -A [args...] ``` --- README.md | 6 + src/grep.js | 126 +++++++++++++++++++- test/grep.js | 240 ++++++++++++++++++++++++++++++++++++++ test/resources/grep/file3 | 15 +++ 4 files changed, 381 insertions(+), 6 deletions(-) create mode 100644 test/resources/grep/file3 diff --git a/README.md b/README.md index e585e4be2..a0de67655 100644 --- a/README.md +++ b/README.md @@ -419,12 +419,18 @@ Available options: + `-l`: Print only filenames of matching files. + `-i`: Ignore case. + `-n`: Print line numbers. ++ `-B `: Show `` lines before each result. ++ `-A `: Show `` lines after each result. ++ `-C `: Show `` lines before and after each result. -B and -A override this option. Examples: ```javascript grep('-v', 'GLOBAL_VARIABLE', '*.js'); grep('GLOBAL_VARIABLE', '*.js'); +grep('-B', 3, 'GLOBAL_VARIABLE', '*.js'); +grep({ '-B': 3 }, 'GLOBAL_VARIABLE', '*.js'); +grep({ '-B': 3, '-C': 2 }, 'GLOBAL_VARIABLE', '*.js'); ``` Reads input string from given files and returns a diff --git a/src/grep.js b/src/grep.js index 63792e640..cfc83e40e 100644 --- a/src/grep.js +++ b/src/grep.js @@ -9,6 +9,9 @@ common.register('grep', _grep, { 'l': 'nameOnly', 'i': 'ignoreCase', 'n': 'lineNumber', + 'B': 'beforeContext', + 'A': 'afterContext', + 'C': 'context', }, }); @@ -22,12 +25,18 @@ common.register('grep', _grep, { //@ + `-l`: Print only filenames of matching files. //@ + `-i`: Ignore case. //@ + `-n`: Print line numbers. +//@ + `-B `: Show `` lines before each result. +//@ + `-A `: Show `` lines after each result. +//@ + `-C `: Show `` lines before and after each result. -B and -A override this option. //@ //@ Examples: //@ //@ ```javascript //@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); //@ grep('GLOBAL_VARIABLE', '*.js'); +//@ grep('-B', 3, 'GLOBAL_VARIABLE', '*.js'); +//@ grep({ '-B': 3 }, 'GLOBAL_VARIABLE', '*.js'); +//@ grep({ '-B': 3, '-C': 2 }, 'GLOBAL_VARIABLE', '*.js'); //@ ``` //@ //@ Reads input string from given files and returns a @@ -39,7 +48,41 @@ function _grep(options, regex, files) { if (!files && !pipe) common.error('no paths given', 2); - files = [].slice.call(arguments, 2); + var idx = 2; + var contextError = ': invalid context length argument'; + // If the option has been found but not read, copy value from arguments + if (options.beforeContext === true) { + idx = 3; + options.beforeContext = Number(arguments[1]); + if (options.beforeContext < 0) { + common.error(options.beforeContext + contextError, 2); + } + } + if (options.afterContext === true) { + idx = 3; + options.afterContext = Number(arguments[1]); + if (options.afterContext < 0) { + common.error(options.afterContext + contextError, 2); + } + } + if (options.context === true) { + idx = 3; + options.context = Number(arguments[1]); + if (options.context < 0) { + common.error(options.context + contextError, 2); + } + } + // If before or after not given but context is, update values + if (typeof options.context === 'number') { + if (options.beforeContext === false) { + options.beforeContext = options.context; + } + if (options.afterContext === false) { + options.afterContext = options.context; + } + } + regex = arguments[idx - 1]; + files = [].slice.call(arguments, idx); if (pipe) { files.unshift('-'); @@ -62,16 +105,79 @@ function _grep(options, regex, files) { } } else { var lines = contents.split('\n'); + var matches = []; + lines.forEach(function (line, index) { var matched = line.match(regex); if ((options.inverse && !matched) || (!options.inverse && matched)) { - var result = line; - if (options.lineNumber) { - result = '' + (index + 1) + ':' + line; + var lineNumber = index + 1; + var result = {}; + if (matches.length > 0) { + // If the last result intersects, combine them + var last = matches[matches.length - 1]; + var minimumLineNumber = Math.max( + 1, + lineNumber - options.beforeContext - 1, + ); + if ( + last.hasOwnProperty('' + lineNumber) || + last.hasOwnProperty('' + minimumLineNumber) + ) { + result = last; + } + } + result[lineNumber] = { + line, + match: true, + }; + if (options.beforeContext > 0) { + // Store the lines with their line numbers to check for overlap + lines + .slice(Math.max(index - options.beforeContext, 0), index) + .forEach(function (v, i, a) { + var lineNum = '' + (index - a.length + i + 1); + if (!result.hasOwnProperty(lineNum)) { + result[lineNum] = { line: v, match: false }; + } + }); + } + if (options.afterContext > 0) { + // Store the lines with their line numbers to check for overlap + lines + .slice( + index + 1, + Math.min(index + options.afterContext + 1, lines.length - 1), + ) + .forEach(function (v, i) { + var lineNum = '' + (index + 1 + i + 1); + if (!result.hasOwnProperty(lineNum)) { + result[lineNum] = { line: v, match: false }; + } + }); + } + // Only add the result if it's new + if (!matches.includes(result)) { + matches.push(result); } - grep.push(result); } }); + + // Loop through the matches and add them to the output + Array.prototype.push.apply( + grep, + matches.map(function (result) { + return Object.entries(result) + .map(function (entry) { + var lineNumber = entry[0]; + var line = entry[1].line; + var match = entry[1].match; + return options.lineNumber + ? lineNumber + (match ? ':' : '-') + line + : line; + }) + .join('\n'); + }), + ); } }); @@ -79,6 +185,14 @@ function _grep(options, regex, files) { // We didn't hit the error above, but pattern didn't match common.error('', { silent: true }); } - return grep.join('\n') + '\n'; + + var separator = '\n'; + if ( + typeof options.beforeContext === 'number' || + typeof options.afterContext === 'number' + ) { + separator = '\n--\n'; + } + return grep.join(separator) + '\n'; } module.exports = _grep; diff --git a/test/grep.js b/test/grep.js index e12ab80f9..4b64d6e76 100644 --- a/test/grep.js +++ b/test/grep.js @@ -57,6 +57,27 @@ test("multiple files, one doesn't exist, one doesn't match", t => { t.is(result.code, 2); }); +test('-A option, negative value', t => { + const result = shell.grep('-A', -2, 'test*', 'test/resources/grep/file3'); + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.stderr, 'grep: -2: invalid context length argument'); +}); + +test('-B option, negative value', t => { + const result = shell.grep('-B', -3, 'test*', 'test/resources/grep/file3'); + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.stderr, 'grep: -3: invalid context length argument'); +}); + +test('-C option, negative value', t => { + const result = shell.grep('-C', -1, 'test*', 'test/resources/grep/file3'); + t.truthy(shell.error()); + t.is(result.code, 2); + t.is(result.stderr, 'grep: -1: invalid context length argument'); +}); + // // Valids // @@ -174,3 +195,222 @@ test('the pattern looks like an option', t => { t.falsy(shell.error()); t.is(result.toString(), '-v\n-vv\n'); }); + +// +// Before & after contexts +// +test('-B option', t => { + const result = shell.grep('-B', 3, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + 'line1\n' + + 'line2 test line\n' + + 'line3 test line\n' + + '--\n' + + 'line7\n' + + 'line8\n' + + 'line9\n' + + 'line10 test line\n' + + '--\n' + + 'line12\n' + + 'line13\n' + + 'line14\n' + + 'line15 test line\n', + ); +}); + +test('-B option, -n option', t => { + const result = shell.grep('-nB', 3, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + '1-line1\n' + + '2:line2 test line\n' + + '3:line3 test line\n' + + '--\n' + + '7-line7\n' + + '8-line8\n' + + '9-line9\n' + + '10:line10 test line\n' + + '--\n' + + '12-line12\n' + + '13-line13\n' + + '14-line14\n' + + '15:line15 test line\n', + ); +}); + +test('-A option', t => { + const result = shell.grep('-A', 2, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + 'line2 test line\n' + + 'line3 test line\n' + + 'line4\n' + + 'line5\n' + + '--\n' + + 'line10 test line\n' + + 'line11\n' + + 'line12\n' + + '--\n' + + 'line15 test line\n', + ); +}); + +test('-A option, -B option', t => { + const result = shell.grep( + { '-A': 2, '-B': 3 }, + 'test*', + 'test/resources/grep/file3', + ); + t.falsy(shell.error()); + t.is( + result.toString(), + 'line1\n' + + 'line2 test line\n' + + 'line3 test line\n' + + 'line4\n' + + 'line5\n' + + '--\n' + + 'line7\n' + + 'line8\n' + + 'line9\n' + + 'line10 test line\n' + + 'line11\n' + + 'line12\n' + + 'line13\n' + + 'line14\n' + + 'line15 test line\n', + ); +}); + +test('-A option, -B option, -n option', t => { + const result = shell.grep( + { '-n': true, '-A': 2, '-B': 3 }, + 'test*', + 'test/resources/grep/file3', + ); + t.falsy(shell.error()); + t.is( + result.toString(), + '1-line1\n' + + '2:line2 test line\n' + + '3:line3 test line\n' + + '4-line4\n' + + '5-line5\n' + + '--\n' + + '7-line7\n' + + '8-line8\n' + + '9-line9\n' + + '10:line10 test line\n' + + '11-line11\n' + + '12-line12\n' + + '13-line13\n' + + '14-line14\n' + + '15:line15 test line\n', + ); +}); + +test('-C option', t => { + const result = shell.grep('-C', 3, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + 'line1\n' + + 'line2 test line\n' + + 'line3 test line\n' + + 'line4\n' + + 'line5\n' + + 'line6\n' + + 'line7\n' + + 'line8\n' + + 'line9\n' + + 'line10 test line\n' + + 'line11\n' + + 'line12\n' + + 'line13\n' + + 'line14\n' + + 'line15 test line\n', + ); +}); + +test('-C option, small value', t => { + const result = shell.grep('-C', 1, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + 'line1\n' + + 'line2 test line\n' + + 'line3 test line\n' + + 'line4\n' + + '--\n' + + 'line9\n' + + 'line10 test line\n' + + 'line11\n' + + '--\n' + + 'line14\n' + + 'line15 test line\n', + ); +}); + +test('-C option, large value', t => { + const result = shell.grep('-C', 100, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + 'line1\n' + + 'line2 test line\n' + + 'line3 test line\n' + + 'line4\n' + + 'line5\n' + + 'line6\n' + + 'line7\n' + + 'line8\n' + + 'line9\n' + + 'line10 test line\n' + + 'line11\n' + + 'line12\n' + + 'line13\n' + + 'line14\n' + + 'line15 test line\n', + ); +}); + +test('-C option, add line separators', t => { + const result = shell.grep('-C', 0, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + 'line2 test line\n' + + 'line3 test line\n' + + '--\n' + + 'line10 test line\n' + + '--\n' + + 'line15 test line\n', + ); +}); + +test('-C option, -n option', t => { + const result = shell.grep('-nC', 3, 'test*', 'test/resources/grep/file3'); + t.falsy(shell.error()); + t.is( + result.toString(), + '1-line1\n' + + '2:line2 test line\n' + + '3:line3 test line\n' + + '4-line4\n' + + '5-line5\n' + + '6-line6\n' + + '7-line7\n' + + '8-line8\n' + + '9-line9\n' + + '10:line10 test line\n' + + '11-line11\n' + + '12-line12\n' + + '13-line13\n' + + '14-line14\n' + + '15:line15 test line\n', + ); +}); diff --git a/test/resources/grep/file3 b/test/resources/grep/file3 new file mode 100644 index 000000000..e4bee9f8c --- /dev/null +++ b/test/resources/grep/file3 @@ -0,0 +1,15 @@ +line1 +line2 test line +line3 test line +line4 +line5 +line6 +line7 +line8 +line9 +line10 test line +line11 +line12 +line13 +line14 +line15 test line From 67a26e2ccc2c5ffa2610912621ad4de26c93c6cb Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 24 Apr 2025 19:34:20 -0700 Subject: [PATCH 316/338] refactor: change how internal errors are handled This is an internal refactor to change how we handle execa errors inside of shell.cmd(). This also adds a test case for a command which fails silently to make sure that we handle this case correctly. --- src/cmd.js | 30 +++++++++++++++++++----------- test/cmd.js | 8 ++++++++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/cmd.js b/src/cmd.js index a4b174361..d017a436e 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -15,7 +15,7 @@ function isNullOrUndefined(val) { return val === null || val === undefined; } -function commandNotFound(execaResult) { +function isCommandNotFound(execaResult) { if (process.platform === 'win32') { var str = 'is not recognized as an internal or external command'; return execaResult.code && execaResult.stderr.includes(str); @@ -28,6 +28,16 @@ function commandNotFound(execaResult) { } } +function isExecaInternalError(result) { + if (typeof result.stdout !== 'string') return true; + if (typeof result.stderr !== 'string') return true; + if (typeof result.code !== 'number') return true; + if (result.code === 0 && result.failed) return true; + // Otherwise assume this executed correctly. The command may still have exited + // with non-zero status, but that's not due to anything execa did. + return false; +} + //@ //@ ### cmd(arg1[, arg2, ...] [, options]) //@ @@ -110,26 +120,24 @@ function _cmd(options, command, commandArgs, userOptions) { var stdout; var stderr; var code; - if (commandNotFound(result)) { + if (isCommandNotFound(result)) { // This can happen if `command` is not an executable binary, or possibly // under other conditions. stdout = ''; stderr = "'" + command + "': command not found"; code = COMMAND_NOT_FOUND_ERROR_CODE; - } else if (typeof result.stdout === 'string' && - typeof result.stderr === 'string' && - typeof result.code === 'number') { - // Normal exit: execa was able to execute `command` and get a return value. - stdout = result.stdout.toString(); - stderr = result.stderr.toString(); - code = result.code; - } else { + } else if (isExecaInternalError(result)) { // Catch-all: execa tried to run `command` but it encountered some error // (ex. maxBuffer, timeout). stdout = result.stdout || ''; stderr = result.stderr || `'${command}' encountered an error during execution`; - code = result.code > 0 ? result.code : 1; + code = typeof result.code === 'number' && result.code > 0 ? result.code : 1; + } else { + // Normal exit: execa was able to execute `command` and get a return value. + stdout = result.stdout.toString(); + stderr = result.stderr.toString(); + code = result.code; } // Pass `continue: true` so we can specify a value for stdout. diff --git a/test/cmd.js b/test/cmd.js index 0165176ef..f49c98873 100644 --- a/test/cmd.js +++ b/test/cmd.js @@ -177,6 +177,14 @@ test('set cwd', t => { t.is(result.stdout, path.resolve('..') + '\n'); }); +test('command fails silently with non-zero status', t => { + const result = shell.cmd('shx', 'false'); + t.truthy(shell.error()); + t.is(result.code, 1); + t.is(result.stdout, ''); + t.is(result.stderr, ''); +}); + test('set maxBuffer (very small)', t => { let result = shell.cmd('shx', 'echo', '1234567890'); // default maxBuffer is ok t.falsy(shell.error()); From e48e9195438e10f06273734d3ab67d941eeaecc8 Mon Sep 17 00:00:00 2001 From: Julien Barbay Date: Thu, 10 Apr 2025 09:21:09 +0700 Subject: [PATCH 317/338] bump execa (#1216) This update execa to v5. --- package-lock.json | 2899 ++++++++++++++++++++++++++++++--------------- package.json | 2 +- src/cmd.js | 23 +- 3 files changed, 1938 insertions(+), 986 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0899b946f..7545e8ee5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "BSD-3-Clause", "dependencies": { "audit": "^0.0.6", - "execa": "^1.0.0", + "execa": "^5.1.1", "fast-glob": "^3.3.2", "interpret": "^1.0.0", "rechoir": "^0.6.2" @@ -38,6 +38,8 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -50,6 +52,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -63,6 +67,8 @@ }, "node_modules/@babel/compat-data": { "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -70,20 +76,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", + "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -100,16 +108,30 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.26.9", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -119,11 +141,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", + "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -133,8 +157,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "license": "MIT", "dependencies": { @@ -147,6 +183,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", "dependencies": { @@ -163,6 +201,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { @@ -171,6 +211,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", "engines": { @@ -179,6 +221,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", "engines": { @@ -190,6 +234,7 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" @@ -203,6 +248,7 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.27.0" }, @@ -218,6 +264,7 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", @@ -228,15 +275,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.9", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -244,11 +293,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -258,7 +318,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, "license": "MIT", "dependencies": { @@ -276,6 +338,8 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -284,6 +348,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -304,33 +370,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { @@ -339,6 +382,9 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -352,6 +398,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -364,6 +412,9 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, @@ -372,6 +423,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -381,6 +433,8 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -396,22 +450,18 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -424,6 +474,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -436,6 +488,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -445,35 +499,39 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -482,6 +540,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -495,6 +555,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -503,6 +565,8 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { @@ -511,11 +575,15 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -528,6 +596,7 @@ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", @@ -544,20 +613,10 @@ "node": ">=18" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -569,6 +628,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -576,6 +637,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -590,6 +653,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -607,20 +671,10 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT" }, @@ -629,6 +683,7 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -640,15 +695,20 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, @@ -657,6 +717,7 @@ "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz", "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==", "dev": true, + "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0-rc.0", "@rollup/pluginutils": "^5.1.3", @@ -678,38 +739,20 @@ "node": ">=16" } }, - "node_modules/@vercel/nft/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@vercel/nft/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/abbrev": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/acorn": { "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { @@ -724,12 +767,15 @@ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -741,6 +787,7 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -753,12 +800,15 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { @@ -771,6 +821,8 @@ }, "node_modules/aggregate-error/node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -779,6 +831,8 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -797,6 +851,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -805,18 +860,22 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/append-transform": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "license": "MIT", "dependencies": { @@ -828,16 +887,22 @@ }, "node_modules/archy": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -856,12 +921,15 @@ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array-includes": { "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { @@ -880,16 +948,19 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -900,6 +971,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { @@ -917,6 +990,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { @@ -934,6 +1009,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -957,6 +1034,7 @@ "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -966,6 +1044,7 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -975,6 +1054,8 @@ }, "node_modules/async-function": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -985,7 +1066,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/audit": { "version": "0.0.6", @@ -1000,6 +1082,7 @@ "resolved": "https://registry.npmjs.org/ava/-/ava-6.2.0.tgz", "integrity": "sha512-+GZk5PbyepjiO/68hzCZCUepQOQauKfNnI7sA4JukBTg97jD7E+tDKEA7OhGOGr6EorNNMM9+jqvgHVOTOzG4w==", "dev": true, + "license": "MIT", "dependencies": { "@vercel/nft": "^0.27.5", "acorn": "^8.13.0", @@ -1057,44 +1140,12 @@ } } }, - "node_modules/ava/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ava/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ava/node_modules/callsites": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ava/node_modules/chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1102,194 +1153,50 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ava/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ava/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/ava/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "file-uri-to-path": "1.0.0" } }, - "node_modules/ava/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ava/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/ava/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ava/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/ava/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ava/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ava/node_modules/write-file-atomic": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", - "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ava/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ava/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -1301,6 +1208,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1310,6 +1218,8 @@ }, "node_modules/browserslist": { "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -1341,6 +1251,8 @@ }, "node_modules/caching-transform": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "license": "MIT", "dependencies": { @@ -1353,8 +1265,23 @@ "node": ">=8" } }, + "node_modules/caching-transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/call-bind": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { @@ -1372,6 +1299,8 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1384,6 +1313,8 @@ }, "node_modules/call-bound": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { @@ -1398,7 +1329,22 @@ } }, "node_modules/callsites": { - "version": "3.1.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", + "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -1406,7 +1352,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001702", + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", "dev": true, "funding": [ { @@ -1429,6 +1377,7 @@ "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", "dev": true, + "license": "MIT", "dependencies": { "nofilter": "^3.1.0" }, @@ -1438,6 +1387,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -1453,6 +1404,8 @@ }, "node_modules/chalk/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -1465,27 +1418,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -1494,7 +1432,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ci-info": { "version": "4.2.0", @@ -1507,17 +1446,22 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ci-parallel-vars": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", "dev": true, "license": "MIT" }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { @@ -1529,6 +1473,7 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" @@ -1540,49 +1485,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { - "version": "6.0.0", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -1597,6 +1560,7 @@ "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, + "license": "MIT", "dependencies": { "convert-to-spaces": "^2.0.1" }, @@ -1606,6 +1570,9 @@ }, "node_modules/coffee-script": { "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", "dev": true, "license": "MIT", "bin": { @@ -1617,15 +1584,22 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, @@ -1633,15 +1607,20 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, @@ -1650,6 +1629,7 @@ "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", "dev": true, + "license": "ISC", "dependencies": { "date-time": "^3.1.0", "esutils": "^2.0.3", @@ -1664,20 +1644,10 @@ "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" } }, - "node_modules/concordance/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true, "license": "MIT" }, @@ -1686,12 +1656,15 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, + "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" } }, "node_modules/convert-source-map": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, "license": "MIT" }, @@ -1700,13 +1673,15 @@ "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/cross-spawn": { "version": "7.0.6", - "dev": true, + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -1722,6 +1697,7 @@ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dev": true, + "license": "MIT", "dependencies": { "array-find-index": "^1.0.1" }, @@ -1731,6 +1707,8 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1747,6 +1725,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1763,6 +1743,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1782,6 +1764,7 @@ "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", "dev": true, + "license": "MIT", "dependencies": { "time-zone": "^1.0.0" }, @@ -1791,6 +1774,8 @@ }, "node_modules/debug": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { @@ -1807,6 +1792,8 @@ }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", "engines": { @@ -1815,11 +1802,15 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/default-require-extensions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "license": "MIT", "dependencies": { @@ -1834,6 +1825,8 @@ }, "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -1850,6 +1843,8 @@ }, "node_modules/define-properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -1869,12 +1864,15 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8" } }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1886,6 +1884,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { @@ -1898,7 +1898,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.113", + "version": "1.5.135", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.135.tgz", + "integrity": "sha512-8gXUdEmvb+WCaYUhA0Svr08uSeRjM2w3x5uHOc1QbaEVzJXB8rgm5eptieXzyKoVEtinLvW6MtTcurA65PeS1Q==", "dev": true, "license": "ISC" }, @@ -1907,6 +1909,7 @@ "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.1.0.tgz", "integrity": "sha512-rsX7ktqARv/6UQDgMaLfIqUWAEzzbCQiVh7V9rhDXp6c37yoJcks12NVD+XPkgl4AEavmNhVfrhGoqYwIsMYYA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -1915,12 +1918,17 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -1928,6 +1936,8 @@ }, "node_modules/es-abstract": { "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "license": "MIT", "dependencies": { @@ -1992,6 +2002,8 @@ }, "node_modules/es-define-property": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { @@ -2000,6 +2012,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -2008,6 +2022,8 @@ }, "node_modules/es-object-atoms": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { @@ -2019,6 +2035,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -2033,6 +2051,8 @@ }, "node_modules/es-shim-unscopables": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { @@ -2044,6 +2064,8 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { @@ -2060,11 +2082,15 @@ }, "node_modules/es6-error": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true, "license": "MIT" }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -2072,15 +2098,23 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -2135,6 +2169,8 @@ }, "node_modules/eslint-config-airbnb-base": { "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, "license": "MIT", "dependencies": { @@ -2151,8 +2187,20 @@ "eslint-plugin-import": "^2.25.2" } }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { @@ -2163,6 +2211,8 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2171,6 +2221,8 @@ }, "node_modules/eslint-module-utils": { "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "license": "MIT", "dependencies": { @@ -2187,6 +2239,8 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2195,6 +2249,8 @@ }, "node_modules/eslint-plugin-import": { "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "license": "MIT", "dependencies": { @@ -2227,6 +2283,8 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2235,6 +2293,8 @@ }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2244,143 +2304,50 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "yocto-queue": "^0.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -2389,6 +2356,8 @@ }, "node_modules/eslint/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -2398,19 +2367,10 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2427,6 +2387,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -2439,6 +2401,8 @@ }, "node_modules/esquery": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2448,16 +2412,10 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2467,8 +2425,10 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2479,10 +2439,13 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2490,78 +2453,32 @@ } }, "node_modules/execa": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.6", - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" + "node": ">=10" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, @@ -2569,10 +2486,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2585,18 +2505,36 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -2607,6 +2545,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, + "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -2619,6 +2558,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -2632,12 +2573,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2647,6 +2590,8 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "license": "MIT", "dependencies": { @@ -2661,11 +2606,29 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-up-simple": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2675,6 +2638,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { @@ -2686,27 +2651,17 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/flatted": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/for-each": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -2721,6 +2676,8 @@ }, "node_modules/foreground-child": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { @@ -2736,6 +2693,8 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -2747,6 +2706,8 @@ }, "node_modules/fromentries": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { @@ -2766,11 +2727,15 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2778,6 +2743,8 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2797,6 +2764,8 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -2805,6 +2774,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -2813,6 +2784,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -2824,6 +2797,7 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2833,6 +2807,8 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2856,6 +2832,8 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -2864,6 +2842,8 @@ }, "node_modules/get-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { @@ -2875,17 +2855,21 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -2902,6 +2886,9 @@ }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -2920,26 +2907,38 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/globals": { - "version": "11.12.0", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2958,6 +2957,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", @@ -2978,12 +2978,15 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/gopd": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -2995,16 +2998,22 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/has-bigints": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -3015,15 +3024,19 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -3035,6 +3048,8 @@ }, "node_modules/has-proto": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3049,6 +3064,8 @@ }, "node_modules/has-symbols": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -3060,6 +3077,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -3074,6 +3093,8 @@ }, "node_modules/hasha": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3087,19 +3108,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasha/node_modules/is-stream": { - "version": "2.0.1", + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3110,6 +3132,8 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, @@ -3118,6 +3142,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -3126,8 +3151,19 @@ "node": ">= 14" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -3139,12 +3175,15 @@ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", "dev": true, + "license": "ISC", "engines": { "node": ">=10 <11 || >=12 <13 || >=14" } }, "node_modules/import-fresh": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3158,8 +3197,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -3171,6 +3222,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3180,6 +3232,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -3189,11 +3244,15 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -3207,6 +3266,8 @@ }, "node_modules/interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -3217,12 +3278,15 @@ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-array-buffer": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -3239,6 +3303,8 @@ }, "node_modules/is-async-function": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3257,6 +3323,8 @@ }, "node_modules/is-bigint": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3271,6 +3339,8 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -3286,6 +3356,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -3297,6 +3369,8 @@ }, "node_modules/is-core-module": { "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -3310,6 +3384,8 @@ }, "node_modules/is-data-view": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -3326,6 +3402,8 @@ }, "node_modules/is-date-object": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -3341,6 +3419,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3348,6 +3428,8 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -3361,16 +3443,22 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3388,6 +3476,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -3398,6 +3488,8 @@ }, "node_modules/is-map": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -3411,12 +3503,15 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -3432,6 +3527,8 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { @@ -3443,6 +3540,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3451,10 +3549,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { @@ -3472,6 +3573,8 @@ }, "node_modules/is-set": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -3483,6 +3586,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -3496,14 +3601,21 @@ } }, "node_modules/is-stream": { - "version": "1.1.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -3519,6 +3631,8 @@ }, "node_modules/is-symbol": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -3535,6 +3649,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3549,6 +3665,8 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, "license": "MIT" }, @@ -3557,6 +3675,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3566,6 +3685,8 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -3577,6 +3698,8 @@ }, "node_modules/is-weakref": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -3591,6 +3714,8 @@ }, "node_modules/is-weakset": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3606,18 +3731,31 @@ }, "node_modules/is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3626,6 +3764,8 @@ }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3637,25 +3777,16 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { "node": ">=10" @@ -3663,6 +3794,8 @@ }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "license": "ISC", "dependencies": { @@ -3679,6 +3812,8 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3688,22 +3823,10 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3717,6 +3840,8 @@ }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -3729,19 +3854,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3753,16 +3869,10 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-reports": { "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3778,17 +3888,22 @@ "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -3800,6 +3915,8 @@ }, "node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -3811,21 +3928,29 @@ }, "node_modules/json-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -3837,6 +3962,8 @@ }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -3845,6 +3972,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3860,6 +3989,7 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3867,24 +3997,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -3896,6 +4049,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -3906,11 +4060,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/matcher": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0" }, @@ -3926,6 +4091,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3935,6 +4101,8 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { @@ -3946,6 +4114,7 @@ "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", "dev": true, + "license": "MIT", "dependencies": { "blueimp-md5": "^2.10.0" }, @@ -3958,6 +4127,7 @@ "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.1.0.tgz", "integrity": "sha512-MMbFhJzh4Jlg/poq1si90XRlTZRDHVqdlz2mPyGJ6kqMpyHUyVpDd5gpFAvVehW64+RA1eKE9Yt8aSLY7w2Kgg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-function": "^5.0.1" }, @@ -3968,8 +4138,16 @@ "url": "https://github.com/sindresorhus/memoize?sponsor=1" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -3979,6 +4157,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -3987,11 +4166,33 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4001,6 +4202,8 @@ }, "node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -4012,6 +4215,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { @@ -4023,6 +4228,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4032,6 +4238,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -4044,6 +4251,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -4056,16 +4264,31 @@ }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/nice-try": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, "license": "MIT" }, "node_modules/node-fetch": { @@ -4073,6 +4296,7 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -4093,6 +4317,7 @@ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "dev": true, + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -4101,6 +4326,8 @@ }, "node_modules/node-preload": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4112,6 +4339,8 @@ }, "node_modules/node-releases": { "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, @@ -4120,6 +4349,7 @@ "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.19" } @@ -4129,6 +4359,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^3.0.0" }, @@ -4140,24 +4371,21 @@ } }, "node_modules/npm-run-path": { - "version": "2.0.2", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/nyc": { "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4196,8 +4424,55 @@ "node": ">=18" } }, + "node_modules/nyc/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -4208,8 +4483,20 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -4219,8 +4506,26 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -4232,6 +4537,8 @@ }, "node_modules/nyc/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4241,38 +4548,97 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/nyc/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/nyc/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/object-inspect": { "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -4284,6 +4650,8 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -4292,6 +4660,8 @@ }, "node_modules/object.assign": { "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { @@ -4310,13 +4680,16 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -4324,6 +4697,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4341,6 +4716,8 @@ }, "node_modules/object.groupby": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4354,6 +4731,8 @@ }, "node_modules/object.values": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -4366,18 +4745,38 @@ "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -4394,6 +4793,8 @@ }, "node_modules/own-keys": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { @@ -4410,20 +4811,41 @@ }, "node_modules/p-finally": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/p-limit": { - "version": "2.3.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4434,6 +4856,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4443,6 +4866,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -4454,6 +4879,7 @@ "resolved": "https://registry.npmjs.org/package-config/-/package-config-5.0.0.tgz", "integrity": "sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==", "dev": true, + "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "load-json-file": "^7.0.1" @@ -4470,6 +4896,7 @@ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, + "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -4482,6 +4909,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -4491,11 +4920,22 @@ "node": ">=6" } }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parse-ms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4503,8 +4943,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -4513,7 +4965,8 @@ }, "node_modules/path-key": { "version": "3.1.1", - "dev": true, + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -4521,6 +4974,8 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-type": { @@ -4528,6 +4983,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4537,14 +4993,19 @@ }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -4555,6 +5016,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -4567,6 +5029,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4580,6 +5043,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -4587,11 +5051,28 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -4599,20 +5080,12 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/plur": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "dev": true, + "license": "MIT", "dependencies": { "irregular-plurals": "^3.3.0" }, @@ -4625,6 +5098,8 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -4633,6 +5108,8 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -4644,6 +5121,7 @@ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", "dev": true, + "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" }, @@ -4656,6 +5134,8 @@ }, "node_modules/process-on-spawn": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4667,6 +5147,9 @@ }, "node_modules/pump": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -4675,6 +5158,8 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -4683,6 +5168,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -4701,6 +5188,8 @@ }, "node_modules/rechoir": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { "resolve": "^1.1.6" }, @@ -4710,6 +5199,8 @@ }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -4731,6 +5222,8 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { @@ -4750,6 +5243,8 @@ }, "node_modules/release-zalgo": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "license": "ISC", "dependencies": { @@ -4761,6 +5256,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -4769,11 +5266,15 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, "node_modules/resolve": { "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -4795,6 +5296,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -4802,33 +5304,47 @@ "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/reusify": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -4850,6 +5366,8 @@ }, "node_modules/safe-array-concat": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4866,13 +5384,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { @@ -4886,13 +5401,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, "node_modules/safe-regex-test": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { @@ -4908,11 +5420,16 @@ } }, "node_modules/semver": { - "version": "6.3.1", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/serialize-error": { @@ -4920,6 +5437,7 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.13.1" }, @@ -4935,6 +5453,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4944,11 +5463,15 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -4965,6 +5488,8 @@ }, "node_modules/set-function-name": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4979,6 +5504,8 @@ }, "node_modules/set-proto": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -4992,7 +5519,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "dev": true, + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -5003,7 +5531,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "dev": true, + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -5011,6 +5540,8 @@ }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5027,6 +5558,8 @@ }, "node_modules/shelljs-changelog": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/shelljs-changelog/-/shelljs-changelog-0.2.6.tgz", + "integrity": "sha512-+jghG+Cdksxc4bHyzQzSjWC+ULcUWX9SVzKBE8J6ShIb1yKAS2m10GNrqNquLS9uqSlGrRZPAyIXLxfrmmd+BA==", "dev": true, "license": "MIT", "dependencies": { @@ -5039,6 +5572,8 @@ }, "node_modules/shelljs-plugin-sleep": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/shelljs-plugin-sleep/-/shelljs-plugin-sleep-0.2.2.tgz", + "integrity": "sha512-w4yozqtrxfqeybp1lrAPmcb4+RfLfkNtHqLMOGvIXuWxNcqDdttREX+DhXy3F8Xfp5ll+/WQLLEgJbH7RCHqWQ==", "dev": true, "license": "MIT", "engines": { @@ -5056,6 +5591,7 @@ "resolved": "https://registry.npmjs.org/shelljs-release/-/shelljs-release-0.5.3.tgz", "integrity": "sha512-9L15opORTyWZSn7eIm+rmdo4hwgwf99bXqIAPS572KdX9KjqBcdex7FvOrCI8YxaAxosYfS73rVeJ22SkWIxGA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^2.4.1", "minimist": "^1.2.0", @@ -5068,8 +5604,23 @@ "node": ">=4" } }, + "node_modules/shelljs-release/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/shelljs-release/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5081,31 +5632,186 @@ "node": ">=4" } }, - "node_modules/shelljs-release/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/shelljs-release/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/shelljs-release/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/shelljs-release/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/shelljs-release/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs-release/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shx": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", + "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.8", + "shelljs": "^0.9.2" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/shx/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/shx/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/shx/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/shx/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shx/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shx/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/shx/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shx/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/shx": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", - "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", + "node_modules/shx/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "dependencies": { - "minimist": "^1.2.8", - "shelljs": "^0.9.2" - }, - "bin": { - "shx": "lib/cli.js" - }, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, "node_modules/shx/node_modules/shelljs": { @@ -5113,6 +5819,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "execa": "^1.0.0", "fast-glob": "^3.3.2", @@ -5126,8 +5833,23 @@ "node": ">=18" } }, + "node_modules/shx/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/side-channel": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { @@ -5146,6 +5868,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", "dependencies": { @@ -5161,6 +5885,8 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { @@ -5178,6 +5904,8 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { @@ -5196,6 +5924,8 @@ }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/slash": { @@ -5203,6 +5933,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -5210,11 +5941,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sleep": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sleep/-/sleep-3.0.1.tgz", + "integrity": "sha512-dtegFdlKDk05SQzlA29LVj8gzf01bTvtSOHCt+JwYRXEmx3qp85OZ+MpB65IYwxTNylwSmq8mOcsa4MitU8PpQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "nan": ">=2.0.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -5226,32 +5973,20 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/spawn-wrap": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "license": "ISC", "dependencies": { @@ -5268,6 +6003,8 @@ }, "node_modules/spawn-wrap/node_modules/foreground-child": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "license": "ISC", "dependencies": { @@ -5278,22 +6015,10 @@ "node": ">=8.0.0" } }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, @@ -5302,6 +6027,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -5314,47 +6040,33 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=18" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string.prototype.trim": { "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { @@ -5375,6 +6087,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5392,6 +6106,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -5411,6 +6127,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5423,6 +6140,8 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -5431,13 +6150,27 @@ }, "node_modules/strip-eof": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -5452,6 +6185,7 @@ "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "js-yaml": "^3.14.1", @@ -5467,6 +6201,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -5476,6 +6211,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5489,6 +6225,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5496,17 +6233,10 @@ "node": ">=8" } }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5520,6 +6250,7 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -5529,84 +6260,209 @@ "yallist": "^5.0.0" }, "engines": { - "node": ">=18" + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/travis-check-changes": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.5.1.tgz", + "integrity": "sha512-nzhjOUiN8S+5lxzTV/208tQYkSSfB07sWrobSExj+/5hWOGFPxaz5DztZbku98ggsKXFd/wREOKVvWOyLl/JrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "shelljs": "^0.9.2" + }, + "bin": { + "travis-check-changes": "travis-check-changes.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/travis-check-changes/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/travis-check-changes/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "node_modules/travis-check-changes/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "node_modules/travis-check-changes/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=0.10.0" } }, - "node_modules/test-exclude": { - "version": "6.0.0", + "node_modules/travis-check-changes/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "path-key": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "node_modules/travis-check-changes/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/travis-check-changes/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/travis-check-changes/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=0.10.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/travis-check-changes": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.5.1.tgz", - "integrity": "sha512-nzhjOUiN8S+5lxzTV/208tQYkSSfB07sWrobSExj+/5hWOGFPxaz5DztZbku98ggsKXFd/wREOKVvWOyLl/JrQ==", + "node_modules/travis-check-changes/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "dependencies": { - "shelljs": "^0.9.2" - }, - "bin": { - "travis-check-changes": "travis-check-changes.js" - }, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, "node_modules/travis-check-changes/node_modules/shelljs": { @@ -5614,6 +6470,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "execa": "^1.0.0", "fast-glob": "^3.3.2", @@ -5627,8 +6484,23 @@ "node": ">=18" } }, + "node_modules/travis-check-changes/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { @@ -5640,6 +6512,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { @@ -5651,6 +6525,8 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -5659,6 +6535,8 @@ }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -5669,15 +6547,22 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-buffer": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { @@ -5691,6 +6576,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { @@ -5709,6 +6596,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5729,6 +6618,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { @@ -5748,6 +6639,8 @@ }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5756,6 +6649,8 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -5776,6 +6671,7 @@ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -5785,6 +6681,8 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -5814,6 +6712,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5822,6 +6722,8 @@ }, "node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", "bin": { @@ -5832,13 +6734,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/well-known-symbols": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", "dev": true, + "license": "ISC", "engines": { "node": ">=6" } @@ -5848,6 +6752,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -5855,7 +6760,8 @@ }, "node_modules/which": { "version": "2.0.2", - "dev": true, + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -5869,6 +6775,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { @@ -5887,6 +6795,8 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5911,13 +6821,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, "node_modules/which-collection": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -5935,18 +6842,23 @@ }, "node_modules/which-module": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.18", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -5959,6 +6871,8 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -5966,7 +6880,9 @@ } }, "node_modules/wrap-ansi": { - "version": "6.2.0", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5975,11 +6891,16 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -5988,6 +6909,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -6000,24 +6923,42 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -6029,48 +6970,72 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "3.0.3", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", + "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/y18n": { - "version": "4.0.3", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yargs": { - "version": "15.4.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/yargs-parser": { @@ -6078,74 +7043,70 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/yargs/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { "node": ">=8" } }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/yargs/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "dev": true, - "license": "ISC", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index f7b4cf23a..1ea6ad8c2 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ }, "dependencies": { "audit": "^0.0.6", - "execa": "^1.0.0", + "execa": "^5.1.1", "fast-glob": "^3.3.2", "interpret": "^1.0.0", "rechoir": "^0.6.2" diff --git a/src/cmd.js b/src/cmd.js index d017a436e..a00d6c497 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -11,28 +11,19 @@ common.register('cmd', _cmd, { wrapOutput: true, }); -function isNullOrUndefined(val) { - return val === null || val === undefined; -} - function isCommandNotFound(execaResult) { if (process.platform === 'win32') { var str = 'is not recognized as an internal or external command'; - return execaResult.code && execaResult.stderr.includes(str); - } else { - // On node <= 22.9.0, stdout/stderr are 'null'. - // On node >= 22.10, stdout/stderr are 'undefined'. - return execaResult.code && - isNullOrUndefined(execaResult.stdout) && - isNullOrUndefined(execaResult.stderr); + return execaResult.exitCode && execaResult.stderr.includes(str); } + return execaResult.failed && execaResult.code === 'ENOENT'; } function isExecaInternalError(result) { if (typeof result.stdout !== 'string') return true; if (typeof result.stderr !== 'string') return true; - if (typeof result.code !== 'number') return true; - if (result.code === 0 && result.failed) return true; + if (typeof result.exitCode !== 'number') return true; + if (result.exitCode === 0 && result.failed) return true; // Otherwise assume this executed correctly. The command may still have exited // with non-zero status, but that's not due to anything execa did. return false; @@ -102,7 +93,7 @@ function _cmd(options, command, commandArgs, userOptions) { // by the user. var defaultOptions = { maxBuffer: DEFAULT_MAXBUFFER_SIZE, - stripEof: false, // Preserve trailing newlines for consistency with unix. + stripFinalNewline: false, // Preserve trailing newlines for consistency with unix. reject: false, // Use ShellJS's error handling system. }; @@ -132,12 +123,12 @@ function _cmd(options, command, commandArgs, userOptions) { stdout = result.stdout || ''; stderr = result.stderr || `'${command}' encountered an error during execution`; - code = typeof result.code === 'number' && result.code > 0 ? result.code : 1; + code = result.exitCode !== undefined && result.exitCode > 0 ? result.exitCode : 1; } else { // Normal exit: execa was able to execute `command` and get a return value. stdout = result.stdout.toString(); stderr = result.stderr.toString(); - code = result.code; + code = result.exitCode; } // Pass `continue: true` so we can specify a value for stdout. From 33db5147e23f8d76e768eefc2f1d4a82da449ed3 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 29 Apr 2025 18:11:58 -0700 Subject: [PATCH 318/338] Regenerate package-lock.json with npm 9.2.0 --- package-lock.json | 704 ++++++---------------------------------------- 1 file changed, 91 insertions(+), 613 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7545e8ee5..f87999a02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,6 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -55,7 +54,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -70,7 +68,6 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -80,7 +77,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -110,15 +106,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -128,7 +122,6 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0", @@ -145,7 +138,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", @@ -162,7 +154,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -172,7 +163,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -186,7 +176,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -204,7 +193,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -214,7 +202,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -224,7 +211,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -234,7 +220,6 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" @@ -248,7 +233,6 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.27.0" }, @@ -264,7 +248,6 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", @@ -279,7 +262,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.27.0", @@ -298,7 +280,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -308,7 +289,6 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -318,11 +298,10 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -341,7 +320,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -351,7 +329,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -375,7 +352,6 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -386,7 +362,6 @@ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -401,7 +376,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -415,15 +389,13 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -436,7 +408,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -453,7 +424,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -463,7 +433,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -477,7 +446,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -491,7 +459,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -504,7 +471,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -520,7 +486,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -533,7 +498,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -543,7 +507,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -558,7 +521,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -568,7 +530,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -577,15 +538,13 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -596,7 +555,6 @@ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", @@ -617,7 +575,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -630,7 +587,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -639,7 +595,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -653,7 +608,6 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -675,15 +629,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -695,29 +647,25 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@vercel/nft": { "version": "0.27.10", "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz", "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==", "dev": true, - "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0-rc.0", "@rollup/pluginutils": "^5.1.3", @@ -740,11 +688,10 @@ } }, "node_modules/abbrev": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", - "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "dev": true, - "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -754,7 +701,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -767,7 +713,6 @@ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -777,7 +722,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -787,7 +731,6 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, - "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -800,7 +743,6 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14" } @@ -810,7 +752,6 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -824,7 +765,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -834,7 +774,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -851,7 +790,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -864,7 +802,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -877,7 +814,6 @@ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -889,22 +825,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "dev": true }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -921,7 +854,6 @@ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -931,7 +863,6 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -952,7 +883,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -974,7 +904,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -993,7 +922,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -1012,7 +940,6 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -1034,7 +961,6 @@ "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -1044,7 +970,6 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -1057,7 +982,6 @@ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1066,8 +990,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/audit": { "version": "0.0.6", @@ -1082,7 +1005,6 @@ "resolved": "https://registry.npmjs.org/ava/-/ava-6.2.0.tgz", "integrity": "sha512-+GZk5PbyepjiO/68hzCZCUepQOQauKfNnI7sA4JukBTg97jD7E+tDKEA7OhGOGr6EorNNMM9+jqvgHVOTOzG4w==", "dev": true, - "license": "MIT", "dependencies": { "@vercel/nft": "^0.27.5", "acorn": "^8.13.0", @@ -1145,7 +1067,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1158,7 +1079,6 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -1173,15 +1093,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, - "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" } @@ -1190,15 +1108,13 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1208,7 +1124,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1235,7 +1150,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -1254,7 +1168,6 @@ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -1270,7 +1183,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -1283,7 +1195,6 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -1302,7 +1213,6 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -1316,7 +1226,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -1333,7 +1242,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.20" }, @@ -1346,15 +1254,14 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001713", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", - "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "version": "1.0.30001715", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", + "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", "dev": true, "funding": [ { @@ -1369,15 +1276,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/cbor": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", "dev": true, - "license": "MIT", "dependencies": { "nofilter": "^3.1.0" }, @@ -1390,7 +1295,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1407,7 +1311,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1423,7 +1326,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -1432,8 +1334,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/ci-info": { "version": "4.2.0", @@ -1446,7 +1347,6 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } @@ -1455,15 +1355,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -1473,7 +1371,6 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, - "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" @@ -1490,7 +1387,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1505,7 +1401,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1514,15 +1409,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1532,7 +1425,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1547,7 +1439,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1560,7 +1451,6 @@ "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, - "license": "MIT", "dependencies": { "convert-to-spaces": "^2.0.1" }, @@ -1574,7 +1464,6 @@ "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", "dev": true, - "license": "MIT", "bin": { "cake": "bin/cake", "coffee": "bin/coffee" @@ -1588,7 +1477,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1600,36 +1488,31 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/concordance": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", "dev": true, - "license": "ISC", "dependencies": { "date-time": "^3.1.0", "esutils": "^2.0.3", @@ -1648,15 +1531,13 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/consola": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, - "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -1665,15 +1546,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/convert-to-spaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -1682,7 +1561,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1697,7 +1575,6 @@ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dev": true, - "license": "MIT", "dependencies": { "array-find-index": "^1.0.1" }, @@ -1710,7 +1587,6 @@ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -1728,7 +1604,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -1746,7 +1621,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -1764,7 +1638,6 @@ "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", "dev": true, - "license": "MIT", "dependencies": { "time-zone": "^1.0.0" }, @@ -1777,7 +1650,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1795,7 +1667,6 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1804,15 +1675,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/default-require-extensions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -1828,7 +1697,6 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1846,7 +1714,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -1860,11 +1727,10 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -1874,7 +1740,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1887,7 +1752,6 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -1898,18 +1762,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.135", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.135.tgz", - "integrity": "sha512-8gXUdEmvb+WCaYUhA0Svr08uSeRjM2w3x5uHOc1QbaEVzJXB8rgm5eptieXzyKoVEtinLvW6MtTcurA65PeS1Q==", - "dev": true, - "license": "ISC" + "version": "1.5.144", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.144.tgz", + "integrity": "sha512-eJIaMRKeAzxfBSxtjYnoIAw/tdD6VIH6tHBZepZnAbE3Gyqqs5mGN87DvcldPUbVkIljTK8pY0CMcUljP64lfQ==", + "dev": true }, "node_modules/emittery": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.1.0.tgz", "integrity": "sha512-rsX7ktqARv/6UQDgMaLfIqUWAEzzbCQiVh7V9rhDXp6c37yoJcks12NVD+XPkgl4AEavmNhVfrhGoqYwIsMYYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -1921,15 +1783,13 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -1939,7 +1799,6 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", @@ -2005,7 +1864,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2015,7 +1873,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2025,7 +1882,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -2038,7 +1894,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -2054,7 +1909,6 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -2067,7 +1921,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -2084,15 +1937,13 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -2102,7 +1953,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2116,7 +1966,6 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -2172,7 +2021,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, - "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -2192,7 +2040,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2202,7 +2049,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -2214,7 +2060,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -2224,7 +2069,6 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -2242,7 +2086,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -2252,7 +2095,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, - "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -2286,7 +2128,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -2296,7 +2137,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -2309,7 +2149,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2319,7 +2158,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -2336,7 +2174,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2349,7 +2186,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2359,7 +2195,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2372,7 +2207,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2390,7 +2224,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2404,7 +2237,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2417,7 +2249,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2430,7 +2261,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2439,15 +2269,13 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2456,7 +2284,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -2479,21 +2306,18 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2509,7 +2333,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2521,21 +2344,18 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -2545,7 +2365,6 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, - "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -2561,7 +2380,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -2573,14 +2391,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2593,7 +2409,6 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -2611,7 +2426,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2628,7 +2442,6 @@ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -2641,7 +2454,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -2655,15 +2467,13 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.2.7" }, @@ -2679,7 +2489,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -2696,7 +2505,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -2722,21 +2530,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2746,7 +2551,6 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -2767,7 +2571,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2777,7 +2580,6 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2787,7 +2589,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -2797,7 +2598,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -2810,7 +2610,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -2835,7 +2634,6 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -2845,7 +2643,6 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -2858,7 +2655,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -2871,7 +2667,6 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -2890,7 +2685,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2911,7 +2705,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2924,7 +2717,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2940,7 +2732,6 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -2957,7 +2748,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, - "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", @@ -2974,11 +2764,10 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -2988,7 +2777,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3000,22 +2788,19 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3028,7 +2813,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3038,7 +2822,6 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -3051,7 +2834,6 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, @@ -3067,7 +2849,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3080,7 +2861,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -3096,7 +2876,6 @@ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -3113,7 +2892,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -3122,7 +2900,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -3134,15 +2911,13 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -3155,7 +2930,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -3165,7 +2939,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -3175,7 +2948,6 @@ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", "dev": true, - "license": "ISC", "engines": { "node": ">=10 <11 || >=12 <13 || >=14" } @@ -3185,7 +2957,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3202,7 +2973,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -3212,7 +2982,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -3222,7 +2991,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -3236,7 +3004,6 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3246,15 +3013,13 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -3268,7 +3033,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -3278,7 +3042,6 @@ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3288,7 +3051,6 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -3306,7 +3068,6 @@ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, - "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", @@ -3326,7 +3087,6 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, @@ -3342,7 +3102,6 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -3359,7 +3118,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3371,7 +3129,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -3387,7 +3144,6 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -3405,7 +3161,6 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -3421,7 +3176,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3431,7 +3185,6 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -3447,7 +3200,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -3460,7 +3212,6 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -3478,7 +3229,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3491,7 +3241,6 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3503,7 +3252,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3513,7 +3261,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -3530,7 +3277,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3540,7 +3286,6 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3549,15 +3294,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -3576,7 +3319,6 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3589,7 +3331,6 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -3604,7 +3345,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -3617,7 +3357,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -3634,7 +3373,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -3652,7 +3390,6 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -3667,15 +3404,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -3688,7 +3423,6 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3701,7 +3435,6 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -3717,7 +3450,6 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -3734,7 +3466,6 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3743,21 +3474,18 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -3767,7 +3495,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -3780,7 +3507,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -3797,7 +3523,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -3815,7 +3540,6 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -3828,7 +3552,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -3843,7 +3566,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -3859,7 +3581,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -3874,7 +3595,6 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -3888,7 +3608,6 @@ "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3897,15 +3616,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3918,7 +3635,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -3930,29 +3646,25 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -3965,7 +3677,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -3975,7 +3686,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3989,7 +3699,6 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -4002,7 +3711,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -4017,29 +3725,25 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -4049,7 +3753,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -4065,7 +3768,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4075,7 +3777,6 @@ "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0" }, @@ -4091,7 +3792,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4104,7 +3804,6 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4114,7 +3813,6 @@ "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", "dev": true, - "license": "MIT", "dependencies": { "blueimp-md5": "^2.10.0" }, @@ -4127,7 +3825,6 @@ "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.1.0.tgz", "integrity": "sha512-MMbFhJzh4Jlg/poq1si90XRlTZRDHVqdlz2mPyGJ6kqMpyHUyVpDd5gpFAvVehW64+RA1eKE9Yt8aSLY7w2Kgg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-function": "^5.0.1" }, @@ -4141,14 +3838,12 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -4157,7 +3852,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4170,7 +3864,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4182,7 +3875,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -4192,7 +3884,6 @@ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -4205,7 +3896,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4218,7 +3908,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4228,7 +3917,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4238,7 +3926,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -4251,7 +3938,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -4266,37 +3952,32 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/nan": { "version": "2.22.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -4317,7 +3998,6 @@ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "dev": true, - "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -4329,7 +4009,6 @@ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -4341,15 +4020,13 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/nofilter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.19" } @@ -4359,7 +4036,6 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, - "license": "ISC", "dependencies": { "abbrev": "^3.0.0" }, @@ -4374,7 +4050,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -4387,7 +4062,6 @@ "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -4429,7 +4103,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4439,7 +4112,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4455,7 +4127,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -4466,15 +4137,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4488,7 +4157,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4498,7 +4166,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -4511,7 +4178,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -4527,7 +4193,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -4540,7 +4205,6 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -4553,7 +4217,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4568,7 +4231,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4581,7 +4243,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4595,15 +4256,13 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/nyc/node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -4626,7 +4285,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -4640,7 +4298,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4653,7 +4310,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4663,7 +4319,6 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4684,7 +4339,6 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -4700,7 +4354,6 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4719,7 +4372,6 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4734,7 +4386,6 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4753,7 +4404,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -4762,7 +4412,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -4778,7 +4427,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -4796,7 +4444,6 @@ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", @@ -4814,7 +4461,6 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -4824,7 +4470,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4840,7 +4485,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -4856,7 +4500,6 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -4869,7 +4512,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4879,7 +4521,6 @@ "resolved": "https://registry.npmjs.org/package-config/-/package-config-5.0.0.tgz", "integrity": "sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==", "dev": true, - "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "load-json-file": "^7.0.1" @@ -4896,7 +4537,6 @@ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -4912,7 +4552,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -4925,7 +4564,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4935,7 +4573,6 @@ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -4948,7 +4585,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4958,7 +4594,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4967,7 +4602,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -4975,15 +4609,13 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -4995,15 +4627,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5016,7 +4646,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -5029,7 +4658,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -5043,7 +4671,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -5056,7 +4683,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -5072,7 +4698,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -5085,7 +4710,6 @@ "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "dev": true, - "license": "MIT", "dependencies": { "irregular-plurals": "^3.3.0" }, @@ -5101,7 +4725,6 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5111,7 +4734,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -5121,7 +4743,6 @@ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", "dev": true, - "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" }, @@ -5137,7 +4758,6 @@ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, - "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -5150,7 +4770,6 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5161,7 +4780,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5183,8 +4801,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/rechoir": { "version": "0.6.2", @@ -5202,7 +4819,6 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -5225,7 +4841,6 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -5246,7 +4861,6 @@ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -5259,7 +4873,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5268,14 +4881,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -5296,7 +4907,6 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -5309,7 +4919,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5318,7 +4927,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -5330,7 +4938,6 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -5359,7 +4966,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -5369,7 +4975,6 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -5389,7 +4994,6 @@ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" @@ -5406,7 +5010,6 @@ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -5424,7 +5027,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5437,7 +5039,6 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.13.1" }, @@ -5453,7 +5054,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5465,15 +5065,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -5491,7 +5089,6 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -5507,7 +5104,6 @@ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", @@ -5521,7 +5117,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -5533,7 +5128,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", "engines": { "node": ">=8" } @@ -5543,7 +5137,6 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -5561,7 +5154,6 @@ "resolved": "https://registry.npmjs.org/shelljs-changelog/-/shelljs-changelog-0.2.6.tgz", "integrity": "sha512-+jghG+Cdksxc4bHyzQzSjWC+ULcUWX9SVzKBE8J6ShIb1yKAS2m10GNrqNquLS9uqSlGrRZPAyIXLxfrmmd+BA==", "dev": true, - "license": "MIT", "dependencies": { "shelljs": "^0.8.5", "shelljs-plugin-sleep": "^0.2.1" @@ -5575,7 +5167,6 @@ "resolved": "https://registry.npmjs.org/shelljs-plugin-sleep/-/shelljs-plugin-sleep-0.2.2.tgz", "integrity": "sha512-w4yozqtrxfqeybp1lrAPmcb4+RfLfkNtHqLMOGvIXuWxNcqDdttREX+DhXy3F8Xfp5ll+/WQLLEgJbH7RCHqWQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0.0" }, @@ -5591,7 +5182,6 @@ "resolved": "https://registry.npmjs.org/shelljs-release/-/shelljs-release-0.5.3.tgz", "integrity": "sha512-9L15opORTyWZSn7eIm+rmdo4hwgwf99bXqIAPS572KdX9KjqBcdex7FvOrCI8YxaAxosYfS73rVeJ22SkWIxGA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^2.4.1", "minimist": "^1.2.0", @@ -5609,7 +5199,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -5622,7 +5211,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -5637,7 +5225,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -5646,15 +5233,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/shelljs-release/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -5664,7 +5249,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5674,7 +5258,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -5687,7 +5270,6 @@ "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.8", "shelljs": "^0.9.2" @@ -5704,7 +5286,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, - "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -5721,7 +5302,6 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -5740,7 +5320,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, - "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -5753,7 +5332,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5763,7 +5341,6 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^2.0.0" }, @@ -5776,7 +5353,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5786,7 +5362,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -5796,7 +5371,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -5809,7 +5383,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5819,7 +5392,6 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "execa": "^1.0.0", "fast-glob": "^3.3.2", @@ -5838,7 +5410,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5851,7 +5422,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -5871,7 +5441,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -5888,7 +5457,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -5907,7 +5475,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -5925,15 +5492,13 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -5947,7 +5512,6 @@ "integrity": "sha512-dtegFdlKDk05SQzlA29LVj8gzf01bTvtSOHCt+JwYRXEmx3qp85OZ+MpB65IYwxTNylwSmq8mOcsa4MitU8PpQ==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "nan": ">=2.0.0" @@ -5961,7 +5525,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -5978,7 +5541,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5988,7 +5550,6 @@ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -6006,7 +5567,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -6019,15 +5579,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -6040,7 +5598,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6050,7 +5607,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -6068,7 +5624,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6090,7 +5645,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6109,7 +5663,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6127,7 +5680,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -6143,7 +5695,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6153,7 +5704,6 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6162,7 +5712,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -6172,7 +5721,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -6185,7 +5733,6 @@ "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", "dev": true, - "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "js-yaml": "^3.14.1", @@ -6201,7 +5748,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -6211,7 +5757,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6225,7 +5770,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6237,7 +5781,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6250,7 +5793,6 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, - "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -6268,7 +5810,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -6278,7 +5819,6 @@ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" } @@ -6288,7 +5828,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -6302,15 +5841,13 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/time-zone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -6319,7 +5856,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6331,15 +5867,13 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/travis-check-changes": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.5.1.tgz", "integrity": "sha512-nzhjOUiN8S+5lxzTV/208tQYkSSfB07sWrobSExj+/5hWOGFPxaz5DztZbku98ggsKXFd/wREOKVvWOyLl/JrQ==", "dev": true, - "license": "MIT", "dependencies": { "shelljs": "^0.9.2" }, @@ -6355,7 +5889,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, - "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -6372,7 +5905,6 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -6391,7 +5923,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, - "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -6404,7 +5935,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6414,7 +5944,6 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^2.0.0" }, @@ -6427,7 +5956,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -6437,7 +5965,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -6447,7 +5974,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -6460,7 +5986,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6470,7 +5995,6 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "execa": "^1.0.0", "fast-glob": "^3.3.2", @@ -6489,7 +6013,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6502,7 +6025,6 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -6515,7 +6037,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -6528,7 +6049,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -6538,7 +6058,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -6551,7 +6070,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6564,7 +6082,6 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6579,7 +6096,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -6599,7 +6115,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -6621,7 +6136,6 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -6642,7 +6156,6 @@ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } @@ -6652,7 +6165,6 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", @@ -6671,7 +6183,6 @@ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -6698,7 +6209,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -6715,7 +6225,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -6725,7 +6234,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -6734,15 +6242,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/well-known-symbols": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", "dev": true, - "license": "ISC", "engines": { "node": ">=6" } @@ -6752,7 +6258,6 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -6762,7 +6267,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6778,7 +6282,6 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -6798,7 +6301,6 @@ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -6826,7 +6328,6 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -6844,15 +6345,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -6874,7 +6373,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6884,7 +6382,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6902,7 +6399,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6912,7 +6408,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6927,15 +6422,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6945,7 +6438,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6960,7 +6452,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6972,15 +6463,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/write-file-atomic": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -6994,7 +6483,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -7007,7 +6495,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -7016,15 +6503,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -7043,7 +6528,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } @@ -7053,7 +6537,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -7062,15 +6545,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -7080,7 +6561,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7095,7 +6575,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7108,7 +6587,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, From 3b03c85ef6442a1ebafca99db606c6c851215e9b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 5 May 2025 16:56:18 -0700 Subject: [PATCH 319/338] chore: remove accidental audit dep I think this was installed by accident when running `npm audit`. The `audit` module is entirely unrelated and I didn't meant to add a dependency on this. --- package-lock.json | 9 --------- package.json | 1 - 2 files changed, 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index f87999a02..34f080f0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "0.9.2", "license": "BSD-3-Clause", "dependencies": { - "audit": "^0.0.6", "execa": "^5.1.1", "fast-glob": "^3.3.2", "interpret": "^1.0.0", @@ -992,14 +991,6 @@ "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", "dev": true }, - "node_modules/audit": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/audit/-/audit-0.0.6.tgz", - "integrity": "sha512-xgv3Y3RIYE00N2/xk10VLlwFd1kjc7FRaX1vC8+CsOfDRe53a06vOSkp91BOSNijZfddYum47a1Fvju/2+JPcw==", - "engines": { - "node": ">= 0.5.0" - } - }, "node_modules/ava": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/ava/-/ava-6.2.0.tgz", diff --git a/package.json b/package.json index 1ea6ad8c2..fac00c873 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,6 @@ "shjs": "./bin/shjs" }, "dependencies": { - "audit": "^0.0.6", "execa": "^5.1.1", "fast-glob": "^3.3.2", "interpret": "^1.0.0", From 9a06336bc15ea36597054be5dacf6f8259ea6520 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 9 May 2025 00:48:37 -0700 Subject: [PATCH 320/338] Deprecate the shjs binary This removes the shjs binary. This feature was not widely used and it was buggy. The recommended workaround is to invoke scripts directly with 'node' (you may also need to set your NODE_PATH environmental variable). Dropping this script lets us trim down the dependency tree. For those who still need the original script, the source code has moved to https://github.com/shelljs/shjs. --- bin/shjs | 48 ------------------ package-lock.json | 38 ++++----------- package.json | 8 +-- test/resources/shjs/a-file.js | 2 - test/resources/shjs/coffeescript.coffee | 2 - test/resources/shjs/exit-0.js | 1 - test/resources/shjs/exit-codes.js | 1 - test/resources/shjs/stdout-stderr.js | 2 - test/shjs.js | 65 ------------------------- 9 files changed, 11 insertions(+), 156 deletions(-) delete mode 100755 bin/shjs delete mode 100644 test/resources/shjs/a-file.js delete mode 100644 test/resources/shjs/coffeescript.coffee delete mode 100644 test/resources/shjs/exit-0.js delete mode 100644 test/resources/shjs/exit-codes.js delete mode 100644 test/resources/shjs/stdout-stderr.js delete mode 100644 test/shjs.js diff --git a/bin/shjs b/bin/shjs deleted file mode 100755 index c4609f7af..000000000 --- a/bin/shjs +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env node - -if (require.main !== module) { - throw new Error('Executable-only module should not be required'); -} - -// we must import global ShellJS methods after the require.main check to prevent the global -// namespace from being polluted if the error is caught -require('../global'); - -function exitWithErrorMessage(msg) { - console.log(msg); - console.log(); - process.exit(1); -} - -if (process.argv.length < 3) { - exitWithErrorMessage('ShellJS: missing argument (script name)'); -} - -var args, - scriptName = process.argv[2]; -env['NODE_PATH'] = __dirname + '/../..'; - -if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { - if (test('-f', scriptName + '.js')) - scriptName += '.js'; - if (test('-f', scriptName + '.coffee')) - scriptName += '.coffee'; -} - -if (!test('-f', scriptName)) { - exitWithErrorMessage('ShellJS: script not found ('+scriptName+')'); -} - -args = process.argv.slice(3); - -for (var i = 0, l = args.length; i < l; i++) { - if (args[i][0] !== "-"){ - args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words - } -} - -var path = require('path'); -var extensions = require('interpret').extensions; -var rechoir = require('rechoir'); -rechoir.prepare(extensions, scriptName); -require(require.resolve(path.resolve(process.cwd(), scriptName))); diff --git a/package-lock.json b/package-lock.json index 34f080f0a..19d57cdbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,7 @@ "license": "BSD-3-Clause", "dependencies": { "execa": "^5.1.1", - "fast-glob": "^3.3.2", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" + "fast-glob": "^3.3.2" }, "devDependencies": { "ava": "^6.2.0", @@ -2533,6 +2528,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2891,6 +2887,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -3024,6 +3021,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -3120,6 +3118,7 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -3945,13 +3944,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", - "dev": true, - "optional": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -4600,7 +4592,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-type": { "version": "6.0.0", @@ -4798,6 +4791,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, "dependencies": { "resolve": "^1.1.6" }, @@ -4878,6 +4872,7 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -5497,20 +5492,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sleep": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sleep/-/sleep-3.0.1.tgz", - "integrity": "sha512-dtegFdlKDk05SQzlA29LVj8gzf01bTvtSOHCt+JwYRXEmx3qp85OZ+MpB65IYwxTNylwSmq8mOcsa4MitU8PpQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": ">=2.0.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -5772,6 +5753,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, diff --git a/package.json b/package.json index fac00c873..2c70facdd 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "make.js", "plugin.js", "shell.js", - "bin", "src" ], "scripts": { @@ -55,14 +54,9 @@ "release:minor": "shelljs-release minor", "release:patch": "shelljs-release patch" }, - "bin": { - "shjs": "./bin/shjs" - }, "dependencies": { "execa": "^5.1.1", - "fast-glob": "^3.3.2", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "fast-glob": "^3.3.2" }, "ava": { "serial": true, diff --git a/test/resources/shjs/a-file.js b/test/resources/shjs/a-file.js deleted file mode 100644 index 3050cd9a6..000000000 --- a/test/resources/shjs/a-file.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log('OK!'); -process.exit(0); diff --git a/test/resources/shjs/coffeescript.coffee b/test/resources/shjs/coffeescript.coffee deleted file mode 100644 index 5b2766405..000000000 --- a/test/resources/shjs/coffeescript.coffee +++ /dev/null @@ -1,2 +0,0 @@ -msg = 'CoffeeScript: OK!' -console.log msg diff --git a/test/resources/shjs/exit-0.js b/test/resources/shjs/exit-0.js deleted file mode 100644 index dcbbff6c9..000000000 --- a/test/resources/shjs/exit-0.js +++ /dev/null @@ -1 +0,0 @@ -process.exit(0); diff --git a/test/resources/shjs/exit-codes.js b/test/resources/shjs/exit-codes.js deleted file mode 100644 index 6427ca060..000000000 --- a/test/resources/shjs/exit-codes.js +++ /dev/null @@ -1 +0,0 @@ -process.exit(42); diff --git a/test/resources/shjs/stdout-stderr.js b/test/resources/shjs/stdout-stderr.js deleted file mode 100644 index 220cb58f8..000000000 --- a/test/resources/shjs/stdout-stderr.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log('stdout: OK!'); -console.error('stderr: OK!'); diff --git a/test/shjs.js b/test/shjs.js deleted file mode 100644 index ff3aade5c..000000000 --- a/test/shjs.js +++ /dev/null @@ -1,65 +0,0 @@ -const path = require('path'); - -const test = require('ava'); - -const shell = require('..'); - -const binPath = path.resolve(__dirname, '../bin/shjs'); - -function runWithShjs(name) { - // prefix with 'node ' for Windows, don't prefix for unix - const execPath = process.platform === 'win32' - ? `${JSON.stringify(shell.config.execPath)} ` - : ''; - const script = path.resolve(__dirname, 'resources', 'shjs', name); - return shell.exec(`${execPath}${binPath} ${script}`, { silent: true }); -} - -// -// Valids -// - -test('Non-zero exit code', t => { - const result = runWithShjs('exit-codes.js'); - t.is(result.code, 42); - t.is(result.stdout, ''); - t.falsy(result.stderr); -}); - -test('Zero exit code', t => { - const result = runWithShjs('exit-0.js'); - t.is(result.code, 0); - t.is(result.stdout, ''); - t.falsy(result.stderr); -}); - -test('Stdout/Stderr', t => { - const result = runWithShjs('stdout-stderr.js'); - t.is(result.code, 0); - t.is(result.stdout, 'stdout: OK!\n'); - t.is(result.stderr, 'stderr: OK!\n'); -}); - -test('CoffeeScript', t => { - const result = runWithShjs('coffeescript.coffee'); - t.is(result.code, 0); - t.is(result.stdout, 'CoffeeScript: OK!\n'); - t.falsy(result.stderr); -}); - -test('Extension detection', t => { - const result = runWithShjs('a-file'); - t.is(result.code, 0); - t.is(result.stdout, 'OK!\n'); - t.falsy(result.stderr); -}); - -// -// Invalids -// - -test('disallow require-ing', t => { - t.throws(() => require(binPath), - { instanceOf: Error }, - 'Executable-only module should not be required'); -}); From 4580c00398982618ff075dd4354b0234a1d679dc Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Fri, 9 May 2025 12:16:36 -0700 Subject: [PATCH 321/338] 0.10.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19d57cdbf..50accbcff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "shelljs", - "version": "0.9.2", + "version": "0.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "shelljs", - "version": "0.9.2", + "version": "0.10.0", "license": "BSD-3-Clause", "dependencies": { "execa": "^5.1.1", diff --git a/package.json b/package.json index 2c70facdd..a5c3299b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.9.2", + "version": "0.10.0", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", From 475797321abb5146a39f7bc2cba068f1767c1c49 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Mon, 1 Sep 2025 18:45:08 -0700 Subject: [PATCH 322/338] chore: update deps No change to logic. This updates dependencies using `npm audit fix`. --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50accbcff..cc599ad87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1097,9 +1097,9 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", From d44f3b95a6d1543a59a33bb01f55c9a4edc7164d Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 18 Nov 2025 21:07:08 -0800 Subject: [PATCH 323/338] chore: update deps No change to logic. This updates dependencies using `npm audit fix`. --- package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc599ad87..695772361 100644 --- a/package-lock.json +++ b/package-lock.json @@ -436,9 +436,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -3609,9 +3609,9 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -5725,9 +5725,9 @@ } }, "node_modules/supertap/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "dependencies": { "argparse": "^1.0.7", From 964fb48e9eb5a82554e05100e3d4dad10c33c75a Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Tue, 18 Nov 2025 22:11:46 -0800 Subject: [PATCH 324/338] test: check for README changes in the unit tests No change to logic. This checks for stale README in the unit tests instead of by calling 'gendocs' directly. The main goal is for GitHub CI to stop getting tripped up by package-lock.json formatting changes. `npm install` sometimes overwrites the package-lock file with a new format, and this breaks the after-travis step. Test: node_modules/.bin/ava test/docs.js --- .github/workflows/main.yml | 4 - package-lock.json | 154 +------------------------------------ package.json | 4 +- scripts/generate-docs.js | 111 ++++++++++++++++---------- test/docs.js | 11 +++ 5 files changed, 83 insertions(+), 201 deletions(-) create mode 100644 test/docs.js diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ed26651a..1a16b3d6b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,11 +26,7 @@ jobs: - name: test with coverage run: npm run test-with-coverage - run: npm run lint - - run: npm run gendocs - run: npm run check-node-support - - name: Check for modified files (skip on Windows) - run: npm run after-travis - if: matrix.os != 'windows-latest' - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4 with: diff --git a/package-lock.json b/package-lock.json index 695772361..25b68743c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,8 +23,7 @@ "nyc": "^17.1.0", "shelljs-changelog": "^0.2.6", "shelljs-release": "^0.5.3", - "shx": "^0.4.0", - "travis-check-changes": "^0.5.1" + "shx": "^0.4.0" }, "engines": { "node": ">=18" @@ -5842,157 +5841,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "node_modules/travis-check-changes": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/travis-check-changes/-/travis-check-changes-0.5.1.tgz", - "integrity": "sha512-nzhjOUiN8S+5lxzTV/208tQYkSSfB07sWrobSExj+/5hWOGFPxaz5DztZbku98ggsKXFd/wREOKVvWOyLl/JrQ==", - "dev": true, - "dependencies": { - "shelljs": "^0.9.2" - }, - "bin": { - "travis-check-changes": "travis-check-changes.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/travis-check-changes/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/travis-check-changes/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/travis-check-changes/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/travis-check-changes/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/travis-check-changes/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/travis-check-changes/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/travis-check-changes/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/travis-check-changes/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/travis-check-changes/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/travis-check-changes/node_modules/shelljs": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", - "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "fast-glob": "^3.3.2", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/travis-check-changes/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", diff --git a/package.json b/package.json index a5c3299b2..243271d9a 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,6 @@ "test-with-coverage": "nyc --reporter=text --reporter=lcov ava", "gendocs": "node scripts/generate-docs", "lint": "eslint .", - "after-travis": "travis-check-changes", "changelog": "shelljs-changelog", "release:major": "shelljs-release major", "release:minor": "shelljs-release minor", @@ -81,8 +80,7 @@ "nyc": "^17.1.0", "shelljs-changelog": "^0.2.6", "shelljs-release": "^0.5.3", - "shx": "^0.4.0", - "travis-check-changes": "^0.5.1" + "shx": "^0.4.0" }, "engines": { "node": ">=18" diff --git a/scripts/generate-docs.js b/scripts/generate-docs.js index 089e0cbbf..3942c28b4 100755 --- a/scripts/generate-docs.js +++ b/scripts/generate-docs.js @@ -4,44 +4,73 @@ require('../global'); var path = require('path'); -echo('Appending docs to README.md'); - -cd(path.join(__dirname, '..')); - -// Extract docs from shell.js -var docs = grep('^//@', 'shell.js'); - -// Insert the docs for all the registered commands -var blocklist = [ - './src/common.js', - './src/error.js', - './src/errorCode.js', -]; -docs = docs.replace(/\/\/@commands\n/g, function () { - return ls('./src/*.js').map(function (file) { - if (blocklist.includes(file)) { - return ''; - } - var commandDoc = grep('^//@', file).toString(); - if (commandDoc !== '') { - commandDoc += '\n'; - } - return commandDoc; - }).join(''); -}); - -// Now extract docs from the remaining src/*.js files -docs = docs.replace(/\/\/@include (.+)/g, function (match, filename) { - return grep('^//@', filename); -}); - -// Remove '//@' -docs = docs.replace(/\/\/@ ?/g, ''); - -// Wipe out the old docs -ShellString(cat('README.md').replace(/## Command reference(.|\n)*\n## Team/, '## Command reference\n## Team')).to('README.md'); - -// Append new docs to README -sed('-i', /## Command reference/, '## Command reference\n\n' + docs, 'README.md'); - -echo('All done.'); +var COMMAND_PREFIX = '## Command reference'; +var COMMAND_SUFFIX = '\n## Team'; +var COMMAND_PATTERN = /## Command reference\n\n((?:.|\n)*)\n## Team/; +function extractCurrentDocs() { + var m = cat('README.md').match(COMMAND_PATTERN); + if (m) { + var docs = m[1]; + return docs; + } + /* istanbul ignore next */ + throw new Error('Unable to extract current docs'); +} +module.exports.extractCurrentDocs = extractCurrentDocs; + +function generateNewDocs() { + // Extract docs from shell.js + var docs = grep('^//@', 'shell.js'); + + // Insert the docs for all the registered commands + var blocklist = [ + './src/common.js', + './src/error.js', + './src/errorCode.js', + ]; + docs = docs.replace(/\/\/@commands\n/g, function () { + return ls('./src/*.js').map(function (file) { + if (blocklist.includes(file)) { + return ''; + } + var commandDoc = grep('^//@', file).toString(); + if (commandDoc !== '') { + commandDoc += '\n'; + } + return commandDoc; + }).join(''); + }); + + // Now extract docs from the remaining src/*.js files + docs = docs.replace(/\/\/@include (.+)/g, function (match, filename) { + return grep('^//@', filename); + }); + + // Remove '//@' + docs = docs.replace(/\/\/@ ?/g, ''); + return docs; +} +module.exports.generateNewDocs = generateNewDocs; + +/* istanbul ignore next */ +function main() { + echo('Appending docs to README.md'); + + cd(path.join(__dirname, '..')); + + var docs = generateNewDocs(); + + // Wipe out the old docs + ShellString(cat('README.md').replace(COMMAND_PATTERN, + COMMAND_PREFIX + COMMAND_SUFFIX)).to('README.md'); + + // Append new docs to README + sed('-i', /## Command reference/, COMMAND_PREFIX + '\n\n' + docs, 'README.md'); + + echo('All done.'); +} + +/* istanbul ignore if */ +if (require.main === module) { + main(); +} diff --git a/test/docs.js b/test/docs.js new file mode 100644 index 000000000..67d503462 --- /dev/null +++ b/test/docs.js @@ -0,0 +1,11 @@ +const test = require('ava'); + +const gendocs = require('../scripts/generate-docs'); + +test('Documentation generation', t => { + if (gendocs.extractCurrentDocs() === gendocs.generateNewDocs()) { + t.pass(); + } else { + t.fail('README documentation is stale. Please run `npm run gendocs`.'); + } +}); From 26e4ff006cdb3423756a7168f8537fe54912acfc Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Thu, 1 Jan 2026 15:47:48 -0800 Subject: [PATCH 325/338] chore: update codecov to v5 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1a16b3d6b..edcd857f5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: - run: npm run lint - run: npm run check-node-support - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From 23fffb89e21bfdb66f164993714b7ddc993be308 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 Jan 2026 14:06:12 +0000 Subject: [PATCH 326/338] chore(deps-dev): bump tar from 7.4.3 to 7.5.3 Bumps [tar](https://github.com/isaacs/node-tar) from 7.4.3 to 7.5.3. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.4.3...v7.5.3) --- updated-dependencies: - dependency-name: tar dependency-version: 7.5.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 55 +++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 25b68743c..919995a3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3911,10 +3911,11 @@ } }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -3922,27 +3923,20 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/nan": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.24.0.tgz", + "integrity": "sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5491,6 +5485,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sleep": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sleep/-/sleep-3.0.1.tgz", + "integrity": "sha512-dtegFdlKDk05SQzlA29LVj8gzf01bTvtSOHCt+JwYRXEmx3qp85OZ+MpB65IYwxTNylwSmq8mOcsa4MitU8PpQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "nan": ">=2.0.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -5761,16 +5770,16 @@ } }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.3.tgz", + "integrity": "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { From 4aef5d59e65524dc38f34814a5a9f03464643841 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:18:36 +0000 Subject: [PATCH 327/338] chore(deps-dev): bump tar from 7.5.3 to 7.5.6 Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.3 to 7.5.6. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.5.3...v7.5.6) --- updated-dependencies: - dependency-name: tar dependency-version: 7.5.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 919995a3c..cfd73d85a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5770,9 +5770,9 @@ } }, "node_modules/tar": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.3.tgz", - "integrity": "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", + "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { From 941c31000a4c5b889d8ace02a82f6681f34ff032 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Jan 2026 21:19:08 +0000 Subject: [PATCH 328/338] chore(deps-dev): bump lodash from 4.17.21 to 4.17.23 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23) --- updated-dependencies: - dependency-name: lodash dependency-version: 4.17.23 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cfd73d85a..db006377f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3711,10 +3711,11 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", From 013fc0041b15ecc28ef2a3aa19d891a7471ecd87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 14:02:57 +0000 Subject: [PATCH 329/338] chore(deps-dev): bump tar from 7.5.6 to 7.5.7 Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.6 to 7.5.7. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.5.6...v7.5.7) --- updated-dependencies: - dependency-name: tar dependency-version: 7.5.7 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index db006377f..fab5286c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5771,9 +5771,9 @@ } }, "node_modules/tar": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", - "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { From 1dd3fe715589268793487ce7669b16326ed0d1b6 Mon Sep 17 00:00:00 2001 From: Varun Chawla <34209028+veeceey@users.noreply.github.com> Date: Sat, 14 Feb 2026 01:10:13 -0800 Subject: [PATCH 330/338] fix: expand ? wildcard in non-final path segments (#1242) fast-glob's dependency glob-parent does not recognize the ? wildcard when it appears in non-final path segments (e.g. test/r?sources/file.txt). It incorrectly treats "test/r?sources" as a literal directory name, causing the glob to fail silently and return no matches. Work around this by converting standalone ? characters to the equivalent character class [^/] before passing patterns to fast-glob. Both match exactly one non-slash character, but glob-parent correctly handles [^/]. The conversion preserves ? inside character classes ([?]), escaped characters (\?), and extglob patterns (?(...)). Un-skip the existing test for this case and add new test coverage. Fixes #1197 --- src/common.js | 38 +++++++++++++++++++++++++++++++++++++- test/common.js | 20 ++++++++++++++++++++ test/config.js | 2 +- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/common.js b/src/common.js index b9ffedab1..d46e3c9b8 100644 --- a/src/common.js +++ b/src/common.js @@ -290,6 +290,42 @@ function globOptions() { return Object.assign({}, defaultGlobOptions, newGlobOptions); } + +// Workaround for https://github.com/shelljs/shelljs/issues/1197 +// fast-glob's dependency glob-parent does not recognize the '?' wildcard in +// non-final path segments, causing those patterns to be treated as literal +// directory names. Replace standalone '?' with the equivalent character class +// '[^/]' which glob-parent handles correctly. +function convertQuestionMarkForGlob(pattern) { + if (pattern.indexOf('?') === -1) { + return pattern; + } + var result = ''; + var inBracket = false; + for (var i = 0; i < pattern.length; i++) { + var ch = pattern[i]; + if (ch === '\\' && i + 1 < pattern.length) { + // Escaped character: keep as-is + result += ch + pattern[i + 1]; + i++; + } else if (ch === '[' && !inBracket) { + inBracket = true; + result += ch; + } else if (ch === ']' && inBracket) { + inBracket = false; + result += ch; + } else if (ch === '?' && !inBracket && pattern[i + 1] === '(') { + // Extglob pattern ?(...) keep as-is + result += ch; + } else if (ch === '?' && !inBracket) { + result += '[^/]'; + } else { + result += ch; + } + } + return result; +} + // Expands wildcards with matching (ie. existing) file names. // For example: // expand(['file*.js']) = ['file1.js', 'file2.js', ...] @@ -307,7 +343,7 @@ function expand(list) { var ret; var globOpts = globOptions(); try { - ret = glob.sync(listEl, globOpts); + ret = glob.sync(convertQuestionMarkForGlob(listEl), globOpts); } catch (e) { // if glob fails, interpret the string literally ret = [listEl]; diff --git a/test/common.js b/test/common.js index e12fdc777..8fc836590 100644 --- a/test/common.js +++ b/test/common.js @@ -168,6 +168,26 @@ test('broken links still expand', t => { t.deepEqual(result, ['test/resources/badlink']); }); +test('glob syntax, ? for single char in directory name', t => { + const result = common.expand(['test/r?sources/file1.txt']); + t.deepEqual(result, ['test/resources/file1.txt']); +}); + +test('glob syntax, ? for single char in directory name with * in file name', t => { + const result = common.expand(['test/r?sources/file*.txt']); + t.deepEqual(result.sort(), ['test/resources/file1.txt', 'test/resources/file2.txt'].sort()); +}); + +test('glob syntax, ? in multiple path segments', t => { + const result = common.expand(['test/r?sources/file?.txt']); + t.deepEqual(result.sort(), ['test/resources/file1.txt', 'test/resources/file2.txt'].sort()); +}); + +test('glob syntax, ? in file name still works', t => { + const result = common.expand(['test/resources/file?.txt']); + t.deepEqual(result.sort(), ['test/resources/file1.txt', 'test/resources/file2.txt'].sort()); +}); + test('empty array', t => { const result = common.expand([]); t.deepEqual(result, []); diff --git a/test/config.js b/test/config.js index 3d73ef64f..1e3a337ce 100644 --- a/test/config.js +++ b/test/config.js @@ -107,7 +107,7 @@ test('config.globOptions expands "*" in multiple path segments by default', t => }); // https://github.com/shelljs/shelljs/issues/1197 -test.skip('config.globOptions expands "?" in folder path by default', t => { +test('config.globOptions expands "?" in folder path by default', t => { const result = common.expand(['test/r?sources/file*.txt']); const expected = [ 'test/resources/file1.txt', From a9599d2e2dbb3a05c9ab2d3badcf2ddf46d9132f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 18:33:41 +0000 Subject: [PATCH 331/338] chore(deps-dev): bump tar from 7.5.7 to 7.5.9 Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.7 to 7.5.9. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.5.7...v7.5.9) --- updated-dependencies: - dependency-name: tar dependency-version: 7.5.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index fab5286c3..3551dc064 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5771,9 +5771,9 @@ } }, "node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { From a776c50b92c3f676f4f2afe6c74f0e21d8a9596b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 03:15:40 +0000 Subject: [PATCH 332/338] chore(deps-dev): bump minimatch from 3.1.2 to 3.1.5 Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.1.2 to 3.1.5. - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5) --- updated-dependencies: - dependency-name: minimatch dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3551dc064..f6dda3f3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3882,10 +3882,11 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, From 973cb7b59ac28c2ef427ebdd5698b9980557ae52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2026 10:27:48 +0000 Subject: [PATCH 333/338] chore(deps-dev): bump flatted from 3.3.3 to 3.4.2 Bumps [flatted](https://github.com/WebReflection/flatted) from 3.3.3 to 3.4.2. - [Commits](https://github.com/WebReflection/flatted/compare/v3.3.3...v3.4.2) --- updated-dependencies: - dependency-name: flatted dependency-version: 3.4.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f6dda3f3f..e69490f75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2449,10 +2449,11 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.5", From b66cdb104ada97dc83066a23d4fd393c85f98963 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 19:08:50 +0000 Subject: [PATCH 334/338] chore(deps): bump picomatch Bumps and [picomatch](https://github.com/micromatch/picomatch). These dependencies needed to be updated together. Updates `picomatch` from 2.3.1 to 2.3.2 - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2) Updates `picomatch` from 4.0.2 to 4.0.4 - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2) --- updated-dependencies: - dependency-name: picomatch dependency-version: 2.3.2 dependency-type: indirect - dependency-name: picomatch dependency-version: 4.0.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e69490f75..371793a10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3852,9 +3852,10 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4610,10 +4611,11 @@ "dev": true }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, From f10e54be9c5db92500bdbaeba32473260472b581 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 12 Apr 2026 16:29:41 -0700 Subject: [PATCH 335/338] chore: update deps No change to logic. This updates dependencies using `npm audit fix`. --- package-lock.json | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 371793a10..cdaeeed0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -763,9 +763,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1096,9 +1096,9 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -3712,11 +3712,10 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "dev": true, - "license": "MIT" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", @@ -5775,11 +5774,10 @@ } }, "node_modules/tar": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", - "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", From 2809a872ead82da2d9fd0704dc3c1f690e2475f4 Mon Sep 17 00:00:00 2001 From: Varun Chawla <34209028+veeceey@users.noreply.github.com> Date: Thu, 16 Apr 2026 00:04:53 -0700 Subject: [PATCH 336/338] fix: prevent data loss when copying directory to its own parent (#1241) Co-authored-by: Claude Opus 4.6 --- src/cp.js | 18 +++++++++----- test/cp.js | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/src/cp.js b/src/cp.js index af4a0a1b5..abed9a987 100644 --- a/src/cp.js +++ b/src/cp.js @@ -24,6 +24,12 @@ function copyFileSync(srcFile, destFile, options) { common.error('copyFileSync: no such file or directory: ' + srcFile); } + // Bail if src and dest are the same file to avoid data loss + if (path.relative(srcFile, destFile) === '') { + common.error("'" + destFile + "' and '" + srcFile + "' are the same file", { continue: true }); + return; + } + var isWindows = process.platform === 'win32'; // Check the mtimes of the files if the '-u' flag is provided @@ -268,6 +274,12 @@ function _cp(options, sources, dest) { path.join(dest, path.basename(src)) : dest; + if (path.relative(src, newDest) === '') { + // a directory cannot be copied into itself, but we want to continue copying other sources + common.error("'" + newDest + "' and '" + src + "' are the same file", { continue: true }); + return; + } + try { common.statFollowLinks(path.dirname(dest)); cpdirSyncRecursive(src, newDest, 0, options); @@ -299,12 +311,6 @@ function _cp(options, sources, dest) { return; // skip file } - if (path.relative(src, thisDest) === '') { - // a file cannot be copied to itself, but we want to continue copying other files - common.error("'" + thisDest + "' and '" + src + "' are the same file", { continue: true }); - return; - } - copyFileSync(src, thisDest, options); } }); // forEach(src) diff --git a/test/cp.js b/test/cp.js index d21e42e54..749884ccb 100644 --- a/test/cp.js +++ b/test/cp.js @@ -922,3 +922,74 @@ test('cp -p should preserve mode, ownership, and timestamp (symlink)', t => { t.is(stat.gid, statOfResult.gid); }); }); + +test('copy directory to its parent dir (same location) should not erase content', t => { + // Setup: create a directory with a file inside t.context.tmp + shell.mkdir(`${t.context.tmp}/srcdir`); + shell.ShellString('deadbeef').to(`${t.context.tmp}/srcdir/lol`); + + // Verify setup + t.is(shell.cat(`${t.context.tmp}/srcdir/lol`).toString(), 'deadbeef'); + + // This should error, not silently erase the file contents + const result = shell.cp('-R', `${t.context.tmp}/srcdir`, t.context.tmp); + t.truthy(shell.error()); + t.is(result.code, 1); + t.truthy(result.stderr.match(/are the same file/)); + + // Most importantly: file content must be preserved (no data loss) + t.is(shell.cat(`${t.context.tmp}/srcdir/lol`).toString(), 'deadbeef'); +}); + +test('copy directory to same location with trailing slash should not erase content', t => { + // Setup: create a directory with a file inside t.context.tmp + shell.mkdir(`${t.context.tmp}/srcdir`); + shell.ShellString('deadbeef').to(`${t.context.tmp}/srcdir/lol`); + + // Verify setup + t.is(shell.cat(`${t.context.tmp}/srcdir/lol`).toString(), 'deadbeef'); + + // cp -R /path/srcdir /path/ should detect same directory + const result = shell.cp('-R', `${t.context.tmp}/srcdir`, `${t.context.tmp}/`); + t.truthy(shell.error()); + t.is(result.code, 1); + t.truthy(result.stderr.match(/are the same file/)); + + // File content must be preserved + t.is(shell.cat(`${t.context.tmp}/srcdir/lol`).toString(), 'deadbeef'); +}); + +test('copy multiple dirs where one is to same location should error for that one and continue', t => { + // Setup: src1 in tmp root, src2 inside destination + shell.mkdir(`${t.context.tmp}/src1`); + shell.mkdir('-p', `${t.context.tmp}/destination/src2`); + shell.ShellString('content1').to(`${t.context.tmp}/src1/file`); + shell.ShellString('content2').to(`${t.context.tmp}/destination/src2/file`); + + // src1 copy should succeed, src2 copy should fail (but the original src2 is still intact) + const result = shell.cp('-R', `${t.context.tmp}/src1`, `${t.context.tmp}/destination/src2`, `${t.context.tmp}/destination`); + t.truthy(shell.error()); + t.is(result.code, 1); + + // src1 was copied successfully into destination + t.is(shell.cat(`${t.context.tmp}/destination/src1/file`).toString(), 'content1'); + // src2's original content is preserved (not lost due to same-file copy) + t.is(shell.cat(`${t.context.tmp}/destination/src2/file`).toString(), 'content2'); +}); + +test('copy single file to itself should not erase content', t => { + // Setup: create a file in t.context.tmp + shell.ShellString('important data').to(`${t.context.tmp}/myfile.txt`); + + // Verify setup + t.is(shell.cat(`${t.context.tmp}/myfile.txt`).toString(), 'important data'); + + // Copying a file to itself should error but preserve data + const result = shell.cp(`${t.context.tmp}/myfile.txt`, `${t.context.tmp}/myfile.txt`); + t.truthy(shell.error()); + t.is(result.code, 1); + t.truthy(result.stderr.match(/are the same file/)); + + // File content must be preserved (no data loss) + t.is(shell.cat(`${t.context.tmp}/myfile.txt`).toString(), 'important data'); +}); From ed9f79aaf0a0a60c57eada9df701a1074e59396b Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 6 Jun 2026 12:43:25 -0700 Subject: [PATCH 337/338] chore: update GitHub Actions No change to logic. This updates GitHub Actions to their latest versions. This also ensures we are testing up through Node v26. The most important part of this is that it updates codecov to v7, which contains a major bug fix that was blocking all codecov uploads (and failing all CI test runs). --- .github/workflows/main.yml | 8 +++++--- scripts/check-node-support.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index edcd857f5..6c207c2bb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,13 +13,15 @@ jobs: - 18 - 20 - 22 + - 24 + - 26 os: - ubuntu-latest - macos-latest - windows-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} - run: npm install @@ -28,7 +30,7 @@ jobs: - run: npm run lint - run: npm run check-node-support - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js index 8ea89d80d..df2065e17 100755 --- a/scripts/check-node-support.js +++ b/scripts/check-node-support.js @@ -10,7 +10,7 @@ var shell = require('..'); // This is the authoritative list of supported node versions. var MIN_NODE_VERSION = 18; -var MAX_NODE_VERSION = 22; +var MAX_NODE_VERSION = 26; // Ideally this map should be empty, however we can pin node releases to // specific versions if necessary to workaround bugs. See From f364da6625945414440bb15210f102ba5fc10ed9 Mon Sep 17 00:00:00 2001 From: Bhardwaj Dubey Date: Tue, 30 Jun 2026 12:43:01 +0530 Subject: [PATCH 338/338] =?UTF-8?q?fix:=20use=20require.resolve()=20for=20?= =?UTF-8?q?exec-child.js=20path=20to=20fix=20Next.js/webp=E2=80=A6=20(#125?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Next.js (or any webpack-based bundler) bundles the server-side code, __dirname is replaced with the bundled output directory (e.g. .next/server/vendor-chunks/). This causes child_process.execFileSync to look for exec-child.js in the wrong location, leading to the 'Cannot find module' error. Fix: resolve exec-child.js path using require.resolve() at module load time. require.resolve() always returns the real filesystem path of the module, unaffected by bundler __dirname transformations. --- src/exec.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/exec.js b/src/exec.js index 390776902..0082f63ed 100644 --- a/src/exec.js +++ b/src/exec.js @@ -5,6 +5,12 @@ var common = require('./common'); var _tempDir = require('./tempdir').tempDir; var _pwd = require('./pwd'); +// Resolve exec-child.js path at module load time using require.resolve() so that +// bundlers (e.g. Next.js/webpack) do not break the path by replacing __dirname +// with the bundled output directory. require.resolve() always returns the real +// filesystem path of the module, regardless of bundler transformations. +var EXEC_CHILD_PATH = require.resolve('./exec-child.js'); + var DEFAULT_MAXBUFFER_SIZE = 20 * 1024 * 1024; var DEFAULT_ERROR_CODE = 1; @@ -78,7 +84,7 @@ function execSync(cmd, opts, pipe) { writeFileLockedDown(paramsFile, JSON.stringify(paramsToSerialize)); var execArgs = [ - path.join(__dirname, 'exec-child.js'), + EXEC_CHILD_PATH, paramsFile, ];