diff -Nru node-mock-fs-4.13.0/changelog.md node-mock-fs-5.1.2/changelog.md --- node-mock-fs-4.13.0/changelog.md 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/changelog.md 2021-11-08 20:09:32.000000000 +0000 @@ -1,9 +1,36 @@ # Change Log +## 5.1.2 + + * Avoid open `FSREQCALLBACK` file handles (thanks @jloleysens, see [#342][#342]) + +## 5.1.1 + + * Added `engines` to `package.json` to clarify that Node >= 12 is required (thanks @tillig, see [#337][#337]) + +## 5.1.0 + + * Added support for Node >= 16.3 (thanks @Rugvip, see [#335][#335]) + +## 5.0.0 + +Breaking change: + + * Remove support for Node < 12. If you want to use mock-fs to test on Node 10 or lower, stick with mock-fs@4. + +New features: + + * Support for BigInt file stats - required for Node 15+ (thanks @3cp, see [#325][#325]) + +## 4.14.0 + + * Attempt to fix logging when using `mock-fs` with `tape` (see [#322][#322]) + * Minor fix for `bypass()` (thanks @3cp, see [#320][#320]) + ## 4.13.0 * Make `process.chdir()`, `process.cwd()`, and `fs.createWriteStream()` work with `bypass()` (thanks @3cp, see [#307][#307]) - * Fix memory leak associated with Node 10 (thanks #3cp, see [#303][#303]) + * Fix memory leak associated with Node 10 (thanks @3cp, see [#303][#303]) * Async function handling in `bypass()` (see [#306][#306]) * Big new feature! Temporarily bypass the mocked filesystem with the `bypass()` function (thanks @nonara, see [#304][#304]) @@ -301,3 +328,9 @@ [#304]: https://github.com/tschaub/mock-fs/pull/304 [#306]: https://github.com/tschaub/mock-fs/pull/306 [#307]: https://github.com/tschaub/mock-fs/pull/307 +[#320]: https://github.com/tschaub/mock-fs/pull/320 +[#322]: https://github.com/tschaub/mock-fs/pull/322 +[#325]: https://github.com/tschaub/mock-fs/pull/325 +[#335]: https://github.com/tschaub/mock-fs/pull/335 +[#337]: https://github.com/tschaub/mock-fs/pull/337 +[#342]: https://github.com/tschaub/mock-fs/pull/342 diff -Nru node-mock-fs-4.13.0/debian/changelog node-mock-fs-5.1.2/debian/changelog --- node-mock-fs-4.13.0/debian/changelog 2020-08-28 11:01:14.000000000 +0000 +++ node-mock-fs-5.1.2/debian/changelog 2021-11-18 23:20:55.000000000 +0000 @@ -1,3 +1,17 @@ +node-mock-fs (5.1.2-1) unstable; urgency=medium + + [ upstream ] + * new release(s) + + [ Jonas Smedegaard ] + * declare compliance with Debian Policy 4.6.0 + * update copyright info: + + use Reference field (not License-Reference); + tighten lintian overrides + + update coverage + + -- Jonas Smedegaard Fri, 19 Nov 2021 00:20:55 +0100 + node-mock-fs (4.13.0-1) unstable; urgency=medium [ upstream ] diff -Nru node-mock-fs-4.13.0/debian/control node-mock-fs-5.1.2/debian/control --- node-mock-fs-4.13.0/debian/control 2020-08-28 11:01:14.000000000 +0000 +++ node-mock-fs-5.1.2/debian/control 2021-11-18 23:16:37.000000000 +0000 @@ -10,7 +10,7 @@ node-chai , node-semver , pandoc , -Standards-Version: 4.5.0 +Standards-Version: 4.6.0 Homepage: https://github.com/tschaub/mock-fs Vcs-Browser: https://salsa.debian.org/js-team/node-mock-fs Vcs-Git: https://salsa.debian.org/js-team/node-mock-fs.git diff -Nru node-mock-fs-4.13.0/debian/copyright node-mock-fs-5.1.2/debian/copyright --- node-mock-fs-4.13.0/debian/copyright 2020-07-19 18:40:42.000000000 +0000 +++ node-mock-fs-5.1.2/debian/copyright 2021-11-18 23:19:28.000000000 +0000 @@ -8,16 +8,19 @@ Tim Schaub Joyent, Inc. and other Node contributors License: Expat +Reference: license.md Files: debian/* -Copyright: 2019-2020, Jonas Smedegaard +Copyright: + 2019-2021 Jonas Smedegaard License-Grant: - This program is free software; + This packaging is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. License: GPL-3+ +Reference: debian/copyright License: Expat Permission is hereby granted, free of charge, @@ -44,4 +47,4 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License: GPL-3+ -License-Reference: /usr/share/common-licenses/GPL-3 +Reference: /usr/share/common-licenses/GPL-3 diff -Nru node-mock-fs-4.13.0/debian/copyright_hints node-mock-fs-5.1.2/debian/copyright_hints --- node-mock-fs-4.13.0/debian/copyright_hints 2020-07-19 18:40:10.000000000 +0000 +++ node-mock-fs-5.1.2/debian/copyright_hints 2021-11-18 23:20:39.000000000 +0000 @@ -15,6 +15,7 @@ changelog.md debian/TODO debian/control + debian/copyright-check debian/gbp.conf debian/install debian/patches/2001_privacy.patch @@ -24,7 +25,7 @@ debian/tests/control debian/watch lib/binding.js - lib/buffer.js + lib/bypass.js lib/descriptor.js lib/directory.js lib/error.js @@ -32,15 +33,20 @@ lib/filesystem.js lib/index.js lib/item.js + lib/loader.js + lib/readfilecontext.js lib/symlink.js - package-lock.json - package.json readme.md + tasks/next-dev-version.js test/.eslintrc + test/assets/dir/file2.txt + test/assets/dir/subdir/file3.txt + test/assets/file1.txt test/helper.js test/integration/filecount.js test/integration/filecount.spec.js test/lib/binding.spec.js + test/lib/bypass.spec.js test/lib/descriptor.spec.js test/lib/directory.spec.js test/lib/file.spec.js @@ -72,24 +78,26 @@ test/lib/fs.writeFile.spec.js test/lib/index.spec.js test/lib/item.spec.js + test/lib/readfilecontext.js Copyright: NONE License: UNKNOWN FIXME +Files: package-lock.json + package.json +Copyright: NONE +License: Expat + FIXME + Files: license.md Copyright: Joyent, Inc. and other Node contributors. Tim Schaub. License: Expat FIXME -Files: debian/copyright-check -Copyright: --deb-machine --ignore '^(debian/(changelog|copyright(_hints)?))$' --lines 0 -- * > debian/copyright_hints -License: UNKNOWN - FIXME - Files: debian/source/lintian-overrides -Copyright: GPL-3+ - gpl-3+ +Copyright: debian/copyright GPL-3+ + debian/copyright gpl-3+ License: UNKNOWN FIXME diff -Nru node-mock-fs-4.13.0/debian/source/lintian-overrides node-mock-fs-5.1.2/debian/source/lintian-overrides --- node-mock-fs-4.13.0/debian/source/lintian-overrides 2019-10-16 16:37:36.000000000 +0000 +++ node-mock-fs-5.1.2/debian/source/lintian-overrides 2021-11-18 23:18:53.000000000 +0000 @@ -1,3 +1,3 @@ -# License is in License-Reference field (see bug#786450) -missing-license-paragraph-in-dep5-copyright gpl-3\+ * -missing-license-text-in-dep5-copyright GPL-3\+ * +# License is in Reference field (see bug#786450) +missing-license-paragraph-in-dep5-copyright debian/copyright gpl-3\+ * +missing-license-text-in-dep5-copyright debian/copyright GPL-3\+ * diff -Nru node-mock-fs-4.13.0/.github/workflows/publish.yml node-mock-fs-5.1.2/.github/workflows/publish.yml --- node-mock-fs-4.13.0/.github/workflows/publish.yml 1970-01-01 00:00:00.000000000 +0000 +++ node-mock-fs-5.1.2/.github/workflows/publish.yml 2021-11-08 20:09:32.000000000 +0000 @@ -0,0 +1,25 @@ +name: Publish + +on: + push: + branches: + - main + +jobs: + publish-npm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '16' + registry-url: 'https://registry.npmjs.org' + - name: Install dependencies + run: npm ci + - name: Publish + run: | + VERSION=$(node tasks/next-dev-version.js) + npm --no-git-tag-version version ${VERSION} + npm publish --tag dev + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff -Nru node-mock-fs-4.13.0/.github/workflows/test.yml node-mock-fs-5.1.2/.github/workflows/test.yml --- node-mock-fs-4.13.0/.github/workflows/test.yml 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/.github/workflows/test.yml 2021-11-08 20:09:32.000000000 +0000 @@ -24,15 +24,9 @@ - macos-latest - windows-latest node: - - 6 - - 8 - - 10 - 12 - exclude: - # Temporarily excludes node 12 on windows - # Wait for https://github.com/nodejs/node/issues/34514 - - os: windows-latest - node: 12 + - 14 + - 16 steps: - name: Clone repository @@ -47,7 +41,7 @@ - run: npm --version - name: Install npm dependencies - run: npm install # switch to `ci` when Node.js 6.x is dropped + run: npm ci - name: Run tests run: npm test diff -Nru node-mock-fs-4.13.0/lib/binding.js node-mock-fs-5.1.2/lib/binding.js --- node-mock-fs-4.13.0/lib/binding.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/binding.js 2021-11-08 20:09:32.000000000 +0000 @@ -6,11 +6,9 @@ const FileDescriptor = require('./descriptor'); const Directory = require('./directory'); const SymbolicLink = require('./symlink'); -const FSError = require('./error'); +const {FSError} = require('./error'); const constants = require('constants'); const getPathParts = require('./filesystem').getPathParts; -const bufferFrom = require('./buffer').from; -const bufferAlloc = require('./buffer').alloc; const MODE_TO_KTYPE = { [constants.S_IFREG]: constants.UV_DIRENT_FILE, @@ -26,24 +24,10 @@ const fsBinding = process.binding('fs'); const kUsePromises = fsBinding.kUsePromises; let statValues; +let bigintStatValues; if (fsBinding.statValues) { statValues = fsBinding.statValues; // node 10+ -} else if (fsBinding.getStatValues) { - statValues = fsBinding.getStatValues(); // node 8 -} else { - statValues = []; -} - -// nodejs v6,8,10 and v12 before v12.10.0 has length 28 -// nodejs v12.10.0+ has length 36 -const statContainsNs = statValues.length > 28; - -/** Introduction of BigUint64Array in 10.5 */ -let BigUint64Array; -if (global.BigUint64Array) { - BigUint64Array = global.BigUint64Array; -} else { - BigUint64Array = function() {}; + bigintStatValues = fsBinding.bigintStatValues; } const MAX_LINKS = 50; @@ -127,29 +111,6 @@ return callback; } -/** - * Handle stat optimizations introduced in Node 8. - * See https://github.com/nodejs/node/pull/11665. - * @param {Function} callback The callback. - * @return {Function} The wrapped callback. - */ -function wrapStatsCallback(callback) { - if (callback && typeof callback.oncomplete === 'function') { - // Unpack callback from FSReqWrap - callback = callback.oncomplete.bind(callback); - } - if (typeof callback === 'function') { - return function(err, stats) { - if (stats) { - fillStatsArray(stats, statValues); - } - callback.apply(this, arguments); - }; - } else { - return callback; - } -} - function getDirentType(mode) { const ktype = MODE_TO_KTYPE[mode & constants.S_IFMT]; @@ -169,78 +130,6 @@ } /** - * Create a new stats object. - * @param {Object} config Stats properties. - * @constructor - */ -function Stats(config) { - for (const key in config) { - this[key] = config[key]; - } - // node 10 expects an array internally - // see https://github.com/nodejs/node/pull/19714 - fillStatsArray(config, this); -} - -/** - * Check if mode indicates property. - * @param {number} property Property to check. - * @return {boolean} Property matches mode. - */ -Stats.prototype._checkModeProperty = function(property) { - return (this.mode & constants.S_IFMT) === property; -}; - -/** - * @return {Boolean} Is a directory. - */ -Stats.prototype.isDirectory = function() { - return this._checkModeProperty(constants.S_IFDIR); -}; - -/** - * @return {Boolean} Is a regular file. - */ -Stats.prototype.isFile = function() { - return this._checkModeProperty(constants.S_IFREG); -}; - -/** - * @return {Boolean} Is a block device. - */ -Stats.prototype.isBlockDevice = function() { - return this._checkModeProperty(constants.S_IFBLK); -}; - -/** - * @return {Boolean} Is a character device. - */ -Stats.prototype.isCharacterDevice = function() { - return this._checkModeProperty(constants.S_IFCHR); -}; - -/** - * @return {Boolean} Is a symbolic link. - */ -Stats.prototype.isSymbolicLink = function() { - return this._checkModeProperty(constants.S_IFLNK); -}; - -/** - * @return {Boolean} Is a named pipe. - */ -Stats.prototype.isFIFO = function() { - return this._checkModeProperty(constants.S_IFIFO); -}; - -/** - * @return {Boolean} Is a socket. - */ -Stats.prototype.isSocket = function() { - return this._checkModeProperty(constants.S_IFSOCK); -}; - -/** * Create a new binding with the given file system. * @param {FileSystem} system Mock file system. * @constructor @@ -253,12 +142,6 @@ this._system = system; /** - * Stats constructor. - * @type {function} - */ - this.Stats = Stats; - - /** * Lookup of open files. * @type {Object.} */ @@ -268,7 +151,19 @@ * Counter for file descriptors. * @type {number} */ - this._counter = 0; + this._counter = -1; + + const stdin = new FileDescriptor(constants.O_RDWR); + stdin.setItem(new File.StandardInput()); + this.trackDescriptor(stdin); + + const stdout = new FileDescriptor(constants.O_RDWR); + stdout.setItem(new File.StandardOutput()); + this.trackDescriptor(stdout); + + const stderr = new FileDescriptor(constants.O_RDWR); + stderr.setItem(new File.StandardError()); + this.trackDescriptor(stderr); } /** @@ -371,74 +266,31 @@ } if (encoding === 'buffer') { - realPath = bufferFrom(realPath); + realPath = Buffer.from(realPath); } return realPath; }); }; -/** - * Fill a Float64Array with stat information - * This is based on the internal FillStatsArray function in Node. - * https://github.com/nodejs/node/blob/4e05952a8a75af6df625415db612d3a9a1322682/src/node_file.cc#L533 - * @param {Object} stats An object with file stats - * @param {Float64Array} statValues A Float64Array where stat values should be inserted - * @returns {void} - */ -function fillStatsArray(stats, statValues) { - statValues[0] = stats.dev; - statValues[1] = stats.mode; - statValues[2] = stats.nlink; - statValues[3] = stats.uid; - statValues[4] = stats.gid; - statValues[5] = stats.rdev; - statValues[6] = stats.blksize; - statValues[7] = stats.ino; - statValues[8] = stats.size; - statValues[9] = stats.blocks; - - if (statContainsNs) { - // nodejs v12.10.0+ - // This is based on the internal FillStatsArray function in Node. - // https://github.com/nodejs/node/blob/3a2e75d9a5c31d20e429d505b82dd182e33f459a/src/node_file.h#L153-L187 - statValues[10] = Math.floor(stats.atimeMs / 1000); - statValues[11] = (stats.atimeMs % 1000) * 1000000; - statValues[12] = Math.floor(stats.mtimeMs / 1000); - statValues[13] = (stats.mtimeMs % 1000) * 1000000; - statValues[14] = Math.floor(stats.ctimeMs / 1000); - statValues[15] = (stats.ctimeMs % 1000) * 1000000; - statValues[16] = Math.floor(stats.birthtimeMs / 1000); - statValues[17] = (stats.birthtimeMs % 1000) * 1000000; - } else { - // nodejs before v12.10.0 - // This is based on the internal FillStatsArray function in Node. - // https://github.com/nodejs/node/blob/4e05952a8a75af6df625415db612d3a9a1322682/src/node_file.cc#L533 - statValues[10] = stats.atimeMs; - statValues[11] = stats.mtimeMs; - statValues[12] = stats.ctimeMs; - statValues[13] = stats.birthtimeMs; +function fillStats(stats) { + const target = stats instanceof Float64Array ? statValues : bigintStatValues; + for (let i = 0; i < 36; i++) { + target[i] = stats[i]; } } /** * Stat an item. * @param {string} filepath Path. - * @param {function(Error, Stats)|Float64Array|BigUint64Array} callback Callback (optional). In Node 7.7.0+ this will be a Float64Array - * that should be filled with stat values. + * @param {function(Error, Float64Array|BigUint64Array)} callback Callback (optional). * @param {Object} ctx Context object (optional), only for nodejs v10+. - * @return {Stats|undefined} Stats or undefined (if sync). + * @return {Float64Array|BigUint64Array|undefined} Stats or undefined (if sync). */ -Binding.prototype.stat = function(filepath, options, callback, ctx) { - // this seems wound not happen in nodejs v10+ - if (arguments.length < 3) { - callback = options; - options = {}; - } - +Binding.prototype.stat = function(filepath, bigint, callback, ctx) { markSyscall(ctx, 'stat'); - return maybeCallback(wrapStatsCallback(callback), ctx, this, function() { + return maybeCallback(normalizeCallback(callback), ctx, this, function() { filepath = deBuffer(filepath); let item = this._system.getItem(filepath); if (item instanceof SymbolicLink) { @@ -449,56 +301,28 @@ if (!item) { throw new FSError('ENOENT', filepath); } - const stats = item.getStats(); - - // In Node 7.7.0+, binding.stat accepts a Float64Array as the second argument, - // which should be filled with stat values. - // In prior versions of Node, binding.stat simply returns a Stats instance. - if ( - callback instanceof Float64Array || - callback instanceof BigUint64Array - ) { - fillStatsArray(stats, callback); - } else { - fillStatsArray(stats, statValues); - return new Stats(stats); - } + const stats = item.getStats(bigint); + fillStats(stats); + return stats; }); }; /** * Stat an item. * @param {number} fd File descriptor. - * @param {function(Error, Stats)|Float64Array|BigUint64Array} callback Callback (optional). In Node 7.7.0+ this will be a Float64Array - * that should be filled with stat values. + * @param {function(Error, Float64Array|BigUint64Array)} callback Callback (optional). * @param {Object} ctx Context object (optional), only for nodejs v10+. - * @return {Stats|undefined} Stats or undefined (if sync). + * @return {Float64Array|BigUint64Array|undefined} Stats or undefined (if sync). */ -Binding.prototype.fstat = function(fd, options, callback, ctx) { - if (arguments.length < 3) { - callback = options; - options = {}; - } - +Binding.prototype.fstat = function(fd, bigint, callback, ctx) { markSyscall(ctx, 'fstat'); - return maybeCallback(wrapStatsCallback(callback), ctx, this, function() { + return maybeCallback(normalizeCallback(callback), ctx, this, function() { const descriptor = this.getDescriptorById(fd); const item = descriptor.getItem(); - const stats = item.getStats(); - - // In Node 7.7.0+, binding.stat accepts a Float64Array as the second argument, - // which should be filled with stat values. - // In prior versions of Node, binding.stat simply returns a Stats instance. - if ( - callback instanceof Float64Array || - callback instanceof BigUint64Array - ) { - fillStatsArray(stats, callback); - } else { - fillStatsArray(stats, statValues); - return new Stats(stats); - } + const stats = item.getStats(bigint); + fillStats(stats); + return stats; }); }; @@ -694,7 +518,7 @@ const destFd = this.open(dest, destFlags); try { - this.write(destFd, srcContent, 0, srcContent.length, 0); + this.writeBuffer(destFd, srcContent, 0, srcContent.length, 0); } finally { this.close(destFd); } @@ -741,7 +565,7 @@ const newContent = Buffer.concat(buffers); const newLength = position + newContent.length; if (content.length < newLength) { - const tempContent = bufferAlloc(newLength); + const tempContent = Buffer.alloc(newLength); content.copy(tempContent); content = tempContent; } @@ -792,12 +616,12 @@ let content = file.getContent(); const newLength = position + length; if (content.length < newLength) { - const newContent = bufferAlloc(newLength); + const newContent = Buffer.alloc(newLength); content.copy(newContent); content = newContent; } const sourceEnd = Math.min(offset + length, buffer.length); - const written = bufferFrom(buffer).copy( + const written = Buffer.from(buffer).copy( content, position, offset, @@ -810,21 +634,6 @@ }; /** - * Alias for writeBuffer (used in Node <= 0.10). - * @param {string} fd File descriptor. - * @param {Buffer} buffer Buffer with contents to write. - * @param {number} offset Offset in the buffer to start writing from. - * @param {number} length Number of bytes to write. - * @param {?number} position Where to begin writing in the file. If null, - * data will be written to the current file position. - * @param {function(Error, number, Buffer)} callback Callback (optional) called - * with any error, number of bytes written, and the buffer. - * @param {Object} ctx Context object (optional), only for nodejs v10+. - * @return {number} Number of bytes written (if sync). - */ -Binding.prototype.write = Binding.prototype.writeBuffer; - -/** * Write to a file descriptor given a string. * @param {string} fd File descriptor. * @param {string} string String with contents to write. @@ -845,7 +654,7 @@ ) { markSyscall(ctx, 'write'); - const buffer = bufferFrom(string, encoding); + const buffer = Buffer.from(string, encoding); let wrapper; if (callback && callback !== kUsePromises) { if (callback.oncomplete) { @@ -926,14 +735,6 @@ callback, ctx ) { - // again, the shorter arguments would not happen in nodejs v10+ - if (arguments.length === 2) { - callback = encoding; - encoding = 'utf-8'; - } else if (arguments.length === 3) { - callback = withFileTypes; - } - markSyscall(ctx, 'scandir'); return maybeCallback(normalizeCallback(callback), ctx, this, function() { @@ -957,7 +758,7 @@ let list = dir.list(); if (encoding === 'buffer') { list = list.map(function(item) { - return bufferFrom(item); + return Buffer.from(item); }); } @@ -983,13 +784,6 @@ * @param {Object} ctx Context object (optional), only for nodejs v10+. */ Binding.prototype.mkdir = function(pathname, mode, recursive, callback, ctx) { - if (typeof recursive !== 'boolean') { - // when running nodejs < 10 - ctx = callback; - callback = recursive; - recursive = false; - } - markSyscall(ctx, 'mkdir'); return maybeCallback(normalizeCallback(callback), ctx, this, function() { @@ -1110,7 +904,7 @@ parent.addItem(name, dir); let uniquePath = path.join(parentPath, name); if (encoding === 'buffer') { - uniquePath = bufferFrom(uniquePath); + uniquePath = Buffer.from(uniquePath); } return uniquePath; }); @@ -1136,7 +930,7 @@ throw new FSError('EINVAL'); } const content = file.getContent(); - const newContent = bufferAlloc(len); + const newContent = Buffer.alloc(len); content.copy(newContent); file.setContent(newContent); }); @@ -1413,7 +1207,7 @@ } let linkPath = link.getPath(); if (encoding === 'buffer') { - linkPath = bufferFrom(linkPath); + linkPath = Buffer.from(linkPath); } return linkPath; }); @@ -1422,40 +1216,22 @@ /** * Stat an item. * @param {string} filepath Path. - * @param {function(Error, Stats)|Float64Array|BigUint64Array} callback Callback (optional). In Node 7.7.0+ this will be a Float64Array - * that should be filled with stat values. + * @param {function(Error, Float64Array|BigUint64Array)} callback Callback (optional). * @param {Object} ctx Context object (optional), only for nodejs v10+. - * @return {Stats|undefined} Stats or undefined (if sync). + * @return {Float64Array|BigUint64Array|undefined} Stats or undefined (if sync). */ -Binding.prototype.lstat = function(filepath, options, callback, ctx) { - if (arguments.length < 3) { - // this would not happend in nodejs v10+ - callback = options; - options = {}; - } - +Binding.prototype.lstat = function(filepath, bigint, callback, ctx) { markSyscall(ctx, 'lstat'); - return maybeCallback(wrapStatsCallback(callback), ctx, this, function() { + return maybeCallback(normalizeCallback(callback), ctx, this, function() { filepath = deBuffer(filepath); const item = this._system.getItem(filepath); if (!item) { throw new FSError('ENOENT', filepath); } - const stats = item.getStats(); - - // In Node 7.7.0+, binding.stat accepts a Float64Array as the second argument, - // which should be filled with stat values. - // In prior versions of Node, binding.stat simply returns a Stats instance. - if ( - callback instanceof Float64Array || - callback instanceof BigUint64Array - ) { - fillStatsArray(stats, callback); - } else { - fillStatsArray(stats, statValues); - return new Stats(item.getStats()); - } + const stats = item.getStats(bigint); + fillStats(stats); + return stats; }); }; diff -Nru node-mock-fs-4.13.0/lib/buffer.js node-mock-fs-5.1.2/lib/buffer.js --- node-mock-fs-4.13.0/lib/buffer.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/buffer.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -exports.from = - Buffer.from || - function(value, encoding) { - if (encoding) { - return new Buffer(value, encoding); - } - return new Buffer(value); - }; - -exports.alloc = - Buffer.alloc || - function(size) { - return new Buffer(size); - }; diff -Nru node-mock-fs-4.13.0/lib/bypass.js node-mock-fs-5.1.2/lib/bypass.js --- node-mock-fs-4.13.0/lib/bypass.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/bypass.js 2021-11-08 20:09:32.000000000 +0000 @@ -18,15 +18,25 @@ let result; try { result = fn(); - } finally { - if (result && typeof result.finally === 'function') { - result.finally(enable); + if (result && typeof result.then === 'function') { + return result.then( + r => { + enable(); + return r; + }, + err => { + enable(); + throw err; + } + ); } else { enable(); + return result; } + } catch (err) { + enable(); + throw err; } - - return result; }; /** diff -Nru node-mock-fs-4.13.0/lib/directory.js node-mock-fs-5.1.2/lib/directory.js --- node-mock-fs-4.13.0/lib/directory.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/directory.js 2021-11-08 20:09:32.000000000 +0000 @@ -95,11 +95,14 @@ * Get directory stats. * @return {Object} Stats properties. */ -Directory.prototype.getStats = function() { - const stats = Item.prototype.getStats.call(this); - stats.mode = this.getMode() | constants.S_IFDIR; - stats.size = 1; - stats.blocks = 1; +Directory.prototype.getStats = function(bigint) { + const stats = Item.prototype.getStats.call(this, bigint); + const convert = bigint ? v => BigInt(v) : v => v; + + stats[1] = convert(this.getMode() | constants.S_IFDIR); // mode + stats[8] = convert(1); // size + stats[9] = convert(1); // blocks + return stats; }; diff -Nru node-mock-fs-4.13.0/lib/error.js node-mock-fs-5.1.2/lib/error.js --- node-mock-fs-4.13.0/lib/error.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/error.js 2021-11-08 20:09:32.000000000 +0000 @@ -7,23 +7,11 @@ */ const codes = {}; -if (uvBinding.errmap) { - // nodejs v8+ - uvBinding.errmap.forEach(function(value, errno) { - const code = value[0]; - const message = value[1]; - codes[code] = {errno: errno, message: message}; - }); -} else { - // nodejs v4 and v6 - Object.keys(uvBinding).forEach(function(key) { - if (key.startsWith('UV_')) { - const code = key.slice(3); - const errno = uvBinding[key]; - codes[code] = {errno: errno, message: key}; - } - }); -} +uvBinding.getErrorMap().forEach(function(value, errno) { + const code = value[0]; + const message = value[1]; + codes[code] = {errno: errno, message: message}; +}); /** * Create an error. @@ -53,6 +41,22 @@ FSError.codes = codes; /** - * Error constructor. + * Create an abort error for when an asynchronous task was aborted. + * @constructor + */ +function AbortError() { + Error.call(this); + this.code = 'ABORT_ERR'; + this.name = 'AbortError'; + Error.captureStackTrace(this, AbortError); +} +AbortError.prototype = new Error(); + +/** + * FSError constructor. + */ +exports.FSError = FSError; +/** + * AbortError constructor. */ -exports = module.exports = FSError; +exports.AbortError = AbortError; diff -Nru node-mock-fs-4.13.0/lib/file.js node-mock-fs-5.1.2/lib/file.js --- node-mock-fs-4.13.0/lib/file.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/file.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,14 +3,12 @@ const util = require('util'); const Item = require('./item'); -const bufferFrom = require('./buffer').from; -const bufferAlloc = require('./buffer').alloc; -const EMPTY = bufferAlloc(0); +const EMPTY = Buffer.alloc(0); const constants = require('constants'); /** - * A directory. + * A file. * @constructor */ function File() { @@ -39,7 +37,7 @@ */ File.prototype.setContent = function(content) { if (typeof content === 'string') { - content = bufferFrom(content); + content = Buffer.from(content); } else if (!Buffer.isBuffer(content)) { throw new Error('File content must be a string or buffer'); } @@ -53,12 +51,15 @@ * Get file stats. * @return {Object} Stats properties. */ -File.prototype.getStats = function() { +File.prototype.getStats = function(bigint) { const size = this._content.length; - const stats = Item.prototype.getStats.call(this); - stats.mode = this.getMode() | constants.S_IFREG; - stats.size = size; - stats.blocks = Math.ceil(size / 512); + const stats = Item.prototype.getStats.call(this, bigint); + const convert = bigint ? v => BigInt(v) : v => v; + + stats[1] = convert(this.getMode() | constants.S_IFREG); // mode + stats[8] = convert(size); // size + stats[9] = convert(Math.ceil(size / 512)); // blocks + return stats; }; @@ -67,3 +68,59 @@ * @type {function()} */ exports = module.exports = File; + +/** + * Standard input. + * @constructor + */ +function StandardInput() { + File.call(this); + this.setMode(438); // 0666 +} +util.inherits(StandardInput, File); + +exports.StandardInput = StandardInput; + +/** + * Standard output. + * @constructor + */ +function StandardOutput() { + File.call(this); + this.setMode(438); // 0666 +} +util.inherits(StandardOutput, File); + +/** + * Write the contents to stdout. + * @param {string|Buffer} content File contents. + */ +StandardOutput.prototype.setContent = function(content) { + if (process.stdout.isTTY) { + process.stdout.write(content); + } +}; + +exports.StandardOutput = StandardOutput; + +/** + * Standard error. + * @constructor + */ +function StandardError() { + File.call(this); + this.setMode(438); // 0666 +} +util.inherits(StandardError, File); + +/** + * Write the contents to stderr. + * @param {string|Buffer} content File contents. + */ +StandardError.prototype.setContent = function(content) { + if (process.stderr.isTTY) { + process.stderr.write(content); + } +}; + +exports.StandardError = StandardError; diff -Nru node-mock-fs-4.13.0/lib/filesystem.js node-mock-fs-5.1.2/lib/filesystem.js --- node-mock-fs-4.13.0/lib/filesystem.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/filesystem.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,7 @@ const Directory = require('./directory'); const File = require('./file'); -const FSError = require('./error'); +const {FSError} = require('./error'); const SymbolicLink = require('./symlink'); const isWindows = process.platform === 'win32'; diff -Nru node-mock-fs-4.13.0/lib/index.js node-mock-fs-5.1.2/lib/index.js --- node-mock-fs-4.13.0/lib/index.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/index.js 2021-11-08 20:09:32.000000000 +0000 @@ -1,12 +1,16 @@ 'use strict'; const Binding = require('./binding'); -const FSError = require('./error'); +const {FSError} = require('./error'); const FileSystem = require('./filesystem'); const realBinding = process.binding('fs'); const path = require('path'); const loader = require('./loader'); const bypass = require('./bypass'); +const { + getReadFileContextPrototype, + patchReadFileContext +} = require('./readfilecontext'); const fs = require('fs'); const toNamespacedPath = FileSystem.toNamespacedPath; @@ -50,6 +54,10 @@ } } +const readFileContextPrototype = getReadFileContextPrototype(); + +patchReadFileContext(readFileContextPrototype); + function overrideBinding(binding) { realBinding._mockedBinding = binding; } @@ -94,6 +102,10 @@ }; } +function overrideReadFileContext(binding) { + readFileContextPrototype._mockedBinding = binding; +} + function restoreBinding() { delete realBinding._mockedBinding; realBinding.Stats = realStats; @@ -110,6 +122,10 @@ fs.createWriteStream = realCreateWriteStream; } +function restoreReadFileContext(binding) { + delete readFileContextPrototype._mockedBinding; +} + /** * Swap out the fs bindings for a mock file system. * @param {Object} config Mock file system configuration. @@ -125,6 +141,8 @@ overrideBinding(binding); + overrideReadFileContext(binding); + let currentPath = process.cwd(); overrideProcess( function cwd() { @@ -135,7 +153,7 @@ }, function chdir(directory) { if (realBinding._mockedBinding) { - if (!binding.stat(toNamespacedPath(directory)).isDirectory()) { + if (!fs.statSync(toNamespacedPath(directory)).isDirectory()) { throw new FSError('ENOTDIR'); } currentPath = path.resolve(currentPath, directory); @@ -167,6 +185,7 @@ restoreBinding(); restoreProcess(); restoreCreateWriteStream(); + restoreReadFileContext(); }; /** diff -Nru node-mock-fs-4.13.0/lib/item.js node-mock-fs-5.1.2/lib/item.js --- node-mock-fs-4.13.0/lib/item.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/item.js 2021-11-08 20:09:32.000000000 +0000 @@ -19,13 +19,13 @@ }; function getUid() { - // force NaN on windows. - return process.getuid ? process.getuid() : NaN; + // force 0 on windows. + return process.getuid ? process.getuid() : 0; } function getGid() { - // force NaN on windows. - return process.getgid ? process.getgid() : NaN; + // force 0 on windows. + return process.getgid ? process.getgid() : 0; } /** @@ -92,14 +92,13 @@ * Add execute if read allowed * See notes in index.js -> mapping#addDir */ -// prettier-ignore Item.fixWin32Permissions = mode => - (process.platform !== 'win32') - ? mode - : mode | - ((mode & permissions.USER_READ) && permissions.USER_EXEC) | - ((mode & permissions.GROUP_READ) && permissions.GROUP_EXEC) | - ((mode & permissions.OTHER_READ) && permissions.OTHER_EXEC); + process.platform !== 'win32' + ? mode + : mode | + (mode & permissions.USER_READ && permissions.USER_EXEC) | + (mode & permissions.GROUP_READ && permissions.GROUP_EXEC) | + (mode & permissions.OTHER_READ && permissions.OTHER_EXEC); /** * Determine if the current user has read permission. @@ -109,10 +108,9 @@ const uid = getUid(); const gid = getGid(); let can = false; - if (uid === 0) { + if (process.getuid && uid === 0) { can = true; - } else if (uid === this._uid || uid !== uid) { - // (uid !== uid) means uid is NaN, only for windows + } else if (uid === this._uid) { can = (permissions.USER_READ & this._mode) === permissions.USER_READ; } else if (gid === this._gid) { can = (permissions.GROUP_READ & this._mode) === permissions.GROUP_READ; @@ -130,10 +128,9 @@ const uid = getUid(); const gid = getGid(); let can = false; - if (uid === 0) { + if (process.getuid && uid === 0) { can = true; - } else if (uid === this._uid || uid !== uid) { - // (uid !== uid) means uid is NaN, only for windows + } else if (uid === this._uid) { can = (permissions.USER_WRITE & this._mode) === permissions.USER_WRITE; } else if (gid === this._gid) { can = (permissions.GROUP_WRITE & this._mode) === permissions.GROUP_WRITE; @@ -151,10 +148,9 @@ const uid = getUid(); const gid = getGid(); let can = false; - if (uid === 0) { + if (process.getuid && uid === 0) { can = true; - } else if (uid === this._uid || isNaN(uid)) { - // NaN occurs on windows + } else if (uid === this._uid) { can = (permissions.USER_EXEC & this._mode) === permissions.USER_EXEC; } else if (gid === this._gid) { can = (permissions.GROUP_EXEC & this._mode) === permissions.GROUP_EXEC; @@ -283,24 +279,33 @@ * Get item stats. * @return {Object} Stats properties. */ -Item.prototype.getStats = function() { - return { - dev: 8675309, - nlink: this.links, - uid: this.getUid(), - gid: this.getGid(), - rdev: 0, - blksize: 4096, - ino: this._id, - atime: this.getATime(), - mtime: this.getMTime(), - ctime: this.getCTime(), - birthtime: this.getBirthtime(), - atimeMs: +this.getATime(), - mtimeMs: +this.getMTime(), - ctimeMs: +this.getCTime(), - birthtimeMs: +this.getBirthtime() - }; +Item.prototype.getStats = function(bigint) { + const stats = bigint ? new BigUint64Array(36) : new Float64Array(36); + const convert = bigint ? v => BigInt(v) : v => v; + + stats[0] = convert(8675309); // dev + // [1] is mode + stats[2] = convert(this.links); // nlink + stats[3] = convert(this.getUid()); // uid + stats[4] = convert(this.getGid()); // gid + stats[5] = convert(0); // rdev + stats[6] = convert(4096); // blksize + stats[7] = convert(this._id); // ino + // [8] is size + // [9] is blocks + const atimeMs = +this.getATime(); + stats[10] = convert(Math.floor(atimeMs / 1000)); // atime seconds + stats[11] = convert((atimeMs % 1000) * 1000000); // atime nanoseconds + const mtimeMs = +this.getMTime(); + stats[12] = convert(Math.floor(mtimeMs / 1000)); // atime seconds + stats[13] = convert((mtimeMs % 1000) * 1000000); // atime nanoseconds + const ctimeMs = +this.getCTime(); + stats[14] = convert(Math.floor(ctimeMs / 1000)); // atime seconds + stats[15] = convert((ctimeMs % 1000) * 1000000); // atime nanoseconds + const birthtimeMs = +this.getBirthtime(); + stats[16] = convert(Math.floor(birthtimeMs / 1000)); // atime seconds + stats[17] = convert((birthtimeMs % 1000) * 1000000); // atime nanoseconds + return stats; }; /** diff -Nru node-mock-fs-4.13.0/lib/readfilecontext.js node-mock-fs-5.1.2/lib/readfilecontext.js --- node-mock-fs-4.13.0/lib/readfilecontext.js 1970-01-01 00:00:00.000000000 +0000 +++ node-mock-fs-5.1.2/lib/readfilecontext.js 2021-11-08 20:09:32.000000000 +0000 @@ -0,0 +1,153 @@ +'use strict'; + +const {AbortError} = require('./error'); +const {FSReqCallback} = process.binding('fs'); + +/** + * This is a workaround for getting access to the ReadFileContext + * prototype, which we need to be able to patch its methods. + * @returns {object} + */ +exports.getReadFileContextPrototype = function() { + const fs = require('fs'); + const fsBinding = process.binding('fs'); + + const originalOpen = fsBinding.open; + + let proto; + fsBinding.open = (_path, _flags, _mode, req) => { + proto = Object.getPrototypeOf(req.context); + return originalOpen.apply(fsBinding, [_path, _flags, _mode, req]); + }; + + fs.readFile('/ignored.txt', () => {}); + + fsBinding.open = originalOpen; + + return proto; +}; + +/** + * This patches the ReadFileContext prototype to use mocked bindings + * when available. This entire implementation is more or less fully + * copied over from Node.js's /lib/internal/fs/read_file_context.js + * + * This patch is required to support Node.js v16+, where the ReadFileContext + * closes directly over the internal fs bindings, and is also eagerly loader. + * + * See https://github.com/tschaub/mock-fs/issues/332 for more information. + * + * @param {object} prototype The ReadFileContext prototype object to patch. + */ +exports.patchReadFileContext = function(prototype) { + const origRead = prototype.read; + const origClose = prototype.close; + + const kReadFileUnknownBufferLength = 64 * 1024; + const kReadFileBufferLength = 512 * 1024; + + function readFileAfterRead(err, bytesRead) { + const context = this.context; + + if (err) { + return context.close(err); + } + context.pos += bytesRead; + + if (context.pos === context.size || bytesRead === 0) { + context.close(); + } else { + if (context.size === 0) { + // Unknown size, just read until we don't get bytes. + const buffer = + bytesRead === kReadFileUnknownBufferLength + ? context.buffer + : context.buffer.slice(0, bytesRead); + context.buffers.push(buffer); + } + context.read(); + } + } + + function readFileAfterClose(err) { + const context = this.context; + const callback = context.callback; + let buffer = null; + + if (context.err || err) { + // This is a simplification from Node.js, where we don't bother merging the errors + return callback(context.err || err); + } + + try { + if (context.size === 0) { + buffer = Buffer.concat(context.buffers, context.pos); + } else if (context.pos < context.size) { + buffer = context.buffer.slice(0, context.pos); + } else { + buffer = context.buffer; + } + + if (context.encoding) { + buffer = buffer.toString(context.encoding); + } + } catch (err) { + return callback(err); + } + + callback(null, buffer); + } + + prototype.read = function read() { + if (!prototype._mockedBinding) { + return origRead.apply(this, arguments); + } + + let buffer; + let offset; + let length; + + if (this.signal && this.signal.aborted) { + return this.close(new AbortError()); + } + if (this.size === 0) { + buffer = Buffer.allocUnsafeSlow(kReadFileUnknownBufferLength); + offset = 0; + length = kReadFileUnknownBufferLength; + this.buffer = buffer; + } else { + buffer = this.buffer; + offset = this.pos; + length = Math.min(kReadFileBufferLength, this.size - this.pos); + } + + const req = new FSReqCallback(); + req.oncomplete = readFileAfterRead; + req.context = this; + + // This call and the one in close() is what we want to change, the + // rest is pretty much the same as Node.js except we don't have access + // to some of the internal optimizations. + prototype._mockedBinding.read(this.fd, buffer, offset, length, -1, req); + }; + + prototype.close = function close(err) { + if (!prototype._mockedBinding) { + return origClose.apply(this, arguments); + } + + if (this.isUserFd) { + process.nextTick(function tick(context) { + readFileAfterClose.apply({context}, [null]); + }, this); + return; + } + + const req = new FSReqCallback(); + req.oncomplete = readFileAfterClose; + req.context = this; + this.err = err; + + prototype._mockedBinding.close(this.fd, req); + }; +}; diff -Nru node-mock-fs-4.13.0/lib/symlink.js node-mock-fs-5.1.2/lib/symlink.js --- node-mock-fs-4.13.0/lib/symlink.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/lib/symlink.js 2021-11-08 20:09:32.000000000 +0000 @@ -41,12 +41,15 @@ * Get symbolic link stats. * @return {Object} Stats properties. */ -SymbolicLink.prototype.getStats = function() { +SymbolicLink.prototype.getStats = function(bigint) { const size = this._path.length; - const stats = Item.prototype.getStats.call(this); - stats.mode = this.getMode() | constants.S_IFLNK; - stats.size = size; - stats.blocks = Math.ceil(size / 512); + const stats = Item.prototype.getStats.call(this, bigint); + const convert = bigint ? v => BigInt(v) : v => v; + + stats[1] = convert(this.getMode() | constants.S_IFLNK); // mode + stats[8] = convert(size); // size + stats[9] = convert(Math.ceil(size / 512)); // blocks + return stats; }; diff -Nru node-mock-fs-4.13.0/package.json node-mock-fs-5.1.2/package.json --- node-mock-fs-4.13.0/package.json 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/package.json 2021-11-08 20:09:32.000000000 +0000 @@ -1,7 +1,7 @@ { "name": "mock-fs", "description": "A configurable mock file system. You know, for testing.", - "version": "4.13.0", + "version": "5.1.2", "main": "lib/index.js", "homepage": "https://github.com/tschaub/mock-fs", "author": { @@ -28,19 +28,28 @@ "lib" ], "scripts": { - "lint": "eslint benchmarks lib test", + "lint": "eslint benchmarks lib test tasks", "pretest": "npm run lint", "test": "mocha --recursive test" }, "eslintConfig": { - "extends": "tschaub" + "extends": "tschaub", + "parserOptions": { + "ecmaVersion": 2020 + }, + "env": { + "es2020": true + } }, "devDependencies": { - "chai": "^4.2.0", - "eslint": "^5.16.0", + "chai": "^4.3.4", + "eslint": "^7.26.0", "eslint-config-tschaub": "^13.1.0", - "mocha": "^6.1.4", - "rimraf": "^2.6.3", - "semver": "^6.0.0" + "mocha": "^8.4.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12.0.0" } } diff -Nru node-mock-fs-4.13.0/package-lock.json node-mock-fs-5.1.2/package-lock.json --- node-mock-fs-4.13.0/package-lock.json 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/package-lock.json 2021-11-08 20:09:32.000000000 +0000 @@ -1,78 +1,3105 @@ { "name": "mock-fs", - "version": "4.13.0", - "lockfileVersion": 1, + "version": "5.1.2", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "version": "5.1.2", + "license": "MIT", + "devDependencies": { + "chai": "^4.3.4", + "eslint": "^7.26.0", + "eslint-config-tschaub": "^13.1.0", + "mocha": "^8.4.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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/@eslint/eslintrc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", + "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "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, + "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-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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": ">=8" + } + }, + "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 + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "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/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/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 + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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 + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz", + "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.21", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz", + "integrity": "sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==", + "dev": true, + "dependencies": { + "get-stdin": "^6.0.0" + }, + "bin": { + "eslint-config-prettier-check": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=3.14.1" + } + }, + "node_modules/eslint-config-tschaub": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-tschaub/-/eslint-config-tschaub-13.1.0.tgz", + "integrity": "sha512-6vlG8FuEQqzB/87AHhs91Z50FZYPwlHk/ZLMDJ9H1ELtbGuqRBkFGBGOI+RxKCgQLdmS77mEDcehhnkBMvxzvA==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^4.1.0", + "eslint-plugin-import": "^2.17.2", + "eslint-plugin-prettier": "^3.0.1", + "prettier": "^1.17.0" + }, + "peerDependencies": { + "eslint": ">= 5.4" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/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/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/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/eslint-module-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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 + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "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 + }, + "node_modules/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 + }, + "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, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "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, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "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/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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 + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "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.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", + "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "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 + }, + "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/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 + }, + "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "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 + }, + "node_modules/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 + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/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 + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/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/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "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.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "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, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=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==", + "dev": true + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/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/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.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": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "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.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "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": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.0.tgz", + "integrity": "sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/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 + }, + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "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, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/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": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/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/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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.0" + } + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "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 + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "@eslint/eslintrc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", + "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "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 + } } }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "requires": {} }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "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.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "argparse": { @@ -85,13 +3112,27 @@ } }, "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" } }, "assertion-error": { @@ -101,15 +3142,21 @@ "dev": true }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "brace-expansion": { @@ -122,12 +3169,31 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -135,93 +3201,81 @@ "dev": true }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", - "pathval": "^1.1.0", + "pathval": "^1.1.1", "type-detect": "^4.0.5" } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "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=", + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" } }, - "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 - }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "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 - }, "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==", + "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, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "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 }, "concat-map": { @@ -237,39 +3291,29 @@ "dev": true }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, "deep-eql": { @@ -297,9 +3341,9 @@ } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, "doctrine": { @@ -312,18 +3356,18 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "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 }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { - "once": "^1.4.0" + "ansi-colors": "^4.1.1" } }, "error-ex": { @@ -336,23 +3380,33 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -360,68 +3414,67 @@ "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz", + "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", + "levn": "^0.4.1", + "lodash": "^4.17.21", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" } }, "eslint-config-prettier": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.1.0.tgz", - "integrity": "sha512-zILwX9/Ocz4SV2vX7ox85AsrAgXV3f2o2gpIicdMIOra48WYqgUnWNH/cR/iHtmD2Vb3dLSC3LiEJnS05Gkw7w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz", + "integrity": "sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -440,13 +3493,13 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { "debug": "^2.6.9", - "resolve": "^1.5.0" + "resolve": "^1.13.1" }, "dependencies": { "debug": { @@ -467,12 +3520,12 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "dev": true, "requires": { - "debug": "^2.6.8", + "debug": "^2.6.9", "pkg-dir": "^2.0.0" }, "dependencies": { @@ -494,22 +3547,24 @@ } }, "eslint-plugin-import": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", - "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { - "array-includes": "^3.0.3", + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.10.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "debug": { @@ -540,48 +3595,64 @@ } }, "eslint-plugin-prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", - "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -591,21 +3662,37 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "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, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -615,41 +3702,15 @@ "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "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" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "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 }, "fast-diff": { @@ -659,9 +3720,9 @@ "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=", + "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 }, "fast-levenshtein": { @@ -670,57 +3731,54 @@ "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=", + "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, "requires": { - "escape-string-regexp": "^1.0.5" + "flat-cache": "^3.0.4" } }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "to-regex-range": "^5.0.1" } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "fs.realpath": { @@ -729,6 +3787,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -753,25 +3818,27 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, - "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, - "requires": { - "pump": "^3.0.0" - } - }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -782,16 +3849,28 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "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 + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "growl": { @@ -809,16 +3888,22 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "he": { @@ -828,20 +3913,11 @@ "dev": true }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "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 }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -849,9 +3925,9 @@ "dev": true }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -867,61 +3943,17 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "is-arrayish": { @@ -930,58 +3962,119 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "dev": true }, + "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, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, + "is-core-module": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", + "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "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=", + "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 + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-promise": { + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "dev": true }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.2" } }, "isarray": { @@ -1003,9 +4096,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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, "requires": { "argparse": "^1.0.7", @@ -1024,23 +4117,23 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "minimist": "^1.2.0" } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "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, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "load-json-file": { @@ -1056,64 +4149,50 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "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, - "requires": { - "chalk": "^2.0.1" - } + "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 }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "chalk": "^4.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "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 - } + "yallist": "^4.0.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", @@ -1129,144 +4208,81 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", "dev": true, "requires": { - "ansi-colors": "3.2.3", + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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, - "requires": { - "locate-path": "^3.0.0" - } - }, - "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, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "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 }, - "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" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "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==", + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "argparse": "^2.0.1" } }, - "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==", + "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 }, "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "has-flag": "^4.0.0" } } } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, "natural-compare": { @@ -1275,30 +4291,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -1312,26 +4304,23 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, - "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.0" - } + "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 }, - "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=", + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "dev": true }, "object-keys": { @@ -1341,25 +4330,27 @@ "dev": true }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" } }, "once": { @@ -1371,80 +4362,36 @@ "wrappy": "1" } }, - "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.0.0" - } - }, "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.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "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.3" } }, - "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-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "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-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^1.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "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, "requires": { - "p-limit": "^1.1.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -1472,9 +4419,9 @@ } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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 }, "path-is-absolute": { @@ -1483,22 +4430,16 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "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=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -1511,9 +4452,15 @@ } }, "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true }, "pify": { @@ -1529,18 +4476,63 @@ "dev": true, "requires": { "find-up": "^2.1.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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.1.0" + } + }, + "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 + } } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.0.tgz", - "integrity": "sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "prettier-linter-helpers": { @@ -1558,22 +4550,21 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -1585,20 +4576,74 @@ "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=", + "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.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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.1.0" + } + }, + "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 + } + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "picomatch": "^2.2.1" } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "require-directory": { @@ -1607,18 +4652,19 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "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==", + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -1628,97 +4674,69 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "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.0", - "signal-exit": "^3.0.2" - } - }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "is-promise": "^2.1.0" + "lru-cache": "^6.0.0" } }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { - "tslib": "^1.9.0" + "randombytes": "^2.1.0" } }, - "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": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "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=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.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 - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -1726,15 +4744,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "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==", + "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, "requires": { "spdx-exceptions": "^2.1.0", @@ -1742,9 +4760,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "sprintf-js": { @@ -1754,22 +4772,43 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "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.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -1778,64 +4817,52 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "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-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "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 }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.0.tgz", + "integrity": "sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", + "ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "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, - "requires": { - "ansi-regex": "^4.1.0" - } + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true } } }, @@ -1845,34 +4872,34 @@ "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 - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "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==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "is-number": "^7.0.0" } }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -1881,15 +4908,39 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "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 + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "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", @@ -1901,19 +4952,26 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } }, "wide-align": { "version": "1.1.3", @@ -1922,279 +4980,120 @@ "dev": true, "requires": { "string-width": "^1.0.2 || 2" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "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.0" - } + "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 }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": "^2.0.0" + "ansi-regex": "^3.0.0" } } } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "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, "requires": { - "mkdirp": "^0.5.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", + "cliui": "^7.0.2", + "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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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, - "requires": { - "locate-path": "^3.0.0" - } - }, - "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, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "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, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "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, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true }, "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "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, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" } + }, + "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 } } } diff -Nru node-mock-fs-4.13.0/readme.md node-mock-fs-5.1.2/readme.md --- node-mock-fs-4.13.0/readme.md 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/readme.md 2021-11-08 20:09:32.000000000 +0000 @@ -268,11 +268,9 @@ **Note** `mock-fs` is not compatible with `graceful-fs@3.x` but works with `graceful-fs@4.x`. -Mock `fs.Stats` objects have the following properties: `dev`, `ino`, `nlink`, `mode`, `size`, `rdev`, `blksize`, `blocks`, `atime`, `ctime`, `mtime`, `birthtime`, `uid`, and `gid`. In addition, all of the `is*()` method are provided (e.g. `isDirectory()`, `isFile()`, et al.). - Mock file access is controlled based on file mode where `process.getuid()` and `process.getgid()` are available (POSIX systems). On other systems (e.g. Windows) the file mode has no effect. -Tested on Linux, OSX, and Windows using Node 6 through 11. Check the tickets for a list of [known issues](https://github.com/tschaub/mock-fs/issues). +Tested on Linux, OSX, and Windows using Node 12 through 16. Check the tickets for a list of [known issues](https://github.com/tschaub/mock-fs/issues). ### Using with Jest Snapshot Testing diff -Nru node-mock-fs-4.13.0/tasks/next-dev-version.js node-mock-fs-5.1.2/tasks/next-dev-version.js --- node-mock-fs-4.13.0/tasks/next-dev-version.js 1970-01-01 00:00:00.000000000 +0000 +++ node-mock-fs-5.1.2/tasks/next-dev-version.js 2021-11-08 20:09:32.000000000 +0000 @@ -0,0 +1,15 @@ +const semver = require('semver'); +const pkg = require('../package.json'); + +function nextVersion() { + const version = pkg.version; + const s = semver.parse(version); + if (!s) { + throw new Error(`Invalid version ${version}`); + } + return `${s.major}.${s.minor}.${s.patch}-dev.${Date.now()}`; +} + +if (require.main === module) { + process.stdout.write(`${nextVersion()}\n`); +} diff -Nru node-mock-fs-4.13.0/test/helper.js node-mock-fs-5.1.2/test/helper.js --- node-mock-fs-4.13.0/test/helper.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/helper.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,8 +3,6 @@ const chai = require('chai'); const constants = require('constants'); const semver = require('semver'); -const fs = require('fs'); -const hasPromise = !!fs.promises; /** @type {boolean} */ chai.config.includeStack = true; @@ -45,8 +43,6 @@ } }; -exports.withPromise = hasPromise ? TEST : NO_TEST; - /** * Convert a string to flags for fs.open. * @param {string} str String. diff -Nru node-mock-fs-4.13.0/test/lib/binding.spec.js node-mock-fs-5.1.2/test/lib/binding.spec.js --- node-mock-fs-4.13.0/test/lib/binding.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/binding.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -9,8 +9,6 @@ const FileSystem = require('../../lib/filesystem'); const helper = require('../helper'); const constants = require('constants'); -const bufferFrom = require('../../lib/buffer').from; -const bufferAlloc = require('../../lib/buffer').alloc; const assert = helper.assert; const assertEqualPaths = helper.assertEqualPaths; @@ -32,7 +30,7 @@ }), 'one-link.txt': FileSystem.symlink({path: './one.txt'}), 'one-link2.txt': FileSystem.symlink({path: './one-link.txt'}), - 'three.bin': bufferFrom([1, 2, 3]), + 'three.bin': Buffer.from([1, 2, 3]), empty: {}, 'non-empty': { 'a.txt': FileSystem.file({ @@ -73,167 +71,193 @@ assert.equal(binding.getSystem(), system); }); - describe('#Stats', function() { - it('is a stats constructor', function() { - const binding = new Binding(system); - assert.isFunction(binding.Stats); - }); - }); - describe('#stat()', function() { it('calls callback with a Stats instance', function(done) { const binding = new Binding(system); - binding.stat(path.join('mock-dir', 'one.txt'), function(err, stats) { + binding.stat(path.join('mock-dir', 'one.txt'), false, function( + err, + stats + ) { if (err) { return done(err); } - assert.instanceOf(stats, binding.Stats); + assert.instanceOf(stats, Float64Array); done(); }); }); it('returns a Stats instance when called synchronously', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'one.txt')); - assert.instanceOf(stats, binding.Stats); + const stats = binding.stat(path.join('mock-dir', 'one.txt'), false); + assert.instanceOf(stats, Float64Array); }); it('identifies files (async)', function(done) { const binding = new Binding(system); - binding.stat(path.join('mock-dir', 'one.txt'), function(err, stats) { + binding.stat(path.join('mock-dir', 'one.txt'), false, function( + err, + stats + ) { if (err) { return done(err); } - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFREG); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFREG); done(); }); }); it('identifies files (sync)', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'one.txt')); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFREG); + const stats = binding.stat(path.join('mock-dir', 'one.txt'), false); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFREG); }); it('identifies directories (async)', function(done) { const binding = new Binding(system); - binding.stat('mock-dir', function(err, stats) { + binding.stat('mock-dir', false, function(err, stats) { if (err) { return done(err); } - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFDIR); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFDIR); done(); }); }); it('identifies directories (sync)', function() { const binding = new Binding(system); - const stats = binding.stat('mock-dir'); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFDIR); + const stats = binding.stat('mock-dir', false); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFDIR); }); it('includes atime, ctime, mtime and birthtime', function(done) { const binding = new Binding(system); - binding.stat(path.join('mock-dir', 'two.txt'), function(err, stats) { + binding.stat(path.join('mock-dir', 'two.txt'), false, function( + err, + stats + ) { if (err) { return done(err); } - assert.equal(stats.atime.getTime(), new Date(1).getTime()); - assert.equal(stats.ctime.getTime(), new Date(2).getTime()); - assert.equal(stats.mtime.getTime(), new Date(3).getTime()); - assert.equal(stats.birthtime.getTime(), new Date(4).getTime()); + assert.equal( + stats[10] * 1000 + stats[11] / 1000000, + new Date(1).getTime() + ); + assert.equal( + stats[12] * 1000 + stats[13] / 1000000, + new Date(3).getTime() + ); + assert.equal( + stats[14] * 1000 + stats[15] / 1000000, + new Date(2).getTime() + ); + assert.equal( + stats[16] * 1000 + stats[17] / 1000000, + new Date(4).getTime() + ); done(); }); }); it('includes mode with file permissions (default)', function(done) { const binding = new Binding(system); - binding.stat(path.join('mock-dir', 'one.txt'), function(err, stats) { + binding.stat(path.join('mock-dir', 'one.txt'), false, function( + err, + stats + ) { if (err) { return done(err); } - assert.equal(stats.mode & parseInt('0777', 8), parseInt('0666', 8)); + assert.equal(stats[1] & parseInt('0777', 8), parseInt('0666', 8)); done(); }); }); it('includes mode with file permissions (custom)', function(done) { const binding = new Binding(system); - binding.stat(path.join('mock-dir', 'two.txt'), function(err, stats) { + binding.stat(path.join('mock-dir', 'two.txt'), false, function( + err, + stats + ) { if (err) { return done(err); } - assert.equal(stats.mode & parseInt('0777', 8), parseInt('0644', 8)); + assert.equal(stats[1] & parseInt('0777', 8), parseInt('0644', 8)); done(); }); }); it('includes size in bytes (async)', function(done) { const binding = new Binding(system); - binding.stat(path.join('mock-dir', 'two.txt'), function(err, stats) { + binding.stat(path.join('mock-dir', 'two.txt'), false, function( + err, + stats + ) { if (err) { return done(err); } - assert.equal(stats.size, 11); + assert.equal(stats[8], 11); done(); }); }); it('includes size in bytes (sync)', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'three.bin')); - assert.equal(stats.size, 3); + const stats = binding.stat(path.join('mock-dir', 'three.bin'), false); + assert.equal(stats[8], 3); }); it('includes non-zero size for directories', function() { const binding = new Binding(system); - const stats = binding.stat('mock-dir'); - assert.isNumber(stats.size); - assert.isTrue(stats.size > 0); + const stats = binding.stat('mock-dir', false); + assert.isNumber(stats[8]); + assert.isTrue(stats[8] > 0); }); it('includes uid for files', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'two.txt')); + const stats = binding.stat(path.join('mock-dir', 'two.txt'), false); if (process.getuid) { - assert.equal(stats.uid, process.getuid()); + assert.equal(stats[3], process.getuid()); } }); it('includes uid for directories', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'empty')); + const stats = binding.stat(path.join('mock-dir', 'empty'), false); if (process.getuid) { - assert.equal(stats.uid, process.getuid()); + assert.equal(stats[3], process.getuid()); } }); it('includes gid for files', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'two.txt')); + const stats = binding.stat(path.join('mock-dir', 'two.txt'), false); if (process.getgid) { - assert.equal(stats.gid, process.getgid()); + assert.equal(stats[4], process.getgid()); } }); it('includes gid for directories', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'empty')); + const stats = binding.stat(path.join('mock-dir', 'empty'), false); if (process.getgid) { - assert.equal(stats.gid, process.getgid()); + assert.equal(stats[4], process.getgid()); } }); it('retrieves stats of files relative to symbolic linked directories', function() { const binding = new Binding(system); - const stats = binding.stat(path.join('mock-dir', 'dir-link', 'a.txt')); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFREG); - assert.equal(stats.mode & 0x1ff, parseInt('0644', 8)); + const stats = binding.stat( + path.join('mock-dir', 'dir-link', 'a.txt'), + false + ); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFREG); + assert.equal(stats[1] & 0x1ff, parseInt('0644', 8)); if (process.getuid) { - assert.equal(stats.uid, process.getuid()); + assert.equal(stats[3], process.getuid()); } if (process.getgid) { - assert.equal(stats.gid, process.getgid()); + assert.equal(stats[4], process.getgid()); } }); }); @@ -327,7 +351,7 @@ it('accepts a buffer', function(done) { const binding = new Binding(system); - binding.realpath(bufferFrom('mock-dir/one.txt'), 'utf-8', function( + binding.realpath(Buffer.from('mock-dir/one.txt'), 'utf-8', function( err, realPath ) { @@ -381,11 +405,11 @@ it('calls callback with a Stats instance', function(done) { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('r')); - binding.fstat(fd, function(err, stats) { + binding.fstat(fd, false, function(err, stats) { if (err) { return done(err); } - assert.instanceOf(stats, binding.Stats); + assert.instanceOf(stats, Float64Array); done(); }); }); @@ -393,18 +417,18 @@ it('returns a Stats instance when called synchronously', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('r')); - const stats = binding.fstat(fd); - assert.instanceOf(stats, binding.Stats); + const stats = binding.fstat(fd, false); + assert.instanceOf(stats, Float64Array); }); it('identifies files (async)', function(done) { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('r')); - binding.fstat(fd, function(err, stats) { + binding.fstat(fd, false, function(err, stats) { if (err) { return done(err); } - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFREG); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFREG); done(); }); }); @@ -412,11 +436,11 @@ it('identifies directories (async)', function(done) { const binding = new Binding(system); const fd = binding.open('mock-dir', flags('r')); - binding.fstat(fd, function(err, stats) { + binding.fstat(fd, false, function(err, stats) { if (err) { return done(err); } - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFDIR); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFDIR); done(); }); }); @@ -424,11 +448,11 @@ it('includes size in bytes (async)', function(done) { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'two.txt'), flags('r')); - binding.fstat(fd, function(err, stats) { + binding.fstat(fd, false, function(err, stats) { if (err) { return done(err); } - assert.equal(stats.size, 11); + assert.equal(stats[8], 11); done(); }); }); @@ -436,23 +460,23 @@ it('includes size in bytes (sync)', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'three.bin'), flags('r')); - const stats = binding.fstat(fd); - assert.equal(stats.size, 3); + const stats = binding.fstat(fd, false); + assert.equal(stats[8], 3); }); it('includes non-zero size for directories', function() { const binding = new Binding(system); const fd = binding.open('mock-dir', flags('r')); - const stats = binding.fstat(fd); - assert.isNumber(stats.size); - assert.isTrue(stats.size > 0); + const stats = binding.fstat(fd, false); + assert.isNumber(stats[8]); + assert.isTrue(stats[8] > 0); }); }); describe('#readdir()', function() { it('calls callback with file list', function(done) { const binding = new Binding(system); - binding.readdir('mock-dir', function(err, items) { + binding.readdir('mock-dir', 'utf8', false, function(err, items) { assert.isNull(err); assert.isArray(items); assert.deepEqual(items.sort(), [ @@ -473,7 +497,7 @@ it('accepts "buffer" encoding', function(done) { const binding = new Binding(system); - binding.readdir('mock-dir', 'buffer', function(err, items) { + binding.readdir('mock-dir', 'buffer', false, function(err, items) { assert.isNull(err); assert.isArray(items); items.forEach(function(item) { @@ -500,7 +524,7 @@ it('returns a file list (sync)', function() { const binding = new Binding(system); - const items = binding.readdir('mock-dir'); + const items = binding.readdir('mock-dir', 'utf8', false); assert.isArray(items); assert.deepEqual(items.sort(), [ 'dead-link', @@ -518,34 +542,48 @@ it('calls callback with file list for symbolic linked dir', function(done) { const binding = new Binding(system); - binding.readdir(path.join('mock-dir', 'dir-link'), function(err, items) { - assert.isNull(err); - assert.isArray(items); - assert.deepEqual(items.sort(), ['a.txt', 'b.txt']); - done(); - }); + binding.readdir( + path.join('mock-dir', 'dir-link'), + 'utf8', + false, + function(err, items) { + assert.isNull(err); + assert.isArray(items); + assert.deepEqual(items.sort(), ['a.txt', 'b.txt']); + done(); + } + ); }); it('calls callback with file list for link to symbolic linked dir', function(done) { const binding = new Binding(system); - binding.readdir(path.join('mock-dir', 'dir-link2'), function(err, items) { - assert.isNull(err); - assert.isArray(items); - assert.deepEqual(items.sort(), ['a.txt', 'b.txt']); - done(); - }); + binding.readdir( + path.join('mock-dir', 'dir-link2'), + 'utf8', + false, + function(err, items) { + assert.isNull(err); + assert.isArray(items); + assert.deepEqual(items.sort(), ['a.txt', 'b.txt']); + done(); + } + ); }); it('calls callback with file list for symbolic linked dir (sync)', function() { const binding = new Binding(system); - const items = binding.readdir(path.join('mock-dir', 'dir-link')); + const items = binding.readdir( + path.join('mock-dir', 'dir-link'), + 'utf8', + false + ); assert.isArray(items); assert.deepEqual(items.sort(), ['a.txt', 'b.txt']); }); it('calls callback with error for bogus dir', function(done) { const binding = new Binding(system); - binding.readdir('bogus', function(err, items) { + binding.readdir('bogus', 'utf8', false, function(err, items) { assert.instanceOf(err, Error); assert.isUndefined(items); done(); @@ -554,7 +592,10 @@ it('calls callback with error for file path', function(done) { const binding = new Binding(system); - binding.readdir(path.join('mock-dir', 'one.txt'), function(err, items) { + binding.readdir(path.join('mock-dir', 'one.txt'), 'utf8', false, function( + err, + items + ) { assert.instanceOf(err, Error); assert.isUndefined(items); done(); @@ -563,35 +604,44 @@ it('calls callback with error for dead symbolic link', function(done) { const binding = new Binding(system); - binding.readdir(path.join('mock-dir', 'dead-link'), function(err, items) { - assert.instanceOf(err, Error); - assert.isUndefined(items); - done(); - }); + binding.readdir( + path.join('mock-dir', 'dead-link'), + 'utf8', + false, + function(err, items) { + assert.instanceOf(err, Error); + assert.isUndefined(items); + done(); + } + ); }); it('calls callback with error for symbolic link to file', function(done) { const binding = new Binding(system); - binding.readdir(path.join('mock-dir', 'one-link.txt'), function( - err, - items - ) { - assert.instanceOf(err, Error); - assert.isUndefined(items); - done(); - }); + binding.readdir( + path.join('mock-dir', 'one-link.txt'), + 'utf8', + false, + function(err, items) { + assert.instanceOf(err, Error); + assert.isUndefined(items); + done(); + } + ); }); it('calls callback with error for link to symbolic link to file', function(done) { const binding = new Binding(system); - binding.readdir(path.join('mock-dir', 'one-link2.txt'), function( - err, - items - ) { - assert.instanceOf(err, Error); - assert.isUndefined(items); - done(); - }); + binding.readdir( + path.join('mock-dir', 'one-link2.txt'), + 'utf8', + false, + function(err, items) { + assert.instanceOf(err, Error); + assert.isUndefined(items); + done(); + } + ); }); }); @@ -842,7 +892,7 @@ it('reads from a file', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'two.txt'), flags('r')); - const buffer = bufferAlloc(11); + const buffer = Buffer.alloc(11); const read = binding.read(fd, buffer, 0, 11, 0); assert.equal(read, 11); assert.equal(String(buffer), 'two content'); @@ -860,7 +910,7 @@ it('interprets null position as current position', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('r')); - const buffer = bufferAlloc(4); + const buffer = Buffer.alloc(4); // chunk 1 assert.equal(binding.read(fd, buffer, 0, 11, null), 4); @@ -881,7 +931,7 @@ path.join('mock-dir', 'one-link.txt'), flags('r') ); - const buffer = bufferAlloc(11); + const buffer = Buffer.alloc(11); const read = binding.read(fd, buffer, 0, 11, 0); assert.equal(read, 11); assert.equal(String(buffer), 'one content'); @@ -893,7 +943,7 @@ path.join('mock-dir', 'one-link2.txt'), flags('r') ); - const buffer = bufferAlloc(11); + const buffer = Buffer.alloc(11); const read = binding.read(fd, buffer, 0, 11, 0); assert.equal(read, 11); assert.equal(String(buffer), 'one content'); @@ -902,7 +952,7 @@ it('throws if not open for reading', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'two.txt'), flags('w')); - const buffer = bufferAlloc(11); + const buffer = Buffer.alloc(11); assert.throws(function() { binding.read(fd, buffer, 0, 11, 0); }); @@ -919,87 +969,11 @@ }); }); - describe('#write()', function() { - it('writes to a file', function() { - const binding = new Binding(system); - const fd = binding.open(path.join('mock-dir', 'new.txt'), flags('w')); - const buffer = bufferFrom('new content'); - const written = binding.write(fd, buffer, 0, 11, 0); - assert.equal(written, 11); - const file = system.getItem(path.join('mock-dir', 'new.txt')); - assert.instanceOf(file, File); - const content = file.getContent(); - assert.isTrue(Buffer.isBuffer(content)); - assert.equal(String(content), 'new content'); - }); - - it('can take input from a Uint8Array', function() { - const binding = new Binding(system); - const fd = binding.open(path.join('mock-dir', 'new.txt'), flags('w')); - const buffer = Uint8Array.from([1, 2, 3, 4, 5]); - const written = binding.write(fd, buffer, 0, 5, 0); - assert.equal(written, 5); - const file = system.getItem(path.join('mock-dir', 'new.txt')); - assert.instanceOf(file, File); - const content = file.getContent(); - assert.isTrue(Buffer.isBuffer(content)); - assert.deepEqual(Array.from(content), [1, 2, 3, 4, 5]); - }); - - it('can overwrite a file', function() { - const binding = new Binding(system); - const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('w')); - const buffer = bufferFrom('bingo'); - const written = binding.write(fd, buffer, 0, 5, null); - assert.equal(written, 5); - const file = system.getItem(path.join('mock-dir', 'one.txt')); - assert.instanceOf(file, File); - const content = file.getContent(); - assert.isTrue(Buffer.isBuffer(content)); - assert.equal(String(content), 'bingo'); - }); - - it('can append to a file', function() { - const binding = new Binding(system); - const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('a')); - const buffer = bufferFrom(' more'); - const written = binding.write(fd, buffer, 0, 5, null); - assert.equal(written, 5); - const file = system.getItem(path.join('mock-dir', 'one.txt')); - assert.instanceOf(file, File); - const content = file.getContent(); - assert.isTrue(Buffer.isBuffer(content)); - assert.equal(String(content), 'one content more'); - }); - - it('can overwrite part of a file', function() { - const binding = new Binding(system); - const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('a')); - const buffer = bufferFrom('new'); - const written = binding.write(fd, buffer, 0, 3, 0); - assert.equal(written, 3); - const file = system.getItem(path.join('mock-dir', 'one.txt')); - assert.instanceOf(file, File); - const content = file.getContent(); - assert.isTrue(Buffer.isBuffer(content)); - assert.equal(String(content), 'new content'); - }); - - it('throws if not open for writing', function() { - const binding = new Binding(system); - const fd = binding.open(path.join('mock-dir', 'two.txt'), flags('r')); - const buffer = bufferFrom('some content'); - assert.throws(function() { - binding.write(fd, buffer, 0, 12, 0); - }); - }); - }); - describe('#writeBuffers()', function() { it('writes to a file', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'new.txt'), flags('w')); - const buffers = [bufferFrom('new '), bufferFrom('content')]; + const buffers = [Buffer.from('new '), Buffer.from('content')]; const written = binding.writeBuffers(fd, buffers); assert.equal(written, 11); const file = system.getItem(path.join('mock-dir', 'new.txt')); @@ -1012,7 +986,7 @@ it('can append to a file', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('a')); - const buffers = [bufferFrom(' more'), bufferFrom(' content')]; + const buffers = [Buffer.from(' more'), Buffer.from(' content')]; const written = binding.writeBuffers(fd, buffers); assert.equal(written, 13); const file = system.getItem(path.join('mock-dir', 'one.txt')); @@ -1025,7 +999,7 @@ it('can overwrite part of a file', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'one.txt'), flags('a')); - const buffers = [bufferFrom('n'), bufferFrom('e'), bufferFrom('w')]; + const buffers = [Buffer.from('n'), Buffer.from('e'), Buffer.from('w')]; const written = binding.writeBuffers(fd, buffers, 0); assert.equal(written, 3); const file = system.getItem(path.join('mock-dir', 'one.txt')); @@ -1038,7 +1012,7 @@ it('throws if not open for writing', function() { const binding = new Binding(system); const fd = binding.open(path.join('mock-dir', 'two.txt'), flags('r')); - const buffers = [bufferFrom('some content')]; + const buffers = [Buffer.from('some content')]; assert.throws(function() { binding.writeBuffers(fd, buffers); }); @@ -1052,8 +1026,8 @@ const newPath = path.join('mock-dir', 'empty', 'new.txt'); binding.rename(oldPath, newPath, function(_) { const stats = binding.stat(newPath); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFREG); - assert.equal(stats.size, 11); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFREG); + assert.equal(stats[8], 11); done(); }); }); @@ -1064,8 +1038,8 @@ const newPath = path.join('mock-dir', 'new.txt'); binding.rename(oldPath, newPath); const stats = binding.stat(newPath); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFREG); - assert.equal(stats.size, 11); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFREG); + assert.equal(stats[8], 11); }); it('replaces existing files (sync)', function() { @@ -1074,8 +1048,8 @@ const newPath = path.join('mock-dir', 'two.txt'); binding.rename(oldPath, newPath); const stats = binding.stat(newPath); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFREG); - assert.equal(stats.size, 11); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFREG); + assert.equal(stats[8], 11); }); it('allows directories to be renamed', function(done) { @@ -1084,7 +1058,7 @@ const newPath = path.join('mock-dir', 'new'); binding.rename(oldPath, newPath, function(_) { const stats = binding.stat(newPath); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFDIR); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFDIR); done(); }); }); @@ -1095,7 +1069,7 @@ const newPath = path.join('new-dir'); binding.rename(oldPath, newPath); const stats = binding.stat(newPath); - assert.equal(stats.mode & constants.S_IFMT, constants.S_IFDIR); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFDIR); const items = binding.readdir(newPath); assert.isArray(items); assert.deepEqual(items.sort(), [ @@ -1147,7 +1121,7 @@ it('creates a new directory', function() { const binding = new Binding(system); const dirPath = path.join('mock-dir', 'foo'); - binding.mkdir(dirPath, parseInt('0755', 8)); + binding.mkdir(dirPath, parseInt('0755', 8), false); const dir = system.getItem(dirPath); assert.instanceOf(dir, Directory); assert.equal(dir.getMode(), parseInt('0755', 8)); @@ -1157,7 +1131,7 @@ const binding = new Binding(system); const dirPath = path.join('bogus', 'path'); assert.throws(function() { - binding.mkdir(dirPath, parseInt('0755', 8)); + binding.mkdir(dirPath, parseInt('0755', 8), false); }); }); @@ -1165,7 +1139,7 @@ const binding = new Binding(system); const dirPath = 'mock-dir'; assert.throws(function() { - binding.mkdir(dirPath, parseInt('0755', 8)); + binding.mkdir(dirPath, parseInt('0755', 8), false); }); }); @@ -1173,7 +1147,7 @@ const binding = new Binding(system); const dirPath = path.join('mock-dir', 'one.txt'); assert.throws(function() { - binding.mkdir(dirPath, parseInt('0755', 8)); + binding.mkdir(dirPath, parseInt('0755', 8), false); }); }); }); @@ -1628,10 +1602,9 @@ it('stats symbolic links', function() { const binding = new Binding(system); const pathname = path.join('mock-dir', 'one-link.txt'); - const stats = binding.lstat(pathname); - assert.isTrue(stats.isSymbolicLink()); - assert.isFalse(stats.isFile()); - assert.equal(stats.size, binding.readlink(pathname).length); + const stats = binding.lstat(pathname, false); + assert.equal(stats[1] & constants.S_IFMT, constants.S_IFLNK); + assert.equal(stats[8], binding.readlink(pathname).length); }); }); diff -Nru node-mock-fs-4.13.0/test/lib/bypass.spec.js node-mock-fs-5.1.2/test/lib/bypass.spec.js --- node-mock-fs-4.13.0/test/lib/bypass.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/bypass.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -4,7 +4,6 @@ const fs = require('fs'); const mock = require('../../lib/index'); const path = require('path'); -const withPromise = helper.withPromise; const assert = helper.assert; @@ -58,16 +57,14 @@ assert.equal(process.cwd(), originalCwd); }); - withPromise.it('runs an async function using the real filesystem', done => { + it('runs an async function using the real filesystem', done => { mock({'/path/to/file': 'content'}); assert.equal(fs.readFileSync('/path/to/file', 'utf8'), 'content'); assert.isFalse(fs.existsSync(__filename)); - const promise = mock.bypass(() => fs.promises.stat(__filename)); - assert.instanceOf(promise, Promise); - - promise + mock + .bypass(() => fs.promises.stat(__filename)) .then(stat => { assert.isTrue(stat.isFile()); assert.isFalse(fs.existsSync(__filename)); @@ -76,7 +73,7 @@ .catch(done); }); - withPromise.it('handles promise rejection', done => { + it('handles promise rejection', done => { mock({'/path/to/file': 'content'}); assert.equal(fs.readFileSync('/path/to/file', 'utf8'), 'content'); @@ -84,15 +81,13 @@ const error = new Error('oops'); - const promise = mock.bypass(() => { - assert.isTrue(fs.existsSync(__filename)); - return Promise.reject(error); - }); - assert.instanceOf(promise, Promise); - - promise + mock + .bypass(() => { + assert.isTrue(fs.existsSync(__filename)); + return Promise.reject(error); + }) .then(() => { - done(new Error('expected rejection')); + done(new Error('should not succeed')); }) .catch(err => { assert.equal(err, error); diff -Nru node-mock-fs-4.13.0/test/lib/file.spec.js node-mock-fs-5.1.2/test/lib/file.spec.js --- node-mock-fs-4.13.0/test/lib/file.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/file.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,7 +3,6 @@ const Item = require('../../lib/item'); const File = require('../../lib/file'); const assert = require('../helper').assert; -const bufferFrom = require('../../lib/buffer').from; describe('File', function() { describe('constructor', function() { @@ -17,7 +16,7 @@ describe('#getContent()', function() { it('gets the file content', function() { const file = new File(); - const content = bufferFrom('bar'); + const content = Buffer.from('bar'); file.setContent(content); assert.equal(file.getContent(), content); }); @@ -48,7 +47,7 @@ it('accepts a buffer', function() { const file = new File(); - file.setContent(bufferFrom('baz')); + file.setContent(Buffer.from('baz')); const content = file.getContent(); assert.isTrue(Buffer.isBuffer(content)); assert.equal(String(content), 'baz'); diff -Nru node-mock-fs-4.13.0/test/lib/fs.access.spec.js node-mock-fs-5.1.2/test/lib/fs.access.spec.js --- node-mock-fs-4.13.0/test/lib/fs.access.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.access.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -4,10 +4,8 @@ const fs = require('fs'); const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; -if (fs.access && fs.accessSync && process.getuid && process.getgid) { - // TODO: drop condition when dropping Node < 0.12 support +if (process.getuid && process.getgid) { // TODO: figure out how fs.access() works on Windows (without gid/uid) describe('fs.access(path[, mode], callback)', function() { @@ -67,7 +65,7 @@ fs.access(Buffer.from('path/to/accessible/file'), done); }); - withPromise.it('promise works for an accessible file', function(done) { + it('promise works for an accessible file', function(done) { fs.promises.access('path/to/accessible/file').then(done, done); }); @@ -75,7 +73,7 @@ fs.access('path/to/000', done); }); - withPromise.it('promise works 000 (and no mode arg)', function(done) { + it('promise works 000 (and no mode arg)', function(done) { fs.promises.access('path/to/000').then(done, done); }); @@ -83,7 +81,7 @@ fs.access('path/to/000', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 000', function(done) { + it('promise works F_OK and 000', function(done) { fs.promises.access('path/to/000', fs.F_OK).then(done, done); }); @@ -95,11 +93,10 @@ }); }); - withPromise.it('promise generates EACCES for R_OK and 000', function(done) { + it('promise generates EACCES for R_OK and 000', function(done) { fs.promises.access('path/to/000', fs.R_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -117,11 +114,10 @@ }); }); - withPromise.it('promise generates EACCES for W_OK and 000', function(done) { + it('promise generates EACCES for W_OK and 000', function(done) { fs.promises.access('path/to/000', fs.W_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -139,11 +135,10 @@ }); }); - withPromise.it('promise generates EACCES for X_OK and 000', function(done) { + it('promise generates EACCES for X_OK and 000', function(done) { fs.promises.access('path/to/000', fs.X_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -157,7 +152,7 @@ fs.access('path/to/111', done); }); - withPromise.it('promise works 111 (and no mode arg)', function(done) { + it('promise works 111 (and no mode arg)', function(done) { fs.promises.access('path/to/111').then(done, done); }); @@ -165,7 +160,7 @@ fs.access('path/to/111', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 111', function(done) { + it('promise works F_OK and 111', function(done) { fs.promises.access('path/to/111', fs.F_OK).then(done, done); }); @@ -173,7 +168,7 @@ fs.access('path/to/111', fs.X_OK, done); }); - withPromise.it('promise works X_OK and 111', function(done) { + it('promise works X_OK and 111', function(done) { fs.promises.access('path/to/111', fs.X_OK).then(done, done); }); @@ -185,11 +180,10 @@ }); }); - withPromise.it('promise generates EACCES for R_OK and 111', function(done) { + it('promise generates EACCES for R_OK and 111', function(done) { fs.promises.access('path/to/111', fs.R_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -207,11 +201,10 @@ }); }); - withPromise.it('promise generates EACCES for W_OK and 111', function(done) { + it('promise generates EACCES for W_OK and 111', function(done) { fs.promises.access('path/to/111', fs.W_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -225,7 +218,7 @@ fs.access('path/to/write/only', done); }); - withPromise.it('promise works for 222 (and no mode arg)', function(done) { + it('promise works for 222 (and no mode arg)', function(done) { fs.promises.access('path/to/write/only').then(done, done); }); @@ -233,7 +226,7 @@ fs.access('path/to/write/only', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 222', function(done) { + it('promise works F_OK and 222', function(done) { fs.promises.access('path/to/write/only', fs.F_OK).then(done, done); }); @@ -241,7 +234,7 @@ fs.access('path/to/write/only', fs.W_OK, done); }); - withPromise.it('promise works W_OK and 222', function(done) { + it('promise works W_OK and 222', function(done) { fs.promises.access('path/to/write/only', fs.W_OK).then(done, done); }); @@ -253,11 +246,10 @@ }); }); - withPromise.it('promise generates EACCES for R_OK and 222', function(done) { + it('promise generates EACCES for R_OK and 222', function(done) { fs.promises.access('path/to/write/only', fs.R_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -275,11 +267,10 @@ }); }); - withPromise.it('promise generates EACCES for X_OK and 222', function(done) { + it('promise generates EACCES for X_OK and 222', function(done) { fs.promises.access('path/to/write/only', fs.X_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -293,7 +284,7 @@ fs.access('path/to/333', done); }); - withPromise.it('promise works for 333 (and no mode arg)', function(done) { + it('promise works for 333 (and no mode arg)', function(done) { fs.promises.access('path/to/333').then(done, done); }); @@ -301,7 +292,7 @@ fs.access('path/to/333', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 333', function(done) { + it('promise works F_OK and 333', function(done) { fs.promises.access('path/to/333', fs.F_OK).then(done, done); }); @@ -309,7 +300,7 @@ fs.access('path/to/333', fs.W_OK, done); }); - withPromise.it('promise works W_OK and 333', function(done) { + it('promise works W_OK and 333', function(done) { fs.promises.access('path/to/333', fs.W_OK).then(done, done); }); @@ -317,7 +308,7 @@ fs.access('path/to/333', fs.X_OK, done); }); - withPromise.it('promise works X_OK and 333', function(done) { + it('promise works X_OK and 333', function(done) { fs.promises.access('path/to/333', fs.X_OK).then(done, done); }); @@ -325,7 +316,7 @@ fs.access('path/to/333', fs.X_OK | fs.W_OK, done); }); - withPromise.it('promise works X_OK | W_OK and 333', function(done) { + it('promise works X_OK | W_OK and 333', function(done) { fs.promises.access('path/to/333', fs.X_OK | fs.W_OK).then(done, done); }); @@ -337,11 +328,10 @@ }); }); - withPromise.it('promise generates EACCES for R_OK and 333', function(done) { + it('promise generates EACCES for R_OK and 333', function(done) { fs.promises.access('path/to/333', fs.R_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -355,7 +345,7 @@ fs.access('path/to/444', done); }); - withPromise.it('promise works for 444 (and no mode arg)', function(done) { + it('promise works for 444 (and no mode arg)', function(done) { fs.promises.access('path/to/444').then(done, done); }); @@ -363,7 +353,7 @@ fs.access('path/to/444', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 444', function(done) { + it('promise works F_OK and 444', function(done) { fs.promises.access('path/to/444', fs.F_OK).then(done, done); }); @@ -371,7 +361,7 @@ fs.access('path/to/444', fs.R_OK, done); }); - withPromise.it('promise works R_OK and 444', function(done) { + it('promise works R_OK and 444', function(done) { fs.promises.access('path/to/444', fs.R_OK).then(done, done); }); @@ -383,11 +373,10 @@ }); }); - withPromise.it('promise generates EACCES for W_OK and 444', function(done) { + it('promise generates EACCES for W_OK and 444', function(done) { fs.promises.access('path/to/444', fs.W_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -405,11 +394,10 @@ }); }); - withPromise.it('promise generates EACCES for X_OK and 444', function(done) { + it('promise generates EACCES for X_OK and 444', function(done) { fs.promises.access('path/to/444', fs.X_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -423,7 +411,7 @@ fs.access('path/to/555', done); }); - withPromise.it('promise works for 555 (and no mode arg)', function(done) { + it('promise works for 555 (and no mode arg)', function(done) { fs.promises.access('path/to/555').then(done, done); }); @@ -431,7 +419,7 @@ fs.access('path/to/555', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 555', function(done) { + it('promise works F_OK and 555', function(done) { fs.promises.access('path/to/555', fs.F_OK).then(done, done); }); @@ -439,7 +427,7 @@ fs.access('path/to/555', fs.R_OK, done); }); - withPromise.it('promise works R_OK and 555', function(done) { + it('promise works R_OK and 555', function(done) { fs.promises.access('path/to/555', fs.R_OK).then(done, done); }); @@ -447,7 +435,7 @@ fs.access('path/to/555', fs.X_OK, done); }); - withPromise.it('promise works X_OK and 555', function(done) { + it('promise works X_OK and 555', function(done) { fs.promises.access('path/to/555', fs.X_OK).then(done, done); }); @@ -455,7 +443,7 @@ fs.access('path/to/555', fs.R_OK | fs.X_OK, done); }); - withPromise.it('promise works R_OK | X_OK and 555', function(done) { + it('promise works R_OK | X_OK and 555', function(done) { fs.promises.access('path/to/555', fs.R_OK | fs.X_OK).then(done, done); }); @@ -467,11 +455,10 @@ }); }); - withPromise.it('promise generates EACCES for W_OK and 555', function(done) { + it('promise generates EACCES for W_OK and 555', function(done) { fs.promises.access('path/to/555', fs.W_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -485,7 +472,7 @@ fs.access('path/to/666', done); }); - withPromise.it('promise works for 666 (and no mode arg)', function(done) { + it('promise works for 666 (and no mode arg)', function(done) { fs.promises.access('path/to/666').then(done, done); }); @@ -493,7 +480,7 @@ fs.access('path/to/666', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 666', function(done) { + it('promise works F_OK and 666', function(done) { fs.promises.access('path/to/666', fs.F_OK).then(done, done); }); @@ -501,7 +488,7 @@ fs.access('path/to/666', fs.R_OK, done); }); - withPromise.it('promise works R_OK and 666', function(done) { + it('promise works R_OK and 666', function(done) { fs.promises.access('path/to/666', fs.R_OK).then(done, done); }); @@ -509,7 +496,7 @@ fs.access('path/to/666', fs.W_OK, done); }); - withPromise.it('promise works W_OK and 666', function(done) { + it('promise works W_OK and 666', function(done) { fs.promises.access('path/to/666', fs.W_OK).then(done, done); }); @@ -517,7 +504,7 @@ fs.access('path/to/666', fs.R_OK | fs.W_OK, done); }); - withPromise.it('promise works R_OK | W_OK and 666', function(done) { + it('promise works R_OK | W_OK and 666', function(done) { fs.promises.access('path/to/666', fs.R_OK | fs.W_OK).then(done, done); }); @@ -529,11 +516,10 @@ }); }); - withPromise.it('promise generates EACCES for X_OK and 666', function(done) { + it('promise generates EACCES for X_OK and 666', function(done) { fs.promises.access('path/to/666', fs.X_OK).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -547,7 +533,7 @@ fs.access('path/to/777', done); }); - withPromise.it('promise works for 777 (and no mode arg)', function(done) { + it('promise works for 777 (and no mode arg)', function(done) { fs.promises.access('path/to/777').then(done, done); }); @@ -555,7 +541,7 @@ fs.access('path/to/777', fs.F_OK, done); }); - withPromise.it('promise works F_OK and 777', function(done) { + it('promise works F_OK and 777', function(done) { fs.promises.access('path/to/777', fs.F_OK).then(done, done); }); @@ -563,7 +549,7 @@ fs.access('path/to/777', fs.R_OK, done); }); - withPromise.it('promise works R_OK and 777', function(done) { + it('promise works R_OK and 777', function(done) { fs.promises.access('path/to/777', fs.R_OK).then(done, done); }); @@ -571,7 +557,7 @@ fs.access('path/to/777', fs.W_OK, done); }); - withPromise.it('promise works W_OK and 777', function(done) { + it('promise works W_OK and 777', function(done) { fs.promises.access('path/to/777', fs.W_OK).then(done, done); }); @@ -579,7 +565,7 @@ fs.access('path/to/777', fs.X_OK, done); }); - withPromise.it('promise works X_OK and 777', function(done) { + it('promise works X_OK and 777', function(done) { fs.promises.access('path/to/777', fs.X_OK).then(done, done); }); @@ -587,7 +573,7 @@ fs.access('path/to/777', fs.X_OK | fs.W_OK, done); }); - withPromise.it('promise works X_OK | W_OK and 777', function(done) { + it('promise works X_OK | W_OK and 777', function(done) { fs.promises.access('path/to/777', fs.X_OK | fs.W_OK).then(done, done); }); @@ -595,7 +581,7 @@ fs.access('path/to/777', fs.X_OK | fs.R_OK, done); }); - withPromise.it('promise works X_OK | R_OK and 777', function(done) { + it('promise works X_OK | R_OK and 777', function(done) { fs.promises.access('path/to/777', fs.X_OK | fs.R_OK).then(done, done); }); @@ -603,7 +589,7 @@ fs.access('path/to/777', fs.R_OK | fs.W_OK, done); }); - withPromise.it('promise works R_OK | W_OK and 777', function(done) { + it('promise works R_OK | W_OK and 777', function(done) { fs.promises.access('path/to/777', fs.R_OK | fs.W_OK).then(done, done); }); @@ -611,7 +597,7 @@ fs.access('path/to/777', fs.R_OK | fs.W_OK | fs.X_OK, done); }); - withPromise.it('promise works R_OK | W_OK | X_OK and 777', function(done) { + it('promise works R_OK | W_OK | X_OK and 777', function(done) { fs.promises .access('path/to/777', fs.R_OK | fs.W_OK | fs.X_OK) .then(done, done); @@ -625,22 +611,18 @@ }); }); - withPromise.it( - 'promise generates EACCESS for F_OK and an unreadable parent', - function(done) { - fs.promises.access('unreadable/readable-child').then( - function() { - assert.fail('should not succeed.'); - done(); - }, - function(err) { - assert.instanceOf(err, Error); - assert.equal(err.code, 'EACCES'); - done(); - } - ); - } - ); + it('promise generates EACCESS for F_OK and an unreadable parent', function(done) { + fs.promises.access('unreadable/readable-child').then( + function() { + done(new Error('should not succeed.')); + }, + function(err) { + assert.instanceOf(err, Error); + assert.equal(err.code, 'EACCES'); + done(); + } + ); + }); }); describe('fs.accessSync(path[, mode])', function() { diff -Nru node-mock-fs-4.13.0/test/lib/fs.appendFile.spec.js node-mock-fs-5.1.2/test/lib/fs.appendFile.spec.js --- node-mock-fs-4.13.0/test/lib/fs.appendFile.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.appendFile.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,10 +3,8 @@ const helper = require('../helper'); const fs = require('fs'); const mock = require('../../lib/index'); -const bufferFrom = require('../../lib/buffer').from; const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.appendFile(filename, data, [options], callback)', function() { beforeEach(function() { @@ -27,7 +25,7 @@ }); }); - withPromise.it('promise writes a string to a new file', function(done) { + it('promise writes a string to a new file', function(done) { fs.promises.appendFile('foo', 'bar').then(function() { assert.equal(String(fs.readFileSync('foo')), 'bar'); done(); @@ -44,9 +42,7 @@ }); }); - withPromise.it('promise appends a string to an existing file', function( - done - ) { + it('promise appends a string to an existing file', function(done) { fs.promises.appendFile('dir/file.txt', ' bar').then(function() { assert.equal(String(fs.readFileSync('dir/file.txt')), 'file content bar'); done(); @@ -54,7 +50,7 @@ }); it('appends a buffer to a file', function(done) { - fs.appendFile('dir/file.txt', bufferFrom(' bar'), function(err) { + fs.appendFile('dir/file.txt', Buffer.from(' bar'), function(err) { if (err) { return done(err); } @@ -63,11 +59,16 @@ }); }); - withPromise.it('promise appends a buffer to a file', function(done) { - fs.promises.appendFile('dir/file.txt', bufferFrom(' bar')).then(function() { - assert.equal(String(fs.readFileSync('dir/file.txt')), 'file content bar'); - done(); - }, done); + it('promise appends a buffer to a file', function(done) { + fs.promises + .appendFile('dir/file.txt', Buffer.from(' bar')) + .then(function() { + assert.equal( + String(fs.readFileSync('dir/file.txt')), + 'file content bar' + ); + done(); + }, done); }); it('appends via a symbolic link file', function(done) { @@ -80,7 +81,7 @@ }); }); - withPromise.it('promise appends via a symbolic link file', function(done) { + it('promise appends via a symbolic link file', function(done) { fs.promises.appendFile('link.txt', ' bar').then(function() { assert.equal(String(fs.readFileSync('dir/file.txt')), 'file content bar'); done(); @@ -94,11 +95,10 @@ }); }); - withPromise.it('promise fails if directory does not exist', function(done) { + it('promise fails if directory does not exist', function(done) { fs.promises.appendFile('foo/bar', 'baz').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/fs.chmod-fchmod.spec.js node-mock-fs-5.1.2/test/lib/fs.chmod-fchmod.spec.js --- node-mock-fs-4.13.0/test/lib/fs.chmod-fchmod.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.chmod-fchmod.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,6 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.chmod(path, mode, callback)', function() { beforeEach(function() { @@ -37,7 +36,7 @@ }); }); - withPromise.it('promise changes permissions of a file', function(done) { + it('promise changes permissions of a file', function(done) { fs.promises.chmod('file.txt', parseInt('0664', 8)).then(function() { const stats = fs.statSync('file.txt'); assert.equal(stats.mode & parseInt('0777', 8), parseInt('0664', 8)); @@ -53,11 +52,10 @@ }); }); - withPromise.it('promise fails if file does not exist', function(done) { + it('promise fails if file does not exist', function(done) { fs.promises.chmod('bogus.txt', parseInt('0664', 8)).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -109,7 +107,7 @@ }); }); - withPromise.it('promise changes permissions of a file', function(done) { + it('promise changes permissions of a file', function(done) { fs.promises .open('file.txt', 'r') .then(function(fd) { diff -Nru node-mock-fs-4.13.0/test/lib/fs.chown-fchown.spec.js node-mock-fs-5.1.2/test/lib/fs.chown-fchown.spec.js --- node-mock-fs-4.13.0/test/lib/fs.chown-fchown.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.chown-fchown.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,6 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.chown(path, uid, gid, callback)', function() { beforeEach(function() { @@ -24,7 +23,7 @@ fs.chown(Buffer.from('file.txt'), 42, 43, done); }); - withPromise.it('promise changes ownership of a file', function(done) { + it('promise changes ownership of a file', function(done) { fs.promises.chown('file.txt', 42, 43).then(done, done); }); @@ -35,11 +34,10 @@ }); }); - withPromise.it('promise fails if file does not exist', function(done) { + it('promise fails if file does not exist', function(done) { fs.promises.chown('bogus.txt', 42, 43).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -84,7 +82,7 @@ fs.fchown(fd, 42, 43, done); }); - withPromise.it('promise changes ownership of a file', function(done) { + it('promise changes ownership of a file', function(done) { fs.promises .open('file.txt', 'r') .then(function(fd) { diff -Nru node-mock-fs-4.13.0/test/lib/fs.copyFile.spec.js node-mock-fs-5.1.2/test/lib/fs.copyFile.spec.js --- node-mock-fs-4.13.0/test/lib/fs.copyFile.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.copyFile.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,6 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; if (fs.copyFile && fs.copyFileSync) { describe('fs.copyFile(src, dest[, flags], callback)', function() { @@ -43,9 +42,7 @@ ); }); - withPromise.it('promise copies a file to an empty directory', function( - done - ) { + it('promise copies a file to an empty directory', function(done) { fs.promises .copyFile('path/to/src.txt', 'empty/dest.txt') .then(function() { @@ -69,7 +66,7 @@ }); }); - withPromise.it('promise truncates dest file if it exists', function(done) { + it('promise truncates dest file if it exists', function(done) { fs.promises .copyFile('path/to/src.txt', 'path/to/other.txt') .then(function() { @@ -94,9 +91,7 @@ ); }); - withPromise.it('promise throws if dest exists and exclusive', function( - done - ) { + it('promise throws if dest exists and exclusive', function(done) { fs.promises .copyFile( 'path/to/src.txt', @@ -105,8 +100,7 @@ ) .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -124,11 +118,10 @@ }); }); - withPromise.it('promise fails if src does not exist', function(done) { + it('promise fails if src does not exist', function(done) { fs.promises.copyFile('path/to/bogus.txt', 'empty/dest.txt').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -146,11 +139,10 @@ }); }); - withPromise.it('promise fails if dest path does not exist', function(done) { + it('promise fails if dest path does not exist', function(done) { fs.promises.copyFile('path/to/src.txt', 'path/nope/dest.txt').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -168,11 +160,10 @@ }); }); - withPromise.it('promise fails if dest is a directory', function(done) { + it('promise fails if dest is a directory', function(done) { fs.promises.copyFile('path/to/src.txt', 'empty').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/fs.createWriteStream.spec.js node-mock-fs-5.1.2/test/lib/fs.createWriteStream.spec.js --- node-mock-fs-4.13.0/test/lib/fs.createWriteStream.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.createWriteStream.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -4,7 +4,6 @@ const helper = require('../helper'); const fs = require('fs'); const mock = require('../../lib/index'); -const bufferFrom = require('../../lib/buffer').from; const assert = helper.assert; @@ -29,10 +28,10 @@ // if output._writev is available, buffered multiple writes will hit _writev. // otherwise, hit multiple _write. - output.write(bufferFrom('lots ')); - output.write(bufferFrom('of ')); - output.write(bufferFrom('source ')); - output.end(bufferFrom('content')); + output.write(Buffer.from('lots ')); + output.write(Buffer.from('of ')); + output.write(Buffer.from('source ')); + output.end(Buffer.from('content')); }); it('provides a write stream for a file', function(done) { @@ -48,13 +47,13 @@ }); output.on('error', done); - output.write(bufferFrom('lots ')); + output.write(Buffer.from('lots ')); setTimeout(function() { - output.write(bufferFrom('of ')); + output.write(Buffer.from('of ')); setTimeout(function() { - output.write(bufferFrom('source ')); + output.write(Buffer.from('source ')); setTimeout(function() { - output.end(bufferFrom('content')); + output.end(Buffer.from('content')); }, 50); }, 50); }, 50); @@ -75,10 +74,10 @@ output.on('error', done); output.cork(); - output.write(bufferFrom('lots ')); - output.write(bufferFrom('of ')); - output.write(bufferFrom('source ')); - output.end(bufferFrom('content')); + output.write(Buffer.from('lots ')); + output.write(Buffer.from('of ')); + output.write(Buffer.from('source ')); + output.end(Buffer.from('content')); output.uncork(); }); } diff -Nru node-mock-fs-4.13.0/test/lib/fs.exists.spec.js node-mock-fs-5.1.2/test/lib/fs.exists.spec.js --- node-mock-fs-4.13.0/test/lib/fs.exists.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.exists.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -4,14 +4,13 @@ const fs = require('fs'); const mock = require('../../lib/index'); const path = require('path'); -const bufferFrom = require('../../lib/buffer').from; const assert = helper.assert; describe('fs.exists(path, callback)', function() { beforeEach(function() { mock({ - 'path/to/a.bin': bufferFrom([1, 2, 3]), + 'path/to/a.bin': Buffer.from([1, 2, 3]), empty: {}, nested: { dir: { @@ -82,7 +81,7 @@ describe('fs.existsSync(path)', function() { beforeEach(function() { mock({ - 'path/to/a.bin': bufferFrom([1, 2, 3]), + 'path/to/a.bin': Buffer.from([1, 2, 3]), empty: {}, nested: { dir: { diff -Nru node-mock-fs-4.13.0/test/lib/fs.link-symlink.spec.js node-mock-fs-5.1.2/test/lib/fs.link-symlink.spec.js --- node-mock-fs-4.13.0/test/lib/fs.link-symlink.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.link-symlink.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,7 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; +const inVersion = helper.inVersion; describe('fs.link(srcpath, dstpath, callback)', function() { beforeEach(function() { @@ -46,7 +46,7 @@ }); }); - withPromise.it('promise creates a link to a file', function(done) { + it('promise creates a link to a file', function(done) { assert.equal(fs.statSync('file.txt').nlink, 1); fs.promises.link('file.txt', 'link.txt').then(function() { @@ -70,7 +70,7 @@ }); }); - withPromise.it('promise works if original is renamed', function(done) { + it('promise works if original is renamed', function(done) { fs.promises.link('file.txt', 'link.txt').then(function() { fs.renameSync('file.txt', 'renamed.txt'); assert.isTrue(fs.statSync('link.txt').isFile()); @@ -96,7 +96,7 @@ }); }); - withPromise.it('promise works if original is removed', function(done) { + it('promise works if original is removed', function(done) { assert.equal(fs.statSync('file.txt').nlink, 1); fs.promises.link('file.txt', 'link.txt').then(function() { @@ -118,11 +118,10 @@ }); }); - withPromise.it('promise fails if original is a directory', function(done) { + it('promise fails if original is a directory', function(done) { fs.promises.link('dir', 'link').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -188,22 +187,40 @@ }); }); - it('supports Buffer input', function(done) { - fs.symlink( - Buffer.from('../file.txt'), - Buffer.from('dir/link.txt'), - function(err) { - if (err) { - return done(err); + // https://github.com/nodejs/node/issues/34514 + if (process.platform === 'win32') { + inVersion('>=15.0.0').it('supports Buffer input', function(done) { + fs.symlink( + Buffer.from('../file.txt'), + Buffer.from('dir/link.txt'), + function(err) { + if (err) { + return done(err); + } + assert.isTrue(fs.statSync('dir/link.txt').isFile()); + assert.equal(String(fs.readFileSync('dir/link.txt')), 'content'); + done(); } - assert.isTrue(fs.statSync('dir/link.txt').isFile()); - assert.equal(String(fs.readFileSync('dir/link.txt')), 'content'); - done(); - } - ); - }); + ); + }); + } else { + it('supports Buffer input', function(done) { + fs.symlink( + Buffer.from('../file.txt'), + Buffer.from('dir/link.txt'), + function(err) { + if (err) { + return done(err); + } + assert.isTrue(fs.statSync('dir/link.txt').isFile()); + assert.equal(String(fs.readFileSync('dir/link.txt')), 'content'); + done(); + } + ); + }); + } - withPromise.it('promise creates a symbolic link to a file', function(done) { + it('promise creates a symbolic link to a file', function(done) { fs.promises.symlink('../file.txt', 'dir/link.txt').then(function() { assert.isTrue(fs.statSync('dir/link.txt').isFile()); assert.equal(String(fs.readFileSync('dir/link.txt')), 'content'); @@ -223,7 +240,7 @@ }); }); - withPromise.it('promise breaks if original is renamed', function(done) { + it('promise breaks if original is renamed', function(done) { fs.promises.symlink('file.txt', 'link.txt').then(function() { assert.isTrue(fs.existsSync('link.txt')); fs.renameSync('file.txt', 'renamed.txt'); @@ -242,7 +259,7 @@ }); }); - withPromise.it('promise works if original is a directory', function(done) { + it('promise works if original is a directory', function(done) { fs.promises.symlink('dir', 'link').then(function() { assert.isTrue(fs.statSync('link').isDirectory()); done(); diff -Nru node-mock-fs-4.13.0/test/lib/fs.lstat.spec.js node-mock-fs-5.1.2/test/lib/fs.lstat.spec.js --- node-mock-fs-4.13.0/test/lib/fs.lstat.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.lstat.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,9 +5,8 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; -describe('fs.lstat(path, callback)', function() { +describe('fs.lstat(path, options, callback)', function() { beforeEach(function() { mock({ 'file.txt': mock.file({ @@ -34,6 +33,18 @@ }); }); + it('stats a symbolic link with bigint', function(done) { + fs.lstat('link', {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.isTrue(stats.isSymbolicLink()); + assert.isFalse(stats.isFile()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + done(); + }); + }); + it('suports Buffer input', function(done) { fs.lstat(Buffer.from('link'), function(err, stats) { if (err) { @@ -46,7 +57,19 @@ }); }); - withPromise.it('promise stats a symbolic link', function(done) { + it('suports Buffer input with bigint', function(done) { + fs.lstat(Buffer.from('link'), {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.isTrue(stats.isSymbolicLink()); + assert.isFalse(stats.isFile()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + done(); + }); + }); + + it('promise stats a symbolic link', function(done) { fs.promises.lstat('link').then(function(stats) { assert.isTrue(stats.isSymbolicLink()); assert.isFalse(stats.isFile()); @@ -55,6 +78,15 @@ }, done); }); + it('promise stats a symbolic link with bigint', function(done) { + fs.promises.lstat('link', {bigint: true}).then(function(stats) { + assert.isTrue(stats.isSymbolicLink()); + assert.isFalse(stats.isFile()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + done(); + }, done); + }); + it('stats a regular file', function(done) { fs.lstat('file.txt', function(err, stats) { if (err) { @@ -67,7 +99,19 @@ }); }); - withPromise.it('promise stats a regular file', function(done) { + it('stats a regular file with bigint', function(done) { + fs.lstat('file.txt', {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.isTrue(stats.isFile()); + assert.isFalse(stats.isSymbolicLink()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + done(); + }); + }); + + it('promise stats a regular file', function(done) { fs.promises.lstat('file.txt').then(function(stats) { assert.isTrue(stats.isFile()); assert.isFalse(stats.isSymbolicLink()); @@ -76,6 +120,15 @@ }, done); }); + it('promise stats a regular file with bigint', function(done) { + fs.promises.lstat('file.txt', {bigint: true}).then(function(stats) { + assert.isTrue(stats.isFile()); + assert.isFalse(stats.isSymbolicLink()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + done(); + }, done); + }); + it('fails on file not exist', function(done) { fs.lstat('bogus', function(err, stats) { assert.instanceOf(err, Error); @@ -84,11 +137,10 @@ }); }); - withPromise.it('promise fails on file not exist', function(done) { + it('promise fails on file not exist', function(done) { fs.promises.lstat('bogus').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -99,7 +151,7 @@ }); }); -describe('fs.lstatSync(path)', function() { +describe('fs.lstatSync(path, options)', function() { beforeEach(function() { mock({ 'file.txt': mock.file({ @@ -121,6 +173,13 @@ assert.equal(stats.mtime.getTime(), 2); }); + it('stats a symbolic link with bigint', function() { + const stats = fs.lstatSync('link', {bigint: true}); + assert.isTrue(stats.isSymbolicLink()); + assert.isFalse(stats.isFile()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + }); + it('stats a regular file', function() { const stats = fs.lstatSync('file.txt'); assert.isTrue(stats.isFile()); @@ -128,6 +187,13 @@ assert.equal(stats.mtime.getTime(), 1); }); + it('stats a regular file with bigint', function() { + const stats = fs.lstatSync('file.txt', {bigint: true}); + assert.isTrue(stats.isFile()); + assert.isFalse(stats.isSymbolicLink()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + }); + it('fails on file not exist', function() { assert.throws(function() { fs.lstatSync('bogus'); diff -Nru node-mock-fs-4.13.0/test/lib/fs.mkdir.spec.js node-mock-fs-5.1.2/test/lib/fs.mkdir.spec.js --- node-mock-fs-4.13.0/test/lib/fs.mkdir.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.mkdir.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,11 +5,8 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const inVersion = helper.inVersion; -const withPromise = helper.withPromise; -const testParentPerms = - fs.access && fs.accessSync && process.getuid && process.getgid; +const testParentPerms = process.getuid && process.getgid; describe('fs.mkdir(path, [mode], callback)', function() { beforeEach(function() { @@ -46,7 +43,7 @@ }); }); - withPromise.it('promise creates a new directory', function(done) { + it('promise creates a new directory', function(done) { fs.promises.mkdir('parent/dir').then(function() { const stats = fs.statSync('parent/dir'); assert.isTrue(stats.isDirectory()); @@ -54,9 +51,7 @@ }, done); }); - inVersion('>=10.12').it('creates a new directory recursively', function( - done - ) { + it('creates a new directory recursively', function(done) { fs.mkdir('parent/foo/bar/dir', {recursive: true}, function(err) { if (err) { return done(err); @@ -71,7 +66,7 @@ }); }); - withPromise.it('promise creates a new directory recursively', function(done) { + it('promise creates a new directory recursively', function(done) { fs.promises.mkdir('parent/foo/bar/dir', {recursive: true}).then(function() { let stats = fs.statSync('parent/foo/bar/dir'); assert.isTrue(stats.isDirectory()); @@ -95,7 +90,7 @@ }); }); - withPromise.it('promise accepts dir mode', function(done) { + it('promise accepts dir mode', function(done) { fs.promises.mkdir('parent/dir', parseInt('0755', 8)).then(function() { const stats = fs.statSync('parent/dir'); assert.isTrue(stats.isDirectory()); @@ -104,7 +99,7 @@ }, done); }); - inVersion('>=10.12').it('accepts dir mode recursively', function(done) { + it('accepts dir mode recursively', function(done) { fs.mkdir( 'parent/foo/bar/dir', {recursive: true, mode: parseInt('0755', 8)}, @@ -128,7 +123,7 @@ ); }); - withPromise.it('promise accepts dir mode recursively', function(done) { + it('promise accepts dir mode recursively', function(done) { fs.promises .mkdir('parent/foo/bar/dir', {recursive: true, mode: parseInt('0755', 8)}) .then(function() { @@ -155,11 +150,10 @@ }); }); - withPromise.it('promise fails if parent does not exist', function(done) { + it('promise fails if parent does not exist', function(done) { fs.promises.mkdir('parent/bogus/dir').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -169,66 +163,52 @@ ); }); - inVersion('>=10.12').it( - 'fails if one parent is not a folder in recursive creation', - function(done) { - fs.mkdir('file.txt/bogus/dir', {recursive: true}, function(err) { + it('fails if one parent is not a folder in recursive creation', function(done) { + fs.mkdir('file.txt/bogus/dir', {recursive: true}, function(err) { + assert.instanceOf(err, Error); + done(); + }); + }); + + it('promise fails if one parent is not a folder in recursive creation', function(done) { + fs.promises.mkdir('file.txt/bogus/dir', {recursive: true}).then( + function() { + done(new Error('should not succeed.')); + }, + function(err) { assert.instanceOf(err, Error); done(); - }); - } - ); + } + ); + }); - withPromise.it( - 'promise fails if one parent is not a folder in recursive creation', - function(done) { - fs.promises.mkdir('file.txt/bogus/dir', {recursive: true}).then( + it('fails if permission does not allow recursive creation', function(done) { + fs.mkdir( + 'parent/foo/bar/dir', + {recursive: true, mode: parseInt('0400', 8)}, + function(err) { + assert.instanceOf(err, Error); + done(); + } + ); + }); + + it('promise fails if permission does not allow recursive creation', function(done) { + fs.promises + .mkdir('parent/foo/bar/dir', { + recursive: true, + mode: parseInt('0400', 8) + }) + .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); done(); } ); - } - ); - - inVersion('>=10.12').it( - 'fails if permission does not allow recursive creation', - function(done) { - fs.mkdir( - 'parent/foo/bar/dir', - {recursive: true, mode: parseInt('0400', 8)}, - function(err) { - assert.instanceOf(err, Error); - done(); - } - ); - } - ); - - withPromise.it( - 'promise fails if permission does not allow recursive creation', - function(done) { - fs.promises - .mkdir('parent/foo/bar/dir', { - recursive: true, - mode: parseInt('0400', 8) - }) - .then( - function() { - assert.fail('should not succeed.'); - done(); - }, - function(err) { - assert.instanceOf(err, Error); - done(); - } - ); - } - ); + }); it('fails if directory already exists', function(done) { fs.mkdir('parent', function(err) { @@ -238,11 +218,10 @@ }); }); - withPromise.it('promise fails if directory already exists', function(done) { + it('promise fails if directory already exists', function(done) { fs.promises.mkdir('parent').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -260,11 +239,10 @@ }); }); - withPromise.it('promise fails if file already exists', function(done) { + it('promise fails if file already exists', function(done) { fs.promises.mkdir('file.txt').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -274,50 +252,37 @@ ); }); - inVersion('>=10.12').it( - 'fails in recursive mode if file already exists', - function(done) { - fs.mkdir('parent/file.md', {recursive: true}, function(err) { + it('fails in recursive mode if file already exists', function(done) { + fs.mkdir('parent/file.md', {recursive: true}, function(err) { + assert.instanceOf(err, Error); + assert.equal(err.code, 'EEXIST'); + done(); + }); + }); + + it('promise fails in recursive mode if file already exists', function(done) { + fs.promises.mkdir('parent/file.md', {recursive: true}).then( + function() { + done(new Error('should not succeed.')); + }, + function(err) { assert.instanceOf(err, Error); assert.equal(err.code, 'EEXIST'); done(); - }); - } - ); - - withPromise.it( - 'promise fails in recursive mode if file already exists', - function(done) { - fs.promises.mkdir('parent/file.md', {recursive: true}).then( - function() { - assert.fail('should not succeed.'); - done(); - }, - function(err) { - assert.instanceOf(err, Error); - assert.equal(err.code, 'EEXIST'); - done(); - } - ); - } - ); + } + ); + }); - inVersion('>=10.12').it( - 'passes in recursive mode if directory already exists', - function(done) { - fs.mkdir('parent/child', {recursive: true}, function(err) { - assert.isNotOk(err, Error); - done(); - }); - } - ); + it('passes in recursive mode if directory already exists', function(done) { + fs.mkdir('parent/child', {recursive: true}, function(err) { + assert.isNotOk(err, Error); + done(); + }); + }); - withPromise.it( - 'promise passes in recursive mode if directory already exists', - function(done) { - fs.promises.mkdir('parent/child', {recursive: true}).then(done, done); - } - ); + it('promise passes in recursive mode if directory already exists', function(done) { + fs.promises.mkdir('parent/child', {recursive: true}).then(done, done); + }); if (testParentPerms) { it('fails if parent is not writeable', function(done) { @@ -328,11 +293,10 @@ }); }); - withPromise.it('promise fails if parent is not writeable', function(done) { + it('promise fails if parent is not writeable', function(done) { fs.promises.mkdir('unwriteable/child').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -377,7 +341,7 @@ assert.isTrue(stats.isDirectory()); }); - inVersion('>=10.12').it('creates a new directory recursively', function() { + it('creates a new directory recursively', function() { fs.mkdirSync('parent/foo/bar/dir', {recursive: true}); let stats = fs.statSync('parent/foo/bar/dir'); assert.isTrue(stats.isDirectory()); @@ -394,7 +358,7 @@ assert.equal(stats.mode & parseInt('0777', 8), parseInt('0755', 8)); }); - inVersion('>=10.12').it('accepts dir mode recursively', function() { + it('accepts dir mode recursively', function() { fs.mkdirSync('parent/foo/bar/dir', { recursive: true, mode: parseInt('0755', 8) @@ -418,26 +382,20 @@ }); }); - inVersion('>=10.12').it( - 'fails if one parent is not a folder in recursive creation', - function() { - assert.throws(function() { - fs.mkdirSync('file.txt/bogus/dir', {recursive: true}); - }); - } - ); + it('fails if one parent is not a folder in recursive creation', function() { + assert.throws(function() { + fs.mkdirSync('file.txt/bogus/dir', {recursive: true}); + }); + }); - inVersion('>=10.12').it( - 'fails if permission does not allow recursive creation', - function() { - assert.throws(function() { - fs.mkdirSync('parent/foo/bar/dir', { - recursive: true, - mode: parseInt('0400', 8) - }); + it('fails if permission does not allow recursive creation', function() { + assert.throws(function() { + fs.mkdirSync('parent/foo/bar/dir', { + recursive: true, + mode: parseInt('0400', 8) }); - } - ); + }); + }); it('fails if directory already exists', function() { assert.throws(function() { @@ -451,23 +409,17 @@ }); }); - inVersion('>=10.12').it( - 'fails in recursive mode if file already exists', - function() { - assert.throws(function() { - fs.mkdirSync('parent/file.md', {recursive: true}); - }); - } - ); + it('fails in recursive mode if file already exists', function() { + assert.throws(function() { + fs.mkdirSync('parent/file.md', {recursive: true}); + }); + }); - inVersion('>=10.12').it( - 'passes in recursive mode if directory already exists', - function() { - assert.doesNotThrow(function() { - fs.mkdirSync('parent/child', {recursive: true}); - }); - } - ); + it('passes in recursive mode if directory already exists', function() { + assert.doesNotThrow(function() { + fs.mkdirSync('parent/child', {recursive: true}); + }); + }); if (testParentPerms) { it('fails if parent is not writeable', function() { diff -Nru node-mock-fs-4.13.0/test/lib/fs.mkdtemp.spec.js node-mock-fs-5.1.2/test/lib/fs.mkdtemp.spec.js --- node-mock-fs-4.13.0/test/lib/fs.mkdtemp.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.mkdtemp.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -6,11 +6,8 @@ const path = require('path'); const assert = helper.assert; -const inVersion = helper.inVersion; -const withPromise = helper.withPromise; -const testParentPerms = - fs.access && fs.accessSync && process.getuid && process.getgid; +const testParentPerms = process.getuid && process.getgid; if (fs.mkdtemp) { describe('fs.mkdtemp(prefix[, options], callback)', function() { @@ -36,7 +33,7 @@ }); }); - withPromise.it('promise creates a new directory', function(done) { + it('promise creates a new directory', function(done) { fs.promises.mkdtemp('parent/dir').then(function(dirPath) { const parentPath = path.dirname(dirPath); assert.equal(parentPath, 'parent'); @@ -46,7 +43,7 @@ }, done); }); - inVersion('>=6').it('accepts a "utf8" encoding argument', function(done) { + it('accepts a "utf8" encoding argument', function(done) { fs.mkdtemp('parent/dir', 'utf8', function(err, dirPath) { if (err) { return done(err); @@ -60,9 +57,7 @@ }); }); - withPromise.it('promise accepts a "utf8" encoding argument', function( - done - ) { + it('promise accepts a "utf8" encoding argument', function(done) { fs.promises.mkdtemp('parent/dir', 'utf8').then(function(dirPath) { assert.isString(dirPath); const parentPath = path.dirname(dirPath); @@ -73,7 +68,7 @@ }, done); }); - inVersion('>=6').it('accepts a "buffer" encoding argument', function(done) { + it('accepts a "buffer" encoding argument', function(done) { fs.mkdtemp('parent/dir', 'buffer', function(err, buffer) { if (err) { return done(err); @@ -88,9 +83,7 @@ }); }); - withPromise.it('promise accepts a "buffer" encoding argument', function( - done - ) { + it('promise accepts a "buffer" encoding argument', function(done) { fs.promises.mkdtemp('parent/dir', 'buffer').then(function(buffer) { assert.instanceOf(buffer, Buffer); const dirPath = buffer.toString(); @@ -102,46 +95,52 @@ }, done); }); - inVersion('>=6').it( - 'accepts an options argument with "utf8" encoding', - function(done) { - fs.mkdtemp('parent/dir', {encoding: 'utf8'}, function(err, dirPath) { - if (err) { - return done(err); - } + it('accepts an options argument with "utf8" encoding', function(done) { + fs.mkdtemp('parent/dir', {encoding: 'utf8'}, function(err, dirPath) { + if (err) { + return done(err); + } + assert.isString(dirPath); + const parentPath = path.dirname(dirPath); + assert.equal(parentPath, 'parent'); + const stats = fs.statSync(dirPath); + assert.isTrue(stats.isDirectory()); + done(); + }); + }); + + it('promise accepts an options argument with "utf8" encoding', function(done) { + fs.promises + .mkdtemp('parent/dir', {encoding: 'utf8'}) + .then(function(dirPath) { assert.isString(dirPath); const parentPath = path.dirname(dirPath); assert.equal(parentPath, 'parent'); const stats = fs.statSync(dirPath); assert.isTrue(stats.isDirectory()); done(); - }); - } - ); + }, done); + }); - withPromise.it( - 'promise accepts an options argument with "utf8" encoding', - function(done) { - fs.promises - .mkdtemp('parent/dir', {encoding: 'utf8'}) - .then(function(dirPath) { - assert.isString(dirPath); - const parentPath = path.dirname(dirPath); - assert.equal(parentPath, 'parent'); - const stats = fs.statSync(dirPath); - assert.isTrue(stats.isDirectory()); - done(); - }, done); - } - ); - - inVersion('>=6').it( - 'accepts an options argument with "buffer" encoding', - function(done) { - fs.mkdtemp('parent/dir', {encoding: 'buffer'}, function(err, buffer) { - if (err) { - return done(err); - } + it('accepts an options argument with "buffer" encoding', function(done) { + fs.mkdtemp('parent/dir', {encoding: 'buffer'}, function(err, buffer) { + if (err) { + return done(err); + } + assert.instanceOf(buffer, Buffer); + const dirPath = buffer.toString(); + const parentPath = path.dirname(dirPath); + assert.equal(parentPath, 'parent'); + const stats = fs.statSync(dirPath); + assert.isTrue(stats.isDirectory()); + done(); + }); + }); + + it('promise accepts an options argument with "buffer" encoding', function(done) { + fs.promises + .mkdtemp('parent/dir', {encoding: 'buffer'}) + .then(function(buffer) { assert.instanceOf(buffer, Buffer); const dirPath = buffer.toString(); const parentPath = path.dirname(dirPath); @@ -149,26 +148,8 @@ const stats = fs.statSync(dirPath); assert.isTrue(stats.isDirectory()); done(); - }); - } - ); - - withPromise.it( - 'promise accepts an options argument with "buffer" encoding', - function(done) { - fs.promises - .mkdtemp('parent/dir', {encoding: 'buffer'}) - .then(function(buffer) { - assert.instanceOf(buffer, Buffer); - const dirPath = buffer.toString(); - const parentPath = path.dirname(dirPath); - assert.equal(parentPath, 'parent'); - const stats = fs.statSync(dirPath); - assert.isTrue(stats.isDirectory()); - done(); - }, done); - } - ); + }, done); + }); it('fails if parent does not exist', function(done) { fs.mkdtemp('unknown/child', function(err, dirPath) { @@ -183,11 +164,10 @@ }); }); - withPromise.it('promise fails if parent does not exist', function(done) { + it('promise fails if parent does not exist', function(done) { fs.promises.mkdtemp('unknown/child').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -210,11 +190,10 @@ }); }); - withPromise.it('promise fails if parent is a file', function(done) { + it('promise fails if parent is a file', function(done) { fs.promises.mkdtemp('file/child').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -238,13 +217,10 @@ }); }); - withPromise.it('promise fails if parent is not writeable', function( - done - ) { + it('promise fails if parent is not writeable', function(done) { fs.promises.mkdtemp('unwriteable/child').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -276,7 +252,7 @@ assert.isTrue(stats.isDirectory()); }); - inVersion('>=6').it('accepts a "utf8" encoding argument', function() { + it('accepts a "utf8" encoding argument', function() { const dirPath = fs.mkdtempSync('parent/dir', 'utf8'); assert.isString(dirPath); const parentPath = path.dirname(dirPath); @@ -285,7 +261,7 @@ assert.isTrue(stats.isDirectory()); }); - inVersion('>=6').it('accepts a "buffer" encoding argument', function() { + it('accepts a "buffer" encoding argument', function() { const buffer = fs.mkdtempSync('parent/dir', 'buffer'); assert.instanceOf(buffer, Buffer); const dirPath = buffer.toString(); @@ -295,30 +271,24 @@ assert.isTrue(stats.isDirectory()); }); - inVersion('>=6').it( - 'accepts an options argument with "utf8" encoding', - function() { - const dirPath = fs.mkdtempSync('parent/dir', {encoding: 'utf8'}); - assert.isString(dirPath); - const parentPath = path.dirname(dirPath); - assert.equal(parentPath, 'parent'); - const stats = fs.statSync(dirPath); - assert.isTrue(stats.isDirectory()); - } - ); + it('accepts an options argument with "utf8" encoding', function() { + const dirPath = fs.mkdtempSync('parent/dir', {encoding: 'utf8'}); + assert.isString(dirPath); + const parentPath = path.dirname(dirPath); + assert.equal(parentPath, 'parent'); + const stats = fs.statSync(dirPath); + assert.isTrue(stats.isDirectory()); + }); - inVersion('>=6').it( - 'accepts an options argument with "buffer" encoding', - function() { - const buffer = fs.mkdtempSync('parent/dir', {encoding: 'buffer'}); - assert.instanceOf(buffer, Buffer); - const dirPath = buffer.toString(); - const parentPath = path.dirname(dirPath); - assert.equal(parentPath, 'parent'); - const stats = fs.statSync(dirPath); - assert.isTrue(stats.isDirectory()); - } - ); + it('accepts an options argument with "buffer" encoding', function() { + const buffer = fs.mkdtempSync('parent/dir', {encoding: 'buffer'}); + assert.instanceOf(buffer, Buffer); + const dirPath = buffer.toString(); + const parentPath = path.dirname(dirPath); + assert.equal(parentPath, 'parent'); + const stats = fs.statSync(dirPath); + assert.isTrue(stats.isDirectory()); + }); it('fails if parent does not exist', function() { assert.throws(function() { diff -Nru node-mock-fs-4.13.0/test/lib/fs.open-close.spec.js node-mock-fs-5.1.2/test/lib/fs.open-close.spec.js --- node-mock-fs-4.13.0/test/lib/fs.open-close.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.open-close.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,7 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; +const inVersion = helper.inVersion; describe('fs.open(path, flags, [mode], callback)', function() { beforeEach(function() { @@ -44,9 +44,7 @@ }); }); - withPromise.it('promise opens an existing file for reading (r)', function( - done - ) { + it('promise opens an existing file for reading (r)', function(done) { fs.promises.open('nested/sub/dir/one.txt', 'r').then(function(fd) { assert.isNumber(fd.fd); done(); @@ -61,11 +59,10 @@ }); }); - withPromise.it('promise fails if file does not exist (r)', function(done) { + it('promise fails if file does not exist (r)', function(done) { fs.promises.open('bogus.txt', 'r').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -86,7 +83,7 @@ }); }); - withPromise.it('promise creates a new file for writing (w)', function(done) { + it('promise creates a new file for writing (w)', function(done) { fs.promises .open('path/to/new.txt', 'w', parseInt('0666', 8)) .then(function(fd) { @@ -106,9 +103,7 @@ }); }); - withPromise.it('promise opens an existing file for writing (w)', function( - done - ) { + it('promise opens an existing file for writing (w)', function(done) { fs.promises .open('path/to/file.txt', 'w', parseInt('0666', 8)) .then(function(fd) { @@ -125,11 +120,10 @@ }); }); - withPromise.it('promise fails if file exists (wx)', function(done) { + it('promise fails if file exists (wx)', function(done) { fs.promises.open('path/to/file.txt', 'wx', parseInt('0666', 8)).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -199,7 +193,7 @@ }); }); - withPromise.it('promise closes a file descriptor', function(done) { + it('promise closes a file descriptor', function(done) { fs.promises .open('dir/file.txt', 'w') .then(function(fd) { @@ -222,18 +216,20 @@ }); }); - withPromise.it('promise fails for closed file descriptors', function(done) { + inVersion('<14.0.0').it('promise fails for closed file descriptors', function( + done + ) { fs.promises .open('dir/file.txt', 'w') .then(function(fd) { return fd.close().then(function() { + // in Nodejs v14+, closing on closed file descriptor is silently ignored. return fd.close(); }); }) .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/fs.readdir.spec.js node-mock-fs-5.1.2/test/lib/fs.readdir.spec.js --- node-mock-fs-4.13.0/test/lib/fs.readdir.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.readdir.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -6,8 +6,6 @@ const path = require('path'); const assert = helper.assert; -const withPromise = helper.withPromise; -const inVersion = helper.inVersion; describe('fs.readdir(path, callback)', function() { beforeEach(function() { @@ -52,7 +50,7 @@ }); }); - withPromise.it('promise lists directory contents', function(done) { + it('promise lists directory contents', function(done) { fs.promises.readdir(path.join('path', 'to')).then(function(items) { assert.isArray(items); assert.deepEqual(items, ['file.txt']); @@ -69,7 +67,7 @@ }); }); - withPromise.it('promise lists nested directory contents', function(done) { + it('promise lists nested directory contents', function(done) { fs.promises .readdir(path.join('nested', 'sub', 'dir')) .then(function(items) { @@ -87,11 +85,10 @@ }); }); - withPromise.it('promise calls with an error for bogus path', function(done) { + it('promise calls with an error for bogus path', function(done) { fs.promises.readdir('bogus').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -109,13 +106,10 @@ }); }); - withPromise.it('promise calls with an error for restricted path', function( - done - ) { + it('promise calls with an error for restricted path', function(done) { fs.promises.readdir('denied').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -125,20 +119,17 @@ ); }); - inVersion('>=10.10').it('should support "withFileTypes" option', function( - done - ) { + it('should support "withFileTypes" option', function(done) { fs.readdir( path.join('nested', 'sub', 'dir'), {withFileTypes: true}, function(err, items) { assert.isNull(err); assert.isArray(items); - assert.deepEqual(items, [ - {name: 'empty'}, - {name: 'one.txt'}, - {name: 'two.txt'} - ]); + assert.deepEqual( + items.map(i => i.name), + ['empty', 'one.txt', 'two.txt'] + ); assert.ok(items[0].isDirectory()); assert.ok(items[1].isFile()); assert.ok(items[2].isFile()); @@ -147,16 +138,15 @@ ); }); - withPromise.it('should support "withFileTypes" option', function(done) { + it('should support "withFileTypes" option', function(done) { fs.promises .readdir(path.join('nested', 'sub', 'dir'), {withFileTypes: true}) .then(function(items) { assert.isArray(items); - assert.deepEqual(items, [ - {name: 'empty'}, - {name: 'one.txt'}, - {name: 'two.txt'} - ]); + assert.deepEqual( + items.map(i => i.name), + ['empty', 'one.txt', 'two.txt'] + ); assert.ok(items[0].isDirectory()); assert.ok(items[1].isFile()); assert.ok(items[2].isFile()); @@ -164,55 +154,49 @@ }, done); }); - inVersion('>=10.10').it( - 'should support "withFileTypes" option with "encoding" option', - function(done) { - fs.readdir( - path.join('nested', 'sub', 'dir'), - {withFileTypes: true, encoding: 'buffer'}, - function(err, items) { - assert.isNull(err); - assert.isArray(items); - items.forEach(function(item) { - assert.equal(Buffer.isBuffer(item.name), true); - }); - const names = items.map(function(item) { - return item.name.toString(); - }); - assert.deepEqual(names, ['empty', 'one.txt', 'two.txt']); - assert.ok(items[0].isDirectory()); - assert.ok(items[1].isFile()); - assert.ok(items[2].isFile()); - done(); - } - ); - } - ); - - withPromise.it( - 'should support "withFileTypes" option with "encoding" option', - function(done) { - fs.promises - .readdir(path.join('nested', 'sub', 'dir'), { - withFileTypes: true, - encoding: 'buffer' - }) - .then(function(items) { - assert.isArray(items); - items.forEach(function(item) { - assert.equal(Buffer.isBuffer(item.name), true); - }); - const names = items.map(function(item) { - return item.name.toString(); - }); - assert.deepEqual(names, ['empty', 'one.txt', 'two.txt']); - assert.ok(items[0].isDirectory()); - assert.ok(items[1].isFile()); - assert.ok(items[2].isFile()); - done(); + it('should support "withFileTypes" option with "encoding" option', function(done) { + fs.readdir( + path.join('nested', 'sub', 'dir'), + {withFileTypes: true, encoding: 'buffer'}, + function(err, items) { + assert.isNull(err); + assert.isArray(items); + items.forEach(function(item) { + assert.equal(Buffer.isBuffer(item.name), true); + }); + const names = items.map(function(item) { + return item.name.toString(); + }); + assert.deepEqual(names, ['empty', 'one.txt', 'two.txt']); + assert.ok(items[0].isDirectory()); + assert.ok(items[1].isFile()); + assert.ok(items[2].isFile()); + done(); + } + ); + }); + + it('should support "withFileTypes" option with "encoding" option', function(done) { + fs.promises + .readdir(path.join('nested', 'sub', 'dir'), { + withFileTypes: true, + encoding: 'buffer' + }) + .then(function(items) { + assert.isArray(items); + items.forEach(function(item) { + assert.equal(Buffer.isBuffer(item.name), true); + }); + const names = items.map(function(item) { + return item.name.toString(); }); - } - ); + assert.deepEqual(names, ['empty', 'one.txt', 'two.txt']); + assert.ok(items[0].isDirectory()); + assert.ok(items[1].isFile()); + assert.ok(items[2].isFile()); + done(); + }); + }); }); describe('fs.readdirSync(path)', function() { diff -Nru node-mock-fs-4.13.0/test/lib/fs.readFile.spec.js node-mock-fs-5.1.2/test/lib/fs.readFile.spec.js --- node-mock-fs-4.13.0/test/lib/fs.readFile.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.readFile.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,6 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.readFile(filename, [options], callback)', function() { // this is provided by fs.open, fs.fstat, and fs.read @@ -29,9 +28,7 @@ }); }); - withPromise.it('promise allows a file to be read asynchronously', function( - done - ) { + it('promise allows a file to be read asynchronously', function(done) { fs.promises.readFile('path/to/file.txt').then(function(data) { assert.isTrue(Buffer.isBuffer(data)); assert.equal(String(data), 'file content'); @@ -47,11 +44,10 @@ }); }); - withPromise.it('promise fails for directory', function(done) { + it('promise fails for directory', function(done) { fs.promises.readFile('path/to').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -70,11 +66,10 @@ }); }); - withPromise.it('promise fails for bad path', function(done) { + it('promise fails for bad path', function(done) { fs.promises.readFile('path/to/bogus').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/fs.readlink.spec.js node-mock-fs-5.1.2/test/lib/fs.readlink.spec.js --- node-mock-fs-4.13.0/test/lib/fs.readlink.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.readlink.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,6 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.readlink(path, callback)', function() { beforeEach(function() { @@ -36,7 +35,7 @@ }); }); - withPromise.it('promise reads a symbolic link', function(done) { + it('promise reads a symbolic link', function(done) { fs.promises.readlink('link').then(function(srcPath) { assert.equal(srcPath, './file.txt'); done(); @@ -50,11 +49,10 @@ }); }); - withPromise.it('promise fails for regular files', function(done) { + it('promise fails for regular files', function(done) { fs.promises.readlink('file.txt').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/fs.read.spec.js node-mock-fs-5.1.2/test/lib/fs.read.spec.js --- node-mock-fs-4.13.0/test/lib/fs.read.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.read.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,10 +3,8 @@ const helper = require('../helper'); const fs = require('fs'); const mock = require('../../lib/index'); -const bufferAlloc = require('../../lib/buffer').alloc; const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.read(fd, buffer, offset, length, position, callback)', function() { beforeEach(function() { @@ -21,7 +19,7 @@ if (err) { return done(err); } - const buffer = bufferAlloc(12); + const buffer = Buffer.alloc(12); fs.read(fd, buffer, 0, 12, 0, function(err2, bytesRead, buf) { if (err2) { return done(err2); @@ -34,8 +32,8 @@ }); }); - withPromise.it('promise allows file contents to be read', function(done) { - const buffer = bufferAlloc(12); + it('promise allows file contents to be read', function(done) { + const buffer = Buffer.alloc(12); fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { @@ -54,7 +52,7 @@ if (err) { return done(err); } - const buffer = bufferAlloc(12); + const buffer = Buffer.alloc(12); fs.read(fd, buffer, 5, 7, 0, function(err2, bytesRead, buf) { if (err2) { return done(err2); @@ -67,10 +65,8 @@ }); }); - withPromise.it('promise allows file contents to be read w/ offset', function( - done - ) { - const buffer = bufferAlloc(12); + it('promise allows file contents to be read w/ offset', function(done) { + const buffer = Buffer.alloc(12); fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { @@ -89,7 +85,7 @@ if (err) { return done(err); } - const buffer = bufferAlloc(12); + const buffer = Buffer.alloc(12); fs.read(fd, buffer, 0, 4, 0, function(err2, bytesRead, buf) { if (err2) { return done(err2); @@ -102,10 +98,8 @@ }); }); - withPromise.it('promise allows file contents to be read w/ length', function( - done - ) { - const buffer = bufferAlloc(12); + it('promise allows file contents to be read w/ length', function(done) { + const buffer = Buffer.alloc(12); fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { @@ -124,7 +118,7 @@ if (err) { return done(err); } - const buffer = bufferAlloc(12); + const buffer = Buffer.alloc(12); fs.read(fd, buffer, 2, 4, 0, function(err2, bytesRead, buf) { if (err2) { return done(err2); @@ -137,30 +131,27 @@ }); }); - withPromise.it( - 'promise allows file contents to be read w/ offset & length', - function(done) { - const buffer = bufferAlloc(12); - fs.promises - .open('path/to/file.txt', 'r') - .then(function(fd) { - return fd.read(buffer, 2, 4, 0); - }) - .then(function(result) { - assert.equal(result.bytesRead, 4); - assert.equal(result.buffer, buffer); - assert.equal(String(buffer.slice(2, 6)), 'file'); - done(); - }, done); - } - ); + it('promise allows file contents to be read w/ offset & length', function(done) { + const buffer = Buffer.alloc(12); + fs.promises + .open('path/to/file.txt', 'r') + .then(function(fd) { + return fd.read(buffer, 2, 4, 0); + }) + .then(function(result) { + assert.equal(result.bytesRead, 4); + assert.equal(result.buffer, buffer); + assert.equal(String(buffer.slice(2, 6)), 'file'); + done(); + }, done); + }); it('allows file contents to be read w/ position', function(done) { fs.open('path/to/file.txt', 'r', function(err, fd) { if (err) { return done(err); } - const buffer = bufferAlloc(7); + const buffer = Buffer.alloc(7); fs.read(fd, buffer, 0, 7, 5, function(err2, bytesRead, buf) { if (err2) { return done(err2); @@ -173,30 +164,27 @@ }); }); - withPromise.it( - 'promise allows file contents to be read w/ position', - function(done) { - const buffer = bufferAlloc(7); - fs.promises - .open('path/to/file.txt', 'r') - .then(function(fd) { - return fd.read(buffer, 0, 7, 5); - }) - .then(function(result) { - assert.equal(result.bytesRead, 7); - assert.equal(result.buffer, buffer); - assert.equal(String(buffer), 'content'); - done(); - }, done); - } - ); + it('promise allows file contents to be read w/ position', function(done) { + const buffer = Buffer.alloc(7); + fs.promises + .open('path/to/file.txt', 'r') + .then(function(fd) { + return fd.read(buffer, 0, 7, 5); + }) + .then(function(result) { + assert.equal(result.bytesRead, 7); + assert.equal(result.buffer, buffer); + assert.equal(String(buffer), 'content'); + done(); + }, done); + }); it('allows read w/ offset, length, & position', function(done) { fs.open('path/to/file.txt', 'r', function(err, fd) { if (err) { return done(err); } - const buffer = bufferAlloc(12); + const buffer = Buffer.alloc(12); fs.read(fd, buffer, 2, 7, 5, function(err2, bytesRead, buf) { if (err2) { return done(err2); @@ -209,10 +197,8 @@ }); }); - withPromise.it('promise allows read w/ offset, length, & position', function( - done - ) { - const buffer = bufferAlloc(12); + it('promise allows read w/ offset, length, & position', function(done) { + const buffer = Buffer.alloc(12); fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { @@ -229,7 +215,7 @@ it('fails for closed file descriptor', function(done) { const fd = fs.openSync('path/to/file.txt', 'r'); fs.closeSync(fd); - fs.read(fd, bufferAlloc(12), 0, 12, 0, function(err, bytesRead, buf) { + fs.read(fd, Buffer.alloc(12), 0, 12, 0, function(err, bytesRead, buf) { assert.instanceOf(err, Error); assert.equal(err.code, 'EBADF'); assert.equal(0, bytesRead); @@ -237,18 +223,17 @@ }); }); - withPromise.it('promise fails for closed file descriptor', function(done) { + it('promise fails for closed file descriptor', function(done) { fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { return fd.close().then(function() { - return fd.read(bufferAlloc(12), 0, 12, 0); + return fd.read(Buffer.alloc(12), 0, 12, 0); }); }) .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -260,23 +245,22 @@ it('fails if not open for reading', function(done) { const fd = fs.openSync('path/to/file.txt', 'w'); - fs.read(fd, bufferAlloc(12), 0, 12, 0, function(err, bytesRead, buf) { + fs.read(fd, Buffer.alloc(12), 0, 12, 0, function(err, bytesRead, buf) { assert.instanceOf(err, Error); assert.equal(0, bytesRead); done(); }); }); - withPromise.it('promise fails if not open for reading', function(done) { + it('promise fails if not open for reading', function(done) { fs.promises .open('path/to/file.txt', 'w') .then(function(fd) { - return fd.read(bufferAlloc(12), 0, 12, 0); + return fd.read(Buffer.alloc(12), 0, 12, 0); }) .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -297,7 +281,7 @@ it('allows a file to be read synchronously', function() { const fd = fs.openSync('path/to/file.txt', 'r'); - const buffer = bufferAlloc(12); + const buffer = Buffer.alloc(12); const read = fs.readSync(fd, buffer, 0, 12, 0); assert.equal(read, 12); assert.equal(String(buffer), 'file content'); @@ -305,25 +289,25 @@ it('allows a file to be read in two parts', function() { const fd = fs.openSync('path/to/file.txt', 'r'); - const first = bufferAlloc(4); + const first = Buffer.alloc(4); fs.readSync(fd, first, 0, 4, 0); assert.equal(String(first), 'file'); - const second = bufferAlloc(7); + const second = Buffer.alloc(7); fs.readSync(fd, second, 0, 7, 5); assert.equal(String(second), 'content'); }); it('treats null position as current position', function() { const fd = fs.openSync('path/to/file.txt', 'r'); - const first = bufferAlloc(4); + const first = Buffer.alloc(4); fs.readSync(fd, first, 0, 4, null); assert.equal(String(first), 'file'); // consume the space - assert.equal(fs.readSync(fd, bufferAlloc(1), 0, 1, null), 1); + assert.equal(fs.readSync(fd, Buffer.alloc(1), 0, 1, null), 1); - const second = bufferAlloc(7); + const second = Buffer.alloc(7); fs.readSync(fd, second, 0, 7, null); assert.equal(String(second), 'content'); }); diff -Nru node-mock-fs-4.13.0/test/lib/fs.realpath.spec.js node-mock-fs-5.1.2/test/lib/fs.realpath.spec.js --- node-mock-fs-4.13.0/test/lib/fs.realpath.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.realpath.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -7,7 +7,6 @@ const assert = helper.assert; const assertEqualPaths = helper.assertEqualPaths; -const withPromise = helper.withPromise; describe('fs.realpath(path, [cache], callback)', function() { beforeEach(function() { @@ -28,9 +27,7 @@ }); }); - withPromise.it('promise resolves the real path for a symbolic link', function( - done - ) { + it('promise resolves the real path for a symbolic link', function(done) { fs.promises.realpath('link').then(function(resolved) { assertEqualPaths(resolved, path.resolve('dir/file.txt')); done(); @@ -47,7 +44,7 @@ }); }); - withPromise.it('promise resolves the real path regular file', function(done) { + it('promise resolves the real path regular file', function(done) { fs.promises.realpath('dir/file.txt').then(function(resolved) { assertEqualPaths(resolved, path.resolve('dir/file.txt')); done(); @@ -62,11 +59,10 @@ }); }); - withPromise.it('promise fails on file not exist', function(done) { + it('promise fails on file not exist', function(done) { fs.promises.realpath('bogus').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/fs.rename.spec.js node-mock-fs-5.1.2/test/lib/fs.rename.spec.js --- node-mock-fs-4.13.0/test/lib/fs.rename.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.rename.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,15 +3,13 @@ const helper = require('../helper'); const fs = require('fs'); const mock = require('../../lib/index'); -const bufferFrom = require('../../lib/buffer').from; const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.rename(oldPath, newPath, callback)', function() { beforeEach(function() { mock({ - 'path/to/a.bin': bufferFrom([1, 2, 3]), + 'path/to/a.bin': Buffer.from([1, 2, 3]), empty: {}, nested: { dir: mock.directory({ @@ -45,7 +43,7 @@ ); }); - withPromise.it('promise allows files to be renamed', function(done) { + it('promise allows files to be renamed', function(done) { fs.promises.rename('path/to/a.bin', 'path/to/b.bin').then(function() { assert.isFalse(fs.existsSync('path/to/a.bin')); assert.isTrue(fs.existsSync('path/to/b.bin')); @@ -65,7 +63,7 @@ }); }); - withPromise.it('promise updates mtime of parent directory', function(done) { + it('promise updates mtime of parent directory', function(done) { const oldTime = fs.statSync('nested/dir').mtime; fs.promises .rename('nested/dir/file.txt', 'nested/dir/renamed.txt') @@ -85,21 +83,17 @@ }); }); - withPromise.it( - 'promise calls callback with error if old path does not exist', - function(done) { - fs.promises.rename('bogus', 'empty').then( - function() { - assert.fail('Should not succeed.'); - done(); - }, - function(err) { - assert.instanceOf(err, Error); - done(); - } - ); - } - ); + it('promise calls callback with error if old path does not exist', function(done) { + fs.promises.rename('bogus', 'empty').then( + function() { + done(new Error('Should not succeed.')); + }, + function(err) { + assert.instanceOf(err, Error); + done(); + } + ); + }); it('overwrites existing files', function(done) { fs.rename('path/to/a.bin', 'nested/dir/file.txt', function(err) { @@ -110,7 +104,7 @@ }); }); - withPromise.it('promise overwrites existing files', function(done) { + it('promise overwrites existing files', function(done) { fs.promises.rename('path/to/a.bin', 'nested/dir/file.txt').then(function() { assert.isFalse(fs.existsSync('path/to/a.bin')); assert.isTrue(fs.existsSync('nested/dir/file.txt')); @@ -128,7 +122,7 @@ }); }); - withPromise.it('promise allows directories to be renamed', function(done) { + it('promise allows directories to be renamed', function(done) { fs.promises.rename('path/to', 'path/foo').then(function() { assert.isFalse(fs.existsSync('path/to')); assert.isTrue(fs.existsSync('path/foo')); @@ -144,27 +138,23 @@ }); }); - withPromise.it( - 'promise calls callback with error if new directory not empty', - function(done) { - fs.promises.rename('path', 'nested').then( - function() { - assert.fail('Should not succeed.'); - done(); - }, - function(err) { - assert.instanceOf(err, Error); - done(); - } - ); - } - ); + it('promise calls callback with error if new directory not empty', function(done) { + fs.promises.rename('path', 'nested').then( + function() { + done(new Error('Should not succeed.')); + }, + function(err) { + assert.instanceOf(err, Error); + done(); + } + ); + }); }); describe('fs.renameSync(oldPath, newPath)', function() { beforeEach(function() { mock({ - 'path/to/a.bin': bufferFrom([1, 2, 3]), + 'path/to/a.bin': Buffer.from([1, 2, 3]), empty: {}, nested: { dir: { diff -Nru node-mock-fs-4.13.0/test/lib/fs.rmdir.spec.js node-mock-fs-5.1.2/test/lib/fs.rmdir.spec.js --- node-mock-fs-4.13.0/test/lib/fs.rmdir.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.rmdir.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -6,10 +6,8 @@ const assert = helper.assert; const inVersion = helper.inVersion; -const withPromise = helper.withPromise; -const testParentPerms = - fs.access && fs.accessSync && process.getuid && process.getgid; +const testParentPerms = process.getuid && process.getgid; function setup() { mock({ @@ -63,7 +61,7 @@ }); }); - withPromise.it('promise removes an empty directory', function(done) { + it('promise removes an empty directory', function(done) { assert.equal(fs.statSync('path/to').nlink, 3); fs.promises.rmdir('path/to/empty').then(function() { @@ -81,11 +79,10 @@ }); }); - withPromise.it('promise fails if not empty', function(done) { + it('promise fails if not empty', function(done) { fs.promises.rmdir('path/to').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -103,11 +100,10 @@ }); }); - withPromise.it('promise fails if file', function(done) { + it('promise fails if file', function(done) { fs.promises.rmdir('file.txt').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -176,11 +172,10 @@ }); }); - withPromise.it('promise fails if parent is not writeable', function(done) { + it('promise fails if parent is not writeable', function(done) { fs.promises.rmdir('unwriteable/child').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/fs.stat-fstat.spec.js node-mock-fs-5.1.2/test/lib/fs.stat-fstat.spec.js --- node-mock-fs-4.13.0/test/lib/fs.stat-fstat.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.stat-fstat.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -6,9 +6,8 @@ const semver = require('semver'); const assert = helper.assert; -const withPromise = helper.withPromise; -describe('fs.stat(path, callback)', function() { +describe('fs.stat(path, options, callback)', function() { beforeEach(function() { mock({ '/path/to/file.txt': mock.file({ @@ -18,7 +17,10 @@ uid: 42, gid: 43 }), - '/dir/symlink': mock.symlink({path: '/path/to/file.txt'}), + '/dir/symlink': mock.symlink({ + path: '/path/to/file.txt', + mtime: new Date(2) + }), '/empty': {} }); }); @@ -34,7 +36,7 @@ }); }); - withPromise.xit('promise creates an instance of fs.Stats', function(done) { + xit('promise creates an instance of fs.Stats', function(done) { fs.promises.stat('/path/to/file.txt').then(function(stats) { assert.instanceOf(stats, fs.Stats); done(); @@ -48,6 +50,19 @@ } assert.isTrue(stats.isFile()); assert.isFalse(stats.isDirectory()); + assert.equal(stats.mtime.getTime(), 2); + done(); + }); + }); + + it('identifies files with bigint', function(done) { + fs.stat('/path/to/file.txt', {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.isTrue(stats.isFile()); + assert.isFalse(stats.isDirectory()); + assert.equal(typeof stats.mtimeMs, 'bigint'); done(); }); }); @@ -59,15 +74,41 @@ } assert.isTrue(stats.isFile()); assert.isFalse(stats.isDirectory()); + assert.equal(stats.mtime.getTime(), 2); done(); }); }); - withPromise.it('promise identifies files', function(done) { + it('supports Buffer input with bigint', function(done) { + fs.stat(Buffer.from('/path/to/file.txt'), {bigint: true}, function( + err, + stats + ) { + if (err) { + return done(err); + } + assert.isTrue(stats.isFile()); + assert.isFalse(stats.isDirectory()); + assert.equal(typeof stats.mtimeMs, 'bigint'); + done(); + }); + }); + + it('promise identifies files', function(done) { fs.promises.stat('/path/to/file.txt').then(function(stats) { assert.isTrue(stats.isFile()); assert.isFalse(stats.isDirectory()); done(); + assert.equal(stats.mtime.getTime(), 2); + }, done); + }); + + it('promise identifies files', function(done) { + fs.promises.stat('/path/to/file.txt', {bigint: true}).then(function(stats) { + assert.isTrue(stats.isFile()); + assert.isFalse(stats.isDirectory()); + done(); + assert.equal(typeof stats.mtimeMs, 'bigint'); }, done); }); @@ -78,14 +119,37 @@ } assert.isTrue(stats.isDirectory()); assert.isFalse(stats.isFile()); + assert.equal(stats.size, 1); + done(); + }); + }); + + it('identifies directories with bigint', function(done) { + fs.stat('/empty', {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.isTrue(stats.isDirectory()); + assert.isFalse(stats.isFile()); + assert.equal(typeof stats.size, 'bigint'); done(); }); }); - withPromise.it('promise identifies directories', function(done) { + it('promise identifies directories', function(done) { fs.promises.stat('/empty').then(function(stats) { assert.isTrue(stats.isDirectory()); assert.isFalse(stats.isFile()); + assert.equal(stats.size, 1); + done(); + }, done); + }); + + it('promise identifies directories with bigint', function(done) { + fs.promises.stat('/empty', {bigint: true}).then(function(stats) { + assert.isTrue(stats.isDirectory()); + assert.isFalse(stats.isFile()); + assert.equal(typeof stats.size, 'bigint'); done(); }, done); }); @@ -106,7 +170,23 @@ }); }); - withPromise.it('promise provides file stats', function(done) { + it('provides file stats with bigint', function(done) { + fs.stat('/path/to/file.txt', {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.equal(typeof stats.ctimeMs, 'bigint'); + assert.equal(typeof stats.mtimeMs, 'bigint'); + assert.equal(typeof stats.atimeMs, 'bigint'); + assert.equal(typeof stats.uid, 'bigint'); + assert.equal(typeof stats.gid, 'bigint'); + assert.equal(typeof stats.nlink, 'bigint'); + assert.equal(typeof stats.rdev, 'bigint'); + done(); + }); + }); + + it('promise provides file stats', function(done) { fs.promises.stat('/path/to/file.txt').then(function(stats) { assert.equal(stats.ctime.getTime(), 1); assert.equal(stats.mtime.getTime(), 2); @@ -119,6 +199,19 @@ }, done); }); + it('promise provides file stats with bigint', function(done) { + fs.promises.stat('/path/to/file.txt', {bigint: true}).then(function(stats) { + assert.equal(typeof stats.ctimeMs, 'bigint'); + assert.equal(typeof stats.mtimeMs, 'bigint'); + assert.equal(typeof stats.atimeMs, 'bigint'); + assert.equal(typeof stats.uid, 'bigint'); + assert.equal(typeof stats.gid, 'bigint'); + assert.equal(typeof stats.nlink, 'bigint'); + assert.equal(typeof stats.rdev, 'bigint'); + done(); + }, done); + }); + if ( process.platform !== 'win32' || semver.coerce(process.version).major !== 10 @@ -136,9 +229,7 @@ }); }); - withPromise.it('promise includes blocks and blksize in stats', function( - done - ) { + it('promise includes blocks and blksize in stats', function(done) { fs.promises.stat('/path/to/file.txt').then(function(stats) { assert.isNumber(stats.blocks); assert.isNumber(stats.blksize); @@ -158,12 +249,12 @@ if (process.getuid) { assert.isNumber(stats.uid); } else { - assert.isNaN(stats.uid); + assert.strictEqual(stats.uid, 0); } if (process.getgid) { assert.isNumber(stats.gid); } else { - assert.isNaN(stats.gid); + assert.strictEqual(stats.gid, 0); } assert.equal(stats.nlink, 3); assert.isNumber(stats.rdev); @@ -171,7 +262,31 @@ }); }); - withPromise.it('promise provides directory stats', function(done) { + it('provides directory stats with bigint', function(done) { + fs.stat('/path', {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.instanceOf(stats.ctime, Date); + assert.instanceOf(stats.mtime, Date); + assert.instanceOf(stats.atime, Date); + if (process.getuid) { + assert.equal(typeof stats.uid, 'bigint'); + } else { + assert.strictEqual(stats.uid, 0n); + } + if (process.getgid) { + assert.equal(typeof stats.gid, 'bigint'); + } else { + assert.strictEqual(stats.gid, 0n); + } + assert.equal(typeof stats.nlink, 'bigint'); + assert.equal(typeof stats.rdev, 'bigint'); + done(); + }); + }); + + it('promise provides directory stats', function(done) { fs.promises.stat('/path').then(function(stats) { assert.instanceOf(stats.ctime, Date); assert.instanceOf(stats.mtime, Date); @@ -179,12 +294,12 @@ if (process.getuid) { assert.isNumber(stats.uid); } else { - assert.isNaN(stats.uid); + assert.strictEqual(stats.uid, 0); } if (process.getgid) { assert.isNumber(stats.gid); } else { - assert.isNaN(stats.gid); + assert.strictEqual(stats.gid, 0); } assert.equal(stats.nlink, 3); assert.isNumber(stats.rdev); @@ -192,6 +307,27 @@ }, done); }); + it('promise provides directory stats with bigint', function(done) { + fs.promises.stat('/path', {bigint: true}).then(function(stats) { + assert.instanceOf(stats.ctime, Date); + assert.instanceOf(stats.mtime, Date); + assert.instanceOf(stats.atime, Date); + if (process.getuid) { + assert.equal(typeof stats.uid, 'bigint'); + } else { + assert.strictEqual(stats.uid, 0n); + } + if (process.getgid) { + assert.equal(typeof stats.gid, 'bigint'); + } else { + assert.strictEqual(stats.gid, 0n); + } + assert.equal(typeof stats.nlink, 'bigint'); + assert.equal(typeof stats.rdev, 'bigint'); + done(); + }, done); + }); + if ( process.platform !== 'win32' || semver.coerce(process.version).major !== 10 @@ -209,20 +345,17 @@ }); }); - withPromise.it( - 'promise includes blocks and blksize in directory stats', - function(done) { - fs.promises.stat('/path').then(function(stats) { - assert.isNumber(stats.blocks); - assert.isNumber(stats.blksize); - done(); - }, done); - } - ); + it('promise includes blocks and blksize in directory stats', function(done) { + fs.promises.stat('/path').then(function(stats) { + assert.isNumber(stats.blocks); + assert.isNumber(stats.blksize); + done(); + }, done); + }); } }); -describe('fs.fstat(fd, callback)', function() { +describe('fs.fstat(fd, options, callback)', function() { beforeEach(function() { mock({ 'path/to/file.txt': 'file content', @@ -243,9 +376,19 @@ }); }); - withPromise.it('promise accepts a file descriptor for a file (r)', function( - done - ) { + it('accepts a file descriptor for a file (r) with bigint', function(done) { + const fd = fs.openSync('path/to/file.txt', 'r'); + fs.fstat(fd, {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.isTrue(stats.isFile()); + assert.equal(typeof stats.size, 'bigint'); + done(); + }); + }); + + it('promise accepts a file descriptor for a file (r)', function(done) { fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { @@ -258,6 +401,19 @@ }, done); }); + it('promise accepts a file descriptor for a file (r) with bigint', function(done) { + fs.promises + .open('path/to/file.txt', 'r') + .then(function(fd) { + return fd.stat({bigint: true}); + }) + .then(function(stats) { + assert.isTrue(stats.isFile()); + assert.equal(typeof stats.size, 'bigint'); + done(); + }, done); + }); + it('accepts a file descriptor for a directory (r)', function(done) { const fd = fs.openSync('path/to', 'r'); fs.fstat(fd, function(err, stats) { @@ -265,26 +421,48 @@ return done(err); } assert.isTrue(stats.isDirectory()); - assert.isTrue(stats.size > 0); + assert.equal(stats.size, 1); done(); }); }); - withPromise.it( - 'promise accepts a file descriptor for a directory (r)', - function(done) { - fs.promises - .open('path/to', 'r') - .then(function(fd) { - return fd.stat(); - }) - .then(function(stats) { - assert.isTrue(stats.isDirectory()); - assert.isTrue(stats.size > 0); - done(); - }, done); - } - ); + it('accepts a file descriptor for a directory (r) with bigint', function(done) { + const fd = fs.openSync('path/to', 'r'); + fs.fstat(fd, {bigint: true}, function(err, stats) { + if (err) { + return done(err); + } + assert.isTrue(stats.isDirectory()); + assert.equal(typeof stats.size, 'bigint'); + done(); + }); + }); + + it('promise accepts a file descriptor for a directory (r)', function(done) { + fs.promises + .open('path/to', 'r') + .then(function(fd) { + return fd.stat(); + }) + .then(function(stats) { + assert.isTrue(stats.isDirectory()); + assert.equal(stats.size, 1); + done(); + }, done); + }); + + it('promise accepts a file descriptor for a directory (r) with bigint', function(done) { + fs.promises + .open('path/to', 'r') + .then(function(fd) { + return fd.stat({bigint: true}); + }) + .then(function(stats) { + assert.isTrue(stats.isDirectory()); + assert.equal(typeof stats.size, 'bigint'); + done(); + }, done); + }); it('fails for bad file descriptor', function(done) { const fd = fs.openSync('path/to/file.txt', 'r'); @@ -296,18 +474,17 @@ }); }); - withPromise.it('promise fails for bad file descriptor', function(done) { + it('promise fails for bad file descriptor', function(done) { fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { return fd.close().then(function() { - return fd.stat(); + return fd.stat({bigint: true}); }); }) .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -318,7 +495,7 @@ }); }); -describe('fs.fstatSync(fd)', function() { +describe('fs.fstatSync(fd, options)', function() { beforeEach(function() { mock({ 'path/to/file.txt': 'file content', @@ -334,11 +511,25 @@ assert.equal(stats.size, 12); }); + it('accepts a file descriptor for a file (r) with bigint', function() { + const fd = fs.openSync('path/to/file.txt', 'r'); + const stats = fs.fstatSync(fd, {bigint: true}); + assert.isTrue(stats.isFile()); + assert.equal(typeof stats.size, 'bigint'); + }); + it('accepts a file descriptor for a directory (r)', function() { const fd = fs.openSync('path/to', 'r'); const stats = fs.fstatSync(fd); assert.isTrue(stats.isDirectory()); - assert.isTrue(stats.size > 0); + assert.equal(stats.size, 1); + }); + + it('accepts a file descriptor for a directory (r) with bigint', function() { + const fd = fs.openSync('path/to', 'r'); + const stats = fs.fstatSync(fd, {bigint: true}); + assert.isTrue(stats.isDirectory()); + assert.equal(typeof stats.size, 'bigint'); }); it('fails for bad file descriptor', function() { diff -Nru node-mock-fs-4.13.0/test/lib/fs.unlink.spec.js node-mock-fs-5.1.2/test/lib/fs.unlink.spec.js --- node-mock-fs-4.13.0/test/lib/fs.unlink.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.unlink.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,10 +3,8 @@ const helper = require('../helper'); const fs = require('fs'); const mock = require('../../lib/index'); -const bufferAlloc = require('../../lib/buffer').alloc; const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.unlink(path, callback)', function() { beforeEach(function() { @@ -41,7 +39,7 @@ }); }); - withPromise.it('promise deletes a file', function(done) { + it('promise deletes a file', function(done) { fs.promises.unlink('file.txt').then(function() { assert.isFalse(fs.existsSync('file.txt')); done(); @@ -61,7 +59,7 @@ }); }); - withPromise.it('updates mtime of parent', function(done) { + it('updates mtime of parent', function(done) { const oldTime = fs.statSync('dir2').mtime; fs.promises.unlink('dir2/file').then(function() { assert.isFalse(fs.existsSync('dir2/file')); @@ -80,11 +78,10 @@ }); }); - withPromise.it('promise fails for a directory', function(done) { + it('promise fails for a directory', function(done) { fs.promises.unlink('dir').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -103,7 +100,7 @@ } assert.isFalse(fs.existsSync('file.txt')); // but we can still use fd to read - const buffer = bufferAlloc(7); + const buffer = Buffer.alloc(7); const read = fs.readSync(fd, buffer, 0, 7); assert.equal(read, 7); assert.equal(String(buffer), 'content'); @@ -111,21 +108,18 @@ }); }); - withPromise.it( - 'promise respects previously opened file descriptors', - function(done) { - const fd = fs.openSync('file.txt', 'r'); - fs.promises.unlink('file.txt').then(function() { - assert.isFalse(fs.existsSync('file.txt')); - // but we can still use fd to read - const buffer = bufferAlloc(7); - const read = fs.readSync(fd, buffer, 0, 7); - assert.equal(read, 7); - assert.equal(String(buffer), 'content'); - done(); - }, done); - } - ); + it('promise respects previously opened file descriptors', function(done) { + const fd = fs.openSync('file.txt', 'r'); + fs.promises.unlink('file.txt').then(function() { + assert.isFalse(fs.existsSync('file.txt')); + // but we can still use fd to read + const buffer = Buffer.alloc(7); + const read = fs.readSync(fd, buffer, 0, 7); + assert.equal(read, 7); + assert.equal(String(buffer), 'content'); + done(); + }, done); + }); }); describe('fs.unlinkSync(path)', function() { @@ -146,7 +140,7 @@ fs.unlinkSync('file.txt'); assert.isFalse(fs.existsSync('file.txt')); // but we can still use fd to read - const buffer = bufferAlloc(7); + const buffer = Buffer.alloc(7); const read = fs.readSync(fd, buffer, 0, 7); assert.equal(read, 7); assert.equal(String(buffer), 'content'); diff -Nru node-mock-fs-4.13.0/test/lib/fs.utimes-futimes.spec.js node-mock-fs-5.1.2/test/lib/fs.utimes-futimes.spec.js --- node-mock-fs-4.13.0/test/lib/fs.utimes-futimes.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.utimes-futimes.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -5,7 +5,6 @@ const mock = require('../../lib/index'); const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.utimes(path, atime, mtime, callback)', function() { beforeEach(function() { @@ -42,7 +41,7 @@ }); }); - withPromise.it('promise updates timestamps for a file', function(done) { + it('promise updates timestamps for a file', function(done) { fs.promises .utimes('file.txt', new Date(100), new Date(200)) .then(function() { @@ -65,7 +64,7 @@ }); }); - withPromise.it('promise updates timestamps for a directory', function(done) { + it('promise updates timestamps for a directory', function(done) { fs.promises.utimes('dir', new Date(300), new Date(400)).then(function() { const stats = fs.statSync('dir'); assert.equal(stats.atime.getTime(), 300); @@ -82,11 +81,10 @@ }); }); - withPromise.it('promise fails for a bogus path', function(done) { + it('promise fails for a bogus path', function(done) { fs.promises.utimes('bogus.txt', new Date(100), new Date(200)).then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -135,7 +133,7 @@ }); }); - withPromise.it('promise updates timestamps for a file', function(done) { + it('promise updates timestamps for a file', function(done) { fs.promises .open('file.txt', 'r') .then(function(fd) { @@ -162,7 +160,7 @@ }); }); - withPromise.it('promise updates timestamps for a directory', function(done) { + it('promise updates timestamps for a directory', function(done) { fs.promises .open('dir', 'r') .then(function(fd) { diff -Nru node-mock-fs-4.13.0/test/lib/fs.writeFile.spec.js node-mock-fs-5.1.2/test/lib/fs.writeFile.spec.js --- node-mock-fs-4.13.0/test/lib/fs.writeFile.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.writeFile.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,10 +3,8 @@ const helper = require('../helper'); const fs = require('fs'); const mock = require('../../lib/index'); -const bufferFrom = require('../../lib/buffer').from; const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.writeFile(filename, data, [options], callback)', function() { beforeEach(function() { @@ -28,7 +26,7 @@ }); }); - withPromise.it('promise writes a string to a file', function(done) { + it('promise writes a string to a file', function(done) { fs.promises.writeFile('dir/foo', 'bar').then(function() { assert.equal(String(fs.readFileSync('dir/foo')), 'bar'); done(); @@ -47,7 +45,7 @@ }); }); - withPromise.it('promise updates mtime of parent directory', function(done) { + it('promise updates mtime of parent directory', function(done) { const oldTime = fs.statSync('dir').mtime; fs.promises.writeFile('dir/foo', 'bar').then(function() { const newTime = fs.statSync('dir').mtime; @@ -57,7 +55,7 @@ }); it('writes a buffer to a file', function(done) { - fs.writeFile('dir/foo', bufferFrom('bar'), function(err) { + fs.writeFile('dir/foo', Buffer.from('bar'), function(err) { if (err) { return done(err); } @@ -66,8 +64,8 @@ }); }); - withPromise.it('promise writes a buffer to a file', function(done) { - fs.promises.writeFile('dir/foo', bufferFrom('bar')).then(function() { + it('promise writes a buffer to a file', function(done) { + fs.promises.writeFile('dir/foo', Buffer.from('bar')).then(function() { assert.equal(String(fs.readFileSync('dir/foo')), 'bar'); done(); }, done); @@ -81,11 +79,10 @@ }); }); - withPromise.it('promise fails if directory does not exist', function(done) { + it('promise fails if directory does not exist', function(done) { fs.promises.writeFile('foo/bar', 'baz').then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -110,7 +107,7 @@ }); it('writes a buffer to a file', function() { - fs.writeFileSync('foo', bufferFrom('bar')); + fs.writeFileSync('foo', Buffer.from('bar')); assert.equal(String(fs.readFileSync('foo')), 'bar'); }); diff -Nru node-mock-fs-4.13.0/test/lib/fs.write.spec.js node-mock-fs-5.1.2/test/lib/fs.write.spec.js --- node-mock-fs-4.13.0/test/lib/fs.write.spec.js 2020-08-20 23:01:18.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/fs.write.spec.js 2021-11-08 20:09:32.000000000 +0000 @@ -3,10 +3,8 @@ const helper = require('../helper'); const fs = require('fs'); const mock = require('../../lib/index'); -const bufferFrom = require('../../lib/buffer').from; const assert = helper.assert; -const withPromise = helper.withPromise; describe('fs.write(fd, buffer, offset, length, position, callback)', function() { beforeEach(function() { @@ -18,7 +16,7 @@ it('writes a buffer to a file', function(done) { const fd = fs.openSync('path/new-file.txt', 'w'); - const buffer = bufferFrom('new file'); + const buffer = Buffer.from('new file'); fs.write(fd, buffer, 0, buffer.length, null, function(err, written, buf) { if (err) { return done(err); @@ -30,8 +28,8 @@ }); }); - withPromise.it('promise writes a buffer to a file', function(done) { - const buffer = bufferFrom('new file'); + it('promise writes a buffer to a file', function(done) { + const buffer = Buffer.from('new file'); fs.promises .open('path/new-file.txt', 'w') .then(function(fd) { @@ -47,7 +45,7 @@ it('writes a buffer to a file with implicit offset, length, position', function(done) { const fd = fs.openSync('path/new-file.txt', 'w'); - const buffer = bufferFrom('new file'); + const buffer = Buffer.from('new file'); fs.write(fd, buffer, function(err, written, buf) { if (err) { return done(err); @@ -59,33 +57,27 @@ }); }); - withPromise.it( - 'promise writes a buffer to a file with implicit offset, length, position', - function(done) { - const buffer = bufferFrom('new file'); - fs.promises - .open('path/new-file.txt', 'w') - .then(function(fd) { - return fd.write(buffer); - }) - .then(function(result) { - assert.equal(result.bytesWritten, 8); - assert.equal(result.buffer, buffer); - assert.equal( - String(fs.readFileSync('path/new-file.txt')), - 'new file' - ); - done(); - }, done); - } - ); + it('promise writes a buffer to a file with implicit offset, length, position', function(done) { + const buffer = Buffer.from('new file'); + fs.promises + .open('path/new-file.txt', 'w') + .then(function(fd) { + return fd.write(buffer); + }) + .then(function(result) { + assert.equal(result.bytesWritten, 8); + assert.equal(result.buffer, buffer); + assert.equal(String(fs.readFileSync('path/new-file.txt')), 'new file'); + done(); + }, done); + }); it('can write a portion of a buffer to a file', function(done) { fs.open('path/new-file.txt', 'w', function(err, fd) { if (err) { return done(err); } - const buffer = bufferFrom('new file'); + const buffer = Buffer.from('new file'); fs.write(fd, buffer, 1, 5, null, function(err2, written, buf) { if (err2) { return done(err2); @@ -98,10 +90,8 @@ }); }); - withPromise.it('promise can write a portion of a buffer to a file', function( - done - ) { - const buffer = bufferFrom('new file'); + it('promise can write a portion of a buffer to a file', function(done) { + const buffer = Buffer.from('new file'); fs.promises .open('path/new-file.txt', 'w') .then(function(fd) { @@ -120,7 +110,7 @@ if (err) { return done(err); } - const buffer = bufferFrom('new file'); + const buffer = Buffer.from('new file'); fs.write(fd, buffer, 1, 5, 2, function(err2, written, buf) { if (err2) { return done(err2); @@ -136,33 +126,30 @@ }); }); - withPromise.it( - 'promise can write a portion of a buffer to a file position', - function(done) { - const buffer = bufferFrom('new file'); - fs.promises - .open('path/to/file.txt', 'a') - .then(function(fd) { - return fd.write(buffer, 1, 5, 2); - }) - .then(function(result) { - assert.equal(result.bytesWritten, 5); - assert.equal(result.buffer, buffer); - assert.equal( - String(fs.readFileSync('path/to/file.txt')), - 'fiew fintent' - ); - done(); - }, done); - } - ); + it('promise can write a portion of a buffer to a file position', function(done) { + const buffer = Buffer.from('new file'); + fs.promises + .open('path/to/file.txt', 'a') + .then(function(fd) { + return fd.write(buffer, 1, 5, 2); + }) + .then(function(result) { + assert.equal(result.bytesWritten, 5); + assert.equal(result.buffer, buffer); + assert.equal( + String(fs.readFileSync('path/to/file.txt')), + 'fiew fintent' + ); + done(); + }, done); + }); it('can write a portion of a buffer to a file position and enlarge the file', function(done) { fs.open('path/to/file.txt', 'a', function(err, fd) { if (err) { return done(err); } - const buffer = bufferFrom('new file'); + const buffer = Buffer.from('new file'); fs.write(fd, buffer, 1, 5, 8, function(err2, written, buf) { if (err2) { return done(err2); @@ -178,33 +165,30 @@ }); }); - withPromise.it( - 'promise can write a portion of a buffer to a file position and enlarge the file', - function(done) { - const buffer = bufferFrom('new file'); - fs.promises - .open('path/to/file.txt', 'a') - .then(function(fd) { - return fd.write(buffer, 1, 5, 8); - }) - .then(function(result) { - assert.equal(result.bytesWritten, 5); - assert.equal(result.buffer, buffer); - assert.equal( - String(fs.readFileSync('path/to/file.txt')), - 'file conew fi' - ); - done(); - }, done); - } - ); + it('promise can write a portion of a buffer to a file position and enlarge the file', function(done) { + const buffer = Buffer.from('new file'); + fs.promises + .open('path/to/file.txt', 'a') + .then(function(fd) { + return fd.write(buffer, 1, 5, 8); + }) + .then(function(result) { + assert.equal(result.bytesWritten, 5); + assert.equal(result.buffer, buffer); + assert.equal( + String(fs.readFileSync('path/to/file.txt')), + 'file conew fi' + ); + done(); + }, done); + }); it('can append to a file', function(done) { fs.open('path/to/file.txt', 'a', function(err, fd) { if (err) { return done(err); } - const buffer = bufferFrom(' more'); + const buffer = Buffer.from(' more'); fs.write(fd, buffer, 0, 5, null, function(err2, written, buf) { if (err2) { return done(err2); @@ -220,8 +204,8 @@ }); }); - withPromise.it('promise can append to a file', function(done) { - const buffer = bufferFrom(' more'); + it('promise can append to a file', function(done) { + const buffer = Buffer.from(' more'); fs.promises .open('path/to/file.txt', 'a') .then(function(fd) { @@ -243,7 +227,7 @@ if (err) { return done(err); } - fs.write(fd, bufferFrom('oops'), 0, 4, null, function(err2) { + fs.write(fd, Buffer.from('oops'), 0, 4, null, function(err2) { assert.instanceOf(err2, Error); assert.equal(err2.code, 'EBADF'); done(); @@ -251,16 +235,15 @@ }); }); - withPromise.it('fails if file not open for writing', function(done) { + it('fails if file not open for writing', function(done) { fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { - return fd.write(bufferFrom('oops'), 0, 4); + return fd.write(Buffer.from('oops'), 0, 4); }) .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); @@ -280,7 +263,7 @@ afterEach(mock.restore); it('writes a buffer to a file', function() { - const buffer = bufferFrom('new file'); + const buffer = Buffer.from('new file'); const fd = fs.openSync('path/new-file.txt', 'w'); const written = fs.writeSync(fd, buffer, 0, buffer.length); assert.equal(written, 8); @@ -288,7 +271,7 @@ }); it('can write a portion of a buffer to a file', function() { - const buffer = bufferFrom('new file'); + const buffer = Buffer.from('new file'); const fd = fs.openSync('path/new-file.txt', 'w'); const written = fs.writeSync(fd, buffer, 1, 5); assert.equal(written, 5); @@ -296,7 +279,7 @@ }); it('can append to a file', function() { - const buffer = bufferFrom(' more'); + const buffer = Buffer.from(' more'); const fd = fs.openSync('path/to/file.txt', 'a'); const written = fs.writeSync(fd, buffer, 0, 5); assert.equal(written, 5); @@ -309,7 +292,7 @@ it('fails if file not open for writing', function() { const fd = fs.openSync('path/to/file.txt', 'r'); assert.throws(function() { - fs.writeSync(fd, bufferFrom('oops'), 0, 4); + fs.writeSync(fd, Buffer.from('oops'), 0, 4); }); }); }); @@ -340,7 +323,7 @@ }); }); - withPromise.it('promise writes a string to a file', function(done) { + it('promise writes a string to a file', function(done) { const string = 'new file'; fs.promises .open('path/new-file.txt', 'w') @@ -373,26 +356,20 @@ }); }); - withPromise.it( - 'promise writes a string to a file with implicit position and encoding', - function(done) { - const string = 'new file'; - fs.promises - .open('path/new-file.txt', 'w') - .then(function(fd) { - return fd.write(string); - }) - .then(function(result) { - assert.equal(result.bytesWritten, 8); - assert.equal(String(result.buffer), string); - assert.equal( - String(fs.readFileSync('path/new-file.txt')), - 'new file' - ); - done(); - }, done); - } - ); + it('promise writes a string to a file with implicit position and encoding', function(done) { + const string = 'new file'; + fs.promises + .open('path/new-file.txt', 'w') + .then(function(fd) { + return fd.write(string); + }) + .then(function(result) { + assert.equal(result.bytesWritten, 8); + assert.equal(String(result.buffer), string); + assert.equal(String(fs.readFileSync('path/new-file.txt')), 'new file'); + done(); + }, done); + }); it('can append to a file', function(done) { fs.open('path/to/file.txt', 'a', function(err, fd) { @@ -412,7 +389,7 @@ }); }); - withPromise.it('promise can append to a file', function(done) { + it('promise can append to a file', function(done) { const string = ' more'; fs.promises .open('path/to/file.txt', 'a') @@ -448,7 +425,7 @@ }); }); - withPromise.it('promise can write to a position of a file', function(done) { + it('promise can write to a position of a file', function(done) { const string = ' more'; fs.promises .open('path/to/file.txt', 'a') @@ -484,26 +461,23 @@ }); }); - withPromise.it( - 'promise can write to a position of a file and enlarge it', - function(done) { - const string = ' more'; - fs.promises - .open('path/to/file.txt', 'a') - .then(function(fd) { - return fd.write(string, 9); - }) - .then(function(result) { - assert.equal(result.bytesWritten, 5); - assert.equal(String(result.buffer), string); - assert.equal( - String(fs.readFileSync('path/to/file.txt')), - 'file cont more' - ); - done(); - }, done); - } - ); + it('promise can write to a position of a file and enlarge it', function(done) { + const string = ' more'; + fs.promises + .open('path/to/file.txt', 'a') + .then(function(fd) { + return fd.write(string, 9); + }) + .then(function(result) { + assert.equal(result.bytesWritten, 5); + assert.equal(String(result.buffer), string); + assert.equal( + String(fs.readFileSync('path/to/file.txt')), + 'file cont more' + ); + done(); + }, done); + }); it('fails if file not open for writing', function(done) { fs.open('path/to/file.txt', 'r', function(err, fd) { @@ -517,7 +491,7 @@ }); }); - withPromise.it('promise fails if file not open for writing', function(done) { + it('promise fails if file not open for writing', function(done) { fs.promises .open('path/to/file.txt', 'r') .then(function(fd) { @@ -525,8 +499,7 @@ }) .then( function() { - assert.fail('should not succeed.'); - done(); + done(new Error('should not succeed.')); }, function(err) { assert.instanceOf(err, Error); diff -Nru node-mock-fs-4.13.0/test/lib/readfilecontext.js node-mock-fs-5.1.2/test/lib/readfilecontext.js --- node-mock-fs-4.13.0/test/lib/readfilecontext.js 1970-01-01 00:00:00.000000000 +0000 +++ node-mock-fs-5.1.2/test/lib/readfilecontext.js 2021-11-08 20:09:32.000000000 +0000 @@ -0,0 +1,174 @@ +'use strict'; + +const constants = require('constants'); +const helper = require('../helper'); +const fs = require('fs'); +const mock = require('../../lib/index'); +const { + patchReadFileContext, + getReadFileContextPrototype +} = require('../../lib/readfilecontext'); + +const assert = helper.assert; +const inVersion = helper.inVersion; + +describe('getReadFileContextPrototype', function() { + it('provides access to the internal ReadFileContext', function() { + const proto = getReadFileContextPrototype(); + assert.equal(proto.constructor.name, 'ReadFileContext'); + assert.equal(typeof proto.read, 'function'); + assert.equal(typeof proto.close, 'function'); + }); +}); + +describe('patchReadFileContext', function() { + it('patch forwards calls to mocked binding when available', function() { + const calls = { + read: 0, + close: 0, + mockedRead: 0, + mockedClose: 0 + }; + + const proto = { + read: function() { + calls.read++; + }, + close: function() { + calls.close++; + } + }; + + const mockedBinding = { + read: function() { + assert.strictEqual(this, mockedBinding); + calls.mockedRead++; + }, + close: function() { + assert.strictEqual(this, mockedBinding); + calls.mockedClose++; + } + }; + + patchReadFileContext(proto); + + const target = Object.create(proto); + + assert.deepEqual(calls, { + read: 0, + close: 0, + mockedRead: 0, + mockedClose: 0 + }); + + target.read(); + assert.deepEqual(calls, { + read: 1, + close: 0, + mockedRead: 0, + mockedClose: 0 + }); + target.close(); + assert.deepEqual(calls, { + read: 1, + close: 1, + mockedRead: 0, + mockedClose: 0 + }); + + proto._mockedBinding = mockedBinding; + target.read(); + assert.deepEqual(calls, { + read: 1, + close: 1, + mockedRead: 1, + mockedClose: 0 + }); + target.close(); + assert.deepEqual(calls, { + read: 1, + close: 1, + mockedRead: 1, + mockedClose: 1 + }); + + delete proto._mockedBinding; + target.read(); + assert.deepEqual(calls, { + read: 2, + close: 1, + mockedRead: 1, + mockedClose: 1 + }); + target.close(); + assert.deepEqual(calls, { + read: 2, + close: 2, + mockedRead: 1, + mockedClose: 1 + }); + }); +}); + +describe('fs.readFile() with ReadFileContext', function() { + // fs.readFile() is already tested elsewhere, here we just make sure we have + // coverage of the mocked ReadFileContext implementation. + + beforeEach(function() { + mock({ + 'path/to/file.txt': 'file content', + 1: 'fd content' + }); + }); + afterEach(mock.restore); + + inVersion('>=15.0.0').it('allows file reads to be aborted', function(done) { + const controller = new AbortController(); + const {signal} = controller; + + fs.readFile('path/to/file.txt', {signal}, function(err) { + assert.instanceOf(err, Error); + assert.equal(err.name, 'AbortError'); + assert.equal(err.code, 'ABORT_ERR'); + done(); + }); + + // By aborting after the call it will be handled by the context rather than readFile() + controller.abort(); + }); + + it('allows file reads with a numeric descriptor', function(done) { + // This isn't actually supported by mock-fs, but let's make sure the call goes through + // It also covers the case of reading an empty file and reading with encoding + fs.readFile(1, 'utf-8', function(err, data) { + assert.isNull(err); + assert.equal(data, ''); + done(); + }); + }); + + it('allows file reads with unknown size', function(done) { + mock({ + 'unknown-size.txt': function() { + const file = mock.file({ + content: Buffer.from('unknown size') + })(); + + // Override getStats to drop the S_IFREG flag + const origGetStats = file.getStats; + file.getStats = function() { + const stats = origGetStats.apply(this, arguments); + stats[1] ^= constants.S_IFREG; + return stats; + }; + return file; + } + }); + + fs.readFile('unknown-size.txt', 'utf-8', function(err, data) { + assert.isNull(err); + assert.equal(data, 'unknown size'); + done(); + }); + }); +});