diff --git a/.appveyor.yml b/.appveyor.yml index ab6071f2d..d370cfdb4 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -11,7 +11,7 @@ environment: - BUILD_JOB: "scenarios_build" install: - - ps: Install-Product node 14.15.4 x64 + - ps: Install-Product node 14.17.6 x64 - cmd: appveyor-retry yarn install:all - cmd: appveyor-retry yarn bootstrap:remote diff --git a/.eslintrc.yml b/.eslintrc.yml index 09d0ee420..dfd99714c 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,6 +4,8 @@ extends: - plugin:node/recommended rules: node/shebang: off + no-param-reassign: off + spaced-comment: off settings: node: allowModules: diff --git a/.flowconfig b/.flowconfig index 715742f0e..1fcd97837 100644 --- a/.flowconfig +++ b/.flowconfig @@ -2,10 +2,8 @@ /build/.* /coverage/.* /tmp/.* -/node_modules/ach/.* -/node_modules/config-chain/test/broken.json -/node_modules/elm-test/.* -/node_modules/jsverify/.* +/node_modules/resolve/.* +/node_modules/yargs/.* [include] diff --git a/.github/actions/build-and-publish/action.yaml b/.github/actions/build-and-publish/action.yaml index 738e637d9..df0406c75 100644 --- a/.github/actions/build-and-publish/action.yaml +++ b/.github/actions/build-and-publish/action.yaml @@ -30,17 +30,9 @@ runs: APPLE_ID_PASSWORD: "${{ inputs.apple-id-password }}" run: | if [ "${{ runner.os }}" == "Linux" ]; then - docker run --rm \ - $(env | \ - grep -Eo '^[^\s=]*(NODE_|ELECTRON_|YARN_|NPM_|CI|GITHUB_|CSC_|_TOKEN|_KEY)[^\s=]*' | \ - sed 's/^/-e /;/^$/d' | \ - paste -sd ' ' \ - ) \ - -v ${PWD}:/project \ - -v ~/.cache/electron:/root/.cache/electron \ - -v ~/.cache/electron-builder:/root/.cache/electron-builder \ - electronuserland/builder:12 \ - /bin/bash -c "yarn dist:all" - else - yarn dist:all + # Install build dependencies: + # - `libopenjp2-tools` for the basic build + # - the others for cross-compiling 32 bit apps on a 64 bit machine + sudo apt install --no-install-recommends -y libopenjp2-tools gcc-multilib g++-multilib fi + yarn dist:all diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml index 4b6f4748f..2ec464468 100644 --- a/.github/workflows/linux.yaml +++ b/.github/workflows/linux.yaml @@ -21,7 +21,7 @@ env: NODE_ENV: "test" COZY_DESKTOP_HEARTBEAT: "1000" DISPLAY: ":99.0" - NODE_VERSION: "14.16.0" + NODE_VERSION: "14.17.6" GO_VERSION: "1.17" COUCHDB_VERSION: "2.3.1" diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index 198848c25..4605ec856 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -22,7 +22,7 @@ env: NODE_ENV: "test" COZY_DESKTOP_HEARTBEAT: "1000" DISPLAY: ":99.0" - NODE_VERSION: "14.16.0" + NODE_VERSION: "14.17.6" GO_VERSION: "1.17" COUCHDB_VERSION: "2.3.1" diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 000000000..c661ff930 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,17 @@ +{ + "color": true, + "slow": "150", + "timeout": "20000", + "reporter": "spec", + "require": [ + "./core/globals", + "should", + "should-sinon", + "./test/support/assertions/change", + "./test/support/assertions/fileContents", + "./test/support/assertions/pending", + "./test/support/assertions/timestamp", + "./test/support/stacktraces" + ], + "recursive": true +} diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 000000000..c5df3bc67 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['cozy-app'] +} diff --git a/core/app.js b/core/app.js index 8bb7844bd..48f25e0c8 100644 --- a/core/app.js +++ b/core/app.js @@ -10,7 +10,7 @@ const _ = require('lodash') const os = require('os') const path = require('path') const url = require('url') -const uuid = require('uuid/v4') +const uuid = require('uuid').v4 const https = require('https') const { createGzip } = require('zlib') const semver = require('semver') @@ -33,6 +33,7 @@ const { LOG_FILE, LOG_FILENAME } = logger const sentry = require('./utils/sentry') const { sendToTrash } = require('./utils/fs') const notes = require('./utils/notes') +const web = require('./utils/web') /*:: import type EventEmitter from 'events' @@ -436,6 +437,10 @@ class App { findNote(filePath /*: string */) { return notes.findNote(filePath, this) } + + findDocument(filePath /*: string */) { + return web.findDocument(filePath, this) + } } module.exports = { diff --git a/core/ignore.js b/core/ignore.js index 342e5fe52..2f2aa320d 100644 --- a/core/ignore.js +++ b/core/ignore.js @@ -48,7 +48,7 @@ */ const { basename, dirname, resolve } = require('path') -const { matcher, makeRe } = require('micromatch') +const { matcher } = require('micromatch') const fs = require('fs') const logger = require('./utils/logger') @@ -117,11 +117,9 @@ function buildPattern(line /*: string */) /*: IgnorePattern */ { line = line.replace(/^\\/, '') // Remove leading escaping char line = line.replace(/( |\t)*$/, '') // Remove trailing spaces // Ignore case for case insensitive file-systems - if (process.platform === 'darwin' || process.platform === 'win32') { - line = makeRe(line, { nocase: true }) - } - let pattern = { - match: matcher(line, {}), + const nocase = process.platform === 'darwin' || process.platform === 'win32' + const pattern = { + match: matcher(line, { nocase }), basename: noslash, // The pattern can match only the basename folder, // The pattern will only match a folder negate // The pattern is negated @@ -131,9 +129,7 @@ function buildPattern(line /*: string */) /*: IgnorePattern */ { /** Parse many lines and build the corresponding pattern array */ function buildPatternArray(lines /*: string[] */) /*: IgnorePattern[] */ { - return Array.from(lines) - .filter(isNotBlankOrComment) - .map(buildPattern) + return Array.from(lines).filter(isNotBlankOrComment).map(buildPattern) } function isNotBlankOrComment(line /*: string */) /*: boolean */ { diff --git a/core/local/atom/dispatch.js b/core/local/atom/dispatch.js index 7ab226662..300147d99 100644 --- a/core/local/atom/dispatch.js +++ b/core/local/atom/dispatch.js @@ -120,10 +120,12 @@ async function dispatchEvent( try { await actions[event.action + event.kind](event, opts) try { - const target = (await opts.pouch.db.changes({ - limit: 1, - descending: true - })).last_seq + const target = ( + await opts.pouch.db.changes({ + limit: 1, + descending: true + }) + ).last_seq opts.events.emit('sync-target', target) } catch (err) { log.warn({ err }) diff --git a/core/local/atom/filter_ignored.js b/core/local/atom/filter_ignored.js index 6db4b4945..1aff32f22 100644 --- a/core/local/atom/filter_ignored.js +++ b/core/local/atom/filter_ignored.js @@ -100,9 +100,13 @@ function movedToIgnoredPath(event /*: AtomEvent */) /*: AtomEvent */ { ...event, action: 'deleted' } + _.set(deletedEvent, [STEP_NAME, 'movedToIgnoredPath'], deletedEvent.path) - deletedEvent.path = deletedEvent.oldPath - delete deletedEvent.oldPath + + if (deletedEvent.oldPath) { + deletedEvent.path = deletedEvent.oldPath + delete deletedEvent.oldPath + } return deletedEvent } diff --git a/core/local/atom/incomplete_fixer.js b/core/local/atom/incomplete_fixer.js index a7b7651b3..c281cd1fa 100644 --- a/core/local/atom/incomplete_fixer.js +++ b/core/local/atom/incomplete_fixer.js @@ -269,9 +269,8 @@ function step( // (e.g. a temporary document now renamed), we'll want to make sure the old // document is removed to avoid having 2 documents with the same inode. // We can do this by keeping the completing renamed event. - const incompleteForExistingDoc /*: ?Metadata */ = await opts.pouch.byLocalPath( - item.event.path - ) + const incompleteForExistingDoc /*: ?Metadata */ = + await opts.pouch.byLocalPath(item.event.path) if ( incompleteForExistingDoc && !incompleteForExistingDoc.trashed && diff --git a/core/local/checksumer.js b/core/local/checksumer.js index e6d503e2a..de2a75e65 100644 --- a/core/local/checksumer.js +++ b/core/local/checksumer.js @@ -27,12 +27,12 @@ function computeChecksum(filePath /*: string */, callback /*: Callback */) { const stream = fs.createReadStream(filePath) const checksum = crypto.createHash('md5') checksum.setEncoding('base64') - stream.on('end', function() { + stream.on('end', function () { stopMeasure() checksum.end() callback(null, checksum.read()) }) - stream.on('error', function(err) { + stream.on('error', function (err) { stopMeasure() checksum.end() callback(err) @@ -69,7 +69,7 @@ function init() /*: Checksumer */ { // Use a queue for checksums to avoid computing many checksums at the // same time. It's better for performance (hard disk are faster with // linear readings). - const queue = Promise.promisifyAll(async.queue(retryComputeChecksum)) + const queue = async.queue(retryComputeChecksum) return { push(filePath /*: string */) /*: Promise */ { diff --git a/core/local/chokidar/analysis.js b/core/local/chokidar/analysis.js index 129321a3a..f267e4253 100644 --- a/core/local/chokidar/analysis.js +++ b/core/local/chokidar/analysis.js @@ -96,18 +96,35 @@ class LocalChangeMap { else return null } - whenFoundByPath /*:: */( + whenFoundByPath( path /*: string */, - callback /*: (LocalChange) => T */ - ) /*: ?T */ { - const change = this.changesByPath.get(path.normalize()) - if (change) return callback(change) + callback /*: (LocalChange) => ?{ change: any, previousChange: any } */ + ) /*: { change: ?LocalChange, previousChange: ?LocalChange } */ { + const samePathChange = this.changesByPath.get(path.normalize()) + if (samePathChange) { + const { change, previousChange } = callback(samePathChange) || {} + return { change, previousChange } + } else { + return { change: null, previousChange: null } + } } - put(c /*: LocalChange */) { - this.changesByPath.set(c.path.normalize(), c) - if (typeof c.ino === 'number') this.changesByInode.set(c.ino, c) - else this.changes.push(c) + put(c /*: LocalChange */, p /*: ?LocalChange */) { + if (p) { + // Replace p with c + this.changesByPath.set(p.path.normalize(), c) + if (typeof p.ino === 'number') { + this.changesByInode.set(p.ino, c) + } else { + const index = this.changes.indexOf(p) + this.changes.splice(index, 1, c) + } + } else { + // Add new c + this.changesByPath.set(c.path.normalize(), c) + if (typeof c.ino === 'number') this.changesByInode.set(c.ino, c) + else this.changes.push(c) + } } flush() /*: LocalChange[] */ { @@ -168,10 +185,15 @@ function analyseEvents( e.type = 'unlinkDir' } - const result = analyseEvent(e, changesFound) - if (result == null) continue // No change was found. Skip event. - if (result === true) continue // A previous change was transformed. Nothing more to do. - changesFound.put(result) // A new change was found + const { change, previousChange } = analyseEvent(e, changesFound) + if (!change) { + continue // No change was found. Skip event. + } else { + // Either: + // - A previous change was transformed and we replace it with the new one + // - A new change was found and we add it to the list + changesFound.put(change, previousChange) + } } catch (err) { const sentry = err.name === 'InvalidLocalMoveEvent' log.error({ err, path: e.path, sentry }, 'Invalid local move event') @@ -189,19 +211,20 @@ function analyseEvents( function analyseEvent( e /*: LocalEvent */, previousChanges /*: LocalChangeMap */ -) /*: ?LocalChange|true */ { +) /*: { change: ?LocalChange, previousChange: ?LocalChange } */ { const sameInodeChange = previousChanges.findByInode(getInode(e)) switch (e.type) { - case 'add': - return ( + case 'add': { + const { change, previousChange } = localChange.includeAddEventInFileMove(sameInodeChange, e) || localChange.fileMoveFromUnlinkAdd(sameInodeChange, e) || localChange.fileMoveIdenticalOffline(e) || localChange.fileAddition(e) - ) - case 'addDir': - return ( + return { change, previousChange } + } + case 'addDir': { + const { change, previousChange } = localChange.dirMoveOverwriteOnMacAPFS(sameInodeChange, e) || localChange.dirRenamingIdenticalLoopback(sameInodeChange, e) || localChange.includeAddDirEventInDirMove(sameInodeChange, e) || @@ -209,19 +232,20 @@ function analyseEvent( localChange.dirRenamingCaseOnlyFromAddAdd(sameInodeChange, e) || localChange.dirMoveIdenticalOffline(e) || localChange.dirAddition(e) - ) - case 'change': - return ( + return { change, previousChange } + } + case 'change': { + const { change, previousChange } = localChange.includeChangeEventIntoFileMove(sameInodeChange, e) || localChange.fileMoveFromFileDeletionChange(sameInodeChange, e) || localChange.fileMoveIdentical(sameInodeChange, e) || localChange.fileUpdate(e) - ) - case 'unlink': + return { change, previousChange } + } + case 'unlink': { { - const moveChange /*: ?LocalFileMove */ = localChange.maybeMoveFile( - sameInodeChange - ) + const moveChange /*: ?LocalFileMove */ = + localChange.maybeMoveFile(sameInodeChange) if (moveChange && !moveChange.wip) { panic( { path: e.path, moveChange, event: e }, @@ -230,7 +254,7 @@ function analyseEvent( ) } } - return ( + const { change, previousChange } = localChange.fileMoveFromAddUnlink(sameInodeChange, e) || localChange.fileDeletion(e) || previousChanges.whenFoundByPath( @@ -240,12 +264,12 @@ function analyseEvent( localChange.ignoreFileAdditionThenDeletion(samePathChange) // Otherwise, skip unlink event by multiple moves ) - ) - case 'unlinkDir': + return { change, previousChange } + } + case 'unlinkDir': { { - const moveChange /*: ?LocalDirMove */ = localChange.maybeMoveFolder( - sameInodeChange - ) + const moveChange /*: ?LocalDirMove */ = + localChange.maybeMoveFolder(sameInodeChange) /* istanbul ignore next */ if (moveChange && !moveChange.wip) { panic( @@ -255,7 +279,7 @@ function analyseEvent( ) } } - return ( + const { change, previousChange } = localChange.dirMoveFromAddUnlink(sameInodeChange, e) || localChange.dirDeletion(e) || previousChanges.whenFoundByPath( @@ -264,7 +288,8 @@ function analyseEvent( localChange.ignoreDirAdditionThenDeletion(samePathChange) || localChange.convertDirMoveToDeletion(samePathChange) ) - ) + return { change, previousChange } + } default: throw new TypeError(`Unknown event type: ${e.type}`) } @@ -312,7 +337,9 @@ function squashMoves(changes /*: LocalChange[] */) { // inline of LocalChange.isChildMove if ( a.type === 'DirMove' && - (oldPathA && oldPathB && oldPathB.startsWith(oldPathA + path.sep)) + oldPathA && + oldPathB && + oldPathB.startsWith(oldPathA + path.sep) ) { log.debug({ oldpath: b.old.path, path: b.path }, 'descendant move') if (pathB.substr(pathA.length) === oldPathB.substr(oldPathA.length)) { diff --git a/core/local/chokidar/initial_scan.js b/core/local/chokidar/initial_scan.js index 81151e92a..53ce786ad 100644 --- a/core/local/chokidar/initial_scan.js +++ b/core/local/chokidar/initial_scan.js @@ -77,11 +77,8 @@ const step = async ( .filter(e => e.type.startsWith('add')) .forEach(e => initialScanParams.paths.push(metadata.id(e.path))) - const { - offlineEvents, - unappliedMoves, - emptySyncDir - } = await detectOfflineUnlinkEvents(initialScanParams, pouch) + const { offlineEvents, unappliedMoves, emptySyncDir } = + await detectOfflineUnlinkEvents(initialScanParams, pouch) events = offlineEvents.concat(events) events = events.filter(e => { diff --git a/core/local/chokidar/local_change.js b/core/local/chokidar/local_change.js index 4c6fef43a..3a2e0ad0c 100644 --- a/core/local/chokidar/local_change.js +++ b/core/local/chokidar/local_change.js @@ -77,7 +77,7 @@ const log = logger({ /*:: export type LocalDirAddition = { - sideName: 'local', + sideName: 'local', // TODO: remove this unnecessary attribute type: 'DirAddition', path: string, old?: SavedMetadata, @@ -96,8 +96,8 @@ export type LocalDirMove = { sideName: 'local', type: 'DirMove', path: string, - old: SavedMetadata, - ino: number, + old?: SavedMetadata, + ino?: number, stats: fs.Stats, wip?: true, needRefetch?: boolean, @@ -124,8 +124,8 @@ export type LocalFileMove = { sideName: 'local', type: 'FileMove', path: string, - old: SavedMetadata, - ino: number, + old?: SavedMetadata, + ino?: number, stats: fs.Stats, md5sum: string, wip?: true, @@ -239,7 +239,7 @@ function addPath(a /*: LocalChange */) /*: ?string */ { function delPath(a /*: LocalChange */) /*: ?string */ { return isDelete(a) ? a.path.normalize() - : isMove(a) + : isMove(a) && a.old != null ? a.old.path.normalize() : null } @@ -290,7 +290,9 @@ function fileHasChanged( ) } -function dirAddition(e /*: LocalDirAdded */) /*: LocalDirAddition */ { +function dirAddition( + e /*: LocalDirAdded */ +) /*: { change: LocalDirAddition, previousChange: null } */ { const change /*: LocalDirAddition */ = { sideName, type: 'DirAddition', @@ -306,11 +308,14 @@ function dirAddition(e /*: LocalDirAdded */) /*: LocalDirAddition */ { 'addDir = DirAddition' ) - return change + return { change, previousChange: null } } -function dirDeletion(e /*: LocalDirUnlinked */) /*: ?LocalDirDeletion */ { +function dirDeletion( + e /*: LocalDirUnlinked */ +) /*: ?{ change: LocalDirDeletion, previousChange: null } */ { if (!getInode(e)) return + const change /*: LocalDirDeletion */ = { sideName, type: 'DirDeletion', @@ -321,10 +326,12 @@ function dirDeletion(e /*: LocalDirUnlinked */) /*: ?LocalDirDeletion */ { log.debug({ path: change.path, ino: change.ino }, 'unlinkDir = DirDeletion') - return change + return { change, previousChange: null } } -function fileAddition(e /*: LocalFileAdded */) /*: LocalFileAddition */ { +function fileAddition( + e /*: LocalFileAdded */ +) /*: { change: LocalFileAddition, previousChange: null } */ { const change /*: LocalFileAddition */ = { sideName, type: 'FileAddition', @@ -341,25 +348,31 @@ function fileAddition(e /*: LocalFileAdded */) /*: LocalFileAddition */ { 'add = FileAddition' ) - return change + return { change, previousChange: null } } -function fileDeletion(e /*: LocalFileUnlinked */) /*: ?LocalFileDeletion */ { +function fileDeletion( + e /*: LocalFileUnlinked */ +) /*: ?{ change: LocalFileDeletion, previousChange: null } */ { if (!getInode(e)) return + const change /*: LocalFileDeletion */ = { sideName, type: 'FileDeletion', path: e.path } + if (e.old) change.old = e.old if (e.old && e.old.ino) change.ino = e.old.ino log.debug({ path: change.path, ino: change.ino }, 'unlink = FileDeletion') - return change + return { change, previousChange: null } } -function fileUpdate(e /*: LocalFileUpdated */) /*: LocalFileUpdate */ { +function fileUpdate( + e /*: LocalFileUpdated */ +) /*: { change: LocalFileUpdate, previousChange: null } */ { const change /*: LocalFileUpdate */ = { sideName, type: 'FileUpdate', @@ -376,31 +389,37 @@ function fileUpdate(e /*: LocalFileUpdated */) /*: LocalFileUpdate */ { 'change = FileUpdate' ) - return change + return { change, previousChange: null } } function fileMoveFromUnlinkAdd( sameInodeChange /*: ?LocalChange */, e /*: LocalFileAdded */ -) /*: * */ { - const unlinkChange /*: ?LocalFileDeletion */ = maybeDeleteFile( - sameInodeChange - ) +) /*: ?{ change: LocalFileMove, previousChange: LocalFileDeletion } */ { + const unlinkChange /*: ?LocalFileDeletion */ = + maybeDeleteFile(sameInodeChange) if (!unlinkChange) return - if (_.get(unlinkChange, 'old.path').normalize() === e.path.normalize()) return - const fileMove /*: Object */ = build('FileMove', e.path, { + + const { old, ino } = unlinkChange + if (old && old.path.normalize() === e.path.normalize()) return + + const md5sum = + old != null && old.md5sum != null && !fileHasChanged(old, e) + ? old.md5sum + : e.md5sum + const fileMove /*: LocalFileMove */ = { + sideName, + type: 'FileMove', + path: e.path, stats: e.stats, - old: unlinkChange.old, - ino: unlinkChange.ino, - wip: e.wip - }) - if (fileHasChanged(unlinkChange.old, e) || !unlinkChange.old) { - fileMove.update = e - fileMove.md5sum = e.md5sum - } else { - fileMove.md5sum = unlinkChange.old.md5sum + md5sum } + if (e.wip) fileMove.wip = true + if (old) fileMove.old = old + if (ino) fileMove.ino = ino + if (md5sum === e.md5sum) fileMove.update = e + log.debug( { oldpath: fileMove.old && fileMove.old.path, @@ -411,24 +430,30 @@ function fileMoveFromUnlinkAdd( `unlink + add = FileMove${fileMove.update ? '(update)' : ''}` ) - return fileMove + return { change: fileMove, previousChange: unlinkChange } } function dirMoveFromUnlinkAdd( sameInodeChange /*: ?LocalChange */, e /*: LocalDirAdded */ -) /*: * */ { - const unlinkChange /*: ?LocalDirDeletion */ = maybeDeleteFolder( - sameInodeChange - ) +) /*: ?{ change: LocalDirMove, previousChange: LocalDirDeletion } */ { + const unlinkChange /*: ?LocalDirDeletion */ = + maybeDeleteFolder(sameInodeChange) if (!unlinkChange) return - if (_.get(unlinkChange, 'old.path').normalize() === e.path.normalize()) return - const dirMove /*: Object */ = build('DirMove', e.path, { - stats: e.stats, - old: unlinkChange.old, - ino: unlinkChange.ino, - wip: e.wip - }) + + const { old, ino } = unlinkChange + if (old && old.path.normalize() === e.path.normalize()) return + + const dirMove /*: LocalDirMove */ = { + sideName, + type: 'DirMove', + path: e.path, + stats: e.stats + } + + if (e.wip) dirMove.wip = true + if (old) dirMove.old = old + if (ino) dirMove.ino = ino log.debug( { @@ -440,22 +465,28 @@ function dirMoveFromUnlinkAdd( `unlinkDir + addDir = DirMove` ) - return dirMove + return { change: dirMove, previousChange: unlinkChange } } function fileMoveFromAddUnlink( sameInodeChange /*: ?LocalChange */, e /*: LocalFileUnlinked */ -) /*: * */ { +) /*: ?{ change: LocalFileMove, previousChange: LocalFileAddition } */ { const addChange /*: ?LocalFileAddition */ = maybeAddFile(sameInodeChange) if (!addChange) return - const fileMove /*: Object */ = build('FileMove', addChange.path, { + + const fileMove /*: LocalFileMove */ = { + sideName, + type: 'FileMove', + path: addChange.path, stats: addChange.stats, md5sum: addChange.md5sum, - old: e.old, - ino: addChange.ino, - wip: addChange.wip - }) + ino: addChange.ino + } + + if (addChange.wip) fileMove.wip = true + if (e.old) fileMove.old = e.old + if (addChange.old) fileMove.overwrite = addChange.old log.debug( { @@ -467,30 +498,34 @@ function fileMoveFromAddUnlink( `add + unlink = FileMove` ) - return fileMove + return { change: fileMove, previousChange: addChange } } function fileMoveFromFileDeletionChange( sameInodeChange /*: ?LocalChange */, e /*: LocalFileUpdated */ -) { - const fileDeletion /*: ?LocalFileDeletion */ = maybeDeleteFile( - sameInodeChange - ) +) /*: ?{ change: LocalFileMove, previousChange: LocalFileDeletion } */ { + const fileDeletion /*: ?LocalFileDeletion */ = + maybeDeleteFile(sameInodeChange) if (!fileDeletion) return + // There was an unlink on the same file, this is most probably a move and replace const src = fileDeletion.old const dst = e.old const newDst = e - const fileMove /*: Object */ = build('FileMove', e.path, { - stats: newDst.stats, - md5sum: newDst.md5sum, - overwrite: dst, + const fileMove /*: LocalFileMove */ = { + sideName, + type: 'FileMove', + path: e.path, old: src, + stats: newDst.stats, ino: newDst.stats.ino, - wip: e.wip - }) + md5sum: newDst.md5sum + } + + if (e.wip) fileMove.wip = true + if (dst) fileMove.overwrite = dst log.debug( { @@ -502,22 +537,27 @@ function fileMoveFromFileDeletionChange( 'unlink(src) + change(dst -> newDst) = FileMove.overwrite(src, newDst)' ) - return fileMove + return { change: fileMove, previousChange: fileDeletion } } function dirMoveFromAddUnlink( sameInodeChange /*: ?LocalChange */, e /*: LocalDirUnlinked */ -) /*: * */ { +) /*: ?{ change: LocalDirMove, previousChange: LocalDirAddition } */ { const addChange /*: ?LocalDirAddition */ = maybePutFolder(sameInodeChange) if (!addChange) return - const dirMove /*: Object */ = build('DirMove', addChange.path, { + const dirMove /*: LocalDirMove */ = { + sideName, + type: 'DirMove', + path: addChange.path, stats: addChange.stats, - old: e.old, - ino: addChange.ino, - wip: addChange.wip - }) + ino: addChange.ino + } + + if (addChange.wip) dirMove.wip = true + if (e.old) dirMove.old = e.old + if (addChange.old) dirMove.overwrite = true log.debug( { @@ -529,13 +569,13 @@ function dirMoveFromAddUnlink( 'addDir + unlinkDir = DirMove' ) - return dirMove + return { change: dirMove, previousChange: addChange } } function fileMoveIdentical( sameInodeChange /*: ?LocalChange */, e /*: LocalFileUpdated */ -) /*: * */ { +) /*: ?{ change: LocalFileMove, previousChange: LocalFileAddition } */ { const addChange /*: ?LocalFileAddition */ = maybeAddFile(sameInodeChange) if ( !addChange || @@ -544,13 +584,17 @@ function fileMoveIdentical( ) return - const fileMove /*: Object */ = build('FileMove', addChange.path, { + const fileMove /*: LocalFileMove */ = { + sideName, + type: 'FileMove', + path: addChange.path, stats: e.stats, md5sum: e.md5sum, - old: e.old, - ino: addChange.ino, - wip: addChange.wip - }) + ino: addChange.ino + } + + if (e.wip) fileMove.wip = true + if (e.old) fileMove.old = e.old log.debug( { @@ -562,12 +606,12 @@ function fileMoveIdentical( 'add + change = FileMove (same id)' ) - return fileMove + return { change: fileMove, previousChange: addChange } } function fileMoveIdenticalOffline( dstEvent /*: LocalFileAdded */ -) /*: ?LocalFileMove */ { +) /*: ?{ change: LocalFileMove, previousChange: null } */ { const srcDoc = dstEvent.old if ( !srcDoc || @@ -576,16 +620,20 @@ function fileMoveIdenticalOffline( ) return - const fileMove /*: Object */ = build('FileMove', dstEvent.path, { + const fileMove /*: LocalFileMove */ = { + sideName, + type: 'FileMove', + path: dstEvent.path, stats: dstEvent.stats, md5sum: dstEvent.md5sum, old: srcDoc, ino: dstEvent.stats.ino, wip: dstEvent.wip - }) + } log.debug( { + // $FlowFixMe: fileMove.old is not null since srcDoc is not null oldpath: fileMove.old.path, path: fileMove.path, ino: fileMove.ino, @@ -594,13 +642,13 @@ function fileMoveIdenticalOffline( 'add = FileMove (same id, offline)' ) - return fileMove + return { change: fileMove, previousChange: null } } function dirRenamingCaseOnlyFromAddAdd( sameInodeChange /*: ?LocalChange */, e /*: LocalDirAdded */ -) /*: * */ { +) /*: ?{ change: LocalDirMove, previousChange: LocalDirAddition } */ { const addChange /*: ?LocalDirAddition */ = maybePutFolder(sameInodeChange) if ( !addChange || @@ -610,12 +658,16 @@ function dirRenamingCaseOnlyFromAddAdd( return } - const dirMove /*: Object */ = build('DirMove', e.path, { + const dirMove /*: LocalDirMove */ = { + sideName, + type: 'DirMove', + path: e.path, stats: addChange.stats, - old: addChange.old, - ino: addChange.ino, - wip: e.wip - }) + ino: addChange.ino + } + + if (e.wip) dirMove.wip = true + if (addChange.old) dirMove.old = addChange.old log.debug( { @@ -627,12 +679,12 @@ function dirRenamingCaseOnlyFromAddAdd( 'addDir + addDir = DirMove (same id)' ) - return dirMove + return { change: dirMove, previousChange: addChange } } function dirMoveIdenticalOffline( dstEvent /*: LocalDirAdded */ -) /*: ?LocalDirMove */ { +) /*: ?{ change: LocalDirMove, previousChange: null } */ { const srcDoc = dstEvent.old if ( !srcDoc || @@ -641,15 +693,20 @@ function dirMoveIdenticalOffline( ) return - const dirMove /*: Object */ = build('DirMove', dstEvent.path, { - stats: dstEvent.stats, + const dirMove /*: LocalDirMove */ = { + sideName, + type: 'DirMove', + path: dstEvent.path, old: srcDoc, - ino: dstEvent.stats.ino, - wip: dstEvent.wip - }) + stats: dstEvent.stats, + ino: dstEvent.stats.ino + } + + if (dstEvent.wip) dirMove.wip = true log.debug( { + // $FlowFixMe: dirMove.old is not null since srcDoc is not null oldpath: dirMove.old.path, path: dirMove.path, ino: dirMove.ino, @@ -658,7 +715,7 @@ function dirMoveIdenticalOffline( 'addDir = DirMove (same id, offline)' ) - return dirMove + return { change: dirMove, previousChange: null } } /*:: @@ -669,7 +726,7 @@ export type LocalMoveEvent = LocalFileAdded|LocalDirAdded function includeAddEventInFileMove( sameInodeChange /*: ?LocalChange */, e /*: LocalFileAdded */ -) { +) /*: ?{ change: LocalFileMove, previousChange: LocalFileMove } */ { const moveChange /*: ?LocalFileMove */ = maybeMoveFile(sameInodeChange) if (!moveChange) return if ( @@ -679,28 +736,32 @@ function includeAddEventInFileMove( moveChange.md5sum === e.md5sum ) return - moveChange.path = e.path - moveChange.stats = e.stats - moveChange.ino = e.stats.ino - moveChange.md5sum = e.md5sum - - if (e.md5sum) { - delete moveChange.wip - } else { - moveChange.wip = true + + const newMove /*: LocalFileMove */ = { + sideName, + type: 'FileMove', + path: e.path, + stats: e.stats, + ino: e.stats.ino, + old: moveChange.old, + md5sum: e.md5sum, + update: e } + if (!newMove.md5sum) newMove.wip = true + if (moveChange.overwrite) newMove.overwrite = moveChange.overwrite + log.debug( { - oldpath: moveChange.old && moveChange.old.path, - path: moveChange.path, - ino: moveChange.ino, - wip: moveChange.wip + oldpath: newMove.old && newMove.old.path, + path: newMove.path, + ino: newMove.ino, + wip: newMove.wip }, 'FileMove + add = FileMove' ) - return true + return { change: newMove, previousChange: moveChange } } /** @@ -710,7 +771,7 @@ function includeAddEventInFileMove( function dirMoveOverwriteOnMacAPFS( sameInodeChange /*: ?LocalChange */, e /*: LocalDirAdded */ -) { +) /*: ?{ change: LocalDirMove, previousChange: LocalDirMove } */ { const moveChange /*: ?LocalDirMove */ = maybeMoveFolder(sameInodeChange) if (!moveChange) return if ( @@ -718,173 +779,219 @@ function dirMoveOverwriteOnMacAPFS( moveChange.path.normalize() === e.path.normalize() && moveChange.stats.ino === e.stats.ino ) { - moveChange.overwrite = true + const newMove /*: LocalDirMove */ = { + sideName, + type: 'DirMove', + path: moveChange.path, + old: moveChange.old, + ino: moveChange.ino, + stats: moveChange.stats, + overwrite: true + } + + if (moveChange.wip) newMove.wip = true + if (moveChange.needRefetch) newMove.needRefetch = true log.debug( { - oldpath: moveChange.old && moveChange.old.path, - path: moveChange.path, - ino: moveChange.ino + oldpath: newMove.old && newMove.old.path, + path: newMove.path, + ino: newMove.ino }, 'DirMove(a, b) + addDir(b) = DirMove.overwrite(a, b) [chokidar bug]' ) - return true + return { change: newMove, previousChange: moveChange } } } function dirRenamingIdenticalLoopback( sameInodeChange /*: ?LocalChange */, e /*: LocalDirAdded */ -) { +) /*: ?{ change: LocalIgnored, previousChange: LocalDirMove } */ { const moveChange /*: ?LocalDirMove */ = maybeMoveFolder(sameInodeChange) - if (!moveChange) return - if (moveChange.old.path.normalize() === e.path.normalize()) { - // $FlowFixMe - moveChange.type = 'Ignored' - - log.debug( - { - oldpath: moveChange.old && moveChange.old.path, - path: moveChange.path, - ino: moveChange.ino - }, - `DirMove(a, b) + addDir(a) = Ignored(b, a) (identical renaming loopback)` - ) + if ( + !moveChange || + !moveChange.old || + moveChange.old.path.normalize() !== e.path.normalize() + ) + return - return true + const ignored /*: LocalIgnored */ = { + sideName, + type: 'Ignored', + path: moveChange.path } + + log.debug( + { + oldpath: moveChange.old && moveChange.old.path, + path: ignored.path, + ino: moveChange.ino + }, + `DirMove(a, b) + addDir(a) = Ignored(b, a) (identical renaming loopback)` + ) + + return { change: ignored, previousChange: moveChange } } function includeAddDirEventInDirMove( sameInodeChange /*: ?LocalChange */, e /*: LocalDirAdded */ -) { +) /*: ?{ change: LocalDirMove, previousChange: LocalDirMove } */ { const moveChange /*: ?LocalDirMove */ = maybeMoveFolder(sameInodeChange) if (!moveChange) return - moveChange.path = e.path - moveChange.stats = e.stats - moveChange.ino = e.stats.ino - - if (!e.wip) { - delete moveChange.wip - } else { - moveChange.wip = true + + const newMove /*: LocalDirMove */ = { + sideName, + type: 'DirMove', + path: e.path, + old: moveChange.old, + stats: e.stats, + ino: e.stats.ino } + if (e.wip) newMove.wip = true + if (moveChange.needRefetch) newMove.needRefetch = true + if (moveChange.overwrite) newMove.overwrite = true + log.debug( { - oldpath: moveChange.old && moveChange.old.path, - path: moveChange.path, - ino: moveChange.ino, - wip: moveChange.wip + oldpath: newMove.old && newMove.old.path, + path: newMove.path, + ino: newMove.ino, + wip: newMove.wip }, 'DirMove + addDir = DirMove' ) - return true + return { change: newMove, previousChange: moveChange } } function includeChangeEventIntoFileMove( sameInodeChange /*: ?LocalChange */, e /*: LocalFileUpdated */ -) { +) /*: ?{ change: LocalFileMove, previousChange: LocalFileMove } */ { const moveChange /*: ?LocalFileMove */ = maybeMoveFile(sameInodeChange) if (!moveChange) return - moveChange.md5sum = e.md5sum - moveChange.update = _.defaults( - { - // In almost all cases, change event has the destination path. - // But on macOS identical renaming, it has the source path. - // So we make sure the file change being merged after the move - // won't erase the destination path with the source one. - // Should be a no-op on all other cases anyway, since e.path - // should already be the same as moveChange.path - path: moveChange.path - }, - e - ) - moveChange.stats = e.stats - moveChange.ino = e.stats.ino + + const newMove /*: LocalFileMove */ = { + sideName, + type: 'FileMove', + path: moveChange.path, + stats: e.stats, + ino: e.stats.ino, + md5sum: e.md5sum, + update: _.defaults( + { + // In almost all cases, change event has the destination path. + // But on macOS identical renaming, it has the source path. + // So we make sure the file change being merged after the move + // won't erase the destination path with the source one. + // Should be a no-op on all other cases anyway, since e.path + // should already be the same as moveChange.path + path: moveChange.path + }, + e + ) + } + + if (e.wip) newMove.wip = true + if (moveChange.needRefetch) newMove.needRefetch = true + if (moveChange.old) newMove.old = moveChange.old + if (moveChange.overwrite) newMove.overwrite = moveChange.overwrite log.debug( { - oldPath: moveChange.old && moveChange.old.path, - path: moveChange.path, - ino: moveChange.ino + oldPath: newMove.old && newMove.old.path, + path: newMove.path, + ino: newMove.ino }, 'FileMove + change' ) - return true + return { change: newMove, previousChange: moveChange } } -function convertFileMoveToDeletion(samePathChange /*: ?LocalChange */) { - const change /*: ?LocalFileMove */ = maybeMoveFile(samePathChange) - if (!change || !change.wip) return - // $FlowFixMe - change.type = 'FileDeletion' - change.path = change.old.path - delete change.md5sum - delete change.stats - delete change.wip +function convertFileMoveToDeletion( + samePathChange /*: ?LocalChange */ +) /*: ?{ change: LocalFileDeletion, previousChange: LocalFileMove } */ { + const moveChange /*: ?LocalFileMove */ = maybeMoveFile(samePathChange) + if (!moveChange || !moveChange.wip || !moveChange.old) return + + const deletion /*: LocalFileDeletion */ = { + sideName, + type: 'FileDeletion', + path: moveChange.old.path, + old: moveChange.old, + ino: moveChange.ino + } log.debug( - { path: change.path, ino: change.ino }, + { path: deletion.path, ino: deletion.ino }, 'FileMove + unlink = FileDeletion' ) - return true + return { change: deletion, previousChange: moveChange } } -function convertDirMoveToDeletion(samePathChange /*: ?LocalChange */) { - const change /*: ?LocalDirMove */ = maybeMoveFolder(samePathChange) - if (!change || !change.wip) return - // $FlowFixMe - change.type = 'DirDeletion' - change.path = change.old.path - delete change.stats - delete change.wip +function convertDirMoveToDeletion( + samePathChange /*: ?LocalChange */ +) /*: ?{ change: LocalDirDeletion, previousChange: LocalDirMove } */ { + const moveChange /*: ?LocalDirMove */ = maybeMoveFolder(samePathChange) + if (!moveChange || !moveChange.wip || !moveChange.old) return + + const deletion /*: LocalDirDeletion */ = { + sideName, + type: 'DirDeletion', + path: moveChange.old.path, + old: moveChange.old, + ino: moveChange.ino + } log.debug( - { path: change.path, ino: change.ino }, + { path: deletion.path, ino: deletion.ino }, 'DirMove + unlinkDir = DirDeletion' ) - return true + return { change: deletion, previousChange: moveChange } } -function ignoreDirAdditionThenDeletion(samePathChange /*: ?LocalChange */) { - const addChangeSamePath /*: ?LocalDirAddition */ = maybePutFolder( - samePathChange - ) - if (addChangeSamePath && addChangeSamePath.wip) { - // $FlowFixMe - addChangeSamePath.type = 'Ignored' +function ignoreDirAdditionThenDeletion( + samePathChange /*: ?LocalChange */ +) /*: ?{ change: LocalIgnored, previousChange: LocalDirAddition } */ { + const addChange /*: ?LocalDirAddition */ = maybePutFolder(samePathChange) + if (!addChange || !addChange.wip) return - log.debug( - { path: addChangeSamePath.path, ino: addChangeSamePath.ino }, - 'Folder was added then deleted. Ignoring add.' - ) - - return true + const ignored /*: LocalIgnored */ = { + sideName, + type: 'Ignored', + path: addChange.path } -} -function ignoreFileAdditionThenDeletion(samePathChange /*: ?LocalChange */) { - const addChangeSamePath /*: ?LocalFileAddition */ = maybeAddFile( - samePathChange + log.debug( + { path: addChange.path, ino: addChange.ino }, + 'Folder was added then deleted. Ignoring add.' ) - if (addChangeSamePath && addChangeSamePath.wip) { - // $FlowFixMe - addChangeSamePath.type = 'Ignored' - delete addChangeSamePath.wip - delete addChangeSamePath.md5sum - log.debug( - { path: addChangeSamePath.path, ino: addChangeSamePath.ino }, - 'File was added then deleted. Ignoring add.' - ) + return { change: ignored, previousChange: addChange } +} - return true +function ignoreFileAdditionThenDeletion( + samePathChange /*: ?LocalChange */ +) /*: ?{ change: LocalIgnored, previousChange: LocalFileAddition } */ { + const addChange /*: ?LocalFileAddition */ = maybeAddFile(samePathChange) + if (!addChange || !addChange.wip) return + + const ignored /*: LocalIgnored */ = { + sideName, + type: 'Ignored', + path: addChange.path } + + log.debug( + { path: ignored.path, ino: addChange.ino }, + 'File was added then deleted. Ignoring add.' + ) + + return { change: ignored, previousChange: addChange } } diff --git a/core/local/chokidar/normalize_paths.js b/core/local/chokidar/normalize_paths.js index 86874261c..44e335909 100644 --- a/core/local/chokidar/normalize_paths.js +++ b/core/local/chokidar/normalize_paths.js @@ -29,31 +29,32 @@ const step = async ( ) /*: Promise */ => { const normalizedPaths = [] - return new Promise.mapSeries(changes, async ( - c /*: LocalChange */ - ) /*: Promise */ => { - if (c.type !== 'Ignored') { - const parentPath = path.dirname(c.path) - const parent = - parentPath !== '.' ? await pouch.bySyncedPath(parentPath) : null - c.path = normalizedPath( - c.path, - c.old ? c.old.path : undefined, - parent, - normalizedPaths - ) - normalizedPaths.push(c.path) - - if (c.path !== normalizedPath) { - log.info( - { path: c.path, normalizedPath }, - 'normalizing local path to match existing doc and parent norms' + return new Promise.mapSeries( + changes, + async (c /*: LocalChange */) /*: Promise */ => { + if (c.type !== 'Ignored') { + const parentPath = path.dirname(c.path) + const parent = + parentPath !== '.' ? await pouch.bySyncedPath(parentPath) : null + c.path = normalizedPath( + c.path, + c.old ? c.old.path : undefined, + parent, + normalizedPaths ) + normalizedPaths.push(c.path) + + if (c.path !== normalizedPath) { + log.info( + { path: c.path, normalizedPath }, + 'normalizing local path to match existing doc and parent norms' + ) + } } - } - return c - }) + return c + } + ) } const previouslyNormalizedPath = ( diff --git a/core/local/chokidar/watcher.js b/core/local/chokidar/watcher.js index 70928352b..4d28ce9b2 100644 --- a/core/local/chokidar/watcher.js +++ b/core/local/chokidar/watcher.js @@ -145,23 +145,23 @@ class LocalWatcher { 'unlink', 'unlinkDir' ]) { - this.watcher.on(eventType, ( - path /*: ?string */, - stats /*: ?fs.Stats */ - ) => { - const isInitialScan = - this.initialScanParams && !this.initialScanParams.flushed - log.chokidar.debug({ path, stats, isInitialScan }, eventType) - const newEvent = chokidarEvent.build(eventType, path, stats) - if (newEvent.type !== eventType) { - log.info( - { eventType, event: newEvent }, - 'fixed wrong fsevents event type' - ) + this.watcher.on( + eventType, + (path /*: ?string */, stats /*: ?fs.Stats */) => { + const isInitialScan = + this.initialScanParams && !this.initialScanParams.flushed + log.chokidar.debug({ path, stats, isInitialScan }, eventType) + const newEvent = chokidarEvent.build(eventType, path, stats) + if (newEvent.type !== eventType) { + log.info( + { eventType, event: newEvent }, + 'fixed wrong fsevents event type' + ) + } + this.buffer.push(newEvent) + this.events.emit('buffering-start') } - this.buffer.push(newEvent) - this.events.emit('buffering-start') - }) + ) } // To detect which files&folders have been removed since the last run of diff --git a/core/local/index.js b/core/local/index.js index 464f61763..9d9dce2a0 100644 --- a/core/local/index.js +++ b/core/local/index.js @@ -137,26 +137,15 @@ class Local /*:: implements Reader, Writer */ { /* Helpers */ /** - * Return a function that will update last modification date - * and does a chmod +x if the file is executable + * Update last modification date and do a chmod +x if the file is executable. * * Note: UNIX has 3 timestamps for a file/folder: * - atime for last access * - ctime for change (metadata or content) * - utime for update (content only) - * This function updates utime and ctime according to the last - * modification date. + * This function updates utime and ctime according to the last modification + * date. */ - metadataUpdater(doc /*: SavedMetadata */) { - return (callback /*: Callback */) => { - this.updateMetadataAsync(doc) - .then(() => { - callback() - }) - .catch(callback) - } - } - async updateMetadataAsync /*:: */( doc /*: T */ ) /*: Promise */ { @@ -244,90 +233,110 @@ class Local /*:: implements Reader, Writer */ { } }, - (existingFilePath, next) => { - fse.ensureDir(this.tmpPath, () => { - hideOnWindows(this.tmpPath) - if (existingFilePath) { - log.info( - { path: filePath }, - `Recopy ${existingFilePath} -> ${filePath}` - ) - this.events.emit('transfer-copy', doc) - fse.copy(existingFilePath, tmpFile, next) - } else { - this.other.createReadStreamAsync(doc).then( - source => { - stream.pipeline(source, fse.createWriteStream(tmpFile), err => - next(err) + async existingFilePath => { + return new Promise((resolve, reject) => { + fse.ensureDir(this.tmpPath, async () => { + hideOnWindows(this.tmpPath) + if (existingFilePath) { + log.info( + { path: filePath }, + `Recopy ${existingFilePath} -> ${filePath}` + ) + this.events.emit('transfer-copy', doc) + fse.copy(existingFilePath, tmpFile, err => { + if (err) { + reject(err) + } else { + resolve() + } + }) + } else { + try { + const source = await this.other.createReadStreamAsync(doc) + stream.pipeline( + source, + fse.createWriteStream(tmpFile), + err => { + if (err) { + reject(err) + } else { + resolve() + } + } ) - }, - err => { - next(err) + } catch (err) { + reject(err) } - ) - } + } + }) }) }, - next => { + async () => { if (doc.md5sum != null) { - // TODO: Share checksumer instead of chaining properties - this.watcher.checksumer - .push(tmpFile) - .asCallback(function(err, md5sum) { - if (err) { - next(err) - } else if (md5sum === doc.md5sum) { - next() - } else { - next(new Error('Invalid checksum')) - } - }) - } else { - next() + const md5sum = await this.watcher.checksumer.push(tmpFile) + + if (md5sum !== doc.md5sum) { + throw new Error('Invalid checksum') + } } }, - next => { + async () => { // After downloading a file, check that the size is correct too // (more protection against stack corruption) - stater.withStats(tmpFile, (err, stats) => { - if (err) { - next(err) - } else if (!doc.size || doc.size === stats.size) { - stater.assignInoAndFileId(doc, stats) - next() - } else { - next(sentry.flag(new Error('Invalid size'))) - } + return new Promise((resolve, reject) => { + stater.withStats(tmpFile, (err, stats) => { + if (err) { + reject(err) + } else if (!doc.size || doc.size === stats.size) { + stater.assignInoAndFileId(doc, stats) + resolve() + } else { + reject(sentry.flag(new Error('Invalid size'))) + } + }) }) }, - next => - fse.ensureDir(parent, () => - fse.rename(tmpFile, filePath, err => { - if ( - err != null && - err.code === 'EPERM' && - doc.mime === NOTE_MIME_TYPE - ) { - // Old Cozy Note with read-only permissions. - // We need to remove the old version before we can write the - // new one. - fse.move(tmpFile, filePath, { overwrite: true }, next) - } else { - next(err) - } + async () => { + return new Promise((resolve, reject) => { + fse.ensureDir(parent, () => { + fse.rename(tmpFile, filePath, err => { + if ( + err != null && + err.code === 'EPERM' && + doc.mime === NOTE_MIME_TYPE + ) { + // Old Cozy Note with read-only permissions. + // We need to remove the old version before we can write the + // new one. + fse.move(tmpFile, filePath, { overwrite: true }, err => { + if (err) { + reject(err) + } else { + resolve() + } + }) + } else if (err) { + reject(err) + } else { + resolve() + } + }) }) - ), + }) + }, + + async () => { + await this.updateMetadataAsync(doc) + }, - this.metadataUpdater(doc), - next => { + async () => { metadata.updateLocal(doc) - next() } ], - function(err) { + function (err) { stopMeasure() if (err) { log.warn({ path: doc.path, err, doc }, 'addFile failed') @@ -345,7 +354,7 @@ class Local /*:: implements Reader, Writer */ { [ cb => fse.ensureDir(folderPath, cb), this.inodeSetter(doc), - this.metadataUpdater(doc), + async () => this.updateMetadataAsync(doc), cb => { metadata.updateLocal(doc) cb() @@ -363,12 +372,7 @@ class Local /*:: implements Reader, Writer */ { /** Update the metadata of a file */ async updateFileMetadataAsync(doc /*: SavedMetadata */) /*: Promise */ { log.info({ path: doc.path }, 'Updating file metadata...') - await new Promise((resolve, reject) => { - this.metadataUpdater(doc)(err => { - if (err) reject(err) - else resolve() - }) - }) + await this.updateMetadataAsync(doc) metadata.updateLocal(doc) } diff --git a/core/metadata.js b/core/metadata.js index 5527d27bb..dc5bf5f18 100644 --- a/core/metadata.js +++ b/core/metadata.js @@ -396,10 +396,8 @@ function detectIncompatibilities( path.join(syncPath, metadata.path), platform ) - const incompatibilities /*: PlatformIncompatibility[] */ = detectPathIncompatibilities( - metadata.path, - metadata.docType - ) + const incompatibilities /*: PlatformIncompatibility[] */ = + detectPathIncompatibilities(metadata.path, metadata.docType) if (pathLenghIncompatibility) { incompatibilities.unshift(pathLenghIncompatibility) } diff --git a/core/pouch/index.js b/core/pouch/index.js index dbe2a9905..4bb60f59f 100644 --- a/core/pouch/index.js +++ b/core/pouch/index.js @@ -136,25 +136,20 @@ class Pouch { * management and block the app with a "Synchronization impossible" status. */ async _allDocs(options /*: ?{ include_docs: boolean } */) { - return new Promise(async (resolve, reject) => { - const uncaughtExceptionHandler = async err => { - log.error( - { err, options, sentry: true }, - 'uncaughtException in _allDocs. PouchDB db might be corrupt.' - ) - reject(err) - } - process.once('uncaughtException', uncaughtExceptionHandler) - - try { - const results = await this.db.allDocs(options) - resolve(results) - } catch (err) { - reject(err) - } finally { - process.off('uncaughtException', uncaughtExceptionHandler) - } - }) + const uncaughtExceptionHandler = err => { + log.error( + { err, options, sentry: true }, + 'uncaughtException in _allDocs. PouchDB db might be corrupt.' + ) + throw err + } + process.once('uncaughtException', uncaughtExceptionHandler) + + try { + return await this.db.allDocs(options) + } finally { + process.off('uncaughtException', uncaughtExceptionHandler) + } } async allDocs() /*: Promise */ { @@ -513,7 +508,7 @@ class Pouch { async addByChecksumView() { /* !pragma no-coverage-next */ /* istanbul ignore next */ - const query = function(doc) { + const query = function (doc) { if ('md5sum' in doc) { // $FlowFixMe return emit(doc.md5sum) // eslint-disable-line no-undef @@ -526,7 +521,7 @@ class Pouch { async addByRemoteIdView() { /* !pragma no-coverage-next */ /* istanbul ignore next */ - const query = function(doc) { + const query = function (doc) { if ('remote' in doc) { // $FlowFixMe return emit(doc.remote._id) // eslint-disable-line no-undef diff --git a/core/pouch/migrations.js b/core/pouch/migrations.js index 83fcd8cc9..994f70b14 100644 --- a/core/pouch/migrations.js +++ b/core/pouch/migrations.js @@ -4,7 +4,7 @@ */ const PouchDB = require('pouchdb') -const uuid = require('uuid/v4') +const uuid = require('uuid').v4 const path = require('path') const { PouchError } = require('./error') @@ -447,14 +447,15 @@ async function migrationDBPath( originalDBInfo /*: PouchDBInfo */ ) /*: Promise */ { const date = new Date() - const dateString = `${date.getFullYear()}-${date.getMonth() + - 1}-${date.getDate()}` + const dateString = `${date.getFullYear()}-${ + date.getMonth() + 1 + }-${date.getDate()}` const safeUUID = uuid().replace(/-/g, '') return `${originalDBInfo.db_name}-migration-${dateString}-${safeUUID}` } async function replicateDB(fromDB /*: PouchDB */, toDB /*: PouchDB */) { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { fromDB.replicate .to(toDB) .on('complete', async () => { diff --git a/core/remote/cozy.js b/core/remote/cozy.js index 34c298573..3d10fcfd7 100644 --- a/core/remote/cozy.js +++ b/core/remote/cozy.js @@ -315,9 +315,9 @@ class RemoteCozy { ? await fetchInitialChanges(since, client, batchSize) : await fetchChangesFromFeed(since, this.client, batchSize) - const docs = (await this.completeRemoteDocs( - dropSpecialDocs(remoteDocs) - )).sort(byPath) + const docs = ( + await this.completeRemoteDocs(dropSpecialDocs(remoteDocs)) + ).sort(byPath) return { last_seq, docs } } @@ -632,7 +632,11 @@ async function fetchInitialChanges( batchSize /*: number */, remoteDocs /*: Array */ = [] ) { - const { newLastSeq: last_seq, pending, results } = await client + const { + newLastSeq: last_seq, + pending, + results + } = await client .collection(FILES_DOCTYPE) .fetchChanges( { since, includeDocs: true, limit: batchSize }, diff --git a/core/remote/index.js b/core/remote/index.js index 613ce9ae8..7e6de9619 100644 --- a/core/remote/index.js +++ b/core/remote/index.js @@ -277,16 +277,12 @@ class Remote /*:: implements Reader, Writer */ { ifMatch: doc.remote._rev } - try { - const newRemoteDoc = await this.remoteCozy.updateAttributesById( - doc.remote._id, - attrs, - opts - ) - metadata.updateRemote(doc, newRemoteDoc) - } catch (err) { - throw err - } + const newRemoteDoc = await this.remoteCozy.updateAttributesById( + doc.remote._id, + attrs, + opts + ) + metadata.updateRemote(doc, newRemoteDoc) } async moveAsync /*:: */( @@ -322,16 +318,12 @@ class Remote /*:: implements Reader, Writer */ { await this.trashAsync(overwrite) } - try { - const newRemoteDoc = await this.remoteCozy.updateAttributesById( - remoteId, - attrs, - opts - ) - metadata.updateRemote(newMetadata, newRemoteDoc) - } catch (err) { - throw err - } + const newRemoteDoc = await this.remoteCozy.updateAttributesById( + remoteId, + attrs, + opts + ) + metadata.updateRemote(newMetadata, newRemoteDoc) if (overwrite && isOverwritingTarget) { try { @@ -474,10 +466,7 @@ class Remote /*:: implements Reader, Writer */ { /** Extract the remote parent path and leaf name from a local path */ function dirAndName(localPath /*: string */) /*: [string, string] */ { - const dir = path - .dirname(localPath) - .split(path.sep) - .join('/') + const dir = path.dirname(localPath).split(path.sep).join('/') const name = path.basename(localPath) return [dir, name] } diff --git a/core/remote/registration.js b/core/remote/registration.js index 45e868067..0c570ea06 100644 --- a/core/remote/registration.js +++ b/core/remote/registration.js @@ -6,7 +6,7 @@ const autoBind = require('auto-bind') const os = require('os') const http = require('http') -const opn = require('opn') +const open = require('open') const CozyClient = require('cozy-client-js').Client @@ -24,7 +24,7 @@ module.exports = class Registration { 'Please visit the following url to authorize the application: ', url ) - opn(url) + open(url) }) autoBind(this) diff --git a/core/remote/watcher/index.js b/core/remote/watcher/index.js index 631624984..d17193dfd 100644 --- a/core/remote/watcher/index.js +++ b/core/remote/watcher/index.js @@ -204,9 +204,9 @@ class RemoteWatcher { { path: change.doc.path }, 'Fetching content of unknwon folder...' ) - const children = (await this.remoteCozy.getDirectoryContent( - change.doc.remote - )).filter(child => + const children = ( + await this.remoteCozy.getDirectoryContent(change.doc.remote) + ).filter(child => docs.every(doc => doc._id !== child._id || doc._rev !== child._rev) ) const childChanges = await this.analyse( diff --git a/core/remote/watcher/normalizePaths.js b/core/remote/watcher/normalizePaths.js index 3e2694552..1b68c89b9 100644 --- a/core/remote/watcher/normalizePaths.js +++ b/core/remote/watcher/normalizePaths.js @@ -26,43 +26,44 @@ const normalizePaths = async ( ) /*: Promise */ => { const normalizedPaths = [] - return new Promise.mapSeries(changes, async ( - c /*: RemoteChange */ - ) /*: Promise */ => { - if ( - c.type === 'FileAddition' || - c.type === 'DirAddition' || - c.type === 'FileUpdate' || - c.type === 'DirUpdate' || - c.type === 'FileMove' || - c.type === 'DirMove' || - c.type === 'DescendantChange' - ) { - const old /*: ?SavedMetadata */ = - c.type === 'FileMove' || c.type === 'DirMove' - ? c.was - : await pouch.bySyncedPath(c.doc.path) - const parentPath = path.dirname(c.doc.path) - const parent /*: ?SavedMetadata */ = - parentPath !== '.' ? await pouch.bySyncedPath(parentPath) : undefined - c.doc.path = normalizedPath( - c.doc.path, - old ? old.path : undefined, - parent, - normalizedPaths - ) - normalizedPaths.push(c.doc.path) - - if (c.doc.path !== normalizedPath) { - log.info( - { path: c.doc.path, normalizedPath }, - 'normalizing local path to match existing doc and parent norms' + return new Promise.mapSeries( + changes, + async (c /*: RemoteChange */) /*: Promise */ => { + if ( + c.type === 'FileAddition' || + c.type === 'DirAddition' || + c.type === 'FileUpdate' || + c.type === 'DirUpdate' || + c.type === 'FileMove' || + c.type === 'DirMove' || + c.type === 'DescendantChange' + ) { + const old /*: ?SavedMetadata */ = + c.type === 'FileMove' || c.type === 'DirMove' + ? c.was + : await pouch.bySyncedPath(c.doc.path) + const parentPath = path.dirname(c.doc.path) + const parent /*: ?SavedMetadata */ = + parentPath !== '.' ? await pouch.bySyncedPath(parentPath) : undefined + c.doc.path = normalizedPath( + c.doc.path, + old ? old.path : undefined, + parent, + normalizedPaths ) + normalizedPaths.push(c.doc.path) + + if (c.doc.path !== normalizedPath) { + log.info( + { path: c.doc.path, normalizedPath }, + 'normalizing local path to match existing doc and parent norms' + ) + } } - } - return c - }) + return c + } + ) } module.exports = normalizePaths diff --git a/core/remote/watcher/squashMoves.js b/core/remote/watcher/squashMoves.js index 675b0099a..e190328ad 100644 --- a/core/remote/watcher/squashMoves.js +++ b/core/remote/watcher/squashMoves.js @@ -40,9 +40,8 @@ const findParentMoves = ( previousChanges /*: RemoteChange[] */, encounteredMoves /*: Array */ ) => { - const parentMove /*: ?RemoteDirMove|RemoteDescendantChange */ = encounteredMoves.find( - move => remoteChange.isChildMove(move, change) - ) + const parentMove /*: ?RemoteDirMove|RemoteDescendantChange */ = + encounteredMoves.find(move => remoteChange.isChildMove(move, change)) let squashedParentMove /*: ?RemoteDirMove|RemoteDescendantChange */ if (parentMove) { for (const previousChange of previousChanges) { diff --git a/core/sync/index.js b/core/sync/index.js index 64583bf92..304a428f8 100644 --- a/core/sync/index.js +++ b/core/sync/index.js @@ -394,9 +394,8 @@ class Sync { } ) if (reschedulingStart > 0) { - const changesToReschedule = this.currentChangesToApply.splice( - reschedulingStart - ) + const changesToReschedule = + this.currentChangesToApply.splice(reschedulingStart) await rescheduleChanges(changesToReschedule, this) } @@ -621,10 +620,10 @@ class Sync { asyncOps.push(this.pouch.setLocalSeq(data.seq)) } else { asyncOps.push( - new Promise(async res => { - data.operation = await detectOperation(data, this) + detectOperation(data, this).then(op => { + data.operation = op changes.push(data) - res() + return }) ) } @@ -1003,7 +1002,11 @@ class Sync { this.events.emit( 'user-action-required', err, - cause.change && cause.change.seq + cause.change && cause.change.seq, + cause.change && + cause.change.operation && + cause.change.operation.side != null && + cause.change.operation.side ) break default: @@ -1109,7 +1112,8 @@ class Sync { if ( parent && - (isMarkedForDeletion(parent) && !metadata.isUpToDate(side.name, parent)) + isMarkedForDeletion(parent) && + !metadata.isUpToDate(side.name, parent) ) { log.info( { path: doc.path }, diff --git a/core/syncstate.js b/core/syncstate.js index 10d544984..ad5a9613b 100644 --- a/core/syncstate.js +++ b/core/syncstate.js @@ -8,6 +8,8 @@ const EventEmitter = require('events') const deepDiff = require('deep-diff').diff /*:: +import type { SideName } from './side' + type UserActionStatus = 'Required'|'InProgress' export type UserActionCommand = | 'retry' @@ -17,6 +19,7 @@ export type UserActionCommand = export type UserAction = { seq: ?number, code: string, + side: ?SideName, doc?: { docType: string, path: string, @@ -55,7 +58,8 @@ export type SyncError = {| const makeAction = ( err /*: Object */, - seq /*: ?number */ + seq /*: ?number */, + side /*: ?SideName */ ) /*: UserAction */ => { const { doc } = err const links = err.links || (err.originalErr && err.originalErr.links) @@ -64,6 +68,7 @@ const makeAction = ( seq: err.seq || seq || null, status: 'Required', code: err.code, + side: side || null, doc: doc || null, links: links || null } diff --git a/core/utils/logger.js b/core/utils/logger.js index 92101d1f4..c43f68a5b 100644 --- a/core/utils/logger.js +++ b/core/utils/logger.js @@ -49,7 +49,7 @@ if (process.env.TESTDEBUG) { type: 'raw', level: process.env.TESTDEBUG, stream: { - write: function(msg) { + write: function (msg) { // eslint-disable-next-line no-console console.log( msg.component, diff --git a/core/utils/mime.js b/core/utils/mime.js index 106046609..143a66421 100644 --- a/core/utils/mime.js +++ b/core/utils/mime.js @@ -7,7 +7,11 @@ function lookup(filepath) { if (path.extname(filepath) === '.cozy-note') { return NOTE_MIME_TYPE } - return mime.lookup(filepath) + // Sinve mime v2.x, no default type is returned when none can be found for the + // given path. + // We re-introduce the previous default type, `bin`, for backwards + // compatibility. + return mime.getType(filepath) || mime.getType('bin') } module.exports = { diff --git a/core/utils/sentry.js b/core/utils/sentry.js index 43ab52120..84509d2e1 100644 --- a/core/utils/sentry.js +++ b/core/utils/sentry.js @@ -24,8 +24,8 @@ module.exports = { const { COZY_NO_SENTRY, DEBUG, TESTDEBUG } = process.env -const SENTRY_REF = `ed6d0a175d504ead84851717b9bdb72e:324375dbe2ae4bbf8c212ae4eaf26289` -const SENTRY_DSN = `https://${SENTRY_REF}@sentry.cozycloud.cc/91` +const SENTRY_REF = `e937e35fcaa14c9a84ca5980ef8a852e` +const SENTRY_DSN = `https://${SENTRY_REF}@errors.cozycloud.cc/4` const DOMAIN_TO_ENV = { 'cozy.localhost': 'development', 'cozy.works': 'development', @@ -116,9 +116,7 @@ const handleBunyanMessage = msg => { Sentry.withScope(scope => { scope.setLevel(level) - for (const key in extra) { - scope.setExtra(key, extra[key]) - } + scope.setExtras(extra) if (msg.err) { if (msg.err.reason) scope.setExtra('reason', msg.err.reason) diff --git a/core/utils/web.js b/core/utils/web.js new file mode 100644 index 000000000..126bd578d --- /dev/null +++ b/core/utils/web.js @@ -0,0 +1,71 @@ +/* @flow */ + +const path = require('path') +const { generateWebLink } = require('cozy-client') + +const capabilities = require('./capabilities') +const logger = require('./logger') + +const log = new logger({ + component: 'Web' +}) + +/*:: +import type { Config } from '../config' +import type { Pouch } from '../pouch' +import type { Metadata } from '../metadata' +*/ + +const findDoc = async ( + filePath /*: string */, + { config, pouch } /*: { config: Config, pouch: Pouch } */ +) /*: Promise */ => { + const relPath = path.relative(config.syncPath, filePath) + return pouch.bySyncedPath(relPath) +} + +async function findDocument( + filePath /*: string */, + { config, pouch } /*: { config: Config, pouch: Pouch } */ +) /*: Promise<{ driveWebUrl: string }> */ { + const { cozyUrl } = config + const { flatSubdomains } = await capabilities(config) + + const doc = + filePath === '' ? null : await findDoc(filePath, { config, pouch }) + + if (doc) { + const hash = doc.remote + ? doc.remote.type === 'directory' + ? `folder/${doc.remote._id}` + : `folder/${doc.remote.dir_id}/file/${doc.remote._id}` + : '' + log.debug({ path: filePath, doc, hash }, 'findDocument') + + return { + driveWebUrl: generateWebLink({ + cozyUrl, + searchParams: [], + pathname: '', + hash, + slug: 'drive', + subDomainType: flatSubdomains ? 'flat' : 'nested' + }) + } + } else { + log.debug({ path: filePath, doc }, 'findDocument') + + return { + driveWebUrl: generateWebLink({ + cozyUrl, + searchParams: [], + pathname: '', + hash: '', + slug: 'drive', + subDomainType: flatSubdomains ? 'flat' : 'nested' + }) + } + } +} + +module.exports = { findDocument } diff --git a/dev/capture/local.js b/dev/capture/local.js index 1dcd6c425..0dd088b7a 100644 --- a/dev/capture/local.js +++ b/dev/capture/local.js @@ -70,6 +70,7 @@ const setupInitialState = (scenario /*: Scenario */) => { .then(() => fse.stat(abspath(relpath))) .then(stats => { mapInode[stats.ino] = ino + return }) } else { debug('- >', relpath) @@ -81,6 +82,7 @@ const setupInitialState = (scenario /*: Scenario */) => { .then(() => fse.stat(abspath(relpath))) .then(stats => { mapInode[stats.ino] = ino + return }) } }) @@ -133,8 +135,8 @@ const runAndRecordChokidarEvents = scenario => { return new Promise((resolve, reject) => { const watcher = chokidar.watch('.', chokidarOptions) const cleanCallback = cb => - function() { - watcher + function () { + return watcher .close() .then(cb.apply(null, arguments), cb.apply(null, arguments)) } diff --git a/dev/capture/remote.js b/dev/capture/remote.js index 91c3ffb32..8bb76c419 100644 --- a/dev/capture/remote.js +++ b/dev/capture/remote.js @@ -30,7 +30,7 @@ const ROOT_DIR = { path: '/' } -const createInitialTree = async function( +const createInitialTree = async function ( scenario /*: * */, cozy /*: * */, pouch /*: Pouch */ diff --git a/dev/chokidar.js b/dev/chokidar.js index 2f05fe868..4ac469961 100755 --- a/dev/chokidar.js +++ b/dev/chokidar.js @@ -4,7 +4,7 @@ const program = require('commander') const local = require('./capture/local') const fse = require('fs-extra') const path = require('path') -const opn = require('opn') +const open = require('open') const scenarioHelpers = require('../test/support/helpers/scenarios') program @@ -32,11 +32,12 @@ if (scenarioArg) { path.join(__dirname, '..', 'test', 'scenarios', match[1], 'scenario.js') ) - local + return local .setupInitialState(scenario) .then(() => { // eslint-disable-next-line no-console console.log('Inodes :', local.mapInode) + return }) .then(startChokidar) } else { @@ -45,7 +46,7 @@ if (scenarioArg) { function startChokidar() { const syncPath = process.env.COZY_DESKTOP_DIR || local.syncPath - opn(syncPath) + open(syncPath) fse.ensureDirSync(syncPath) @@ -81,4 +82,5 @@ function startChokidar() { // eslint-disable-next-line no-console console.log(`Watching ${syncPath}`) + return } diff --git a/dev/remote/change-dir-exclusions.js b/dev/remote/change-dir-exclusions.js index 86e98b0a2..b31a6f563 100644 --- a/dev/remote/change-dir-exclusions.js +++ b/dev/remote/change-dir-exclusions.js @@ -107,11 +107,7 @@ async function getDirectoryContent(context) { } = j if (_deleted) continue - const parentPath = path - .dirname(dirPath) - .split('/') - .slice(1) - .join('.') + const parentPath = path.dirname(dirPath).split('/').slice(1).join('.') const key = parentPath === '' ? dir.name : `${dir.name}.${parentPath}` const parent = _.get(dirContent, key) if (!parent) continue @@ -132,10 +128,11 @@ async function showTree(context) { console.log(treeify.asTree(tree)) } -app.whenReady().then(async () => { - const { COZY_DESKTOP_DIR } = process.env +app + .whenReady() + .then(async () => { + const { COZY_DESKTOP_DIR } = process.env - try { const config = new Config(path.resolve(COZY_DESKTOP_DIR, '.cozy-desktop')) const oldClient = new OldCozyClient({ cozyURL: config.cozyUrl, @@ -151,21 +148,18 @@ app.whenReady().then(async () => { const { list, add, remove } = args() if (list || (add.length === 0 && remove.length === 0)) { await showTree(context) - app.exit(0) + return } else { - changeDirExclusions(context, { add, remove }) - .then(() => { - // eslint-disable-next-line no-console - console.log('Exclusions changed.') - app.exit(0) // eslint-disable-line no-process-exit - }) - .catch(err => { - // eslint-disable-next-line no-console - console.error(err) - app.exit(1) // eslint-disable-line no-process-exit - }) + await changeDirExclusions(context, { add, remove }) + // eslint-disable-next-line no-console + console.log('Exclusions changed.') + return } - } catch (err) { + }) + .then(() => { + return app.exit(0) // eslint-disable-line no-process-exit + }) + .catch(err => { if (err.message === 'Device not configured') { // eslint-disable-next-line no-console console.log('\nYou need to register a dev client first.\n') @@ -174,5 +168,4 @@ app.whenReady().then(async () => { console.error(err) } app.exit(1) - } -}) + }) diff --git a/dev/remote/generate-test-env.js b/dev/remote/generate-test-env.js index 25f9de246..a737845f8 100644 --- a/dev/remote/generate-test-env.js +++ b/dev/remote/generate-test-env.js @@ -50,22 +50,18 @@ app // session cookie which would trigger a redirect from the login page. return syncSession.clearStorageData() }) - .then(() => - proxy - .setup(app, {}, session, '') - .then(() => - automatedRegistration(cozyUrl, passphrase, storage).process(pkg) - ) - .then(readAccessToken) - .then(generateTestEnv) - .then(() => { - // eslint-disable-next-line no-console - console.log('Remote bootstrap complete.') - process.exit(0) // eslint-disable-line no-process-exit - }) - .catch(err => { - // eslint-disable-next-line no-console - console.error(err) - process.exit(1) // eslint-disable-line no-process-exit - }) - ) + .then(() => proxy.setup(app, {}, session, '')) + .then(() => automatedRegistration(cozyUrl, passphrase, storage).process(pkg)) + .then(readAccessToken) + .then(generateTestEnv) + .then(() => { + // eslint-disable-next-line no-console + console.log('Remote bootstrap complete.') + process.exit(0) // eslint-disable-line no-process-exit + return + }) + .catch(err => { + // eslint-disable-next-line no-console + console.error(err) + process.exit(1) // eslint-disable-line no-process-exit + }) diff --git a/dev/repl.js b/dev/repl.js index d46b22c01..29b8a55ea 100644 --- a/dev/repl.js +++ b/dev/repl.js @@ -46,8 +46,12 @@ const defaultEval = repl.eval repl.eval = function customEval(cmd, context, filename, callback) { defaultEval(cmd, context, filename, (err, result) => { if (result instanceof Promise) { - // eslint-disable-next-line no-console - result.then(console.log).catch(console.error) + // eslint-disable-next-line promise/no-promise-in-callback + result + // eslint-disable-next-line no-console + .then(console.log) + // eslint-disable-next-line no-console + .catch(console.error) result = undefined } callback(err, result) diff --git a/elm.json b/elm.json index afc857a9c..d3eb60127 100644 --- a/elm.json +++ b/elm.json @@ -15,7 +15,8 @@ "elm/regex": "1.0.0", "elm/svg": "1.0.1", "elm/time": "1.0.0", - "elm/url": "1.0.0" + "elm/url": "1.0.0", + "mpizenberg/elm-pointer-events": "3.1.0" }, "indirect": { "elm/virtual-dom": "1.0.2" diff --git a/flow-typed/npm/sinon_vx.x.x.js b/flow-typed/npm/sinon_vx.x.x.js new file mode 100644 index 000000000..dadcc133a --- /dev/null +++ b/flow-typed/npm/sinon_vx.x.x.js @@ -0,0 +1,529 @@ +// flow-typed signature: b17546e627070b9f4fd31c2e99bd1237 +// flow-typed version: <>/sinon_v12.0.1/flow_v0.99.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'sinon' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'sinon' { + declare interface SinonFakeCallApi { + thisValue: any; + args: Array; + exception: any; + returnValue: any; + calledOn(obj: any): boolean; + calledWith(...args: Array): boolean; + calledWithExactly(...args: Array): boolean; + calledWithMatch(...args: Array): boolean; + notCalledWith(...args: Array): boolean; + notCalledWithMatch(...args: Array): boolean; + returned(value: any): boolean; + threw(): boolean; + threw(type: string): boolean; + threw(obj: any): boolean; + } + + declare interface SinonFake extends SinonFakeCallApi { + [key: string]: any; + (...args: Array): any; + callCount: number; + called: boolean; + notCalled: boolean; + calledOnce: boolean; + calledTwice: boolean; + calledThrice: boolean; + firstCall: SinonSpyCall; + secondCall: SinonSpyCall; + thirdCall: SinonSpyCall; + lastCall: SinonSpyCall; + thisValues: Array; + args: Array[]; + exceptions: Array; + returnValues: Array; + calledBefore(anotherSpy: SinonSpy): boolean; + calledAfter(anotherSpy: SinonSpy): boolean; + calledImmediatelyBefore(anotherSpy: SinonSpy): boolean; + calledImmediatelyAfter(anotherSpy: SinonSpy): boolean; + calledWithNew(): boolean; + alwaysCalledOn(obj: any): boolean; + alwaysCalledWith(...args: Array): boolean; + alwaysCalledWithExactly(...args: Array): boolean; + alwaysCalledWithMatch(...args: Array): boolean; + neverCalledWith(...args: Array): boolean; + neverCalledWithMatch(...args: Array): boolean; + alwaysThrew(): boolean; + alwaysThrew(type: string): boolean; + alwaysThrew(obj: any): boolean; + alwaysReturned(): boolean; + getCall(n: number): SinonSpyCall; + getCalls(): Array; + resetHistory(): void; + printf(format: string, ...args: Array): string; + restore(): void; + } + + declare interface SinonFakeStatic { + (): SinonSpy; + (func: any): SinonSpy; + (obj: any, method: string): SinonSpy; + returns(obj: any): SinonFake; + throws(type?: string): SinonFake; + throws(obj: any): SinonFake; + resolves(value?: any): SinonFake; + rejects(): SinonFake; + rejects(errorType: string): SinonFake; + rejects(value: any): SinonFake; + yields(...args: Array): SinonFake; + yieldsAsync(...args: Array): SinonFake; + } + + declare interface SinonSpyCallApi extends SinonFakeCallApi { + thisValue: any; + args: Array; + exception: any; + returnValue: any; + calledOn(obj: any): boolean; + calledWith(...args: Array): boolean; + calledWithExactly(...args: Array): boolean; + calledWithMatch(...args: Array): boolean; + notCalledWith(...args: Array): boolean; + notCalledWithMatch(...args: Array): boolean; + returned(value: any): boolean; + threw(): boolean; + threw(type: string): boolean; + threw(obj: any): boolean; + callArg(pos: number): void; + callArgOn(pos: number, obj: any, ...args: Array): void; + callArgWith(pos: number, ...args: Array): void; + callArgOnWith(pos: number, obj: any, ...args: Array): void; + yield(...args: Array): void; + yieldOn(obj: any, ...args: Array): void; + yieldTo(property: string, ...args: Array): void; + yieldToOn(property: string, obj: any, ...args: Array): void; + } + + declare interface SinonSpyCall extends SinonSpyCallApi { + calledBefore(call: SinonSpyCall): boolean; + calledAfter(call: SinonSpyCall): boolean; + calledWithNew(call: SinonSpyCall): boolean; + lastArg: mixed; + } + + declare interface SinonSpy extends SinonSpyCallApi, SinonFake { + // This blows everything up... idk why + (...args: Array): any; + withArgs(...args: Array): SinonSpy; + invokeCallback(...args: Array): void; + calledOnceWithExactly(...args: Array): boolean; + } + + declare interface SinonSpyStatic { + (): SinonSpy; + (func: any): SinonSpy; + (obj: any, method: string): SinonSpy; + } + + declare interface SinonStub extends SinonSpy { + (...args?: Array): any; + resetBehavior(): void; + resetHistory(): void; + usingPromise(promiseLibrary: any): SinonStub; + returns(obj: any): SinonStub; + returnsArg(index: number): SinonStub; + returnsThis(): SinonStub; + resolves(value?: any): SinonStub; + throws(type?: string): SinonStub; + throws(obj: any): SinonStub; + throwsArg(index: number): SinonStub; + throwsException(type?: string): SinonStub; + throwsException(obj: any): SinonStub; + rejects(): SinonStub; + rejects(errorType: string): SinonStub; + rejects(value: any): SinonStub; + callsArg(index: number): SinonStub; + callThrough(): SinonStub; + callsArgOn(index: number, context: any): SinonStub; + callsArgWith(index: number, ...args: Array): SinonStub; + callsArgOnWith(index: number, context: any, ...args: Array): SinonStub; + callsArgAsync(index: number): SinonStub; + callsArgOnAsync(index: number, context: any): SinonStub; + callsArgWithAsync(index: number, ...args: Array): SinonStub; + callsArgOnWithAsync(index: number, context: any, ...args: Array): SinonStub; + callsFake(func: (...args: Array) => any): SinonStub; + get(func: () => any): SinonStub; + set(func: (v: any) => mixed): SinonStub; + onCall(n: number): SinonStub; + onFirstCall(): SinonStub; + onSecondCall(): SinonStub; + onThirdCall(): SinonStub; + value(val: any): SinonStub; + yields(...args: Array): SinonStub; + yieldsOn(context: any, ...args: Array): SinonStub; + yieldsRight(...args: any[]): SinonStub; + yieldsTo(property: string, ...args: Array): SinonStub; + yieldsToOn(property: string, context: any, ...args: Array): SinonStub; + yieldsAsync(...args: Array): SinonStub; + yieldsOnAsync(context: any, ...args: Array): SinonStub; + yieldsToAsync(property: string, ...args: Array): SinonStub; + yieldsToOnAsync(property: string, context: any, ...args: Array): SinonStub; + withArgs(...args: Array): SinonStub; + } + + declare interface SinonStubStatic { + (): SinonStub; + (obj: any): SinonStub; + (obj: any, method: string): SinonStub; + } + + declare interface SinonExpectation extends SinonStub { + atLeast(n: number): SinonExpectation; + atMost(n: number): SinonExpectation; + never(): SinonExpectation; + once(): SinonExpectation; + twice(): SinonExpectation; + thrice(): SinonExpectation; + exactly(n: number): SinonExpectation; + withArgs(...args: Array): SinonExpectation; + withExactArgs(...args: Array): SinonExpectation; + on(obj: any): SinonExpectation; + verify(): SinonExpectation; + restore(): void; + } + + declare interface SinonExpectationStatic { + create(methodName?: string): SinonExpectation; + } + + declare interface SinonMock { + expects(method: string): SinonExpectation; + restore(): void; + verify(): void; + } + + declare interface SinonMockStatic { + (obj: any): SinonMock; + (): SinonExpectation; + } + + declare interface SinonFakeTimers { + now: number; + create(now: number): SinonFakeTimers; + setTimeout(callback: (...args: Array) => void, timeout: number, ...args: Array): number; + clearTimeout(id: number): void; + setInterval(callback: (...args: Array) => void, timeout: number, ...args: Array): number; + clearInterval(id: number): void; + tick(ms: number): number; + reset(): void; + Date(): Date; + Date(year: number): Date; + Date(year: number, month: number): Date; + Date(year: number, month: number, day: number): Date; + Date(year: number, month: number, day: number, hour: number): Date; + Date(year: number, month: number, day: number, hour: number, minute: number): Date; + Date(year: number, month: number, day: number, hour: number, minute: number, second: number): Date; + Date(year: number, month: number, day: number, hour: number, minute: number, second: number, ms: number): Date; + restore(): void; + + /** + * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp + * without affecting timers, intervals or immediates. + * @param now The new 'now' in unix milliseconds + */ + setSystemTime(now: number): void; + + /** + * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp + * without affecting timers, intervals or immediates. + * @param now The new 'now' as a JavaScript Date + */ + setSystemTime(date: Date): void; + } + + declare interface SinonFakeTimersStatic { + (): SinonFakeTimers; + (config: SinonFakeTimersConfig): SinonFakeTimers; + (now: number): SinonFakeTimers; + } + + declare interface SinonFakeTimersConfig { + now: number | Date; + toFake: string[]; + shouldAdvanceTime: boolean; + + } + + declare interface SinonFakeUploadProgress { + eventListeners: {| + progress: Array; + load: Array; + abort: Array; + error: Array; + |}; + + addEventListener(event: string, listener: (e: Event) => any): void; + removeEventListener(event: string, listener: (e: Event) => any): void; + dispatchEvent(event: Event): void; + } + + declare interface SinonFakeXMLHttpRequest { + onCreate: (xhr: SinonFakeXMLHttpRequest) => void; + url: string; + method: string; + requestHeaders: any; + requestBody: string; + status: number; + statusText: string; + async: boolean; + username: string; + password: string; + withCredentials: boolean; + upload: SinonFakeUploadProgress; + responseXML: Document; + getResponseHeader(header: string): string; + getAllResponseHeaders(): any; + restore(): void; + useFilters: boolean; + addFilter(filter: (method: string, url: string, async: boolean, username: string, password: string) => boolean): void; + setResponseHeaders(headers: any): void; + setResponseBody(body: string): void; + respond(status: number, headers: any, body: string): void; + autoRespond(ms: number): void; + error(): void; + onerror(): void; + } + + declare type SinonFakeXMLHttpRequestStatic = () => SinonFakeXMLHttpRequest; + + declare interface SinonFakeServerConfig { + autoRespond?: boolean; + autoRespondAfter?: number; + respondImmediately?: boolean; + fakeHTTPMethods?: boolean; + } + + declare interface SinonFakeServer { + autoRespond: boolean; + autoRespondAfter: number; + configure(config: SinonFakeServerConfig): void; + fakeHTTPMethods: boolean; + getHTTPMethod: (request: SinonFakeXMLHttpRequest) => string; + requests: SinonFakeXMLHttpRequest[]; + respondImmediately: boolean; + respondWith(body: string): void; + respondWith(response: Array): void; + respondWith(fn: (xhr: SinonFakeXMLHttpRequest) => void): void; + respondWith(url: string, body: string): void; + respondWith(url: string, response: Array): void; + respondWith(url: string, fn: (xhr: SinonFakeXMLHttpRequest) => void): void; + respondWith(method: string, url: string, body: string): void; + respondWith(method: string, url: string, response: Array): void; + respondWith(method: string, url: string, fn: (xhr: SinonFakeXMLHttpRequest) => void): void; + respondWith(url: RegExp, body: string): void; + respondWith(url: RegExp, response: Array): void; + respondWith(url: RegExp, fn: (xhr: SinonFakeXMLHttpRequest) => void): void; + respondWith(method: string, url: RegExp, body: string): void; + respondWith(method: string, url: RegExp, response: Array): void; + respondWith(method: string, url: RegExp, fn: (xhr: SinonFakeXMLHttpRequest) => void): void; + respond(): void; + restore(): void; + } + + declare interface SinonFakeServerStatic { + create(): SinonFakeServer; + } + + declare interface SinonExposeOptions { + prefix?: string; + includeFail?: boolean; + } + + declare interface SinonAssert { + failException: string; + fail: (message?: string) => void; + pass: (assertion: any) => void; + notCalled(spy: SinonSpy): void; + called(spy: SinonSpy): void; + calledOnce(spy: SinonSpy): void; + calledTwice(spy: SinonSpy): void; + calledThrice(spy: SinonSpy): void; + callCount(spy: SinonSpy, count: number): void; + callOrder(...spies: SinonSpy[]): void; + calledOn(spy: SinonSpy, obj: any): void; + alwaysCalledOn(spy: SinonSpy, obj: any): void; + calledWith(spy: SinonSpy, ...args: Array): void; + alwaysCalledWith(spy: SinonSpy, ...args: Array): void; + neverCalledWith(spy: SinonSpy, ...args: Array): void; + calledWithExactly(spy: SinonSpy, ...args: Array): void; + alwaysCalledWithExactly(spy: SinonSpy, ...args: Array): void; + calledWithMatch(spy: SinonSpy, ...args: Array): void; + alwaysCalledWithMatch(spy: SinonSpy, ...args: Array): void; + neverCalledWithMatch(spy: SinonSpy, ...args: Array): void; + threw(spy: SinonSpy): void; + threw(spy: SinonSpy, exception: string): void; + threw(spy: SinonSpy, exception: any): void; + alwaysThrew(spy: SinonSpy): void; + alwaysThrew(spy: SinonSpy, exception: string): void; + alwaysThrew(spy: SinonSpy, exception: any): void; + expose(obj: any, options?: SinonExposeOptions): void; + } + + declare interface SinonMatcher { + and(expr: SinonMatcher): SinonMatcher; + or(expr: SinonMatcher): SinonMatcher; + } + + declare interface SinonArrayMatcher extends SinonMatcher { + /** + * Requires an Array to be deep equal another one. + */ + deepEquals(expected: Array): SinonMatcher; + /** + * Requires an Array to start with the same values as another one. + */ + startsWith(expected: Array): SinonMatcher; + /** + * Requires an Array to end with the same values as another one. + */ + endsWith(expected: Array): SinonMatcher; + /** + * Requires an Array to contain each one of the values the given array has. + */ + contains(expected: Array): SinonMatcher; + } + + declare interface SinonMapMatcher extends SinonMatcher { + /** + * Requires a Map to be deep equal another one. + */ + deepEquals(expected: Map): SinonMatcher; + /** + * Requires a Map to contain each one of the items the given map has. + */ + contains(expected: Map): SinonMatcher; + } + + declare interface SinonSetMatcher extends SinonMatcher { + /** + * Requires a Set to be deep equal another one. + */ + deepEquals(expected: Set): SinonMatcher; + /** + * Requires a Set to contain each one of the items the given set has. + */ + contains(expected: Set): SinonMatcher; + } + + declare interface SinonMatch { + (value: number): SinonMatcher; + (value: string): SinonMatcher; + (expr: RegExp): SinonMatcher; + (obj: any): SinonMatcher; + (callback: (value: any) => boolean): SinonMatcher; + any: SinonMatcher; + defined: SinonMatcher; + truthy: SinonMatcher; + falsy: SinonMatcher; + bool: SinonMatcher; + number: SinonMatcher; + string: SinonMatcher; + object: SinonMatcher; + func: SinonMatcher; + /** + * Requires the value to be a Map. + */ + map: SinonMapMatcher; + /** + * Requires the value to be a Set. + */ + set: SinonSetMatcher; + /** + * Requires the value to be an Array. + */ + array: SinonArrayMatcher; + regexp: SinonMatcher; + date: SinonMatcher; + symbol: SinonMatcher; + same(obj: any): SinonMatcher; + typeOf(type: string): SinonMatcher; + instanceOf(type: any): SinonMatcher; + has(property: string, expect?: any): SinonMatcher; + hasOwn(property: string, expect?: any): SinonMatcher; + } + + declare interface SinonSandboxConfig { + injectInto?: any; + properties?: string[]; + useFakeTimers?: SinonFakeTimersConfig; + useFakeServer?: any; + } + + declare interface SinonSandbox { + assert: SinonAssert; + clock: SinonFakeTimers; + requests: SinonFakeXMLHttpRequest; + server: SinonFakeServer; + spy: SinonSpyStatic; + stub: SinonStubStatic; + mock: SinonMockStatic; + useFakeTimers: SinonFakeTimersStatic; + useFakeXMLHttpRequest: SinonFakeXMLHttpRequestStatic; + useFakeServer(): SinonFakeServer; + restore(): void; + reset(): void; + resetHistory(): void; + resetBehavior(): void; + usingPromise(promiseLibrary: any): SinonSandbox; + verify(): void; + verifyAndRestore(): void; + } + + declare interface SinonSandboxStatic { + create(): SinonSandbox; + create(config: SinonSandboxConfig): SinonSandbox; + } + + declare interface SinonXMLHttpRequestStatic { + XMLHttpRequest: XMLHttpRequest; + } + + declare module.exports: {| + createFakeServer(config?: SinonFakeServerConfig): SinonFakeServer; + createFakeServerWithClock(): SinonFakeServer; + createSandbox(config?: SinonSandboxConfig): SinonSandbox; + defaultConfig: SinonSandboxConfig; + spy: SinonSpyStatic; + stub: SinonStubStatic; + expectation: SinonExpectationStatic; + mock: SinonMockStatic; + useFakeTimers: SinonFakeTimersStatic; + clock: SinonFakeTimers; + useFakeXMLHttpRequest: SinonFakeXMLHttpRequestStatic; + FakeXMLHttpRequest: SinonFakeXMLHttpRequest; + fakeServer: SinonFakeServerStatic; + fakeServerWithClock: SinonFakeServerStatic; + assert: SinonAssert; + match: SinonMatch; + sandbox: SinonSandboxStatic; + createStubInstance(constructor: any): any; + format(obj: any): string; + setFormatter(aCustomFormatter: (obj: any) => string): void; + restore(object: any): void; + fake: SinonFakeStatic; + xhr: SinonXMLHttpRequestStatic; + spyCall(spy: any, + thisValue: any, + args: Array, + returnValue: any, + exception: any, + id: number, + errorWithCallStack: any): SinonSpyCall; + |}; +} diff --git a/flow-typed/npm/yargs_vx.x.x.js b/flow-typed/npm/yargs_vx.x.x.js new file mode 100644 index 000000000..7c35e8c02 --- /dev/null +++ b/flow-typed/npm/yargs_vx.x.x.js @@ -0,0 +1,175 @@ +// flow-typed signature: 0e40564d80be151a7cd75d1f853019bb +// flow-typed version: <>/yargs_v17.3.1/flow_v0.98.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'yargs' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'yargs' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'yargs/build/lib/argsert' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/command' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/completion-templates' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/completion' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/middleware' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/parse-command' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/typings/common-types' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/typings/yargs-parser-types' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/usage' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/apply-extends' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/is-promise' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/levenshtein' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/maybe-async-result' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/obj-filter' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/process-argv' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/set-blocking' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/utils/which-module' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/validation' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/yargs-factory' { + declare module.exports: any; +} + +declare module 'yargs/build/lib/yerror' { + declare module.exports: any; +} + +declare module 'yargs/helpers' { + declare module.exports: any; +} + +// Filename aliases +declare module 'yargs/build/lib/argsert.js' { + declare module.exports: $Exports<'yargs/build/lib/argsert'>; +} +declare module 'yargs/build/lib/command.js' { + declare module.exports: $Exports<'yargs/build/lib/command'>; +} +declare module 'yargs/build/lib/completion-templates.js' { + declare module.exports: $Exports<'yargs/build/lib/completion-templates'>; +} +declare module 'yargs/build/lib/completion.js' { + declare module.exports: $Exports<'yargs/build/lib/completion'>; +} +declare module 'yargs/build/lib/middleware.js' { + declare module.exports: $Exports<'yargs/build/lib/middleware'>; +} +declare module 'yargs/build/lib/parse-command.js' { + declare module.exports: $Exports<'yargs/build/lib/parse-command'>; +} +declare module 'yargs/build/lib/typings/common-types.js' { + declare module.exports: $Exports<'yargs/build/lib/typings/common-types'>; +} +declare module 'yargs/build/lib/typings/yargs-parser-types.js' { + declare module.exports: $Exports<'yargs/build/lib/typings/yargs-parser-types'>; +} +declare module 'yargs/build/lib/usage.js' { + declare module.exports: $Exports<'yargs/build/lib/usage'>; +} +declare module 'yargs/build/lib/utils/apply-extends.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/apply-extends'>; +} +declare module 'yargs/build/lib/utils/is-promise.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/is-promise'>; +} +declare module 'yargs/build/lib/utils/levenshtein.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/levenshtein'>; +} +declare module 'yargs/build/lib/utils/maybe-async-result.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/maybe-async-result'>; +} +declare module 'yargs/build/lib/utils/obj-filter.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/obj-filter'>; +} +declare module 'yargs/build/lib/utils/process-argv.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/process-argv'>; +} +declare module 'yargs/build/lib/utils/set-blocking.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/set-blocking'>; +} +declare module 'yargs/build/lib/utils/which-module.js' { + declare module.exports: $Exports<'yargs/build/lib/utils/which-module'>; +} +declare module 'yargs/build/lib/validation.js' { + declare module.exports: $Exports<'yargs/build/lib/validation'>; +} +declare module 'yargs/build/lib/yargs-factory.js' { + declare module.exports: $Exports<'yargs/build/lib/yargs-factory'>; +} +declare module 'yargs/build/lib/yerror.js' { + declare module.exports: $Exports<'yargs/build/lib/yerror'>; +} +declare module 'yargs/helpers/index' { + declare module.exports: $Exports<'yargs/helpers'>; +} +declare module 'yargs/helpers/index.js' { + declare module.exports: $Exports<'yargs/helpers'>; +} diff --git a/gui/elm/Data/UserAction.elm b/gui/elm/Data/UserAction.elm index 52b26b7db..da4345196 100644 --- a/gui/elm/Data/UserAction.elm +++ b/gui/elm/Data/UserAction.elm @@ -17,6 +17,7 @@ import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Locale exposing (Helpers) +import Util.Conditional exposing (ShowInWeb, inWeb, onOS) import Util.DecorationParser exposing (DecorationResult(..), findDecorations) @@ -31,8 +32,13 @@ type UserActionStatus | Done +type Side + = Local + | Remote + + type alias ClientActionInfo = - { status : UserActionStatus, seq : Int, docType : String, path : String } + { status : UserActionStatus, seq : Int, docType : String, path : String, side : Maybe Side } type alias RemoteActionInfo = @@ -49,7 +55,7 @@ type Command type Msg = SendCommand Command UserAction -- send specified command to client - | ShowInParent Path -- open file explorer at parent's path + | ShowInParent Path ShowInWeb -- open file explorer or Cozy Drive Web at parent's path same : UserAction -> UserAction -> Bool @@ -102,6 +108,7 @@ type alias EncodedUserAction = { seq : Maybe Int , status : String , code : String + , side : Maybe String , doc : Maybe { docType : String @@ -119,7 +126,7 @@ type alias EncodedCommand = decode : EncodedUserAction -> Maybe UserAction -decode { seq, status, code, doc, links } = +decode { seq, status, code, side, doc, links } = let decodedStatus = decodeUserActionStatus status @@ -129,7 +136,15 @@ decode { seq, status, code, doc, links } = Just (RemoteAction code { status = decodedStatus, link = self }) ( Just { docType, path }, _, Just num ) -> - Just (ClientAction code { status = decodedStatus, seq = num, docType = docType, path = path }) + Just + (ClientAction code + { status = decodedStatus + , seq = num + , docType = docType + , path = path + , side = decodedSide side + } + ) _ -> Nothing @@ -142,6 +157,7 @@ encodeAction action = { seq = Just a.seq , status = encodeUserActionStatus a.status , code = code + , side = encodedSide a.side , doc = Just { docType = a.docType, path = a.path } , links = Nothing } @@ -150,6 +166,7 @@ encodeAction action = { seq = Nothing , status = encodeUserActionStatus a.status , code = code + , side = Nothing , links = Just { self = a.link } , doc = Nothing } @@ -200,6 +217,32 @@ encodeUserActionStatus status = "Done" +decodedSide : Maybe String -> Maybe Side +decodedSide side = + case side of + Just "local" -> + Just Local + + Just "remote" -> + Just Remote + + _ -> + Nothing + + +encodedSide : Maybe Side -> Maybe String +encodedSide side = + case side of + Just Local -> + Just "local" + + Just Remote -> + Just "remote" + + _ -> + Nothing + + -- View User Action from other modules @@ -220,10 +263,18 @@ view helpers platform action = let { title, content, buttons } = viewByCode helpers action + + side = + case action of + ClientAction _ a -> + a.side + + _ -> + Nothing in div [ class "u-p-1 u-bg-paleGrey" ] [ header [ class "u-title-h1" ] [ text (helpers.t title) ] - , p [ class "u-text" ] (actionContent helpers platform content) + , p [ class "u-text" ] (actionContent helpers platform content side) , div [ class "u-flex u-flex-justify-end" ] buttons ] @@ -420,11 +471,11 @@ viewByCode helpers action = { title = "", content = [], buttons = [] } -actionContent : Helpers -> Platform -> List String -> List (Html Msg) -actionContent helpers platform details = +actionContent : Helpers -> Platform -> List String -> Maybe Side -> List (Html Msg) +actionContent helpers platform details side = details |> List.map helpers.capitalize - |> List.map (viewActionContentLine platform) + |> List.map (viewActionContentLine platform side) |> List.intersperse [ br [] [] ] |> List.concat @@ -481,15 +532,15 @@ linkButton helpers link label bType = [ span [] [ text (helpers.t label) ] ] -viewActionContentLine : Platform -> String -> List (Html Msg) -viewActionContentLine platform line = +viewActionContentLine : Platform -> Maybe Side -> String -> List (Html Msg) +viewActionContentLine platform side line = let toHTML = \decoration -> case decoration of Decorated path -> Path.fromString platform path - |> decoratedName + |> decoratedName side Normal str -> text str @@ -498,11 +549,22 @@ viewActionContentLine platform line = |> List.map toHTML -decoratedName : Path -> Html Msg -decoratedName path = +decoratedName : Maybe Side -> Path -> Html Msg +decoratedName side path = + let + medium = + case side of + -- Open on the side opposite of the one on which the change is + -- being applied. + Just Local -> + inWeb + + _ -> + onOS + in span [ class "u-bg-frenchPass u-bdrs-4 u-ph-half u-pv-0 u-c-pointer" , title (Path.toString path) - , onClick (ShowInParent path) + , onClick (ShowInParent path medium) ] [ text (Path.name path) ] diff --git a/gui/elm/Ports.elm b/gui/elm/Ports.elm index 43bf306a6..f0e0197c3 100644 --- a/gui/elm/Ports.elm +++ b/gui/elm/Ports.elm @@ -69,10 +69,10 @@ port folder : (SyncFolderConfig -> msg) -> Sub msg port folderError : (String -> msg) -> Sub msg -port gotocozy : () -> Cmd msg +port gotocozy : Bool -> Cmd msg -port gotofolder : () -> Cmd msg +port gotofolder : Bool -> Cmd msg port gototab : (String -> msg) -> Sub msg @@ -84,10 +84,10 @@ port mail : (Maybe String -> msg) -> Sub msg port newRelease : (( String, String ) -> msg) -> Sub msg -port openFile : String -> Cmd msg +port openFile : ( String, Bool ) -> Cmd msg -port showInParent : String -> Cmd msg +port showInParent : ( String, Bool ) -> Cmd msg port quitAndInstall : () -> Cmd msg diff --git a/gui/elm/Util/Conditional.elm b/gui/elm/Util/Conditional.elm index 7b5a8b206..28371cfeb 100644 --- a/gui/elm/Util/Conditional.elm +++ b/gui/elm/Util/Conditional.elm @@ -1,4 +1,4 @@ -module Util.Conditional exposing (viewIf) +module Util.Conditional exposing (ShowInWeb, inWeb, onOS, viewIf) import Html exposing (Html, text) @@ -10,3 +10,22 @@ viewIf condition content = else text "" + + + +-- Used to decide where to open paths (i.e. either in Drive Web or the local +-- filesystem). + + +type alias ShowInWeb = + Bool + + +inWeb : ShowInWeb +inWeb = + True + + +onOS : ShowInWeb +onOS = + False diff --git a/gui/elm/Util/Mouse.elm b/gui/elm/Util/Mouse.elm new file mode 100644 index 000000000..9131dfd3c --- /dev/null +++ b/gui/elm/Util/Mouse.elm @@ -0,0 +1,67 @@ +module Util.Mouse exposing (EventWithKeys, onCapturingClick, onSpecialClick) + +import Html +import Html.Events +import Html.Events.Extra.Mouse as Mouse +import Json.Decode as Decode exposing (Decoder) + + +type alias Keys = + { alt : Bool, ctrl : Bool, meta : Bool, shift : Bool } + + +type alias EventOptions = + { stopPropagation : Bool, preventDefault : Bool } + + +type alias EventWithKeys = + { mouseEvent : Mouse.Event + , keys : Keys + } + + +decodeWithKeys : Decoder EventWithKeys +decodeWithKeys = + Decode.map2 EventWithKeys + Mouse.eventDecoder + keysDecoder + + + +-- Decodes ctrl or cmd/meta key as ctrl + + +keysDecoder : Decoder Keys +keysDecoder = + Decode.map4 Keys + (Decode.field "altKey" Decode.bool) + (Decode.field "ctrlKey" Decode.bool) + (Decode.field "metaKey" Decode.bool) + (Decode.field "shiftKey" Decode.bool) + + +onClickWithOptions : EventOptions -> (EventWithKeys -> msg) -> Html.Attribute msg +onClickWithOptions { stopPropagation, preventDefault } htmlTag = + let + decoder = + decodeWithKeys + |> Decode.map htmlTag + |> Decode.map options + + options message = + { message = message + , stopPropagation = stopPropagation + , preventDefault = preventDefault + } + in + Html.Events.custom "click" decoder + + +onSpecialClick : (EventWithKeys -> msg) -> Html.Attribute msg +onSpecialClick = + onClickWithOptions { stopPropagation = False, preventDefault = True } + + +onCapturingClick : (EventWithKeys -> msg) -> Html.Attribute msg +onCapturingClick = + onClickWithOptions { stopPropagation = True, preventDefault = False } diff --git a/gui/elm/Window/Tray.elm b/gui/elm/Window/Tray.elm index 4906a2f04..42121a841 100644 --- a/gui/elm/Window/Tray.elm +++ b/gui/elm/Window/Tray.elm @@ -19,6 +19,8 @@ import Icons import Locale exposing (Helpers) import Ports import Time +import Util.Conditional exposing (ShowInWeb, inWeb, onOS) +import Util.Mouse as Mouse import Window.Tray.Dashboard as Dashboard import Window.Tray.Settings as Settings import Window.Tray.StatusBar as StatusBar @@ -61,8 +63,8 @@ init version platform = type Msg = GotSyncState SyncState | GotSyncConfig SyncConfig - | GoToCozy - | GoToFolder + | GoToCozy ShowInWeb + | GoToFolder ShowInWeb | GoToTab Page | GoToStrTab String | DashboardMsg Dashboard.Msg @@ -118,11 +120,11 @@ update msg model = in ( { model | settings = settings }, Cmd.map SettingsMsg cmd ) - GoToCozy -> - ( model, Ports.gotocozy () ) + GoToCozy showInWeb -> + ( model, Ports.gotocozy showInWeb ) - GoToFolder -> - ( model, Ports.gotofolder () ) + GoToFolder showInWeb -> + ( model, Ports.gotofolder showInWeb ) GoToTab tab -> let @@ -213,16 +215,34 @@ viewBottomBar helpers = div [ class "bottom-bar" ] [ a [ href "#" - , onClick GoToFolder + , Mouse.onSpecialClick handleGoToFolder ] [ Icons.folder 48 False , text (helpers.t "Bar GoToFolder") ] , a [ href "#" - , onClick GoToCozy + , Mouse.onSpecialClick handleGoToCozy ] [ Icons.globe 48 False , text (helpers.t "Bar GoToCozy") ] ] + + +handleGoToFolder : Mouse.EventWithKeys -> Msg +handleGoToFolder mouseEvent = + if mouseEvent.keys.ctrl || mouseEvent.keys.meta then + GoToFolder inWeb + + else + GoToFolder onOS + + +handleGoToCozy : Mouse.EventWithKeys -> Msg +handleGoToCozy mouseEvent = + if mouseEvent.keys.ctrl || mouseEvent.keys.meta then + GoToCozy onOS + + else + GoToCozy inWeb diff --git a/gui/elm/Window/Tray/Dashboard.elm b/gui/elm/Window/Tray/Dashboard.elm index b2dcc9c9d..3b3e4d131 100644 --- a/gui/elm/Window/Tray/Dashboard.elm +++ b/gui/elm/Window/Tray/Dashboard.elm @@ -21,6 +21,8 @@ import Json.Decode as Json import Locale exposing (Helpers) import Ports import Time +import Util.Conditional exposing (ShowInWeb, inWeb, onOS) +import Util.Mouse as Mouse @@ -61,8 +63,8 @@ maxActivities = type Msg = Transfer EncodedFile | Remove EncodedFile - | OpenPath Path - | ShowInParent Path + | OpenPath Path ShowInWeb + | ShowInParent Path ShowInWeb | Tick Time.Posix | ShowMore | Reset @@ -99,11 +101,11 @@ update msg model = in ( { model | files = files }, Cmd.none ) - OpenPath path -> - ( model, Ports.openFile (Path.toString path) ) + OpenPath path showInWeb -> + ( model, Ports.openFile ( Path.toString path, showInWeb ) ) - ShowInParent path -> - ( model, Ports.showInParent (Path.toString path) ) + ShowInParent path showInWeb -> + ( model, Ports.showInParent ( Path.toString path, showInWeb ) ) Tick now -> ( { model | now = now }, Cmd.none ) @@ -162,7 +164,7 @@ renderFile helpers model file = div [ class "file-line" , title filenameTitle - , onClick (OpenPath file.path) + , Mouse.onSpecialClick (handleOpenPath file.path) ] [ div [ class ("file-type file-type-" ++ file.icon) ] [] , span [ class "file-line-content file-name-wrapper" ] @@ -174,15 +176,31 @@ renderFile helpers model file = , span [ class "file-parent-folder" , title dirPathTitle - , stopPropagationOn "click" <| - Json.map (\msg -> ( msg, True )) <| - Json.succeed (ShowInParent file.path) + , Mouse.onCapturingClick (handleShowInParent file.path) ] [ text (Path.toString dirPath) ] ] ] +handleOpenPath : Path -> Mouse.EventWithKeys -> Msg +handleOpenPath path mouseEvent = + if mouseEvent.keys.ctrl || mouseEvent.keys.meta then + OpenPath path inWeb + + else + OpenPath path onOS + + +handleShowInParent : Path -> Mouse.EventWithKeys -> Msg +handleShowInParent path mouseEvent = + if mouseEvent.keys.ctrl || mouseEvent.keys.meta then + ShowInParent path inWeb + + else + ShowInParent path onOS + + showMoreButton : Helpers -> Html Msg showMoreButton helpers = div [ class "show-more-container" ] @@ -201,8 +219,8 @@ viewActions helpers model = msg = \actionMsg -> case actionMsg of - UserAction.ShowInParent path -> - ShowInParent path + UserAction.ShowInParent path showInWeb -> + ShowInParent path showInWeb UserAction.SendCommand cmd action -> SendActionCommand cmd action diff --git a/gui/js/autolaunch.js b/gui/js/autolaunch.js index 6d086765f..eb77ca68e 100644 --- a/gui/js/autolaunch.js +++ b/gui/js/autolaunch.js @@ -42,6 +42,7 @@ if (process.env.APPIMAGE) { // with the app's path. autoLauncher.enable() } + return }) .catch(err => log.warn({ err }, 'could not check autolaunch or replace old one') @@ -51,13 +52,19 @@ if (process.env.APPIMAGE) { module.exports.isEnabled = () => autoLauncher.isEnabled() module.exports.setEnabled = enabled => { - autoLauncher.isEnabled().then(was => { - if (was !== enabled) { - if (enabled) { - autoLauncher.enable() - } else { - autoLauncher.disable() + autoLauncher + .isEnabled() + .then(was => { + if (was !== enabled) { + if (enabled) { + autoLauncher.enable() + return true + } else { + autoLauncher.disable() + return false + } } - } - }) + return was + }) + .catch(err => log.warn({ err }, 'could not set autolaunch')) } diff --git a/gui/js/cozy-web.window.js b/gui/js/cozy-web.window.js new file mode 100644 index 000000000..647bb1fe7 --- /dev/null +++ b/gui/js/cozy-web.window.js @@ -0,0 +1,99 @@ +const { BrowserWindow } = require('electron') + +const SCREEN_WIDTH = 1060 +const SCREEN_HEIGHT = 800 + +const WindowManager = require('./window_manager') + +module.exports = class CozyWebWM extends WindowManager { + windowOptions() { + return { + title: 'Cozy', + show: true, + center: true, + width: SCREEN_WIDTH, + height: SCREEN_HEIGHT + } + } + + ipcEvents() { + return {} + } + + hash() { + return '#cozy' + } + + on(event /*: Event */, handler /*: Function */) { + this.win.on(event, handler) + } + + create() { + this.log.debug('create') + const opts = { + ...this.windowOptions(), + autoHideMenuBar: true, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + enableRemoteModule: false + } + } + + this.win = new BrowserWindow(opts) + + // dont keep hidden windows objects + this.win.on('closed', () => { + this.win = null + }) + this.win.on('unresponsive', () => { + this.log.warn('Web page becomes unresponsive') + }) + this.win.on('responsive', () => { + this.log.warn('Web page becomes responsive again') + }) + this.centerOnScreen(opts.width, opts.height) + + // Most windows (e.g. onboarding, help...) make the app visible in macOS + // dock (and cmd+tab) by default. App is hidden when windows is closed to + // allow per-window visibility. + if (process.platform === 'darwin') { + this.app.dock.show() + const showTime = Date.now() + this.win.on('closed', () => { + const hideTime = Date.now() + setTimeout(() => { + this.app.dock.hide() + }, 1000 - (hideTime - showTime)) + }) + } + + const windowCreated = new Promise((resolve, reject) => { + this.win.webContents.on( + 'did-fail-load', + (event, errorCode, errorDescription, url) => { + const err = new Error(errorDescription) + err.code = errorCode + this.log.error({ err, url }, 'failed loading window content') + // TODO: show error Window when Cozy is unreachable instead of a white + // page. + reject(err) + } + ) + // TODO: use `ready-to-show` instead? + // See https://www.electronjs.org/docs/latest/api/browser-window#event-ready-to-show + this.win.webContents.on('dom-ready', () => { + this.win.show() + resolve(this.win) + }) + }) + this.win.loadURL(this.desktop.config.cozyUrl) + + // devTools + if (process.env.WATCH === 'true' || process.env.DEBUG === 'true') { + this.win.webContents.openDevTools({ mode: 'detach' }) + } + + return windowCreated + } +} diff --git a/gui/js/help.window.js b/gui/js/help.window.js index 16f595852..8246fd403 100644 --- a/gui/js/help.window.js +++ b/gui/js/help.window.js @@ -27,6 +27,7 @@ module.exports = class HelpWM extends WindowManager { .sendMailToSupport(body) .then(() => { event.sender.send('mail-sent') + return }) .catch(err => { log.error({ err, sentry: true }, 'failed sending mail to support') diff --git a/gui/js/lastfiles.js b/gui/js/lastfiles.js index 2a3474c9a..f79448fa3 100644 --- a/gui/js/lastfiles.js +++ b/gui/js/lastfiles.js @@ -20,7 +20,7 @@ const writeJSON = (data, callback) => { } const init = desktop => { - persistQueue = Promise.promisifyAll(async.queue(writeJSON)) + persistQueue = async.queue(writeJSON) lastFilesPath = path.join(desktop.basePath, 'last-files') lastFiles = new Promise(resolve => { fs.readFile(lastFilesPath, 'utf-8', (err, data) => { diff --git a/gui/js/markdown-viewer.window.js b/gui/js/markdown-viewer.window.js index 0fd4d7906..37f2bcf4c 100644 --- a/gui/js/markdown-viewer.window.js +++ b/gui/js/markdown-viewer.window.js @@ -41,8 +41,4 @@ module.exports = class MarkdownViewerWindow extends WindowManager { filename }) } - - on(event, handler) { - this.win.on(event, handler) - } } diff --git a/gui/js/onboarding.window.js b/gui/js/onboarding.window.js index aac1d8bfa..60e259400 100644 --- a/gui/js/onboarding.window.js +++ b/gui/js/onboarding.window.js @@ -110,7 +110,7 @@ module.exports = class OnboardingWM extends WindowManager { this.afterOnboarding = handler } - onRegisterRemote(event, arg) { + async onRegisterRemote(event, arg) { const syncSession = session.fromPartition(SESSION_PARTITION_NAME) let desktop = this.desktop @@ -157,7 +157,7 @@ module.exports = class OnboardingWM extends WindowManager { this.openOAuthView(url) return promise } - desktop.registerRemote(cozyUrl, arg.location, onRegistered).then( + return desktop.registerRemote(cozyUrl, arg.location, onRegistered).then( reg => { syncSession.clearStorageData() this.win.webContents.once('dom-ready', () => { @@ -171,6 +171,7 @@ module.exports = class OnboardingWM extends WindowManager { if (!process.env.DEBUG) { autoLaunch.setEnabled(true) } + return }, err => { log.warn({ err, cozyUrl }, 'failed registering device with remote Cozy') @@ -187,6 +188,7 @@ module.exports = class OnboardingWM extends WindowManager { translate('Address No cozy instance at this address!') ) } + throw err } ) } diff --git a/gui/js/proxy.js b/gui/js/proxy.js index ca4091599..4ecf162ed 100644 --- a/gui/js/proxy.js +++ b/gui/js/proxy.js @@ -24,20 +24,34 @@ const config = (argv /*: Array<*> */ = process.argv) => { const config = yargs .env('COZY_DRIVE') .conflicts('proxy-script', 'proxy-rules') - .describe('proxy-script', 'The URL associated with the PAC file.') - .describe('proxy-rules', 'Rules indicating which proxies to use.') - .describe( - 'proxy-bypassrules', - 'Rules indicating which URLs should bypass the proxy settings. ' + - 'See https://github.com/electron/electron/blob/master/docs/api/session.md#sessetproxyconfig-callback' - ) - .default('proxy-ntlm-domains', '*') - .describe( - 'proxy-ntlm-domains', - 'A comma-separated list of servers for which integrated authentication is enabled. ' + - 'Dynamically sets whether to always send credentials for HTTP NTLM or Negotiate authentication.' - ) - .describe('login-by-realm', 'comma-separated list of realm:user:password') + .option('proxy-script', { + describe: 'The URL associated with the PAC file.', + type: 'string', + default: undefined + }) + .option('proxy-rules', { + describe: 'Rules indicating which proxies to use.', + type: 'string', + default: undefined + }) + .option('proxy-bypassrules', { + describe: + 'Rules indicating which URLs should bypass the proxy settings. ' + + 'See https://github.com/electron/electron/blob/master/docs/api/session.md#sessetproxyconfig-callback', + type: 'string', + default: undefined + }) + .option('proxy-ntlm-domains', { + describe: + 'A comma-separated list of servers for which integrated authentication is enabled. ' + + 'Dynamically sets whether to always send credentials for HTTP NTLM or Negotiate authentication.', + default: '*' + }) + .option('login-by-realm', { + describe: 'comma-separated list of realm:user:password', + type: 'string', + default: undefined + }) .help('help') .parse(argv) @@ -139,9 +153,12 @@ const setup = async ( } // $FlowFixMe - http.Agent.globalAgent = http.globalAgent = https.globalAgent = new ElectronProxyAgent( - syncSession - ) + http.Agent.globalAgent = + // $FlowFixMe + http.globalAgent = + // $FlowFixMe + https.globalAgent = + new ElectronProxyAgent(syncSession) const parseRequestOptions = (options /* * */) => { if (typeof options === 'string') { @@ -191,12 +208,12 @@ const setup = async ( const originalHttpRequest = http.request // $FlowFixMe - http.request = function(options, cb) { + http.request = function (options, cb) { return originalHttpRequest.call(http, parseRequestOptions(options), cb) } const originalHttpsRequest = https.request // $FlowFixMe - https.request = function(options, cb) { + https.request = function (options, cb) { return originalHttpsRequest.call(https, parseRequestOptions(options), cb) } diff --git a/gui/js/tray.window.js b/gui/js/tray.window.js index 2d6cea291..341c6a5eb 100644 --- a/gui/js/tray.window.js +++ b/gui/js/tray.window.js @@ -1,12 +1,14 @@ const electron = require('electron') const { dialog, shell } = electron const { spawn } = require('child_process') -const { join } = require('path') +const path = require('path') const { openNote } = require('../utils/notes') const { openUrl } = require('../utils/urls') +const { openInWeb } = require('../utils/web') const autoLaunch = require('./autolaunch') const DetailsWM = require('./details.window') +const CozyWebWM = require('./cozy-web.window') const { translate } = require('./i18n') const log = require('../../core/app').logger({ @@ -177,35 +179,52 @@ module.exports = class TrayWM extends WindowManager { ipcEvents() { return { - 'go-to-cozy': () => shell.openExternal(this.desktop.config.cozyUrl), - 'go-to-folder': () => - shell.openPath(this.desktop.config.syncPath).catch(err => { - log.error({ err, sentry: true }, 'Could not open sync folder') - }), + 'go-to-cozy': (event, showInWeb) => { + if (showInWeb) { + shell.openExternal(this.desktop.config.cozyUrl) + } else { + let cozyWebWindow = new CozyWebWM(this.app, this.desktop) + cozyWebWindow.show() + cozyWebWindow.on('closed', () => { + cozyWebWindow = null + }) + } + }, + 'go-to-folder': async (event, showInWeb) => { + this.openPath('', showInWeb) + }, + 'open-file': (event, path, showInWeb) => { + this.log.debug({ path, showInWeb }, 'open file') + this.openPath(path, showInWeb) + }, + 'show-in-parent': (event, path, showInWeb) => { + this.showInParent(path, showInWeb) + }, 'auto-launcher': (event, enabled) => autoLaunch.setEnabled(enabled), 'close-app': () => { this.desktop.stopSync() this.app.quit() }, - 'open-file': (event, path) => this.openPath(path), - 'show-in-parent': (event, path) => this.showInParent(path), 'unlink-cozy': this.onUnlink, 'manual-start-sync': () => this.desktop.sync.forceSync().catch(err => { if (err) log.error({ err, sentry: true }, 'Could not run manual sync') }), - userActionDetails: (event, action) => { + userActionDetails: async (event, action) => { let detailsWindow = new DetailsWM(this.app, this.desktop) - detailsWindow.show().then(() => { + try { if (detailsWindow) { - detailsWindow.loadContent(action) + detailsWindow.on('closed', () => { + detailsWindow = null + }) + await detailsWindow.show() + await detailsWindow.loadContent(action) } else { log.error('could not load user action details content') } - }) - detailsWindow.on('closed', () => { - detailsWindow = null - }) + } catch (err) { + log.error({ err }, 'could not load user action details content') + } }, userActionInProgress: (event, action) => { this.desktop.events.emit('user-action-inprogress', action) @@ -216,10 +235,10 @@ module.exports = class TrayWM extends WindowManager { } } - async openPath(pathToOpen) { + async openPath(pathToOpen, showInWeb = false) { const { desktop } = this - pathToOpen = join(desktop.config.syncPath, pathToOpen) + pathToOpen = path.join(desktop.config.syncPath, pathToOpen) // TODO: find better way to check whether it's a note or not without // requiring modules from main. @@ -228,15 +247,32 @@ module.exports = class TrayWM extends WindowManager { } else if (process.platform === 'linux' && pathToOpen.endsWith('.url')) { // Linux Desktops generally don't provide any way to open those shortcuts. openUrl(pathToOpen) + } else if (showInWeb) { + openInWeb(pathToOpen, { desktop }) + } else if (pathToOpen === '') { + shell.openPath(desktop.config.syncPath).catch(err => { + log.error({ err, sentry: true }, 'Could not open sync folder') + }) } else { - shell.openPath(pathToOpen) + shell.openPath(pathToOpen).catch(err => { + log.error( + { err, path: pathToOpen, sentry: true }, + 'Could not open given path' + ) + }) } } - showInParent(pathToOpen) { - pathToOpen = join(this.desktop.config.syncPath, pathToOpen) + showInParent(pathToOpen, showInWeb = false) { + const { desktop } = this + + pathToOpen = path.join(desktop.config.syncPath, pathToOpen) - shell.showItemInFolder(pathToOpen) + if (showInWeb) { + openInWeb(path.dirname(pathToOpen), { desktop }) + } else { + shell.showItemInFolder(pathToOpen) + } } onUnlink() { diff --git a/gui/js/window_manager.js b/gui/js/window_manager.js index d787a6392..cc2022880 100644 --- a/gui/js/window_manager.js +++ b/gui/js/window_manager.js @@ -91,6 +91,14 @@ module.exports = class WindowManager { this.win && this.win.webContents && this.win.webContents.send(...args) } + on(event, handler) { + this.win && this.win.on(event, handler) + } + + once(event, handler) { + this.win && this.win.once(event, handler) + } + async sendSyncConfig() { const { cozyUrl, deviceName, deviceId } = this.desktop.config this.send( diff --git a/gui/main.js b/gui/main.js index 4cd7f4381..4d7dad92d 100644 --- a/gui/main.js +++ b/gui/main.js @@ -268,9 +268,7 @@ const sendErrorToMainWindow = async ({ msg, code }) => { desktop .stopSync() .then(() => desktop.pouch.db.destroy()) - .then(() => { - desktop.config.syncPath = undefined - }) + .then(() => (desktop.config.syncPath = undefined)) .then(() => desktop.config.persist()) .then(() => log.info('removed')) .then(() => trayWindow.doRestart()) @@ -366,7 +364,7 @@ const updateState = async ({ newState, data }) => { } } } -const updateStateQueue = Promise.promisifyAll(async.queue(updateState)) +const updateStateQueue = async.queue(updateState) const enqueueStateUpdate = (newState, data) => { updateStateQueue.pushAsync({ newState, data }).catch(err => { @@ -416,6 +414,7 @@ const sendDiskUsage = () => { quota: +(res.attributes.quota || 0) } trayWindow.send('disk-space', space) + return space }) .catch(err => log.warn({ err }, 'could not get remote disk usage')) } @@ -590,7 +589,8 @@ app.on('ready', async () => { onboardingWindow.onOnboardingDone(async () => { await setupDesktop() onboardingWindow.hide() - trayWindow.show().then(() => startSync()) + await trayWindow.show() + await startSync() }) if (app.isPackaged) { log.trace('Setting up updater WM...') diff --git a/gui/ports.js b/gui/ports.js index b654eee40..8ab74b401 100644 --- a/gui/ports.js +++ b/gui/ports.js @@ -111,11 +111,11 @@ ipcRenderer.on('new-release-available', (event, notes, name) => { elmectron.ports.quitAndInstall.subscribe(() => { ipcRenderer.send('quit-and-install') }) -elmectron.ports.gotocozy.subscribe(() => { - ipcRenderer.send('go-to-cozy') +elmectron.ports.gotocozy.subscribe(showInWeb => { + ipcRenderer.send('go-to-cozy', showInWeb) }) -elmectron.ports.gotofolder.subscribe(() => { - ipcRenderer.send('go-to-folder') +elmectron.ports.gotofolder.subscribe(showInWeb => { + ipcRenderer.send('go-to-folder', showInWeb) }) elmectron.ports.closeApp.subscribe(() => { @@ -148,12 +148,12 @@ elmectron.ports.sendMail.subscribe(body => { ipcRenderer.send('send-mail', body) }) -elmectron.ports.openFile.subscribe(path => { - ipcRenderer.send('open-file', path) +elmectron.ports.openFile.subscribe(([path, showInWeb]) => { + ipcRenderer.send('open-file', path, showInWeb) }) -elmectron.ports.showInParent.subscribe(path => { - ipcRenderer.send('show-in-parent', path) +elmectron.ports.showInParent.subscribe(([path, showInWeb]) => { + ipcRenderer.send('show-in-parent', path, showInWeb) }) elmectron.ports.userActionDetails.subscribe(action => { @@ -168,12 +168,15 @@ elmectron.ports.userActionCommand.subscribe(([cmd, action]) => { ipcRenderer.send('userActionCommand', cmd, action) }) -ipcRenderer.on('sync-state', ( - event, - newState /*: { status: SyncStatus, remaining: number, userActions: UserAction[], errors: SyncError[] } */ -) => { - elmectron.ports.syncState.send(newState) -}) +ipcRenderer.on( + 'sync-state', + ( + event, + newState /*: { status: SyncStatus, remaining: number, userActions: UserAction[], errors: SyncError[] } */ + ) => { + elmectron.ports.syncState.send(newState) + } +) ipcRenderer.on('transfer', (event, info) => { elmectron.ports.transfer.send(info) diff --git a/gui/utils/notes.js b/gui/utils/notes.js index 0ab6b6c86..1a4c7b522 100644 --- a/gui/utils/notes.js +++ b/gui/utils/notes.js @@ -16,6 +16,7 @@ const log = Desktop.logger({ /*:: import { App } from '../../core/app' +import { WindowManager } from '../js/window_manager' */ const openMarkdownViewer = async ( @@ -24,24 +25,26 @@ const openMarkdownViewer = async ( banner /*: ?{ level: string, title: string, details: string } */ = null, { desktop } /*: { desktop: App } */ ) /*: Promise */ => { - return new Promise((resolve, reject) => { - let viewerWindow = new MarkdownViewerWindow(app, desktop) + let viewerWindow /*: WindowManager */ + try { + viewerWindow = new MarkdownViewerWindow(app, desktop) + if (viewerWindow) { - viewerWindow.show().then(() => { - if (viewerWindow) { - viewerWindow.loadContent(filename, content, banner) - } else { - reject(new Error('could not load Markdown viewer content')) - } - }) - viewerWindow.on('closed', () => { - viewerWindow = null - resolve() + const closed = new Promise(resolve => { + viewerWindow.once('closed', () => { + resolve() + }) }) + + await viewerWindow.show() + viewerWindow.loadContent(filename, content, banner) + await closed } else { - reject(new Error('could not open Markdown viewer window')) + throw new Error('could not load Markdown viewer content') } - }) + } finally { + if (viewerWindow) viewerWindow = null + } } const showGenericError = (filePath, err) => { diff --git a/gui/utils/web.js b/gui/utils/web.js new file mode 100644 index 000000000..d350ba2bc --- /dev/null +++ b/gui/utils/web.js @@ -0,0 +1,35 @@ +/** + * @module gui/notes + * @flow + */ + +const { shell } = require('electron') + +const Desktop = require('../../core/app.js') + +const log = Desktop.logger({ + component: 'GUI' +}) + +/*:: +import { App } from '../../core/app' +*/ + +const openInWeb = async ( + filePath /*: string */, + { desktop } /*: { desktop: App } */ +) => { + try { + const { driveWebUrl } = await desktop.findDocument(filePath) + shell.openExternal(driveWebUrl) + } catch (err) { + log.error( + { err, path: filePath, filePath, sentry: true }, + 'Could not find or open remote document' + ) + return false + } + return true +} + +module.exports = { openInWeb } diff --git a/package.json b/package.json index 330641788..dafe8360e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "url": "git://github.com/cozy-labs/cozy-desktop.git" }, "engines": { - "node": ">=10.6.0" + "node": ">=14.17.6" }, "keywords": [ "Electron", @@ -34,13 +34,13 @@ "build:css": "stylus --sourcemap --compress --use cozy-ui/stylus gui/styles/app.styl --out gui", "build:elm": "elm make ./gui/elm/Main.elm --output ./gui/elm.js", "build:tx": "tx pull --all --minimum-perc=1 || true", - "capture": "env-cmd .env.test electron ./dev/capture.js", - "capture:manual": "env-cmd .env.test electron ./dev/chokidar.js", + "capture": "env-cmd -f .env.test electron ./dev/capture.js", + "capture:manual": "env-cmd -f .env.test electron ./dev/chokidar.js", "clean": "rimraf core/lib/ core/tmp/ gui/elm.js gui/app.css* gui/dist/", "cozy-stack": "yarn docker:exec cozy-stack", "dev:setup": "yarn docker:exec /cozy-desktop/dev/setup.sh", "dev:elm": "yarn watch:css & yarn watch:elm & python2 -m SimpleHTTPServer 8000", - "dev:exclusions": "env-cmd .env.dev electron ./dev/remote/change-dir-exclusions.js", + "dev:exclusions": "env-cmd -f .env.dev electron ./dev/remote/change-dir-exclusions.js", "dist": "electron-builder build", "dist:all": "yarn dist --x64 --ia32", "docker:exec": "docker exec -it cozy-desktop-stack", @@ -51,16 +51,16 @@ "lint": "yarn lint:flow && yarn lint:eslint", "lint:flow": "flow status --quiet --show-all-errors", "lint:elm": "elm-format --validate gui/elm test/elm", - "lint:eslint": "eslint './core/**/*.js' 'dev/**/*.js' gui/main.js gui/ports.js 'gui/js/**/*.js' './test/**/*.js'", - "mocha": "env-cmd .env.test electron-mocha ./test/support/hooks/index.js", + "lint:eslint": "eslint './core/**/*.js' 'dev/**/*.js' gui/main.js gui/ports.js 'gui/js/**/*.js' 'gui/utils/**/*.js' './test/**/*.js'", + "mocha": "env-cmd -f .env.test electron-mocha ./test/support/hooks/index.js", "mocha:coverage": "yarn mocha --require ./test/support/coverage --reporter ./test/support/istanbul_reporter", "mocha:watch": "./test/watch.sh", "install:all": "yarn && yarn install:electron", "install:electron": "electron-builder install-app-deps", "prebuild": "yarn clean", - "repl": "env-cmd .env.dev electron ./dev/repl.js", + "repl": "env-cmd -f .env.dev electron ./dev/repl.js", "stack:reset": "sudo ./node_modules/.bin/rimraf tmp/couchdb tmp/cozy-storage", - "start": "env-cmd .env.dev electron .", + "start": "env-cmd -f .env.dev electron .", "test": "yarn test:world && yarn test:unit && yarn test:elm && yarn test:integration && yarn test:scenarios", "test:coverage": "yarn test:unit:coverage && yarn test:integration", "test:elm": "elm-test test/elm/*.elm", @@ -80,92 +80,93 @@ }, "dependencies": { "@atom/watcher": "https://github.com/taratatach/watcher.git", - "@babel/runtime": "7.6.2", + "@babel/runtime": "7.16.7", "@electron/remote": "^1.0.4", - "@sentry/electron": "^0.17.4", - "abortcontroller-polyfill": "^1.5.0", - "async": "^2.6.2", - "auto-bind": "^2.0.0", + "@sentry/electron": "2.5.4", + "async": "3.2.3", + "auto-bind": "4.0.0", "auto-launch": "^5.0.3", "babel-polyfill": "^6.26.0", - "bluebird": "^3.5.4", + "bluebird": "3.7.2", "btoa": "^1.1.2", - "bunyan": "^2.0.2", - "chai": "^4.2.0", - "chai-like": "^1.1.1", + "bunyan": "2.0.5", "chokidar": "^3.5.0", - "cozy-client": "^27.1.0", - "cozy-client-js": "^0.19.0", - "cozy-flags": "^2.8.0", + "cozy-client": "^27.8.0", + "cozy-client-js": "^0.20.0", + "cozy-flags": "^2.8.3", "cozy-stack-client": "^24.0.0", "deep-diff": "^1.0.2", "dtrace-provider": "^0.8.8", - "electron-fetch": "^1.7.1", + "electron-fetch": "1.7.4", "electron-positioner": "^4.0.0", - "electron-proxy-agent": "^1.2.0", + "electron-proxy-agent": "1.2.1", "electron-updater": "^4.1.2", - "fs-extra": "^8.0.0", - "isomorphic-fetch": "2.2.1", + "fs-extra": "10.0.0", + "isomorphic-fetch": "3.0.0", "lnk": "^1.1.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.0", - "mime": "^1.3.4", - "node-abi": "^3.2.0", - "opn": "5.0.0", + "lodash": "4.17.21", + "micromatch": "4.0.4", + "mime": "3.0.0", + "nan": "2.15.0", + "node-abi": "3.5.0", + "open": "8.4.0", "pouchdb": "^7.2.2", "pouchdb-find": "^7.2.2", - "prop-types": "^15.7.2", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "react-markdown": "^4.3.1", + "prop-types": "15.8.1", + "react": "17.0.2", + "react-dom": "17.0.2", + "react-markdown": "6.0.3", "read": "1.0.7", - "regedit": "^3.0.3", + "regedit": "5.0.0", "secret-event-listener": "1.0.0", - "semver": "^7.3.2", - "tar": "^6.1.6", - "uuid": "^3.3.2", - "yargs": "^11.0.0" + "semver": "7.3.5", + "tar": "6.1.11", + "uuid": "8.3.2", + "yargs": "17.3.1" }, "devDependencies": { - "cheerio": "^0.22.0", - "chokidar-cli": "^2.0.0", - "commander": "^2.20.0", + "@babel/core": "7.16.7", + "babel-preset-cozy-app": "^2.0.1", + "chai": "4.3.4", + "chai-like": "1.1.1", + "cheerio": "0.22.0", + "chokidar-cli": "3.0.0", + "commander": "8.3.0", "cozy-ui": "^35.38.0", - "cross-env": "^5.2.0", + "cross-env": "7.0.3", "debug-menu": "^0.6.1", "del": "^6.0.0", "devtron": "^1.4.0", "electron": "^12.0.0", "electron-builder": "^22.8.1", - "electron-mocha": "^8.1.2", + "electron-mocha": "11.0.2", "electron-notarize": "^0.1.1", "elm": "^0.19.1", - "elm-format": "elm0.19.1", + "elm-format": "0.8.5", "elm-test": "^0.19.1", - "elm-upgrade": "^0.19.6", - "env-cmd": "^8.0.0", - "eslint-config-cozy-app": "^1.1.12", - "eslint-plugin-node": "^8.0.1", - "eslint-plugin-promise": "^4.1.1", - "faker": "^4.1.0", - "flow-bin": "^0.98.0", - "flow-typed": "^2.5.0", - "glob": "^7.1.4", - "istanbul": "^0.4.5", - "istanbul-api": "^2.0.0", - "istanbul-lib-coverage": "^2.0.0", - "istanbul-lib-hook": "^2.0.0", - "jsdoc": "~3.5.0", + "elm-upgrade": "0.19.8", + "env-cmd": "10.1.0", + "eslint-config-cozy-app": "^4.0.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.0.0", + "faker": "5.5.3", + "flow-bin": "0.109.0", + "flow-typed": "3.6.1", + "glob": "7.2.0", + "istanbul": "0.4.5", + "istanbul-api": "3.0.0", + "istanbul-lib-coverage": "3.2.0", + "istanbul-lib-hook": "3.0.0", + "jsdoc": "3.6.7", "jsverify": "^0.8.4", "mocha-clean": "^1.0.0", "pouchdb-adapter-memory": "^7.2.2", - "request-promise": "^4.2.4", - "rimraf": "^2.6.3", + "rimraf": "3.0.2", "should": "^13.2.3", - "should-sinon": "^0.0.5", - "sinon": "^2.3.1", - "source-map-support": "^0.5.11", - "stylus": "^0.54.5", + "should-sinon": "0.0.6", + "sinon": "12.0.1", + "source-map-support": "0.5.21", + "stylus": "0.56.0", "treeify": "^1.1.0" }, "optionalDependencies": { @@ -173,7 +174,7 @@ }, "resolutions": { "dtrace-provider": "0.8.8", - "nan": "2.14.0", - "node-abi": "3.2.0" + "nan": "2.15.0", + "node-abi": "3.5.0" } } diff --git a/test/generate_property_json.js b/test/generate_property_json.js index 9cdc9f248..3ad25d006 100755 --- a/test/generate_property_json.js +++ b/test/generate_property_json.js @@ -174,7 +174,10 @@ function freq(choices) { function init(ops) { const n = faker.random.number(nbInitOps) for (let i = 0; i < n; i++) { - const op = freq([[1, createNewDir], [1, createNewFile]]) + const op = freq([ + [1, createNewDir], + [1, createNewFile] + ]) ops.push(op) } ops.push({ op: 'mkdir', path: '../outside' }) diff --git a/test/integration/add.js b/test/integration/add.js index b7ed258c2..d4990e7f4 100644 --- a/test/integration/add.js +++ b/test/integration/add.js @@ -27,7 +27,7 @@ describe('Add', () => { beforeEach(pouchHelpers.createDatabase) beforeEach(cozyHelpers.deleteAll) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) helpers.local.setupTrash() await helpers.remote.ignorePreviousChanges() diff --git a/test/integration/case_or_encoding_change.js b/test/integration/case_or_encoding_change.js index 9d9c9b990..6a114168e 100644 --- a/test/integration/case_or_encoding_change.js +++ b/test/integration/case_or_encoding_change.js @@ -20,7 +20,7 @@ describe('Case or encoding change', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { cozy = cozyHelpers.cozy helpers = TestHelpers.init(this) diff --git a/test/integration/conflict_resolution.js b/test/integration/conflict_resolution.js index b0d857eee..ed7e6883a 100644 --- a/test/integration/conflict_resolution.js +++ b/test/integration/conflict_resolution.js @@ -30,7 +30,7 @@ describe('Conflict resolution', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) builders = new Builders(this) @@ -48,10 +48,7 @@ describe('Conflict resolution', () => { await helpers.local.syncDir.ensureDir('foo') await helpers.prep.putFolderAsync( 'local', - builders - .metadir() - .path('foo') - .build() + builders.metadir().path('foo').build() ) should(await helpers.local.tree()).deepEqual(['foo-conflict-.../']) @@ -175,9 +172,9 @@ describe('Conflict resolution', () => { }) it('conflict correction local', async () => { - const conflictedPath = (await fse.readdir( - helpers.local.syncPath - )).filter(x => x.indexOf('-conflict-') !== -1)[0] + const conflictedPath = ( + await fse.readdir(helpers.local.syncPath) + ).filter(x => x.indexOf('-conflict-') !== -1)[0] await helpers.local.syncDir.remove(conflictedPath) await helpers.local.syncDir.outputFile('concurrent-edited', 'content5') @@ -190,9 +187,9 @@ describe('Conflict resolution', () => { }) it('conflict correction remote', async () => { - const conflictedPath = (await fse.readdir( - helpers.local.syncPath - )).filter(x => x.indexOf('-conflict-') !== -1)[0] + const conflictedPath = ( + await fse.readdir(helpers.local.syncPath) + ).filter(x => x.indexOf('-conflict-') !== -1)[0] const remoteBadFile = await cozy.files.statByPath('/' + conflictedPath) const remoteFile = await cozy.files.statByPath(`/concurrent-edited`) @@ -411,10 +408,7 @@ describe('Conflict resolution', () => { beforeEach('set up conflict', async () => { await helpers.prep.putFolderAsync( 'local', - builders - .metadir() - .path('foo') - .build() + builders.metadir().path('foo').build() ) await cozy.files.create('whatever', { name: 'foo' }) }) diff --git a/test/integration/differential_sync.js b/test/integration/differential_sync.js index b630eb9ad..d933d783d 100644 --- a/test/integration/differential_sync.js +++ b/test/integration/differential_sync.js @@ -33,7 +33,7 @@ describe('Differential synchronization', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { this.cozy = cozy = await cozyHelpers.oauthCozy(this.config) helpers = TestHelpers.init(this) @@ -46,11 +46,8 @@ describe('Differential synchronization', () => { }) let remoteDir, remoteFile - beforeEach(async function() { - remoteDir = await builders - .remoteDir() - .name('Photos') - .create() + beforeEach(async function () { + remoteDir = await builders.remoteDir().name('Photos').create() remoteFile = await builders .remoteFile() .inDir(remoteDir) @@ -63,7 +60,7 @@ describe('Differential synchronization', () => { describe('when a folder is excluded from synchronization', () => { let excludedDir, oauthClient - beforeEach(async function() { + beforeEach(async function () { excludedDir = { _id: remoteDir._id, _type: FILES_DOCTYPE } oauthClient = { _id: this.config.client.clientID, @@ -72,7 +69,7 @@ describe('Differential synchronization', () => { }) context('and the folder was never synced', () => { - it('does not propagate it or its content to the local filesystem', async function() { + it('does not propagate it or its content to the local filesystem', async function () { await files.addNotSynchronizedDirectories(oauthClient, [excludedDir]) await helpers.pullAndSyncAll() @@ -85,11 +82,11 @@ describe('Differential synchronization', () => { }) context('and the folder was previously synced', () => { - beforeEach(async function() { + beforeEach(async function () { await helpers.pullAndSyncAll() }) - it('propagates its deletion to the local filesystem', async function() { + it('propagates its deletion to the local filesystem', async function () { should(await helpers.local.treeWithoutTrash()).deepEqual([ path(remoteDir), path(remoteFile) @@ -109,7 +106,7 @@ describe('Differential synchronization', () => { describe('when a folder is re-included into synchronization', () => { let excludedDir, oauthClient - beforeEach(async function() { + beforeEach(async function () { excludedDir = { _id: remoteDir._id, _type: FILES_DOCTYPE } oauthClient = { _id: this.config.client.clientID, @@ -123,7 +120,7 @@ describe('Differential synchronization', () => { await helpers.pullAndSyncAll() }) - it('propagates its addition and that of its content to the local filesystem', async function() { + it('propagates its addition and that of its content to the local filesystem', async function () { should(await helpers.local.treeWithoutTrash()).deepEqual([]) await files.removeNotSynchronizedDirectories(oauthClient, [excludedDir]) @@ -142,7 +139,7 @@ describe('Differential synchronization', () => { describe('when a folder is created locally with the same path as an excluded folder', () => { let excludedDir, oauthClient - beforeEach(async function() { + beforeEach(async function () { excludedDir = { _id: remoteDir._id, _type: FILES_DOCTYPE } oauthClient = { _id: this.config.client.clientID, @@ -151,7 +148,7 @@ describe('Differential synchronization', () => { }) context('and the user chooses to create a conflict', () => { - beforeEach(function() { + beforeEach(function () { const originalBlockSyncFor = helpers._sync.blockSyncFor sinon.stub(helpers._sync, 'blockSyncFor') @@ -166,12 +163,12 @@ describe('Differential synchronization', () => { }) helpers._sync.blockSyncFor.callThrough() }) - afterEach(async function() { + afterEach(async function () { helpers._sync.blockSyncFor.restore() await helpers.local.side.stop() }) - it('renames the local folder with a conflict suffix before synchronizing it', async function() { + it('renames the local folder with a conflict suffix before synchronizing it', async function () { await files.addNotSynchronizedDirectories(oauthClient, [excludedDir]) await helpers.pullAndSyncAll() @@ -210,7 +207,7 @@ describe('Differential synchronization', () => { }) context('and the user chooses to merge both folders', () => { - beforeEach(function() { + beforeEach(function () { const originalBlockSyncFor = helpers._sync.blockSyncFor sinon.stub(helpers._sync, 'blockSyncFor') @@ -229,11 +226,11 @@ describe('Differential synchronization', () => { }) helpers._sync.blockSyncFor.callThrough() }) - afterEach(function() { + afterEach(function () { helpers._sync.blockSyncFor.restore() }) - it('does not rename the local folder and re-includes the remote one', async function() { + it('does not rename the local folder and re-includes the remote one', async function () { await files.addNotSynchronizedDirectories(oauthClient, [excludedDir]) await helpers.pullAndSyncAll() diff --git a/test/integration/executable.js b/test/integration/executable.js index a4e9b7350..2078ed2f8 100644 --- a/test/integration/executable.js +++ b/test/integration/executable.js @@ -25,7 +25,7 @@ describe('Executable handling', () => { afterEach(pouchHelpers.cleanDatabase) afterEach(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { cozy = cozyHelpers.cozy helpers = TestHelpers.init(this) syncDir = helpers.local.syncDir diff --git a/test/integration/full_loop.js b/test/integration/full_loop.js index 56a34dd68..ed780a995 100644 --- a/test/integration/full_loop.js +++ b/test/integration/full_loop.js @@ -22,7 +22,7 @@ describe('Full watch/merge/sync/repeat loop', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) helpers.local.setupTrash() await helpers.remote.ignorePreviousChanges() diff --git a/test/integration/id_conflict.js b/test/integration/id_conflict.js index e715125f1..f758933ae 100644 --- a/test/integration/id_conflict.js +++ b/test/integration/id_conflict.js @@ -23,7 +23,7 @@ describe('Identity conflict', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { cozy = cozyHelpers.cozy helpers = TestHelpers.init(this) diff --git a/test/integration/interrupted_sync.js b/test/integration/interrupted_sync.js index 072bcaff0..0ff340174 100644 --- a/test/integration/interrupted_sync.js +++ b/test/integration/interrupted_sync.js @@ -23,7 +23,7 @@ describe('Sync gets interrupted, initialScan occurs', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) helpers.local.setupTrash() await helpers.remote.ignorePreviousChanges() @@ -69,7 +69,7 @@ describe('Sync gets interrupted, initialScan occurs', () => { }) describe('remote file update', () => { - it('does not override the remote file with the local version', async function() { + it('does not override the remote file with the local version', async function () { const path = 'file' await helpers.local.syncDir.outputFile(path, 'original content') @@ -94,7 +94,7 @@ describe('Sync gets interrupted, initialScan occurs', () => { }) describe('local file move outside dir then update then dir trashing', () => { - beforeEach('run actions', async function() { + beforeEach('run actions', async function () { const dirPath = 'dir/' const fileSrcPath = 'dir/file' const fileDstPath = 'file' @@ -135,7 +135,7 @@ describe('Sync gets interrupted, initialScan occurs', () => { } }) - it('moves the file and trashes the dir', async function() { + it('moves the file and trashes the dir', async function () { await should(helpers.trees('local', 'remote')).be.fulfilledWith({ local: ['file'], remote: ['file'] diff --git a/test/integration/move.js b/test/integration/move.js index 7e5561f35..7c9a4f273 100644 --- a/test/integration/move.js +++ b/test/integration/move.js @@ -47,7 +47,7 @@ describe('Move', () => { beforeEach(pouchHelpers.createDatabase) beforeEach(cozyHelpers.deleteAll) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) pouch = helpers.pouch prep = helpers.prep @@ -562,10 +562,7 @@ describe('Move', () => { it('local', async () => { const oldFolder = await pouch.byRemoteIdMaybe(dir._id) - const doc = builders - .metadir() - .path('parent/dst/dir') - .build() + const doc = builders.metadir().path('parent/dst/dir').build() await prep.moveFolderAsync('local', doc, oldFolder) @@ -690,10 +687,7 @@ describe('Move', () => { helpers.resetPouchSpy() const oldFolder = await pouch.byRemoteIdMaybe(dir._id) - const doc = builders - .metadir() - .path('parent/dst/dir') - .build() + const doc = builders.metadir().path('parent/dst/dir').build() await prep.moveFolderAsync('local', doc, oldFolder) diff --git a/test/integration/mtime-update.js b/test/integration/mtime-update.js index 118baca7d..20002ab92 100644 --- a/test/integration/mtime-update.js +++ b/test/integration/mtime-update.js @@ -22,7 +22,7 @@ describe('Update only mtime', () => { beforeEach(pouchHelpers.createDatabase) beforeEach(cozyHelpers.deleteAll) - beforeEach(function() { + beforeEach(function () { helpers = TestHelpers.init(this) helpers.local.setupTrash() }) @@ -34,7 +34,7 @@ describe('Update only mtime', () => { describe('of a file', () => { context('when update is made on local filesystem', () => { let oldUpdatedAt - beforeEach('create file and update mtime', async function() { + beforeEach('create file and update mtime', async function () { await helpers.remote.ignorePreviousChanges() oldUpdatedAt = new Date() @@ -73,7 +73,7 @@ describe('Update only mtime', () => { context('when update is made on remote Cozy', () => { let file, oldUpdatedAt - beforeEach('create file and update mtime', async function() { + beforeEach('create file and update mtime', async function () { await helpers.remote.ignorePreviousChanges() oldUpdatedAt = new Date() @@ -114,7 +114,7 @@ describe('Update only mtime', () => { describe('of a folder', () => { context('when update is made on local filesystem', () => { let oldUpdatedAt - beforeEach('create folder and update mtime', async function() { + beforeEach('create folder and update mtime', async function () { await helpers.remote.ignorePreviousChanges() oldUpdatedAt = new Date() @@ -147,7 +147,7 @@ describe('Update only mtime', () => { context('when update is made on remote Cozy', () => { let oldUpdatedAt, dir - beforeEach('create folder and update mtime', async function() { + beforeEach('create folder and update mtime', async function () { await helpers.remote.ignorePreviousChanges() oldUpdatedAt = new Date() diff --git a/test/integration/notes.js b/test/integration/notes.js index 6f04a1597..24ff9b49d 100644 --- a/test/integration/notes.js +++ b/test/integration/notes.js @@ -25,7 +25,7 @@ describe('Update', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { builders = new Builders({ cozy: cozyHelpers.cozy, pouch: this.pouch }) helpers = TestHelpers.init(this) @@ -86,10 +86,7 @@ describe('Update', () => { describe('Cozy Note move', () => { let note beforeEach('create note', async () => { - await builders - .remoteDir() - .name('dst') - .create() + await builders.remoteDir().name('dst').create() note = await builders .remoteNote() .name('note.cozy-note') @@ -138,10 +135,7 @@ describe('Update', () => { describe('Cozy Note move with update', () => { let dst, note beforeEach('create note', async () => { - dst = await builders - .remoteDir() - .name('dst') - .create() + dst = await builders.remoteDir().name('dst').create() note = await builders .remoteNote() .name('note.cozy-note') @@ -180,9 +174,7 @@ describe('Update', () => { it('updates the note metadata', async () => { const updatedDoc = await helpers.pouch.byRemoteIdMaybe(note._id) - should(updatedDoc) - .have.property('name') - .equal(note.name) + should(updatedDoc).have.property('name').equal(note.name) }) }) @@ -216,9 +208,7 @@ describe('Update', () => { name: note.name, dir_id: dst._id }) - should(updatedRemote) - .have.property('md5sum') - .not.equal(note.md5sum) + should(updatedRemote).have.property('md5sum').not.equal(note.md5sum) should(isNote(updatedRemote)).be.true() }) diff --git a/test/integration/permanent_deletion.js b/test/integration/permanent_deletion.js index 5183360d4..56efc760f 100644 --- a/test/integration/permanent_deletion.js +++ b/test/integration/permanent_deletion.js @@ -22,7 +22,7 @@ describe('Permanent deletion remote', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) await helpers.local.setupTrash() await helpers.remote.ignorePreviousChanges() diff --git a/test/integration/platform_incompatibilities.js b/test/integration/platform_incompatibilities.js index b365e3d5b..3b253c6a0 100644 --- a/test/integration/platform_incompatibilities.js +++ b/test/integration/platform_incompatibilities.js @@ -37,7 +37,7 @@ describe('Platform incompatibilities', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { cozy = cozyHelpers.cozy builders = new Builders({ cozy }) helpers = TestHelpers.init(this) @@ -71,14 +71,8 @@ describe('Platform incompatibilities', () => { should(helpers._sync.blockSyncFor).not.have.been.called() it('add incompatible dir and file', async () => { - await builders - .remoteDir() - .name('di:r') - .create() - await builders - .remoteFile() - .name('fi:le') - .create() + await builders.remoteDir().name('di:r').create() + await builders.remoteFile().name('fi:le').create() await helpers.pullAndSyncAll() should(await helpers.local.tree()).be.empty() @@ -87,10 +81,7 @@ describe('Platform incompatibilities', () => { }) it('add incompatible dir with two colons', async () => { - await builders - .remoteDir() - .name('d:i:r') - .create() + await builders.remoteDir().name('d:i:r').create() await helpers.pullAndSyncAll() should(await helpers.local.tree()).be.empty() @@ -362,9 +353,12 @@ describe('Platform incompatibilities', () => { }) it('move remote dir with incompatible metadata & remote content', async () => { - const remoteDocs /*: { [string]: MetadataRemoteInfo } */ = await helpers.remote.createTree( - ['dir/', 'dir/sub:dir/', 'dir/sub:dir/file'] - ) + const remoteDocs /*: { [string]: MetadataRemoteInfo } */ = + await helpers.remote.createTree([ + 'dir/', + 'dir/sub:dir/', + 'dir/sub:dir/file' + ]) await helpers.pullAndSyncAll() // Simulate remote move @@ -379,10 +373,7 @@ describe('Platform incompatibilities', () => { .name('dir2') .updatedAt(...timestamp.spread(new Date())) .create() - const dir2 = builders - .metadir() - .fromRemote(newRemoteDoc) - .build() + const dir2 = builders.metadir().fromRemote(newRemoteDoc).build() await helpers.prep.moveFolderAsync('remote', dir2, dir) await helpers.syncAll() diff --git a/test/integration/sync_state.js b/test/integration/sync_state.js index 45b5bec0c..068902868 100644 --- a/test/integration/sync_state.js +++ b/test/integration/sync_state.js @@ -24,7 +24,7 @@ describe('Sync state', () => { let events, helpers - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) events = helpers.events sinon.spy(events, 'emit') diff --git a/test/integration/trash.js b/test/integration/trash.js index d26a25b4f..e8cd81d0e 100644 --- a/test/integration/trash.js +++ b/test/integration/trash.js @@ -30,7 +30,7 @@ describe('Trash', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { cozy = cozyHelpers.cozy helpers = TestHelpers.init(this) pouch = helpers.pouch @@ -352,7 +352,7 @@ describe('Restore', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { cozy = cozyHelpers.cozy helpers = TestHelpers.init(this) diff --git a/test/integration/update.js b/test/integration/update.js index c4aa59c94..0c5900297 100644 --- a/test/integration/update.js +++ b/test/integration/update.js @@ -29,7 +29,7 @@ describe('Update file', () => { afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { builders = new Builders({ cozy: cozyHelpers.cozy }) cozy = cozyHelpers.cozy helpers = TestHelpers.init(this) diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 0a6d2cfa4..000000000 --- a/test/mocha.opts +++ /dev/null @@ -1,13 +0,0 @@ ---color ---slow 150 ---timeout 20000 ---reporter spec ---require ./core/globals ---require should ---require should-sinon ---require ./test/support/assertions/change ---require ./test/support/assertions/fileContents ---require ./test/support/assertions/pending ---require ./test/support/assertions/timestamp ---require ./test/support/stacktraces ---recursive diff --git a/test/performance/local/watcher.js b/test/performance/local/watcher.js index 9b2ebdfa4..b46873dde 100644 --- a/test/performance/local/watcher.js +++ b/test/performance/local/watcher.js @@ -45,12 +45,7 @@ let abspath const createDoc = async (builders, dir, relpath /*: string */, ino) => { if (dir) { - await builders - .metadir() - .path(relpath) - .ino(ino) - .upToDate() - .create() + await builders.metadir().path(relpath).ino(ino).upToDate().create() } else { await builders .metafile() @@ -74,30 +69,30 @@ describe('LocalWatcher charge', () => { let watcher, prep, builders before('instanciate config', configHelpers.createConfig) before('instanciate pouch', pouchHelpers.createDatabase) - before('prepare builders', function() { + before('prepare builders', function () { builders = new Builders({ pouch: this.pouch }) }) - before('create outside dir', async function() { + before('create outside dir', async function () { await fse.emptyDir(path.resolve(path.join(this.syncPath, '..', 'outside'))) }) - before('instanciate local watcher', async function() { + before('instanciate local watcher', async function () { prep = new SpyPrep() const events = { emit: () => {} } // $FlowFixMe watcher = new Watcher(this.syncPath, prep, this.pouch, events) }) - before('cleanup test directory', async function() { + before('cleanup test directory', async function () { await fse.emptyDir(this.syncPath) }) - before(function() { + before(function () { abspath = relpath => path.join(this.syncPath, relpath.replace(/\//g, path.sep)) }) let events - before('prepare FS', async function() { + before('prepare FS', async function () { this.timeout(10 * 60 * 1000) const now = new Date() events = new Array(N) @@ -124,9 +119,9 @@ describe('LocalWatcher charge', () => { after('destroy pouch', pouchHelpers.cleanDatabase) after('clean config', configHelpers.cleanConfig) - describe(`with ${N} events`, function() { + describe(`with ${N} events`, function () { this.timeout(5 * 60 * 1000) - it('takes less than 5min and does not crash', async function() { + it('takes less than 5min and does not crash', async function () { this.timeout(5 * 60 * 1000) await watcher.onFlush(events) // TODO: Make benchmark more realistic with real actions, e.g. big moves. diff --git a/test/property/local_watcher/index.js b/test/property/local_watcher/index.js index d15e2e75a..49282d27b 100644 --- a/test/property/local_watcher/index.js +++ b/test/property/local_watcher/index.js @@ -17,14 +17,14 @@ const TmpDir = require('../../support/helpers/TmpDir') const { run } = require('../runner') -describe('Local watcher', function() { +describe('Local watcher', function () { this.timeout(240000) this.slow(30000) const scenarios = glob.sync(path.join(__dirname, '*.json')) scenarios.forEach(scenario => { scenario = path.normalize(scenario) - it(`works fine for ${path.basename(scenario)}`, async function() { + it(`works fine for ${path.basename(scenario)}`, async function () { const ops = await fse.readJson(scenario) if (ops.length > 0 && ops[0].op === 'pending') { return this.skip(ops[0].msg || 'pending') diff --git a/test/property/runner.js b/test/property/runner.js index e8710868e..530fd4f48 100644 --- a/test/property/runner.js +++ b/test/property/runner.js @@ -87,7 +87,7 @@ async function step(state /*: Object */, op /*: Object */) { const block = size > 65536 ? 65536 : size const content = await crypto.randomBytes(block) size -= block - setTimeout(async function() { + setTimeout(async function () { await state.dir.outputFile(op.path, content).catch(() => {}) }, (i + 1) * 10) } @@ -112,6 +112,9 @@ async function step(state /*: Object */, op /*: Object */) { } else { fs.chmodSync(abspath, 0o700) } + return + } else { + throw err } }) } catch (err) { diff --git a/test/property/two_clients/index.js b/test/property/two_clients/index.js index d33fd3bf1..f5954f961 100644 --- a/test/property/two_clients/index.js +++ b/test/property/two_clients/index.js @@ -15,14 +15,14 @@ const { run } = require('../runner') const { setupStack } = require('../stack') const { setupDevice } = require('../device') -describe('Two clients', function() { +describe('Two clients', function () { this.timeout(600000) this.slow(60000) const scenarios = glob.sync(path.join(__dirname, '*.json')) scenarios.forEach(scenario => { scenario = path.normalize(scenario) - it(`works fine for ${path.basename(scenario)}`, async function() { + it(`works fine for ${path.basename(scenario)}`, async function () { const data = await fse.readJson(scenario) if (data.pending) { return this.skip(data.pending.msg || 'pending') diff --git a/test/regression/TRELLO_484_local_sort_before_squash.js b/test/regression/TRELLO_484_local_sort_before_squash.js index c97663e46..f339cebaa 100644 --- a/test/regression/TRELLO_484_local_sort_before_squash.js +++ b/test/regression/TRELLO_484_local_sort_before_squash.js @@ -17,19 +17,19 @@ let helpers // Spies let prepCalls -describe('TRELLO #484: Local sort before squash (https://trello.com/c/RcRmqymw)', function() { +describe('TRELLO #484: Local sort before squash (https://trello.com/c/RcRmqymw)', function () { before(configHelpers.createConfig) before(configHelpers.registerClient) beforeEach(pouchHelpers.createDatabase) beforeEach(cozyHelpers.deleteAll) - beforeEach('set up synced dir', async function() { + beforeEach('set up synced dir', async function () { await fse.emptyDir(this.syncPath) }) afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) prepCalls = [] @@ -63,7 +63,7 @@ describe('TRELLO #484: Local sort before squash (https://trello.com/c/RcRmqymw)' } }) - it('is fixed', async function() { + it('is fixed', async function () { await init( { init: [ diff --git a/test/regression/TRELLO_646_move_overridden_before_sync.js b/test/regression/TRELLO_646_move_overridden_before_sync.js index b332fcd84..5d0d5a7e5 100644 --- a/test/regression/TRELLO_646_move_overridden_before_sync.js +++ b/test/regression/TRELLO_646_move_overridden_before_sync.js @@ -20,19 +20,19 @@ describe('TRELLO #646: Déplacement écrasé avant synchro (malgré la synchro p before(configHelpers.registerClient) beforeEach(pouchHelpers.createDatabase) beforeEach(cozyHelpers.deleteAll) - beforeEach('set up synced dir', async function() { + beforeEach('set up synced dir', async function () { await fse.emptyDir(this.syncPath) }) afterEach(pouchHelpers.cleanDatabase) after(configHelpers.cleanConfig) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) await helpers.local.setupTrash() }) - it('is broken', async function() { + it('is broken', async function () { this.timeout(30000) const pouchTree = async () => _.chain(await this.pouch.byRecursivePath('')) @@ -45,7 +45,12 @@ describe('TRELLO #646: Déplacement écrasé avant synchro (malgré la synchro p const mtime = ctime await helpers.remote.ignorePreviousChanges() await init( - { init: [{ ino: 1, path: 'src/' }, { ino: 2, path: 'src/file' }] }, + { + init: [ + { ino: 1, path: 'src/' }, + { ino: 2, path: 'src/file' } + ] + }, this.pouch, helpers.local.syncDir.abspath, _.identity diff --git a/test/scenarios/create_dirs/scenario.js b/test/scenarios/create_dirs/scenario.js index ad9c85018..d872b769d 100644 --- a/test/scenarios/create_dirs/scenario.js +++ b/test/scenarios/create_dirs/scenario.js @@ -3,7 +3,10 @@ /*:: import type { Scenario } from '..' */ module.exports = ({ - actions: [{ type: 'mkdir', path: 'foo' }, { type: 'mkdir', path: 'foo/bar' }], + actions: [ + { type: 'mkdir', path: 'foo' }, + { type: 'mkdir', path: 'foo/bar' } + ], expected: { tree: ['foo/', 'foo/bar/'], trash: [] diff --git a/test/scenarios/move_dir_a_to_b_to_c_to_b/scenario.js b/test/scenarios/move_dir_a_to_b_to_c_to_b/scenario.js index c2156afbd..8e8c05d61 100644 --- a/test/scenarios/move_dir_a_to_b_to_c_to_b/scenario.js +++ b/test/scenarios/move_dir_a_to_b_to_c_to_b/scenario.js @@ -3,7 +3,10 @@ /*:: import type { Scenario } from '..' */ module.exports = ({ - init: [{ ino: 1, path: 'src/' }, { ino: 2, path: 'src/A/' }], + init: [ + { ino: 1, path: 'src/' }, + { ino: 2, path: 'src/A/' } + ], actions: [ { type: 'mv', src: 'src/A', dst: 'src/B' }, { type: 'wait', ms: 1500 }, diff --git a/test/scenarios/move_file_a_to_b_to_c_to_b/scenario.js b/test/scenarios/move_file_a_to_b_to_c_to_b/scenario.js index 4c77eca40..0a25a1b9f 100644 --- a/test/scenarios/move_file_a_to_b_to_c_to_b/scenario.js +++ b/test/scenarios/move_file_a_to_b_to_c_to_b/scenario.js @@ -4,7 +4,10 @@ module.exports = ({ useCaptures: false, - init: [{ ino: 1, path: 'src/' }, { ino: 2, path: 'src/A' }], + init: [ + { ino: 1, path: 'src/' }, + { ino: 2, path: 'src/A' } + ], actions: [ { type: 'mv', src: 'src/A', dst: 'src/B' }, { type: 'wait', ms: 1500 }, diff --git a/test/scenarios/rename_identical_local_loopback/scenario.js b/test/scenarios/rename_identical_local_loopback/scenario.js index 8c7cbe80e..56b4ae71e 100644 --- a/test/scenarios/rename_identical_local_loopback/scenario.js +++ b/test/scenarios/rename_identical_local_loopback/scenario.js @@ -6,7 +6,10 @@ module.exports = ({ // FIXME: fails on darwin because cozy-stack uses case-insensitive APFS platforms: ['win32', 'darwin'], side: 'local', - init: [{ ino: 1, path: 'DIR_CASE/' }, { ino: 2, path: 'FILE.CASE' }], + init: [ + { ino: 1, path: 'DIR_CASE/' }, + { ino: 2, path: 'FILE.CASE' } + ], actions: [ // No action, we're just simulating FS events after syncing remote to local. ], diff --git a/test/scenarios/replace_file_with_dir/scenario.js b/test/scenarios/replace_file_with_dir/scenario.js index 49df2d8a5..dd45cb087 100644 --- a/test/scenarios/replace_file_with_dir/scenario.js +++ b/test/scenarios/replace_file_with_dir/scenario.js @@ -5,7 +5,10 @@ module.exports = ({ disabled: "We don't know how to handle it yet.", init: [{ ino: 1, path: 'foo' }], - actions: [{ type: 'delete', path: 'foo' }, { type: 'mkdir', path: 'foo' }], + actions: [ + { type: 'delete', path: 'foo' }, + { type: 'mkdir', path: 'foo' } + ], expected: { tree: ['foo/'], trash: ['foo'] diff --git a/test/scenarios/run.js b/test/scenarios/run.js index 05ab65a54..4c0e6e4ff 100644 --- a/test/scenarios/run.js +++ b/test/scenarios/run.js @@ -33,17 +33,17 @@ const { platform } = process const logger = require('../../core/utils/logger') const log = new logger({ component: 'TEST' }) -describe('Test scenarios', function() { +describe('Test scenarios', function () { let helpers beforeEach(configHelpers.createConfig) beforeEach(configHelpers.registerClient) beforeEach(pouchHelpers.createDatabase) beforeEach(cozyHelpers.deleteAll) - beforeEach('set up outside dir', async function() { + beforeEach('set up outside dir', async function () { await fse.emptyDir(path.resolve(path.join(this.syncPath, '..', 'outside'))) }) - beforeEach(async function() { + beforeEach(async function () { helpers = TestHelpers.init(this) // TODO: helpers.setup() @@ -51,7 +51,7 @@ describe('Test scenarios', function() { await helpers.remote.ignorePreviousChanges() }) - afterEach(async function() { + afterEach(async function () { await helpers.stop() }) afterEach(pouchHelpers.cleanDatabase) @@ -78,7 +78,7 @@ describe('Test scenarios', function() { continue } - it(localTestName, async function() { + it(localTestName, async function () { await runLocalAtom(scenario, atomCapture, helpers) }) } @@ -98,7 +98,7 @@ describe('Test scenarios', function() { const breakpoints = injectChokidarBreakpoints(eventsFile) for (let flushAfter of breakpoints) { - it(localTestName + ' flushAfter=' + flushAfter, async function() { + it(localTestName + ' flushAfter=' + flushAfter, async function () { await runLocalChokidarWithCaptures( scenario, _.cloneDeep(eventsFile), @@ -108,7 +108,7 @@ describe('Test scenarios', function() { }) } } else { - it(localTestName, async function() { + it(localTestName, async function () { await runLocalChokidarWithoutCaptures( scenario, _.cloneDeep(eventsFile), @@ -123,7 +123,7 @@ describe('Test scenarios', function() { if (stoppedTestSkipped) { it.skip(`${stoppedTestName} (${stoppedTestSkipped})`, () => {}) } else { - it(stoppedTestName, async function() { + it(stoppedTestName, async function () { this.timeout(3 * 60 * 1000) await runLocalStopped(scenario, helpers) }) @@ -138,7 +138,7 @@ describe('Test scenarios', function() { continue } - it(remoteTestName, async function() { + it(remoteTestName, async function () { await runRemote(scenario, helpers) }) } diff --git a/test/support/assertions/change.js b/test/support/assertions/change.js index 90dffca98..742840374 100644 --- a/test/support/assertions/change.js +++ b/test/support/assertions/change.js @@ -4,7 +4,7 @@ const should = require('should') function changeAssertion(strict) { const assertionName = strict ? 'changeOnly' : 'change' - const assertion = function(actual, props) { + const assertion = function (actual, props) { if (props) { if (this.negate) { throw new Error( diff --git a/test/support/assertions/fileContents.js b/test/support/assertions/fileContents.js index 5221cce8f..90870e4a7 100644 --- a/test/support/assertions/fileContents.js +++ b/test/support/assertions/fileContents.js @@ -14,7 +14,7 @@ import type { ContextDir } from '../helpers/context_dir' // file1: 'content 1', // file2: 'content 2' // }) -should.Assertion.prototype.fileContents = async function( +should.Assertion.prototype.fileContents = async function ( expected /*: { [path: string]: string } */ ) { const dir /*: ContextDir */ = this.obj diff --git a/test/support/assertions/pending.js b/test/support/assertions/pending.js index 0be8434b1..8a2adfd67 100644 --- a/test/support/assertions/pending.js +++ b/test/support/assertions/pending.js @@ -1,6 +1,6 @@ const should = require('should') -should.Assertion.add('pending', function() { +should.Assertion.add('pending', function () { this.params = { operator: 'be pending' } this.obj.isPending().should.be.true() }) diff --git a/test/support/assertions/timestamp.js b/test/support/assertions/timestamp.js index ca44f2b54..50036d40d 100644 --- a/test/support/assertions/timestamp.js +++ b/test/support/assertions/timestamp.js @@ -2,8 +2,8 @@ const should = require('should') const timestamp = require('../../../core/utils/timestamp') -should.use(function(should, Assertion) { - Assertion.add('sameTimestamp', function(expected, message) { +should.use(function (should, Assertion) { + Assertion.add('sameTimestamp', function (expected, message) { this.params = { operator: 'be the same timestamp as', expected, @@ -13,7 +13,7 @@ should.use(function(should, Assertion) { this.obj.getTime().should.equal(expected.getTime()) }) - Assertion.add('timestamp', function(...args) { + Assertion.add('timestamp', function (...args) { const expected = timestamp.build(...args) this.params = { diff --git a/test/support/builders/checksum.js b/test/support/builders/checksum.js index 563f40017..df17ef207 100644 --- a/test/support/builders/checksum.js +++ b/test/support/builders/checksum.js @@ -19,11 +19,7 @@ module.exports = class ChecksumBuilder { 'build() can only be called with String data as we will not await a Stream reading' ) } else { - return crypto - .createHash('md5') - .update(data) - .digest() - .toString('base64') + return crypto.createHash('md5').update(data).digest().toString('base64') } } @@ -34,11 +30,11 @@ module.exports = class ChecksumBuilder { checksum.setEncoding('base64') return new Promise((resolve, reject) => { - stream.on('end', function() { + stream.on('end', function () { checksum.end() resolve(String(checksum.read())) }) - stream.on('error', function(err) { + stream.on('error', function (err) { checksum.end() reject(err) }) diff --git a/test/support/builders/db.js b/test/support/builders/db.js index c66ada46d..db26f9023 100644 --- a/test/support/builders/db.js +++ b/test/support/builders/db.js @@ -4,7 +4,7 @@ * @flow */ -const uuid = require('uuid/v4') +const uuid = require('uuid').v4 module.exports = { id() /*: string */ { diff --git a/test/support/builders/metadata/base.js b/test/support/builders/metadata/base.js index 912960322..5532b91f0 100644 --- a/test/support/builders/metadata/base.js +++ b/test/support/builders/metadata/base.js @@ -342,10 +342,10 @@ module.exports = class BaseMetadataBuilder { if ( this.doc.remote != null && (!this.doc.sides || - (!this.doc.sides.local || - (this.doc.sides.remote && - (this.doc.sides.remote < this.doc.sides.local || - remoteIsUpToDate(this.doc))))) + !this.doc.sides.local || + (this.doc.sides.remote && + (this.doc.sides.remote < this.doc.sides.local || + remoteIsUpToDate(this.doc)))) ) { return } diff --git a/test/support/builders/remote/dir.js b/test/support/builders/remote/dir.js index d0f03be9c..07129451b 100644 --- a/test/support/builders/remote/dir.js +++ b/test/support/builders/remote/dir.js @@ -23,7 +23,9 @@ var dirNumber = 1 // // const dir: MetadataRemoteDir = await builders.remoteDir().inDir(...).create() // -module.exports = class RemoteDirBuilder extends RemoteBaseBuilder /*:: */ { +module.exports = class RemoteDirBuilder extends ( + RemoteBaseBuilder +) /*:: */ { constructor(cozy /*: ?Cozy */, old /*: ?(RemoteDir|MetadataRemoteDir) */) { super(cozy, old) diff --git a/test/support/builders/remote/file.js b/test/support/builders/remote/file.js index c84ff45b9..d83a4d0a7 100644 --- a/test/support/builders/remote/file.js +++ b/test/support/builders/remote/file.js @@ -47,7 +47,9 @@ const baseData = `Content of remote file ${fileNumber}` // // const file /*: MetadataRemoteFile */ = await builders.remoteFile().inDir(...).create() // -module.exports = class RemoteFileBuilder extends RemoteBaseBuilder /*:: */ { +module.exports = class RemoteFileBuilder extends ( + RemoteBaseBuilder +) /*:: */ { /*:: _data: string | stream.Readable | Buffer */ diff --git a/test/support/builders/remote/note.js b/test/support/builders/remote/note.js index 2273b5ef4..2700d603b 100644 --- a/test/support/builders/remote/note.js +++ b/test/support/builders/remote/note.js @@ -39,7 +39,9 @@ const baseMetadata = { // // const note /*: MetadataRemoteFile */ = await builders.remoteNote().inDir(...).create() // -module.exports = class RemoteNoteBuilder extends RemoteBaseBuilder /*:: */ { +module.exports = class RemoteNoteBuilder extends ( + RemoteBaseBuilder +) /*:: */ { /*:: _title: string _content: string diff --git a/test/support/builders/stats.js b/test/support/builders/stats.js index 0b04c0dca..6d6c3d958 100644 --- a/test/support/builders/stats.js +++ b/test/support/builders/stats.js @@ -86,11 +86,7 @@ class DefaultStatsBuilder { * hexadecimal string. */ const fileIdFromNumber = (n /*: number */) => - '0x' + - n - .toString(16) - .toUpperCase() - .padStart(16, '0') + '0x' + n.toString(16).toUpperCase().padStart(16, '0') /** Build a @gyselroth/windows-fsstat object */ class WinStatsBuilder { diff --git a/test/support/builders/stream.js b/test/support/builders/stream.js index c1f4b5c97..b2bc52bb7 100644 --- a/test/support/builders/stream.js +++ b/test/support/builders/stream.js @@ -26,7 +26,7 @@ module.exports = class StreamBuilder { build() /*: stream.Readable */ { const builder = this return new stream.Readable({ - read: function() { + read: function () { if (builder.err) { this.emit('error', builder.err) } else { diff --git a/test/support/doubles/side.js b/test/support/doubles/side.js index 43c1e51ff..12d4c9023 100644 --- a/test/support/doubles/side.js +++ b/test/support/doubles/side.js @@ -31,7 +31,7 @@ module.exports = function stubSide(name /*: SideName */) /*: Writer */ { double.watcher.running = new Promise(() => {}) if (name === 'remote') { - double.isExcludedFromSync = sinon.stub.returns() + double.isExcludedFromSync = sinon.stub().returns() } return double diff --git a/test/support/helpers/index.js b/test/support/helpers/index.js index 8ddb75a76..f6da13d04 100644 --- a/test/support/helpers/index.js +++ b/test/support/helpers/index.js @@ -141,8 +141,8 @@ class TestHelpers { } resetPouchSpy() { - this.pouch.put.reset() - this.pouch.bulkDocs.reset() + this.pouch.put.resetHistory() + this.pouch.bulkDocs.resetHistory() } // XXX: The order of calls is not respected here as we merge the calls of diff --git a/test/support/helpers/local.js b/test/support/helpers/local.js index 89829bbbd..9a114bca6 100644 --- a/test/support/helpers/local.js +++ b/test/support/helpers/local.js @@ -79,11 +79,7 @@ class LocalTestHelpers { async sendToTrash(src /*: string */) /*: Promise */ { const dst = path.join(this.trashPath, path.basename(src)) - try { - await fse.rename(src, dst) - } catch (err) { - throw err - } + await fse.rename(src, dst) } async setupTrash() { diff --git a/test/support/helpers/remote.js b/test/support/helpers/remote.js index 9a147694e..abc83533b 100644 --- a/test/support/helpers/remote.js +++ b/test/support/helpers/remote.js @@ -174,7 +174,7 @@ class RemoteTestHelpers { return _.chain(await this.tree()) .map(p => _.nth(p.match(TRASH_REGEXP), 1)) .compact() - .map(p => p.replace(/\(__cozy__: \d+\)/, '(__cozy__: ...)')) + .map(p => p.replace(/\(\d+\)/, '(...)')) .value() } diff --git a/test/support/helpers/scenarios.js b/test/support/helpers/scenarios.js index 4c2de746e..648ce3f7c 100644 --- a/test/support/helpers/scenarios.js +++ b/test/support/helpers/scenarios.js @@ -202,6 +202,11 @@ module.exports.loadRemoteChangesFiles = ( }) } +const toFsStats = (stats /*: Stats */) /*: fs.Stats */ => { + const anyStats /*: any */ = stats + return (anyStats /*: fs.Stats */) +} + const fixCapture = ( capture /*: {| batches: AtomEvent[][] |} | {| events: ChokidarEvent[] |} */, inoMap /*: Map */ @@ -228,8 +233,7 @@ const fixCapture = ( if (!stats.fileid) { // Make sure `event.stats` is an instance of `fs.Stats` so // `stater.isDirectory()` returns the appropriate value. - // $FlowFixMe No `fileid` means `stats` is not a `WinStats` instance - event.stats = fsStatsFromObj(stats) + event.stats = fsStatsFromObj(toFsStats(stats)) } }) }) diff --git a/test/support/hooks/logging.js b/test/support/hooks/logging.js index db2e1d004..2fd7d2d1a 100644 --- a/test/support/hooks/logging.js +++ b/test/support/hooks/logging.js @@ -12,13 +12,13 @@ defaultLogger.addStream({ type: 'raw', level: 'error', stream: { - write: function(msg) { + write: function (msg) { errors.push(msg.err || msg) } } }) -beforeEach(function() { +beforeEach(function () { errors.length = 0 // FIXME: this.currentTest is undefined on AppVeyor, not sure why if (process.env.APPVEYOR == null) { @@ -26,7 +26,7 @@ beforeEach(function() { } }) -afterEach(function() { +afterEach(function () { for (const err of errors) { // eslint-disable-next-line no-console console.log(err) diff --git a/test/unit/IdConflict.js b/test/unit/IdConflict.js index 2b9179828..4477dd6e3 100644 --- a/test/unit/IdConflict.js +++ b/test/unit/IdConflict.js @@ -11,7 +11,7 @@ const IdConflict = require('../../core/IdConflict') const builders = new Builders() const { platform } = process -describe('IdConflict', function() { +describe('IdConflict', function () { const side = 'remote' // whatever describe('.detect()', () => { @@ -104,19 +104,13 @@ describe('IdConflict', function() { } beforeEach(() => { - existingDoc = builders - .metadata() - .path(existingPath) - .build() + existingDoc = builders.metadata().path(existingPath).build() }) describe('when change is an addition', () => { const addition = path => ({ side, - doc: builders - .metadata() - .path(path) - .build() + doc: builders.metadata().path(path).build() }) describe('to the existing path', () => { @@ -134,14 +128,8 @@ describe('IdConflict', function() { describe('when change is a move', () => { const move = ({ srcPath, dstPath }) => ({ - doc: builders - .metadata() - .path(dstPath) - .build(), - was: builders - .metadata() - .path(srcPath) - .build() + doc: builders.metadata().path(dstPath).build(), + was: builders.metadata().path(srcPath).build() }) describe('to a completely different path (should not happen)', () => { diff --git a/test/unit/app.js b/test/unit/app.js index fd7484267..3033caa3e 100644 --- a/test/unit/app.js +++ b/test/unit/app.js @@ -14,34 +14,34 @@ const { FetchError } = require('../../core/remote/cozy') const configHelpers = require('../support/helpers/config') -describe('App', function() { - describe('parseCozyUrl', function() { - it('parses https://example.com/', function() { +describe('App', function () { + describe('parseCozyUrl', function () { + it('parses https://example.com/', function () { let parsed = App.prototype.parseCozyUrl('https://example.com') parsed.protocol.should.equal('https:') parsed.host.should.equal('example.com') }) - it('parses example.org as https://example.org', function() { + it('parses example.org as https://example.org', function () { let parsed = App.prototype.parseCozyUrl('example.org') parsed.protocol.should.equal('https:') parsed.host.should.equal('example.org') }) - it('parses zoe as https://zoe.mycozy.cloud', function() { + it('parses zoe as https://zoe.mycozy.cloud', function () { let parsed = App.prototype.parseCozyUrl('zoe') parsed.protocol.should.equal('https:') parsed.host.should.equal('zoe.mycozy.cloud') }) - it('parses http://localhost:9104', function() { + it('parses http://localhost:9104', function () { let parsed = App.prototype.parseCozyUrl('http://localhost:9104') parsed.protocol.should.equal('http:') parsed.hostname.should.equal('localhost') parsed.port.should.equal('9104') }) - it('parses https://toto.cozy.claude.fr:8084', function() { + it('parses https://toto.cozy.claude.fr:8084', function () { let parsed = App.prototype.parseCozyUrl( 'https://toto.cozy.claude.fr:8084' ) @@ -54,7 +54,7 @@ describe('App', function() { describe('removeRemote', () => { beforeEach(configHelpers.createConfig) - it('removes the config even if the Cozy is unreachable', async function() { + it('removes the config even if the Cozy is unreachable', async function () { // We have to call this helper here and not in a beforeEach otherwise the // next test will actually delete the test OAuth client on the Cozy and // other tests will subsequently fail. @@ -82,7 +82,7 @@ describe('App', function() { return } - it('unregisters the client', async function() { + it('unregisters the client', async function () { await configHelpers.registerOAuthClient.call(this) const configDir = path.dirname(this.config.configPath) const basePath = path.dirname(configDir) @@ -105,7 +105,7 @@ describe('App', function() { beforeEach(configHelpers.createConfig) beforeEach(configHelpers.registerClient) - it('removes everything but the logs from the config dir', async function() { + it('removes everything but the logs from the config dir', async function () { const configDir = path.dirname(this.config.configPath) const basePath = path.dirname(configDir) const app = new App(basePath) @@ -193,7 +193,7 @@ describe('App', function() { describe('stopSync', () => { let app - beforeEach('create app', function() { + beforeEach('create app', function () { configHelpers.createConfig.call(this) configHelpers.registerClient.call(this) this.config.persist() // the config helper does not persist it @@ -201,7 +201,7 @@ describe('App', function() { }) context('when we have an instanciated Sync', () => { - beforeEach('instanciate app', function() { + beforeEach('instanciate app', function () { app.instanciate() }) @@ -238,7 +238,7 @@ describe('App', function() { }) }) - it('works when app is configured', function() { + it('works when app is configured', function () { configHelpers.createConfig.call(this) configHelpers.registerClient.call(this) this.config.persist() // the config helper does not persist it @@ -259,7 +259,7 @@ describe('App', function() { }) describe('sendMailToSupport', () => { - it('sends email even without the local PouchDB tree', async function() { + it('sends email even without the local PouchDB tree', async function () { configHelpers.createConfig.call(this) configHelpers.registerClient.call(this) this.config.persist() // the config helper does not persist it diff --git a/test/unit/config.js b/test/unit/config.js index fc2c13e12..93cfa0d95 100644 --- a/test/unit/config.js +++ b/test/unit/config.js @@ -8,37 +8,37 @@ const { COZY_URL } = require('../support/helpers/cozy') const config = require('../../core/config') -describe('core/config', function() { +describe('core/config', function () { describe('.Config', () => { beforeEach('instanciate config', configHelpers.createConfig) afterEach('clean config directory', configHelpers.cleanConfig) - describe('read', function() { - context('when a tmp config file exists', function() { - beforeEach('create tmp config file', function() { + describe('read', function () { + context('when a tmp config file exists', function () { + beforeEach('create tmp config file', function () { fse.ensureFileSync(this.config.tmpConfigPath) }) - afterEach('remove tmp config file', function() { + afterEach('remove tmp config file', function () { if (fse.existsSync(this.config.tmpConfigPath)) { fse.unlinkSync(this.config.tmpConfigPath) } }) - context('and it has a valid JSON content', function() { + context('and it has a valid JSON content', function () { const fileConfig = { url: 'https://cozy.test/' } - beforeEach('write valid content', function() { + beforeEach('write valid content', function () { fse.writeFileSync( this.config.tmpConfigPath, JSON.stringify(fileConfig, null, 2) ) }) - it('reads the tmp config', function() { + it('reads the tmp config', function () { should(this.config.read()).match(fileConfig) }) - it('persists the tmp config file as the new config file', function() { + it('persists the tmp config file as the new config file', function () { this.config.read() const fileConfigPersisted = fse.readJSONSync(this.config.configPath) @@ -46,13 +46,13 @@ describe('core/config', function() { }) }) - context('and it does not have a valid JSON content', function() { - beforeEach('write invalid content', function() { + context('and it does not have a valid JSON content', function () { + beforeEach('write invalid content', function () { fse.writeFileSync(this.config.tmpConfigPath, '\0') this.config.persist() }) - it('reads the existing config', function() { + it('reads the existing config', function () { const fileConfig = this.config.read() should(fileConfig).be.an.Object() should(fileConfig.url).eql(COZY_URL) @@ -60,28 +60,28 @@ describe('core/config', function() { }) }) - context('when no tmp config files exist', function() { - beforeEach('remove any tmp config file', function() { + context('when no tmp config files exist', function () { + beforeEach('remove any tmp config file', function () { if (fse.existsSync(this.config.tmpConfigPath)) { fse.unlinkSync(this.config.tmpConfigPath) } this.config.persist() }) - it('reads the existing config', function() { + it('reads the existing config', function () { const fileConfig = this.config.read() should(fileConfig).be.an.Object() should(fileConfig.url).eql(COZY_URL) }) }) - context('when the read config is empty', function() { - beforeEach('empty local config', function() { + context('when the read config is empty', function () { + beforeEach('empty local config', function () { fse.ensureFileSync(this.config.configPath) fse.writeFileSync(this.config.configPath, '') }) - it('creates a new empty one', function() { + it('creates a new empty one', function () { const fileConfig = this.config.read() should(fileConfig).be.an.Object() should(fileConfig).be.empty() @@ -89,69 +89,69 @@ describe('core/config', function() { }) }) - describe('safeLoad', function() { - context('when the file content is valid JSON', function() { + describe('safeLoad', function () { + context('when the file content is valid JSON', function () { const fileConfig = { url: 'https://cozy.test/' } - beforeEach('write valid content', function() { + beforeEach('write valid content', function () { fse.writeFileSync( this.config.configPath, JSON.stringify(fileConfig, null, 2) ) }) - it('returns an object matching the file content', function() { + it('returns an object matching the file content', function () { const newFileConfig = config.loadOrDeleteFile(this.config.configPath) newFileConfig.should.be.an.Object() newFileConfig.url.should.eql(fileConfig.url) }) }) - context('when the file does not exist', function() { - beforeEach('remove config file', function() { + context('when the file does not exist', function () { + beforeEach('remove config file', function () { if (fse.existsSync(this.config.configPath)) { fse.unlinkSync(this.config.configPath) } }) - it('throws an error', function() { + it('throws an error', function () { ;(() => { config.loadOrDeleteFile(this.config.configPath) }).should.throw() }) }) - context('when the file is empty', function() { - beforeEach('create empty file', function() { + context('when the file is empty', function () { + beforeEach('create empty file', function () { fse.writeFileSync(this.config.configPath, '') }) - it('returns an empty object', function() { + it('returns an empty object', function () { should(config.loadOrDeleteFile(this.config.configPath)).deepEqual({}) }) - it('does not delete it', function() { + it('does not delete it', function () { config.loadOrDeleteFile(this.config.configPath) should(fse.existsSync(this.config.configPath)).be.true() }) }) - context('when the file content is not valid JSON', function() { - beforeEach('write invalid content', function() { + context('when the file content is not valid JSON', function () { + beforeEach('write invalid content', function () { fse.writeFileSync(this.config.configPath, '\0') }) - it('does not throw any errors', function() { + it('does not throw any errors', function () { ;(() => { config.loadOrDeleteFile(this.config.configPath) }).should.not.throw() }) - it('returns an empty object', function() { + it('returns an empty object', function () { should(config.loadOrDeleteFile(this.config.configPath)).deepEqual({}) }) - it('deletes the file', function() { + it('deletes the file', function () { fse.existsSync(this.config.configPath).should.be.true() config.loadOrDeleteFile(this.config.configPath) fse.existsSync(this.config.configPath).should.be.false() @@ -159,8 +159,8 @@ describe('core/config', function() { }) }) - describe('persist', function() { - it('saves last changes made on the config', function() { + describe('persist', function () { + it('saves last changes made on the config', function () { const url = 'http://cozy.local:8080/' this.config.cozyUrl = url this.config.persist() @@ -169,51 +169,51 @@ describe('core/config', function() { }) }) - describe('SyncPath', function() { - it('returns the set sync path', function() { + describe('SyncPath', function () { + it('returns the set sync path', function () { this.config.syncPath = '/path/to/sync/dir' should(this.config.syncPath).equal('/path/to/sync/dir') }) }) - describe('CozyUrl', function() { - it('returns the set Cozy URL', function() { + describe('CozyUrl', function () { + it('returns the set Cozy URL', function () { this.config.cozyUrl = 'https://cozy.example.com' should(this.config.cozyUrl).equal('https://cozy.example.com') }) }) describe('gui', () => { - it('returns an empty hash by default', function() { + it('returns an empty hash by default', function () { should(this.config.gui).deepEqual({}) }) - it('returns GUI configuration if any', function() { + it('returns GUI configuration if any', function () { const guiConfig = { foo: 'bar' } this.config.fileConfig.gui = guiConfig should(this.config.gui).deepEqual(guiConfig) }) }) - describe('Client', function() { - it('can set a client', function() { + describe('Client', function () { + it('can set a client', function () { this.config.client = { clientName: 'test' } should(this.config.isValid()).be.true() should(this.config.client.clientName).equal('test') }) - it('has no client after a reset', function() { + it('has no client after a reset', function () { this.config.reset() should(this.config.isValid()).be.false() }) }) describe('flags', () => { - it('returns an empty hash by default', function() { + it('returns an empty hash by default', function () { should(this.config.flags).deepEqual({}) }) - it('returns GUI configuration if any', function() { + it('returns GUI configuration if any', function () { const flagsConfig = { 'settings.partial-desktop-sync.show-synced-folders-selection': true } @@ -227,13 +227,13 @@ describe('core/config', function() { }) }) - describe('#watcherType', function() { - it('returns valid watcher type from file config if any', function() { + describe('#watcherType', function () { + it('returns valid watcher type from file config if any', function () { this.config.fileConfig.watcherType = 'atom' should(this.config.watcherType).equal('atom') }) - it('is the same as core/config.watcherType() otherwise', function() { + it('is the same as core/config.watcherType() otherwise', function () { should(this.config.watcherType).equal(config.watcherType()) }) }) diff --git a/test/unit/gui/proxy.js b/test/unit/gui/proxy.js index 274f46057..83b2211d4 100644 --- a/test/unit/gui/proxy.js +++ b/test/unit/gui/proxy.js @@ -14,7 +14,7 @@ const cozyHelpers = require('../../support/helpers/cozy') const proxy = require('../../../gui/js/proxy') -describe('gui/js/proxy', function() { +describe('gui/js/proxy', function () { const emptyConfig = { 'login-by-realm': undefined, 'proxy-bypassrules': undefined, diff --git a/test/unit/helpers_merge.js b/test/unit/helpers_merge.js index c33e7e800..2471651a7 100644 --- a/test/unit/helpers_merge.js +++ b/test/unit/helpers_merge.js @@ -14,12 +14,12 @@ const pouchHelpers = require('../support/helpers/pouch') const Builders = require('../support/builders') const stubSide = require('../support/doubles/side') -describe('Merge Helpers', function() { +describe('Merge Helpers', function () { let builders before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('instanciate merge', function() { + beforeEach('instanciate merge', function () { this.side = 'local' this.merge = new Merge(this.pouch) this.merge.putFolderAsync = sinon.stub() @@ -37,28 +37,22 @@ describe('Merge Helpers', function() { return conflict.local }) }) - beforeEach('prepare builders', function() { + beforeEach('prepare builders', function () { builders = new Builders(this) }) afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - describe('resolveConflict', function() { - it('does not change the original doc path', async function() { - const doc = builders - .metadir() - .path('foo/bar') - .build() + describe('resolveConflict', function () { + it('does not change the original doc path', async function () { + const doc = builders.metadir().path('foo/bar').build() await this.merge.resolveConflictAsync(this.side, doc) should(this.merge.local.resolveConflict).have.been.called() should(doc.path).eql(path.normalize('foo/bar')) }) - it('appends -conflict- and the date to the path', async function() { - const doc = builders - .metadir() - .path('foo/bar') - .build() + it('appends -conflict- and the date to the path', async function () { + const doc = builders.metadir().path('foo/bar').build() const dstDoc = await this.merge.resolveConflictAsync(this.side, doc) should(this.merge.local.resolveConflict).have.been.called() should(dstDoc.path) @@ -66,11 +60,8 @@ describe('Merge Helpers', function() { .and.match(conflicts.CONFLICT_REGEXP) }) - it('preserves the extension', async function() { - const doc = builders - .metafile() - .path('foo/bar.jpg') - .build() + it('preserves the extension', async function () { + const doc = builders.metafile().path('foo/bar.jpg').build() const dstDoc = await this.merge.resolveConflictAsync(this.side, doc) should(this.merge.local.resolveConflict).have.been.called() should(dstDoc.path) @@ -79,7 +70,7 @@ describe('Merge Helpers', function() { .and.endWith('.jpg') }) - it('do not chain conflicts', async function() { + it('do not chain conflicts', async function () { const doc = builders .metafile() .path('foo/baz-conflict-2018-11-08T01_02_03.004Z.jpg') diff --git a/test/unit/ignore.js b/test/unit/ignore.js index 31fa0fc36..f5315c624 100644 --- a/test/unit/ignore.js +++ b/test/unit/ignore.js @@ -11,7 +11,7 @@ const metadata = require('../../core/metadata') const { onPlatform } = require('../support/helpers/platform') const TmpDir = require('../support/helpers/TmpDir') -describe('Ignore', function() { +describe('Ignore', function () { describe('.loadSync()', () => { let tmpDir @@ -34,7 +34,7 @@ describe('Ignore', function() { }) describe('Removal of unnecessary lines', () => { - it('remove blank lines or comments', function() { + it('remove blank lines or comments', function () { const ignore = new Ignore([ 'foo', '', // removed @@ -47,26 +47,26 @@ describe('Ignore', function() { }) describe('Ignored patterns', () => { - it("don't ignore file name not matching to the pattern", function() { + it("don't ignore file name not matching to the pattern", function () { const ignore = new Ignore(['foo']) ignore .isIgnored({ relativePath: 'bar', isFolder: false }) .should.be.false() }) - it('ignore file name matching to the pattern', function() { + it('ignore file name matching to the pattern', function () { const ignore = new Ignore(['foo']) ignore .isIgnored({ relativePath: 'foo', isFolder: false }) .should.be.true() }) - it('ignore folder name matching to the pattern', function() { + it('ignore folder name matching to the pattern', function () { const ignore = new Ignore(['foo']) ignore.isIgnored({ relativePath: 'foo', isFolder: true }).should.be.true() }) - it("don't ignore file name when the pattern match folders", function() { + it("don't ignore file name when the pattern match folders", function () { const ignore = new Ignore(['foo/']) ignore .isIgnored({ relativePath: 'foo', isFolder: false }) @@ -76,14 +76,14 @@ describe('Ignore', function() { }) describe('Patterns operators', () => { - it('match to the glob with *', function() { + it('match to the glob with *', function () { const ignore = new Ignore(['*.txt']) ignore .isIgnored({ relativePath: 'foo.txt', isFolder: false }) .should.be.true() }) - it('match to the glob with ?', function() { + it('match to the glob with ?', function () { const ignore = new Ignore(['ba?']) ignore .isIgnored({ relativePath: 'bar', isFolder: false }) @@ -99,7 +99,7 @@ describe('Ignore', function() { .should.be.false() }) - it('match braces {p1,p2}', function() { + it('match braces {p1,p2}', function () { const ignore = new Ignore(['{bar,baz}.txt']) ignore .isIgnored({ relativePath: 'bar.txt', isFolder: false }) @@ -112,7 +112,7 @@ describe('Ignore', function() { .should.be.false() }) - it('match to the glob with range [a-c]', function() { + it('match to the glob with range [a-c]', function () { const ignore = new Ignore(['foo[a-c]']) ignore .isIgnored({ relativePath: 'fooa', isFolder: false }) @@ -130,7 +130,7 @@ describe('Ignore', function() { }) describe('Path patterns', () => { - it('ignore files in subdirectory', function() { + it('ignore files in subdirectory', function () { new Ignore(['foo']) .isIgnored({ relativePath: 'bar/foo', isFolder: false }) .should.be.true() @@ -139,7 +139,7 @@ describe('Ignore', function() { .should.be.false() }) - it('ignore files in a ignored directory', function() { + it('ignore files in a ignored directory', function () { new Ignore(['foo']) .isIgnored({ relativePath: 'foo/bar', isFolder: false }) .should.be.true() @@ -148,14 +148,14 @@ describe('Ignore', function() { .should.be.true() }) - it('ignore folders in a ignored directory', function() { + it('ignore folders in a ignored directory', function () { const ignore = new Ignore(['foo']) ignore .isIgnored({ relativePath: 'foo/bar', isFolder: true }) .should.be.true() }) - it('match leading slash pattern', function() { + it('match leading slash pattern', function () { const ignore = new Ignore(['/foo']) ignore.isIgnored({ relativePath: 'foo', isFolder: true }).should.be.true() ignore @@ -163,21 +163,21 @@ describe('Ignore', function() { .should.be.false() }) - it('match nested file with leading **', function() { + it('match nested file with leading **', function () { const ignore = new Ignore(['**/baz']) ignore .isIgnored({ relativePath: 'foo/bar/baz', isFolder: false }) .should.be.true() }) - it('match nested files with trailing **', function() { + it('match nested files with trailing **', function () { const ignore = new Ignore(['foo/**']) ignore .isIgnored({ relativePath: 'foo/bar/baz', isFolder: false }) .should.be.true() }) - it('match nested files with middle **', function() { + it('match nested files with middle **', function () { const ignore = new Ignore(['a/**/b']) ignore .isIgnored({ relativePath: 'a/foo/bar/b', isFolder: false }) @@ -187,7 +187,7 @@ describe('Ignore', function() { .should.be.true() }) - it("doen't match misnested file with middle **", function() { + it("doen't match misnested file with middle **", function () { const ignore = new Ignore(['a/**/b']) ignore .isIgnored({ relativePath: 'foo/a/b', isFolder: false }) @@ -196,14 +196,14 @@ describe('Ignore', function() { }) describe('Escaping', () => { - it('escapes the comment character', function() { + it('escapes the comment character', function () { const ignore = new Ignore(['\\#foo']) ignore .isIgnored({ relativePath: '#foo', isFolder: false }) .should.be.true() }) - it('escapes the negation character', function() { + it('escapes the negation character', function () { const ignore = new Ignore(['\\!foo']) ignore .isIgnored({ relativePath: '!foo', isFolder: false }) @@ -219,7 +219,7 @@ describe('Ignore', function() { .should.be.false() }) - it('can negate a previous rule', function() { + it('can negate a previous rule', function () { const ignore = new Ignore(['*.foo', '!bar.foo']) ignore .isIgnored({ relativePath: 'bar.foo', isFolder: false }) @@ -229,7 +229,7 @@ describe('Ignore', function() { .should.be.true() }) - it('can negate a more complex previous rules organization', function() { + it('can negate a more complex previous rules organization', function () { const ignore = new Ignore(['/*', '!/foo', '/foo/*', '!/foo/bar']) ignore .isIgnored({ relativePath: 'foo/bar', isFolder: false }) @@ -244,7 +244,7 @@ describe('Ignore', function() { }) describe('Default rules', () => { - it('has some defaults rules for dropbox', function() { + it('has some defaults rules for dropbox', function () { const ignore = new Ignore([]) ignore.addDefaultRules() ignore @@ -252,7 +252,7 @@ describe('Ignore', function() { .should.be.true() }) - it('has some defaults rules for editors', function() { + it('has some defaults rules for editors', function () { const ignore = new Ignore([]) ignore.addDefaultRules() ignore @@ -260,7 +260,7 @@ describe('Ignore', function() { .should.be.true() }) - it('has some defaults rules for OSes', function() { + it('has some defaults rules for OSes', function () { const ignore = new Ignore([]) ignore.addDefaultRules() ignore @@ -268,7 +268,7 @@ describe('Ignore', function() { .should.be.true() }) - it('does ignore Icon', function() { + it('does ignore Icon', function () { const ignore = new Ignore([]) ignore.addDefaultRules() ignore @@ -276,7 +276,7 @@ describe('Ignore', function() { .should.be.true() }) - it('does ignore any hidden file or directory', function() { + it('does ignore any hidden file or directory', function () { const ignore = new Ignore([]) ignore.addDefaultRules() ignore @@ -284,7 +284,7 @@ describe('Ignore', function() { .should.be.true() }) - it('ignores Microsoft Office temporary files', function() { + it('ignores Microsoft Office temporary files', function () { const ignore = new Ignore([]) ignore.addDefaultRules() ignore @@ -343,44 +343,31 @@ describe('Ignore', function() { }) describe('OS specific rules', () => { - before(() => { - this.originalPlatform = Object.getOwnPropertyDescriptor( - process, - 'platform' - ) - }) - - after(() => { - Object.defineProperty(process, 'platform', this.originalPlatform) - }) - it('does not match files if case does not match', () => { - Object.defineProperty(process, 'platform', { - value: 'linux' + onPlatform('linux', () => { + it('does not match files if case does not match', () => { + const ignore = new Ignore(['Foo']) + ignore + .isIgnored({ relativePath: 'foo', isFolder: false }) + .should.be.false() }) - const ignore = new Ignore(['Foo']) - ignore - .isIgnored({ relativePath: 'foo', isFolder: false }) - .should.be.false() }) - it('match files even if case does not match on darwin', () => { - Object.defineProperty(process, 'platform', { - value: 'darwin' + onPlatform('darwin', () => { + it('match files even if case does not match on darwin', () => { + const ignore = new Ignore(['Foo']) + ignore + .isIgnored({ relativePath: 'foo', isFolder: false }) + .should.be.true() }) - const ignore = new Ignore(['Foo']) - ignore - .isIgnored({ relativePath: 'foo', isFolder: false }) - .should.be.true() }) - it('match files even if case does not match on darwin', () => { - Object.defineProperty(process, 'platform', { - value: 'win32' + onPlatform('win32', () => { + it('match files even if case does not match on darwin', () => { + const ignore = new Ignore(['Foo']) + ignore + .isIgnored({ relativePath: 'foo', isFolder: false }) + .should.be.true() }) - const ignore = new Ignore(['Foo']) - ignore - .isIgnored({ relativePath: 'foo', isFolder: false }) - .should.be.true() }) }) diff --git a/test/unit/incompatibilities/platform.js b/test/unit/incompatibilities/platform.js index 95aba15a7..77c95f40d 100644 --- a/test/unit/incompatibilities/platform.js +++ b/test/unit/incompatibilities/platform.js @@ -3,10 +3,8 @@ const should = require('should') const platformIncompatibilities = require('../../../core/incompatibilities/platform') -const { - detectNameIncompatibilities, - detectPathLengthIncompatibility -} = platformIncompatibilities +const { detectNameIncompatibilities, detectPathLengthIncompatibility } = + platformIncompatibilities describe('core/incompatibilities/platform', () => { describe('detectNameIncompatibilities', () => { diff --git a/test/unit/local/atom/add_checksum.js b/test/unit/local/atom/add_checksum.js index fdbbb5a34..9af144bad 100644 --- a/test/unit/local/atom/add_checksum.js +++ b/test/unit/local/atom/add_checksum.js @@ -13,7 +13,7 @@ const Channel = require('../../../../core/local/atom/channel') describe('core/local/atom/add_checksum.loop()', () => { let config, dirpath, filepath before(configHelpers.createConfig) - before(function() { + before(function () { config = this.config config.syncPath = path.dirname(__dirname) @@ -36,9 +36,7 @@ describe('core/local/atom/add_checksum.loop()', () => { config }) const enhancedBatch = await enhancedChannel.pop() - should(enhancedBatch) - .be.an.Array() - .and.length(batch.length) + should(enhancedBatch).be.an.Array().and.length(batch.length) should.exist(enhancedBatch[0].md5sum) }) @@ -57,9 +55,7 @@ describe('core/local/atom/add_checksum.loop()', () => { config }) const enhancedBatch = await enhancedChannel.pop() - should(enhancedBatch) - .be.an.Array() - .and.length(batch.length) + should(enhancedBatch).be.an.Array().and.length(batch.length) should.not.exist(enhancedBatch[0].md5sum) }) @@ -79,9 +75,7 @@ describe('core/local/atom/add_checksum.loop()', () => { config }) const enhancedBatch = await enhancedChannel.pop() - should(enhancedBatch) - .be.an.Array() - .and.length(batch.length) + should(enhancedBatch).be.an.Array().and.length(batch.length) should(enhancedBatch[0]).have.property('md5sum', 'checksum') }) diff --git a/test/unit/local/atom/add_infos.js b/test/unit/local/atom/add_infos.js index acb07d87d..1e3df1ee5 100644 --- a/test/unit/local/atom/add_infos.js +++ b/test/unit/local/atom/add_infos.js @@ -18,10 +18,10 @@ describe('core/local/atom/add_infos.loop()', () => { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('instanciate builders', async function() { + beforeEach('instanciate builders', async function () { builders = new Builders({ pouch: this.pouch }) }) - beforeEach('create step opts', async function() { + beforeEach('create step opts', async function () { this.config.syncPath = path.dirname(__dirname) opts = this filepath = path.basename(__filename) @@ -40,9 +40,7 @@ describe('core/local/atom/add_infos.loop()', () => { channel.push(batch) const enhancedChannel = addInfos.loop(channel, opts) const enhancedBatch = await enhancedChannel.pop() - should(enhancedBatch) - .be.an.Array() - .and.have.length(batch.length) + should(enhancedBatch).be.an.Array().and.have.length(batch.length) }) it('adds specific infos for specific events', async () => { @@ -81,11 +79,8 @@ describe('core/local/atom/add_infos.loop()', () => { const channel = new Channel() channel.push(batch) const enhancedChannel = addInfos.loop(channel, opts) - const [ - deletedEvent, - ignoredEvent, - ...otherEvents - ] = await enhancedChannel.pop() + const [deletedEvent, ignoredEvent, ...otherEvents] = + await enhancedChannel.pop() should(deletedEvent).eql({ action: batch[0].action, kind: 'directory', @@ -105,19 +100,9 @@ describe('core/local/atom/add_infos.loop()', () => { context('when deleted event kind is unknown', () => { context('and document exists in Pouch', () => { let file, dir - beforeEach('populate Pouch with documents', async function() { - file = await builders - .metafile() - .path('file') - .ino(1) - .upToDate() - .create() - dir = await builders - .metadir() - .path('dir') - .ino(2) - .upToDate() - .create() + beforeEach('populate Pouch with documents', async function () { + file = await builders.metafile().path('file').ino(1).upToDate().create() + dir = await builders.metadir().path('dir').ino(2).upToDate().create() }) it('looks up existing document doctype from Pouch', async () => { @@ -196,24 +181,14 @@ describe('core/local/atom/add_infos.loop()', () => { 'when deleted document has different remote & synced path in Pouch', () => { let file, dir - beforeEach('populate Pouch with documents', async function() { - file = await builders - .metafile() - .path('file') - .ino(1) - .upToDate() - .create() + beforeEach('populate Pouch with documents', async function () { + file = await builders.metafile().path('file').ino(1).upToDate().create() await builders .metafile(file) .path('other-file') .changedSide('remote') .create() - dir = await builders - .metadir() - .path('dir') - .ino(2) - .upToDate() - .create() + dir = await builders.metadir().path('dir').ino(2).upToDate().create() await builders .metadir(dir) .path('other-dir') diff --git a/test/unit/local/atom/channel.js b/test/unit/local/atom/channel.js index 9eea9d125..c2d240060 100644 --- a/test/unit/local/atom/channel.js +++ b/test/unit/local/atom/channel.js @@ -14,11 +14,12 @@ const Builders = require('../../../support/builders') import type { AtomBatch } from '../../../../core/local/atom/event' +import type { SinonSpy } from 'sinon' */ const builders = new Builders() -describe('core/local/atom/Channel', function() { +describe('core/local/atom/Channel', function () { this.timeout(100) describe('Basics', () => { @@ -179,15 +180,11 @@ describe('core/local/atom/Channel', function() { if (!outputChannel) { throw new Error(`Step pop cannot occur before asyncMap in scenario`) } - scenarioState.outputBatchesPromise = new Promise((resolve, reject) => { - outputBatchesPromise - .then(outputBatches => - outputChannel - .pop() - .then(batch => resolve(outputBatches.concat([batch]))) - ) - .catch(reject) - }) + scenarioState.outputBatchesPromise = outputBatchesPromise + .then(outputBatches => + Promise.all([outputBatches, outputChannel.pop()]) + ) + .then(([outputBatches, batch]) => outputBatches.concat([batch])) } const scenarioStepFn = step => { @@ -212,10 +209,12 @@ describe('core/local/atom/Channel', function() { * Must be sync from #map() and async for #asyncMap(). */ - const transform = batch => + const transform = (batch /*: AtomBatch */) /*: AtomBatch */ => batch.map(event => _.defaults({ path: `mapped-${event.path}` }, event)) - const asyncTransform = async batch => { + const asyncTransform = async ( + batch /*: AtomBatch */ + ) /*: Promise */ => { // According to manual testing, random 1-5ms delay easily breaks tests // in case Channel#asyncMap() doesn't properly await asyncTransform() // while keeping the test suite duration < 2x the time without delay. @@ -245,7 +244,7 @@ describe('core/local/atom/Channel', function() { for (const scenario of scenarios) { describe(scenarioDescription(scenario), () => { let scenarioState /*:: ?: { - callback: (AtomBatch) => AtomBatch, + callback: SinonSpy, inputBatches: AtomBatch[], inputChannel: Channel, outputChannel?: Channel, @@ -319,7 +318,7 @@ describe('core/local/atom/Channel', function() { for (const scenario of scenarios) { describe(scenarioDescription(scenario), () => { let scenarioState /*:: ?: { - callback: (AtomBatch) => Promise, + callback: SinonSpy, inputBatches: AtomBatch[], inputChannel: Channel, outputChannel?: Channel, diff --git a/test/unit/local/atom/dispatch.js b/test/unit/local/atom/dispatch.js index 6f98e5b0d..164bc01f0 100644 --- a/test/unit/local/atom/dispatch.js +++ b/test/unit/local/atom/dispatch.js @@ -2,7 +2,7 @@ /* @flow */ /*:: -import type { Stub, Call } from 'sinon' +import type { SinonStub, SinonSpyCall } from 'sinon' type DispatchedCalls = { [string]: Array> @@ -24,14 +24,14 @@ const Channel = require('../../../../core/local/atom/channel') const dispatch = require('../../../../core/local/atom/dispatch') const winDetectMove = require('../../../../core/local/atom/win_detect_move') -function dispatchedCalls(obj /*: Stub */) /*: DispatchedCalls */ { +function dispatchedCalls(obj /*: SinonStub */) /*: DispatchedCalls */ { const methods = Object.getOwnPropertyNames(obj).filter( m => typeof obj[m] === 'function' ) const dispatchedCalls = {} for (const method of methods) { - const calls /*: Array */ = obj[method].getCalls() + const calls /*: Array */ = obj[method].getCalls() for (const call of calls) { if (!dispatchedCalls[method]) dispatchedCalls[method] = [] @@ -50,7 +50,7 @@ function dispatchedCalls(obj /*: Stub */) /*: DispatchedCalls */ { return dispatchedCalls } -describe('core/local/atom/dispatch.loop()', function() { +describe('core/local/atom/dispatch.loop()', function () { let builders let channel let events @@ -59,7 +59,7 @@ describe('core/local/atom/dispatch.loop()', function() { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('populate pouch with documents', async function() { + beforeEach('populate pouch with documents', async function () { builders = new Builders({ pouch: this.pouch }) channel = new Channel() @@ -81,15 +81,10 @@ describe('core/local/atom/dispatch.loop()', function() { context('when channel contains an initial-scan-done event', () => { beforeEach(() => { - channel.push([ - builders - .event() - .action('initial-scan-done') - .build() - ]) + channel.push([builders.event().action('initial-scan-done').build()]) }) - it('emits an initial-scan-done event via the emitter', async function() { + it('emits an initial-scan-done event via the emitter', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(events)).containDeep({ @@ -97,7 +92,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) }) - it('does not emit a sync-target event via the emitter', async function() { + it('does not emit a sync-target event via the emitter', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(events)).not.containDeep({ @@ -105,7 +100,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) }) - it('does not call any Prep method', async function() { + it('does not call any Prep method', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) @@ -114,21 +109,16 @@ describe('core/local/atom/dispatch.loop()', function() { context('when channel contains an ignored event', () => { beforeEach(() => { - channel.push([ - builders - .event() - .action('ignored') - .build() - ]) + channel.push([builders.event().action('ignored').build()]) }) - it('does not call any Prep method', async function() { + it('does not call any Prep method', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) }) - it('does not emit a sync-target event via the emitter', async function() { + it('does not emit a sync-target event via the emitter', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(events)).not.containDeep({ @@ -141,36 +131,16 @@ describe('core/local/atom/dispatch.loop()', function() { let changeEvents beforeEach(() => { changeEvents = [ - builders - .event() - .action('created') - .kind('file') - .build(), - builders - .event() - .action('created') - .kind('file') - .build(), - builders - .event() - .action('ignored') - .kind('file') - .build(), // No events for this one - builders - .event() - .action('created') - .kind('file') - .build(), - builders - .event() - .action('created') - .kind('file') - .build() + builders.event().action('created').kind('file').build(), + builders.event().action('created').kind('file').build(), + builders.event().action('ignored').kind('file').build(), // No events for this one + builders.event().action('created').kind('file').build(), + builders.event().action('created').kind('file').build() ] channel.push(changeEvents) }) - it('emits sync-target events via the emitter', async function() { + it('emits sync-target events via the emitter', async function () { await dispatch.loop(channel, stepOptions).pop() // Make sure we emit exactly 4 sync-target events, one for each @@ -198,7 +168,7 @@ describe('core/local/atom/dispatch.loop()', function() { context('when channel contains multiple batches', () => { context('processed in less than a second', () => { - it('emits a local-start event for each batch via the emitter', async function() { + it('emits a local-start event for each batch via the emitter', async function () { const outChannel = dispatch.loop(channel, stepOptions) channel.push([builders.event().build()]) @@ -211,7 +181,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) }) - it('emits only one local-end event via the emitter', async function() { + it('emits only one local-end event via the emitter', async function () { const outChannel = dispatch.loop(channel, stepOptions) channel.push([builders.event().build()]) @@ -233,7 +203,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) context('processed in more than a second', () => { - it('emits a local-start event for each batch via the emitter', async function() { + it('emits a local-start event for each batch via the emitter', async function () { const outChannel = dispatch.loop(channel, stepOptions) channel.push([builders.event().build()]) @@ -250,7 +220,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) }) - it('emits one local-end event for each batch via the emitter', async function() { + it('emits one local-end event for each batch via the emitter', async function () { const outChannel = dispatch.loop(channel, stepOptions) channel.push([builders.event().build()]) @@ -290,7 +260,7 @@ describe('core/local/atom/dispatch.loop()', function() { ]) }) - it('triggers a call to addFileAsync with a file Metadata object', async function() { + it('triggers a call to addFileAsync with a file Metadata object', async function () { const doc = builders .metafile() .path(filePath) @@ -336,7 +306,7 @@ describe('core/local/atom/dispatch.loop()', function() { ]) }) - it('triggers a call to putFolderAsync with a directory Metadata object', async function() { + it('triggers a call to putFolderAsync with a directory Metadata object', async function () { const doc = builders .metadir() .path(directoryPath) @@ -373,7 +343,7 @@ describe('core/local/atom/dispatch.loop()', function() { ]) }) - it('triggers a call to addFileAsync with a file Metadata object', async function() { + it('triggers a call to addFileAsync with a file Metadata object', async function () { const doc = builders .metafile() .path(filePath) @@ -419,7 +389,7 @@ describe('core/local/atom/dispatch.loop()', function() { ]) }) - it('triggers a call to putFolderAsync with a directory Metadata object', async function() { + it('triggers a call to putFolderAsync with a directory Metadata object', async function () { const doc = builders .metadir() .path(directoryPath) @@ -456,7 +426,7 @@ describe('core/local/atom/dispatch.loop()', function() { ]) }) - it('triggers a call to updateFileAsync with a file Metadata object', async function() { + it('triggers a call to updateFileAsync with a file Metadata object', async function () { const doc = builders .metafile() .path(filePath) @@ -502,7 +472,7 @@ describe('core/local/atom/dispatch.loop()', function() { ]) }) - it('triggers a call to putFolderAsync with a directory Metadata object', async function() { + it('triggers a call to putFolderAsync with a directory Metadata object', async function () { const doc = builders .metadir() .path(directoryPath) @@ -555,7 +525,7 @@ describe('core/local/atom/dispatch.loop()', function() { .create() }) - it('triggers a call to moveFileAsync with a file Metadata object', async function() { + it('triggers a call to moveFileAsync with a file Metadata object', async function () { const doc = builders .metafile() .path(newFilePath) @@ -594,7 +564,7 @@ describe('core/local/atom/dispatch.loop()', function() { .create() }) - it('does not call moveFileAsync', async function() { + it('does not call moveFileAsync', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) @@ -603,7 +573,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) context('for a propagated remote move', () => { - beforeEach('build records for moved doc', async function() { + beforeEach('build records for moved doc', async function () { const src = await builders .metafile() .path(filePath) @@ -624,7 +594,7 @@ describe('core/local/atom/dispatch.loop()', function() { this.pouch.put(dst) }) - it('does not trigger any call to prep', async function() { + it('does not trigger any call to prep', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) @@ -678,7 +648,7 @@ describe('core/local/atom/dispatch.loop()', function() { .create() }) - it('triggers a call to moveFileAsync with an overwriting file Metadata object', async function() { + it('triggers a call to moveFileAsync with an overwriting file Metadata object', async function () { const doc = builders .metafile() .path(newFilePath) @@ -710,7 +680,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) context('without existing documents at the event oldPath', () => { - it('triggers a call to addFileAsync with a file Metadata object', async function() { + it('triggers a call to addFileAsync with a file Metadata object', async function () { const doc = builders .metafile() .path(newFilePath) @@ -735,7 +705,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) }) - it('removes the event oldPath', async function() { + it('removes the event oldPath', async function () { const batch = await dispatch.loop(channel, stepOptions).pop() should(batch).have.length(1) @@ -778,7 +748,7 @@ describe('core/local/atom/dispatch.loop()', function() { .create() }) - it('triggers a call to moveFolderAsync with a directory Metadata object', async function() { + it('triggers a call to moveFolderAsync with a directory Metadata object', async function () { const doc = builders .metadir() .path(newDirectoryPath) @@ -806,7 +776,7 @@ describe('core/local/atom/dispatch.loop()', function() { .create() }) - it('does not call moveFolderAsync', async function() { + it('does not call moveFolderAsync', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) @@ -815,7 +785,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) context('without existing documents at the event oldPath', () => { - it('triggers a call to putFolderAsync with a directory Metadata object', async function() { + it('triggers a call to putFolderAsync with a directory Metadata object', async function () { const doc = builders .metadir() .path(newDirectoryPath) @@ -832,7 +802,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) }) - it('removes the event oldPath', async function() { + it('removes the event oldPath', async function () { const batch = await dispatch.loop(channel, stepOptions).pop() should(batch).have.length(1) @@ -841,7 +811,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) context('for a propagated remote move', () => { - beforeEach('build records for moved doc', async function() { + beforeEach('build records for moved doc', async function () { const src = await builders .metadir() .path(directoryPath) @@ -862,7 +832,7 @@ describe('core/local/atom/dispatch.loop()', function() { this.pouch.put(dst) }) - it('does not trigger any call to prep', async function() { + it('does not trigger any call to prep', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) @@ -897,7 +867,7 @@ describe('core/local/atom/dispatch.loop()', function() { .create() }) - it('triggers a call to trashFileAsync with the existing document', async function() { + it('triggers a call to trashFileAsync with the existing document', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({ @@ -907,7 +877,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) context('without existing documents at the event path', () => { - it('ignores the event', async function() { + it('ignores the event', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) @@ -942,7 +912,7 @@ describe('core/local/atom/dispatch.loop()', function() { .create() }) - it('triggers a call to trashFolderAsync with the existing document', async function() { + it('triggers a call to trashFolderAsync with the existing document', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({ @@ -952,7 +922,7 @@ describe('core/local/atom/dispatch.loop()', function() { }) context('without existing documents at the event path', () => { - it('ignores the event', async function() { + it('ignores the event', async function () { await dispatch.loop(channel, stepOptions).pop() should(dispatchedCalls(prep)).deepEqual({}) diff --git a/test/unit/local/atom/incomplete_fixer.js b/test/unit/local/atom/incomplete_fixer.js index 5d99cdb75..88a31f92a 100644 --- a/test/unit/local/atom/incomplete_fixer.js +++ b/test/unit/local/atom/incomplete_fixer.js @@ -30,18 +30,18 @@ describe('core/local/atom/incomplete_fixer', () => { before('create config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('create helpers', function() { + beforeEach('create helpers', function () { syncDir = new ContextDir(this.syncPath) builders = new Builders({ pouch: this.pouch }) }) afterEach('clean pouch', pouchHelpers.cleanDatabase) - afterEach('clean files', function() { + afterEach('clean files', function () { syncDir.clean() }) after('cleanup config', configHelpers.cleanConfig) describe('.loop()', () => { - it('pushes the result of step() into the output Channel', async function() { + it('pushes the result of step() into the output Channel', async function () { const { config } = this const src = 'missing' @@ -82,34 +82,14 @@ describe('core/local/atom/incomplete_fixer', () => { describe('.step()', () => { context('without any complete "renamed" event', () => { - it('drops incomplete events', async function() { + it('drops incomplete events', async function () { const { config } = this const inputBatch = [ - builders - .event() - .incomplete() - .action('created') - .path('foo1') - .build(), - builders - .event() - .incomplete() - .action('modified') - .path('foo2') - .build(), - builders - .event() - .incomplete() - .action('deleted') - .path('foo3') - .build(), - builders - .event() - .incomplete() - .action('scan') - .path('foo4') - .build() + builders.event().incomplete().action('created').path('foo1').build(), + builders.event().incomplete().action('modified').path('foo2').build(), + builders.event().incomplete().action('deleted').path('foo3').build(), + builders.event().incomplete().action('scan').path('foo4').build() ] const incompletes = [] @@ -126,24 +106,15 @@ describe('core/local/atom/incomplete_fixer', () => { }) context('with a complete "renamed" event', () => { - it('leaves complete events untouched', async function() { + it('leaves complete events untouched', async function () { const { config } = this const src = 'file' const dst = 'foo' await syncDir.ensureFile(dst) const inputBatch = [ - builders - .event() - .action('created') - .path(src) - .build(), - builders - .event() - .action('renamed') - .oldPath(src) - .path(dst) - .build() + builders.event().action('created').path(src).build(), + builders.event().action('renamed').oldPath(src).path(dst).build() ] const incompletes = [] @@ -158,7 +129,7 @@ describe('core/local/atom/incomplete_fixer', () => { should(outputBatch).deepEqual(inputBatch) }) - it('rebuilds the all incomplete events matching the "renamed" event old path', async function() { + it('rebuilds the all incomplete events matching the "renamed" event old path', async function () { const { config } = this await syncDir.makeTree([ @@ -265,7 +236,7 @@ describe('core/local/atom/incomplete_fixer', () => { ]) }) - it('drops incomplete ignored events matching the "renamed" event old path', async function() { + it('drops incomplete ignored events matching the "renamed" event old path', async function () { const { config } = this await syncDir.makeTree(['dst/', 'dst/file']) @@ -294,7 +265,7 @@ describe('core/local/atom/incomplete_fixer', () => { should(outputBatch).deepEqual([renamedEvent]) }) - it('replaces the completing event if its path is the same as the rebuilt one', async function() { + it('replaces the completing event if its path is the same as the rebuilt one', async function () { const { config } = this const src = 'missing' @@ -340,7 +311,7 @@ describe('core/local/atom/incomplete_fixer', () => { }) describe('file renamed then deleted', () => { - it('is deleted at its original path', async function() { + it('is deleted at its original path', async function () { const { config } = this const src = 'src' @@ -392,7 +363,7 @@ describe('core/local/atom/incomplete_fixer', () => { }) describe('file renamed twice', () => { - it('is renamed once as a whole', async function() { + it('is renamed once as a whole', async function () { const { config } = this const src = 'src' @@ -454,7 +425,7 @@ describe('core/local/atom/incomplete_fixer', () => { }) describe('file renamed three times', () => { - it('is renamed once as a whole', async function() { + it('is renamed once as a whole', async function () { const { config } = this const src = 'src' @@ -522,7 +493,7 @@ describe('core/local/atom/incomplete_fixer', () => { }) describe('file renamed and then renamed back to its previous name', () => { - it('results in no events at all', async function() { + it('results in no events at all', async function () { const { config } = this const src = 'src' @@ -563,7 +534,7 @@ describe('core/local/atom/incomplete_fixer', () => { }) describe('file renamed to backup location and replaced by new file', () => { - it('is modified once and not deleted', async function() { + it('is modified once and not deleted', async function () { const { config } = this const src = 'src' @@ -640,15 +611,11 @@ describe('core/local/atom/incomplete_fixer', () => { const src = 'src' const dst = 'dst' - beforeEach(async function() { - await builders - .metafile() - .path(src) - .sides({ local: 1 }) - .create() + beforeEach(async function () { + await builders.metafile().path(src).sides({ local: 1 }).create() }) - it('results in the renamed event', async function() { + it('results in the renamed event', async function () { const { config, pouch } = this await syncDir.ensureFile(dst) @@ -689,15 +656,11 @@ describe('core/local/atom/incomplete_fixer', () => { const src = 'src' const dst = 'dst' - beforeEach(async function() { - await builders - .metafile() - .path(src) - .sides({ local: 1 }) - .create() + beforeEach(async function () { + await builders.metafile().path(src).sides({ local: 1 }).create() }) - it('results in the renamed event followed by the rebuilt modified event', async function() { + it('results in the renamed event followed by the rebuilt modified event', async function () { const { config, pouch } = this await syncDir.ensureFile(dst) @@ -755,15 +718,11 @@ describe('core/local/atom/incomplete_fixer', () => { const dst1 = 'dst1' const dst2 = 'dst2' - beforeEach(async function() { - await builders - .metafile() - .path(src) - .sides({ local: 1 }) - .create() + beforeEach(async function () { + await builders.metafile().path(src).sides({ local: 1 }).create() }) - it('results in one renamed event followed by the rebuilt modified event', async function() { + it('results in one renamed event followed by the rebuilt modified event', async function () { const { config, pouch } = this await syncDir.ensureFile(dst2) diff --git a/test/unit/local/atom/initial_diff.js b/test/unit/local/atom/initial_diff.js index 84582d809..59caac635 100644 --- a/test/unit/local/atom/initial_diff.js +++ b/test/unit/local/atom/initial_diff.js @@ -22,14 +22,14 @@ describe('core/local/atom/initial_diff', () => { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('create builders', function() { + beforeEach('create builders', function () { builders = new Builders({ pouch: this.pouch }) }) afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) describe('.initialState()', () => { - it('returns initial state referenced by initial diff step name', async function() { + it('returns initial state referenced by initial diff step name', async function () { const foo = await builders .metadir() .path('foo') @@ -48,11 +48,7 @@ describe('core/local/atom/initial_diff', () => { .ino(3) .sides({ local: 1 }) .create() - await builders - .metafile() - .path('baz') - .sides({ remote: 1 }) - .create() + await builders.metafile().path('baz').sides({ remote: 1 }).create() const state = await initialDiff.initialState(this) should(state).have.property(initialDiff.STEP_NAME, { @@ -70,22 +66,13 @@ describe('core/local/atom/initial_diff', () => { }) describe('.clearState()', () => { - it('removes every item from all initialDiff state collections', function() { - const doc = builders - .metadata() - .path('foo') - .ino(1) - .upToDate() - .build() + it('removes every item from all initialDiff state collections', function () { + const doc = builders.metadata().path('foo').ino(1).upToDate().build() const waiting = [ { batch: [], nbCandidates: 0, timeout: setTimeout(() => {}, 0) } ] const renamedEvents = [ - builders - .event() - .path('foo') - .oldPath('bar') - .build() + builders.event().path('foo').oldPath('bar').build() ] const scannedPaths = new Set(['foo']) const byInode = new Map([[doc.fileid || doc.ino || '', doc]]) // Flow thinks doc.ino can be null @@ -119,7 +106,7 @@ describe('core/local/atom/initial_diff', () => { const inputBatch = batch => channel.push(_.cloneDeep(batch)) - beforeEach(function() { + beforeEach(function () { channel = new Channel() initialScanDone = builders .event() @@ -129,13 +116,8 @@ describe('core/local/atom/initial_diff', () => { .build() }) - it('forwards events untouched when initial scan is done', async function() { - await builders - .metadir() - .path('foo') - .ino(1) - .upToDate() - .create() + it('forwards events untouched when initial scan is done', async function () { + await builders.metadir().path('foo').ino(1).upToDate().create() const state = await initialDiff.initialState({ pouch: this.pouch }) initialDiff.clearState(state) @@ -176,7 +158,7 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('clears the state after initial-scan-done is received', async function() { + it('clears the state after initial-scan-done is received', async function () { const state = await initialDiff.initialState({ pouch: this.pouch }) const outChannel = initialDiff.loop(channel, { config: this.config, @@ -195,32 +177,18 @@ describe('core/local/atom/initial_diff', () => { inputBatch([fooScan]) await outChannel.pop() - should(state.initialDiff) - .have.property('initialScanDone') - .be.false() + should(state.initialDiff).have.property('initialScanDone').be.false() // Send initial-scan-done inputBatch([initialScanDone]) await outChannel.pop() - should(state.initialDiff) - .have.property('initialScanDone') - .be.true() + should(state.initialDiff).have.property('initialScanDone').be.true() }) - it('detects documents moved while client was stopped', async function() { - await builders - .metadir() - .path('foo') - .ino(1) - .upToDate() - .create() - await builders - .metafile() - .path('fizz') - .ino(2) - .upToDate() - .create() + it('detects documents moved while client was stopped', async function () { + await builders.metadir().path('foo').ino(1).upToDate().create() + await builders.metafile().path('fizz').ino(2).upToDate().create() const state = await initialDiff.initialState({ pouch: this.pouch }) @@ -261,25 +229,10 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('detects documents moved while client is doing initial scan', async function() { - await builders - .metadir() - .path('foo') - .ino(1) - .upToDate() - .create() - await builders - .metafile() - .path('foo/baz') - .ino(2) - .upToDate() - .create() - await builders - .metadir() - .path('bar') - .ino(3) - .upToDate() - .create() + it('detects documents moved while client is doing initial scan', async function () { + await builders.metadir().path('foo').ino(1).upToDate().create() + await builders.metafile().path('foo/baz').ino(2).upToDate().create() + await builders.metadir().path('bar').ino(3).upToDate().create() const state = await initialDiff.initialState({ pouch: this.pouch }) @@ -334,31 +287,11 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('detects documents replaced by another one of a different kind while client was stopped', async function() { - await builders - .metadir() - .path('foo') - .ino(1) - .upToDate() - .create() - await builders - .metafile() - .path('bar') - .ino(2) - .upToDate() - .create() - await builders - .metadir() - .path('fizz') - .ino(3) - .upToDate() - .create() - await builders - .metafile() - .path('buzz') - .ino(4) - .upToDate() - .create() + it('detects documents replaced by another one of a different kind while client was stopped', async function () { + await builders.metadir().path('foo').ino(1).upToDate().create() + await builders.metafile().path('bar').ino(2).upToDate().create() + await builders.metadir().path('fizz').ino(3).upToDate().create() + await builders.metafile().path('buzz').ino(4).upToDate().create() const state = await initialDiff.initialState({ pouch: this.pouch }) @@ -401,19 +334,9 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('detects documents replaced by another one with a different ino while client was stopped', async function() { - await builders - .metadir() - .path('foo') - .ino(1) - .upToDate() - .create() - await builders - .metafile() - .path('bar') - .ino(2) - .upToDate() - .create() + it('detects documents replaced by another one with a different ino while client was stopped', async function () { + await builders.metadir().path('foo').ino(1).upToDate().create() + await builders.metafile().path('bar').ino(2).upToDate().create() const state = await initialDiff.initialState({ pouch: this.pouch }) @@ -446,19 +369,9 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('detects documents replaced by another one of a different kind with the same ino while client was stopped', async function() { - await builders - .metadir() - .path('foo') - .ino(1) - .upToDate() - .create() - await builders - .metafile() - .path('bar') - .ino(2) - .upToDate() - .create() + it('detects documents replaced by another one of a different kind with the same ino while client was stopped', async function () { + await builders.metadir().path('foo').ino(1).upToDate().create() + await builders.metafile().path('bar').ino(2).upToDate().create() const state = await initialDiff.initialState({ pouch: this.pouch }) @@ -491,7 +404,7 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('detects documents removed while client was stopped', async function() { + it('detects documents removed while client was stopped', async function () { const foo = await builders .metadir() .path('foo') @@ -542,7 +455,7 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('reuses the checksum of untouched files', async function() { + it('reuses the checksum of untouched files', async function () { const stillEmptyFile = await builders .metafile() .path('stillEmptyFile') @@ -593,7 +506,7 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('does not try to reuse the checksum of a directory', async function() { + it('does not try to reuse the checksum of a directory', async function () { const dir = await builders .metadir() .path('dir') @@ -618,7 +531,7 @@ describe('core/local/atom/initial_diff', () => { should(events).deepEqual([dirScan, initialScanDone]) }) - it('does not reuse the checksum of modified files', async function() { + it('does not reuse the checksum of modified files', async function () { const updatedContent = await builders .metafile() .path('updatedContent') @@ -646,14 +559,14 @@ describe('core/local/atom/initial_diff', () => { }) context('when WINDOWS_DATE_MIGRATION_FLAG is active', () => { - before(function() { + before(function () { this.config.setFlag(WINDOWS_DATE_MIGRATION_FLAG, true) }) - after(function() { + after(function () { this.config.setFlag(WINDOWS_DATE_MIGRATION_FLAG, false) }) - it('reuses the checksum of untouched files with a same second modification date', async function() { + it('reuses the checksum of untouched files with a same second modification date', async function () { const emptyFileUpdateDate = new Date() const stillEmptyFile = await builders .metafile() @@ -710,7 +623,7 @@ describe('core/local/atom/initial_diff', () => { }) context('when WINDOWS_DATE_MIGRATION_FLAG is inactive', () => { - it('does not reuse the checksum of untouched files with a same second modification date', async function() { + it('does not reuse the checksum of untouched files with a same second modification date', async function () { const updatedContentUpdateDate = new Date() const updatedContent = await builders .metafile() @@ -739,25 +652,15 @@ describe('core/local/atom/initial_diff', () => { }) }) - it('ignores events for unapplied moves', async function() { - const wasDir = builders - .metadir() - .path('foo') - .ino(1) - .upToDate() - .build() + it('ignores events for unapplied moves', async function () { + const wasDir = builders.metadir().path('foo').ino(1).upToDate().build() await builders .metadir() .moveFrom(wasDir) .path('foo2') .changedSide('remote') .create() - const wasFile = builders - .metafile() - .path('fizz') - .ino(2) - .upToDate() - .build() + const wasFile = builders.metafile().path('fizz').ino(2).upToDate().build() await builders .metafile() .moveFrom(wasFile) @@ -802,25 +705,10 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('fixes renamed after parent renamed', async function() { - await builders - .metadir() - .path('parent') - .ino(1) - .upToDate() - .create() - await builders - .metadir() - .path('parent/foo') - .ino(2) - .upToDate() - .create() - await builders - .metadir() - .path('parent/foo/bar') - .ino(3) - .upToDate() - .create() + it('fixes renamed after parent renamed', async function () { + await builders.metadir().path('parent').ino(1).upToDate().create() + await builders.metadir().path('parent/foo').ino(2).upToDate().create() + await builders.metadir().path('parent/foo/bar').ino(3).upToDate().create() const state = await initialDiff.initialState({ pouch: this.pouch }) @@ -886,19 +774,9 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('fixes deleted after parent renamed', async function() { - await builders - .metadir() - .path('parent') - .ino(1) - .upToDate() - .create() - await builders - .metadir() - .path('parent/foo') - .ino(2) - .upToDate() - .create() + it('fixes deleted after parent renamed', async function () { + await builders.metadir().path('parent').ino(1).upToDate().create() + await builders.metadir().path('parent/foo').ino(2).upToDate().create() const missingDoc = await builders .metadir() .path('parent/foo/bar') @@ -971,13 +849,8 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('does not swallow possible changes on move descendants', async function() { - await builders - .metadir() - .path('parent') - .ino(1) - .upToDate() - .create() + it('does not swallow possible changes on move descendants', async function () { + await builders.metadir().path('parent').ino(1).upToDate().create() await builders .metafile() .path('parent/foo') @@ -1032,13 +905,8 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('does not delete replaced file after parent move', async function() { - await builders - .metadir() - .path('parent') - .ino(1) - .upToDate() - .create() + it('does not delete replaced file after parent move', async function () { + await builders.metadir().path('parent').ino(1).upToDate().create() await builders .metafile() .path('parent/foo') @@ -1082,13 +950,8 @@ describe('core/local/atom/initial_diff', () => { ]) }) - it('does not delete unsynced remote additions', async function() { - await builders - .metadir() - .path('dir') - .ino(1) - .sides({ remote: 1 }) - .create() + it('does not delete unsynced remote additions', async function () { + await builders.metadir().path('dir').ino(1).sides({ remote: 1 }).create() await builders .metafile() .path('file') diff --git a/test/unit/local/atom/overwrite.js b/test/unit/local/atom/overwrite.js index d468b734a..80d85f570 100644 --- a/test/unit/local/atom/overwrite.js +++ b/test/unit/local/atom/overwrite.js @@ -205,11 +205,7 @@ describe('core/local/atom/overwrite', () => { it(`forwards ${action} ${kind} (${ oldPath ? oldPath + ' -> ' : '' }${path}) after .DELAY`, async () => { - let event = builders - .event() - .action(action) - .kind(kind) - .path(path) + let event = builders.event().action(action).kind(kind).path(path) if (oldPath) event.oldPath(oldPath) const batch = [event.build()] diff --git a/test/unit/local/atom/producer.js b/test/unit/local/atom/producer.js index 409851a40..0ba74a50a 100644 --- a/test/unit/local/atom/producer.js +++ b/test/unit/local/atom/producer.js @@ -23,7 +23,7 @@ onPlatforms(['linux', 'win32'], () => { let producer beforeEach('instanciate config', configHelpers.createConfig) - beforeEach(function() { + beforeEach(function () { config = this.config syncDir = new ContextDir(config.syncPath) ignore = new Ignore([]) @@ -35,13 +35,13 @@ onPlatforms(['linux', 'win32'], () => { context('on readdir error on dir', () => { beforeEach( 'create content with missing read permission', - async function() { + async function () { await syncDir.makeTree(['dirA/fileA', 'dirB/fileB', 'dirC/fileC']) await syncDir.chmod('dirB', 0o220) } ) - it('should not reject', async function() { + it('should not reject', async function () { await should(producer.start()).be.fulfilled() }) }) diff --git a/test/unit/local/atom/watcher.js b/test/unit/local/atom/watcher.js index 660d7ecbf..a94669085 100644 --- a/test/unit/local/atom/watcher.js +++ b/test/unit/local/atom/watcher.js @@ -24,7 +24,7 @@ onPlatforms(['linux', 'win32'], () => { after('clean config directory', configHelpers.cleanConfig) describe('.stepsInitialState()', () => { - it('includes initial diff state key', async function() { + it('includes initial diff state key', async function () { const state = {} const initialState = await stepsInitialState(state, this) should(state).have.property(initialDiff.STEP_NAME) @@ -34,12 +34,12 @@ onPlatforms(['linux', 'win32'], () => { describe('start', () => { let helpers - beforeEach('init helpers', async function() { + beforeEach('init helpers', async function () { helpers = TestHelpers.init(this) }) context('when producer.start() rejects', () => { - it('should reject with the same error', async function() { + it('should reject with the same error', async function () { const watcher = new AtomWatcher({ ...helpers, config: this.config, diff --git a/test/unit/local/atom/win_detect_move.js b/test/unit/local/atom/win_detect_move.js index 2c05c2478..4e0e97588 100644 --- a/test/unit/local/atom/win_detect_move.js +++ b/test/unit/local/atom/win_detect_move.js @@ -24,14 +24,14 @@ if (process.platform === 'win32') { afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - beforeEach(function() { + beforeEach(function () { builders = new Builders(this) }) describe('.loop()', () => { let inputChannel, outputChannel - beforeEach(async function() { + beforeEach(async function () { this.state = await winDetectMove.initialState() inputChannel = new Channel() outputChannel = winDetectMove.loop(inputChannel, this) @@ -88,7 +88,7 @@ if (process.platform === 'win32') { .build() }) - it(`is a replaced ${kind} (not aggregated)`, async function() { + it(`is a replaced ${kind} (not aggregated)`, async function () { inputBatch([deletedEvent, createdEvent]) should(await outputBatch()).deepEqual([deletedEvent]) should(await outputBatch()).deepEqual([createdEvent]) @@ -110,7 +110,7 @@ if (process.platform === 'win32') { }) context('when doc has not been moved in PouchDB', () => { - it(`is a renamed ${kind} (aggregated)`, async function() { + it(`is a renamed ${kind} (aggregated)`, async function () { inputBatch([deletedEvent, createdEvent]) should(await outputBatch()).deepEqual([ { @@ -139,7 +139,7 @@ if (process.platform === 'win32') { .create() }) - it(`is a renamed ${kind} (aggregated)`, async function() { + it(`is a renamed ${kind} (aggregated)`, async function () { inputBatch([deletedEvent, createdEvent]) should(await outputBatch()).deepEqual([ { @@ -197,7 +197,7 @@ if (process.platform === 'win32') { inputBatch([createdChildEvent]) }) - it(`is a renamed child ${childKind} (aggregated)`, async function() { + it(`is a renamed child ${childKind} (aggregated)`, async function () { const outputBatches = [ await outputBatch(), await outputBatch() @@ -260,7 +260,7 @@ if (process.platform === 'win32') { .build() }) - it(`is untouched`, async function() { + it(`is untouched`, async function () { inputBatch([deletedEvent, createdEvent]) should(await outputBatch()).deepEqual([deletedEvent]) should(await outputBatch()).deepEqual([createdEvent]) @@ -383,7 +383,7 @@ if (process.platform === 'win32') { .build() }) - it(`is a renamed ${kind} (aggregated)`, async function() { + it(`is a renamed ${kind} (aggregated)`, async function () { inputBatch([createdEvent, deletedEvent]) should(await outputBatch()).deepEqual([ { @@ -439,7 +439,7 @@ if (process.platform === 'win32') { inputBatch([deletedChildEvent]) }) - it(`is a renamed child ${childKind} (aggregated)`, async function() { + it(`is a renamed child ${childKind} (aggregated)`, async function () { const outputBatches = await timesAsync(2, outputBatch) should(outputBatches).deepEqual([ [ @@ -505,7 +505,7 @@ if (process.platform === 'win32') { .build() }) - it(`is an ignored ${kind} (aggregated)`, async function() { + it(`is an ignored ${kind} (aggregated)`, async function () { inputBatch([createdEvent, deletedEvent]) should(await outputBatch()).deepEqual([ { @@ -546,7 +546,7 @@ if (process.platform === 'win32') { .build() }) - it(`is a temporary ${kind} (not aggregated)`, async function() { + it(`is a temporary ${kind} (not aggregated)`, async function () { inputBatch([createdEvent, deletedEvent]) should(await outputBatch()).deepEqual([createdEvent]) should(await outputBatch()).deepEqual([ @@ -563,14 +563,10 @@ if (process.platform === 'win32') { let ignoredEvent beforeEach(async () => { - ignoredEvent = builders - .event() - .action('ignored') - .kind(kind) - .build() + ignoredEvent = builders.event().action('ignored').kind(kind).build() }) - it('is untouched', async function() { + it('is untouched', async function () { inputBatch([ignoredEvent]) should(await outputBatch()).deepEqual([ignoredEvent]) }) diff --git a/test/unit/local/atom/win_identical_renaming.js b/test/unit/local/atom/win_identical_renaming.js index 352042f3a..84cde9637 100644 --- a/test/unit/local/atom/win_identical_renaming.js +++ b/test/unit/local/atom/win_identical_renaming.js @@ -25,14 +25,8 @@ if (process.platform === 'win32') { beforeEach(() => { builders = new Builders() const docs = { - DIR: builders - .metadir() - .path('dir') - .build(), - FILE: builders - .metafile() - .path('file') - .build() + DIR: builders.metadir().path('dir').build(), + FILE: builders.metafile().path('file').build() } inputChannel = new Channel() outputChannel = winIdenticalRenaming.loop(inputChannel, { @@ -185,11 +179,7 @@ if (process.platform === 'win32') { ] const buildEvent = ({ action, kind, path, oldPath }) => { - let event = builders - .event() - .action(action) - .kind(kind) - .path(path) + let event = builders.event().action(action).kind(kind).path(path) if (oldPath) event.oldPath(oldPath) return event.build() } diff --git a/test/unit/local/checksumer.js b/test/unit/local/checksumer.js index e063b9895..c68dca385 100644 --- a/test/unit/local/checksumer.js +++ b/test/unit/local/checksumer.js @@ -9,9 +9,9 @@ const { Readable } = require('stream') const { init } = require('../../../core/local/checksumer') describe('local/checksumer', () => { - let checksumer - let sandbox = sinon.sandbox.create() + const sandbox = sinon.createSandbox() + let checksumer beforeEach('init', () => { checksumer = init() }) @@ -62,7 +62,7 @@ describe('local/checksumer', () => { ).be.fulfilledWith('+HBGS7uN4XdB0blqLv5tFQ==') }) - it.skip('fails on successive errors', async function() { + it.skip('fails on successive errors', async function () { this.timeout(60000) createReadStream.callsFake(() => { return busyStream() diff --git a/test/unit/local/chokidar/analysis.js b/test/unit/local/chokidar/analysis.js index 958f4416d..44749ffbf 100644 --- a/test/unit/local/chokidar/analysis.js +++ b/test/unit/local/chokidar/analysis.js @@ -16,7 +16,7 @@ import type { Metadata } from '../../../../core/metadata' */ onPlatform('darwin', () => { - describe('core/local/chokidar/analysis', function() { + describe('core/local/chokidar/analysis', function () { const sideName = 'local' const builders = new Builders() @@ -204,10 +204,7 @@ onPlatform('darwin', () => { describe('FileMove(src => dst)', () => { describe('unlink(src) + add(dst)', () => { it('is the most common case', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const stats = { ino: 1 } const { md5sum } = old const events /*: LocalEvent[] */ = [ @@ -233,10 +230,7 @@ onPlatform('darwin', () => { describe('unlinkDir(src) + add(dst)', () => { it('is a chokidar bug', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const stats = { ino: 1 } const { md5sum } = old const events /*: LocalEvent[] */ = [ @@ -260,10 +254,7 @@ onPlatform('darwin', () => { describe('add(tmp) + unlink(src) + add(dst) + flush + unlink(tmp)', () => { it('is already complete on first flush', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const stats = { ino: 1 } const { md5sum } = old const events /*: LocalEvent[] */ = [ @@ -296,10 +287,7 @@ onPlatform('darwin', () => { describe('unlink(src) + add(tmp) + dropped unlink(tmp) + wip add(dst)', () => { it('is incomplete', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const stats = { ino: 1 } const events /*: LocalEvent[] */ = [ { type: 'unlink', path: 'src', old }, @@ -327,10 +315,7 @@ onPlatform('darwin', () => { describe('unlink(src) + wip add(tmp) + add(dst)', () => { it('is complete', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const stats = { ino: 1 } const { md5sum } = old const events /*: LocalEvent[] */ = [ @@ -394,10 +379,7 @@ onPlatform('darwin', () => { describe('FileMove.update(src => dst)', () => { describe('unlink(src) + add(dst) + change(dst)', () => { it('happens when there is sufficient delay betwen move & change', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const addStats = { ino: old.ino, mtime: new Date(old.local.updated_at) @@ -436,10 +418,7 @@ onPlatform('darwin', () => { describe('unlink(src, ino=1) + add(dst, ino=1) + change(dst, ino=2)', () => { it('does not include the change into the move', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const addStats = { ino: old.ino, mtime: new Date(old.local.updated_at) @@ -480,10 +459,7 @@ onPlatform('darwin', () => { describe('unlink(src) + add(dst) with different md5sum but same update date', () => { it('does not mark the move as an update', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const stats = { ino: old.ino, mtime: new Date(old.local.updated_at) } const events /*: LocalEvent[] */ = [ { type: 'unlink', path: 'src', old }, @@ -508,10 +484,7 @@ onPlatform('darwin', () => { describe('unlink(src) + add(dst) with different md5sum and update date', () => { it('marks the move as an update', () => { - const old /*: Metadata */ = builders - .metafile() - .ino(1) - .build() + const old /*: Metadata */ = builders.metafile().ino(1).build() const stats = { ino: old.ino, mtime: new Date(new Date(old.local.updated_at).getTime() + 1000) @@ -585,11 +558,7 @@ onPlatform('darwin', () => { it('is a FileUpdate(a) not to be confused with', () => { const partiallyAddedPath = 'partially-added-file' const changedPath = 'changed-file' - const old = builders - .metafile() - .path(changedPath) - .ino(111) - .build() + const old = builders.metafile().path(changedPath).ino(111).build() const ino = 222 const md5sum = 'changedSum' const events /*: LocalEvent[] */ = [ @@ -694,10 +663,7 @@ onPlatform('darwin', () => { describe('DirMove(src => dst)', () => { describe('unlinkDir(src) + addDir(dst)', () => { it('is the most common case', () => { - const old /*: Metadata */ = builders - .metadir() - .ino(1) - .build() + const old /*: Metadata */ = builders.metadir().ino(1).build() const stats = { ino: 1 } const events /*: LocalEvent[] */ = [ { type: 'unlinkDir', path: 'src', old }, @@ -721,10 +687,7 @@ onPlatform('darwin', () => { describe('addDir(dst) + unlinkDir(src)', () => { it('may happen with this reversed order on some platforms', () => { - const old /*: Metadata */ = builders - .metadir() - .ino(1) - .build() + const old /*: Metadata */ = builders.metadir().ino(1).build() const stats = { ino: 1 } const events /*: LocalEvent[] */ = [ { type: 'addDir', path: 'dst', stats }, @@ -748,10 +711,7 @@ onPlatform('darwin', () => { describe('unlinkDir(src) + wip addDir(tmp) + addDir(dst)', () => { it('ignores the intermediate move', () => { - const old /*: Metadata */ = builders - .metadir() - .ino(1) - .build() + const old /*: Metadata */ = builders.metadir().ino(1).build() const stats = { ino: 1 } const events /*: LocalEvent[] */ = [ { type: 'unlinkDir', path: 'src', old }, @@ -777,10 +737,7 @@ onPlatform('darwin', () => { describe('unlinkDir(src) + addDir(tmp) + wip addDir(dst)', () => { it('is incomplete, waiting for an upcoming unlinkDir(tmp)', () => { - const old /*: Metadata */ = builders - .metadir() - .ino(1) - .build() + const old /*: Metadata */ = builders.metadir().ino(1).build() const stats = { ino: 1 } const events /*: LocalEvent[] */ = [ { type: 'unlinkDir', path: 'src', old }, @@ -1419,17 +1376,9 @@ onPlatform('darwin', () => { describe('Move squashing', () => { it('move into moved folder', () => { const dirStats = { ino: 1 } - const dir = builders - .metadir() - .path('src/dir') - .ino(dirStats.ino) - .build() + const dir = builders.metadir().path('src/dir').ino(dirStats.ino).build() const fileStats = { ino: 2 } - const file = builders - .metafile() - .path('file') - .ino(fileStats.ino) - .build() + const file = builders.metafile().path('file').ino(fileStats.ino).build() const events /*: LocalEvent[] */ = [ { type: 'unlinkDir', path: dir.path, old: dir }, @@ -1458,11 +1407,7 @@ onPlatform('darwin', () => { it('child move', () => { const dirStats = { ino: 1 } - const dir = builders - .metadir() - .path('src/dir') - .ino(dirStats.ino) - .build() + const dir = builders.metadir().path('src/dir').ino(dirStats.ino).build() const fileStats = { ino: 2 } const file = builders .metafile() @@ -1494,11 +1439,7 @@ onPlatform('darwin', () => { it('child moved out of moved folder', () => { const dirStats = { ino: 1 } - const dir = builders - .metadir() - .path('src/dir') - .ino(dirStats.ino) - .build() + const dir = builders.metadir().path('src/dir').ino(dirStats.ino).build() const fileStats = { ino: 2 } const file = builders .metafile() @@ -1533,11 +1474,7 @@ onPlatform('darwin', () => { it('child moved within moved dir', () => { const dirStats = { ino: 1 } - const dir = builders - .metadir() - .path('src/dir') - .ino(dirStats.ino) - .build() + const dir = builders.metadir().path('src/dir').ino(dirStats.ino).build() const fileStats = { ino: 2 } const file = builders .metafile() @@ -1699,25 +1636,13 @@ onPlatform('darwin', () => { const otherFileStats = { ino: 4 } const otherDirStats = { ino: 5 } const dirMetadata /*: Metadata */ = normalizer( - builders - .metadir() - .path('src') - .ino(dirStats.ino) - .build() + builders.metadir().path('src').ino(dirStats.ino).build() ) const subdirMetadata /*: Metadata */ = normalizer( - builders - .metadir() - .path('src/subdir') - .ino(subdirStats.ino) - .build() + builders.metadir().path('src/subdir').ino(subdirStats.ino).build() ) const fileMetadata /*: Metadata */ = normalizer( - builders - .metafile() - .path('src/file') - .ino(fileStats.ino) - .build() + builders.metafile().path('src/file').ino(fileStats.ino).build() ) const otherFileMetadata /*: Metadata */ = normalizer( builders diff --git a/test/unit/local/chokidar/initial_scan.js b/test/unit/local/chokidar/initial_scan.js index c361ddd56..9e9c068da 100644 --- a/test/unit/local/chokidar/initial_scan.js +++ b/test/unit/local/chokidar/initial_scan.js @@ -21,21 +21,17 @@ onPlatform('darwin', () => { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('set up builders', function() { + beforeEach('set up builders', function () { builders = new Builders({ pouch: this.pouch }) }) afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - describe('.detectOfflineUnlinkEvents()', function() { - it('detects deleted files and folders', async function() { + describe('.detectOfflineUnlinkEvents()', function () { + it('detects deleted files and folders', async function () { // Folder still exists - await builders - .metadir() - .path('folder1') - .upToDate() - .create() + await builders.metadir().path('folder1').upToDate().create() // Folder does not exist anymore const folder2 = await builders .metadir() @@ -69,11 +65,7 @@ onPlatform('darwin', () => { .changedSide('remote') .create() // File still exists - builders - .metafile() - .path('file1') - .upToDate() - .create() + builders.metafile().path('file1').upToDate().create() // File does not exist anymore const file2 = await builders .metafile() @@ -122,11 +114,8 @@ onPlatform('darwin', () => { }) if (platform === 'win32') { - it('ignores incompatible docs', async function() { - await builders - .metafile() - .incompatible() - .create() + it('ignores incompatible docs', async function () { + await builders.metafile().incompatible().create() const initialScan = { ids: [] } const { offlineEvents } = await detectOfflineUnlinkEvents( @@ -138,13 +127,8 @@ onPlatform('darwin', () => { } }) - it('does not detect unsynced remote additions as deleted docs', async function() { - await builders - .metadir() - .path('dir') - .ino(1) - .sides({ remote: 1 }) - .create() + it('does not detect unsynced remote additions as deleted docs', async function () { + await builders.metadir().path('dir').ino(1).sides({ remote: 1 }).create() await builders .metafile() .path('file') diff --git a/test/unit/local/chokidar/normalize_paths.js b/test/unit/local/chokidar/normalize_paths.js index a8f9994ca..acd6696cd 100644 --- a/test/unit/local/chokidar/normalize_paths.js +++ b/test/unit/local/chokidar/normalize_paths.js @@ -21,7 +21,7 @@ onPlatform('darwin', () => { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('set up builders', function() { + beforeEach('set up builders', function () { builders = new Builders({ pouch: this.pouch }) }) @@ -33,7 +33,7 @@ onPlatform('darwin', () => { const filename = 'Réussite'.normalize('NFD') context('when parent is saved with NFC encoded path in Pouch', () => { - beforeEach(async function() { + beforeEach(async function () { await builders .metadir() .path(dirPath.normalize('NFC')) @@ -41,7 +41,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes only parent part of file path with NFC', async function() { + it('normalizes only parent part of file path with NFC', async function () { const changes = [ { type: 'FileAddition', @@ -57,7 +57,7 @@ onPlatform('darwin', () => { }) context('when parent is saved with NFD encoded path in Pouch', () => { - beforeEach(async function() { + beforeEach(async function () { await builders .metadir() .path(dirPath.normalize('NFD')) @@ -65,7 +65,7 @@ onPlatform('darwin', () => { .create() }) - it('does not normalize parent part of file path with NFC', async function() { + it('does not normalize parent part of file path with NFC', async function () { const changes = [ { type: 'FileAddition', @@ -87,7 +87,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFC encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(dirPath.normalize('NFC')) @@ -97,7 +97,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFC'))) @@ -106,7 +106,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes file path with NFC', async function() { + it('normalizes file path with NFC', async function () { const changes = [ { type: 'FileUpdate', @@ -141,7 +141,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFD'))) @@ -150,7 +150,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes only parent part of file path with NFC', async function() { + it('normalizes only parent part of file path with NFC', async function () { const changes = [ { type: 'FileUpdate', @@ -192,7 +192,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFD encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(dirPath.normalize('NFD')) @@ -202,7 +202,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFC'))) @@ -211,7 +211,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes only file name with NFC', async function() { + it('normalizes only file name with NFC', async function () { const changes = [ { type: 'FileUpdate', @@ -252,7 +252,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFD'))) @@ -261,7 +261,7 @@ onPlatform('darwin', () => { .create() }) - it('does not normalize file path with NFC', async function() { + it('does not normalize file path with NFC', async function () { const changes = [ { type: 'FileUpdate', @@ -303,7 +303,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFC encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(srcDirPath.normalize('NFC')) @@ -313,7 +313,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFC'))) @@ -322,7 +322,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes new dir and file paths with NFC', async function() { + it('normalizes new dir and file paths with NFC', async function () { const changes = [ { type: 'DirMove', @@ -356,7 +356,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFD'))) @@ -365,7 +365,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes only parent part of file path with NFC', async function() { + it('normalizes only parent part of file path with NFC', async function () { const changes = [ { type: 'DirMove', @@ -403,7 +403,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFD encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(srcDirPath.normalize('NFD')) @@ -413,7 +413,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFC'))) @@ -422,7 +422,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes file name with NFC', async function() { + it('normalizes file name with NFC', async function () { const changes = [ { type: 'DirMove', @@ -459,7 +459,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, filename.normalize('NFD'))) @@ -468,7 +468,7 @@ onPlatform('darwin', () => { .create() }) - it('does not normalize new dir or file paths with NFC', async function() { + it('does not normalize new dir or file paths with NFC', async function () { const changes = [ { type: 'DirMove', @@ -512,7 +512,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFC encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(dirPath.normalize('NFC')) @@ -522,7 +522,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFC'))) @@ -531,7 +531,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes new file path with NFC', async function() { + it('normalizes new file path with NFC', async function () { const changes = [ { type: 'FileMove', @@ -554,7 +554,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFD'))) @@ -563,7 +563,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes only parent part of file path with NFC', async function() { + it('normalizes only parent part of file path with NFC', async function () { const changes = [ { type: 'FileMove', @@ -590,7 +590,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFD encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(dirPath.normalize('NFD')) @@ -600,7 +600,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFC'))) @@ -609,7 +609,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes file name with NFC', async function() { + it('normalizes file name with NFC', async function () { const changes = [ { type: 'FileMove', @@ -635,7 +635,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFD'))) @@ -644,7 +644,7 @@ onPlatform('darwin', () => { .create() }) - it('does not normalize new dir or file paths with NFC', async function() { + it('does not normalize new dir or file paths with NFC', async function () { const changes = [ { type: 'FileMove', @@ -678,7 +678,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFC encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(srcDirPath.normalize('NFC')) @@ -688,7 +688,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFC'))) @@ -697,7 +697,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes new dir and file paths with NFC', async function() { + it('normalizes new dir and file paths with NFC', async function () { const changes = [ { type: 'DirMove', @@ -731,7 +731,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFD'))) @@ -740,7 +740,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes only parent part of file path with NFC', async function() { + it('normalizes only parent part of file path with NFC', async function () { const changes = [ { type: 'DirMove', @@ -778,7 +778,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFD encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(srcDirPath.normalize('NFD')) @@ -788,7 +788,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFC'))) @@ -797,7 +797,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes file name with NFC', async function() { + it('normalizes file name with NFC', async function () { const changes = [ { type: 'DirMove', @@ -834,7 +834,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(path.join(dir.path, srcFilename.normalize('NFD'))) @@ -843,7 +843,7 @@ onPlatform('darwin', () => { .create() }) - it('does not normalize new dir or file paths with NFC', async function() { + it('does not normalize new dir or file paths with NFC', async function () { const changes = [ { type: 'DirMove', @@ -888,7 +888,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFC encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(srcDirPath.normalize('NFC')) @@ -898,7 +898,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(srcFilename.normalize('NFC')) @@ -907,7 +907,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes new dir and file paths with NFC', async function() { + it('normalizes new dir and file paths with NFC', async function () { const changes = [ { type: 'DirMove', @@ -941,7 +941,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(srcFilename.normalize('NFD')) @@ -950,7 +950,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes only parent part of file path with NFC', async function() { + it('normalizes only parent part of file path with NFC', async function () { const changes = [ { type: 'DirMove', @@ -988,7 +988,7 @@ onPlatform('darwin', () => { context('when parent is saved with NFD encoded path in Pouch', () => { let dir - beforeEach(async function() { + beforeEach(async function () { dir = await builders .metadir() .path(srcDirPath.normalize('NFD')) @@ -998,7 +998,7 @@ onPlatform('darwin', () => { context('when file is saved with NFC encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(srcFilename.normalize('NFC')) @@ -1007,7 +1007,7 @@ onPlatform('darwin', () => { .create() }) - it('normalizes file name with NFC', async function() { + it('normalizes file name with NFC', async function () { const changes = [ { type: 'DirMove', @@ -1044,7 +1044,7 @@ onPlatform('darwin', () => { context('when file is saved with NFD encoded name in Pouch', () => { let file - beforeEach(async function() { + beforeEach(async function () { file = await builders .metafile() .path(srcFilename.normalize('NFD')) @@ -1053,7 +1053,7 @@ onPlatform('darwin', () => { .create() }) - it('does not normalize new dir or file paths with NFC', async function() { + it('does not normalize new dir or file paths with NFC', async function () { const changes = [ { type: 'DirMove', diff --git a/test/unit/local/chokidar/prepare_events.js b/test/unit/local/chokidar/prepare_events.js index f4b9c572d..079ec73b5 100644 --- a/test/unit/local/chokidar/prepare_events.js +++ b/test/unit/local/chokidar/prepare_events.js @@ -17,7 +17,7 @@ onPlatform('darwin', () => { before('instanciate config', configHelpers.createConfig) before('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('set up builders', function() { + beforeEach('set up builders', function () { builders = new Builders({ pouch: this.pouch }) }) @@ -25,11 +25,8 @@ onPlatform('darwin', () => { after('clean config directory', configHelpers.cleanConfig) describe('#oldMetadata()', () => { - it('resolves with the metadata whose id matches the event path', async function() { - const old = await builders - .metadata() - .upToDate() - .create() + it('resolves with the metadata whose id matches the event path', async function () { + const old = await builders.metadata().upToDate().create() const resultByEventType = {} for (let type of ['add', 'addDir', 'change', 'unlink', 'unlinkDir']) { resultByEventType[type] = await prepareEvents.oldMetadata( @@ -51,7 +48,7 @@ onPlatform('darwin', () => { }) describe('#step()', () => { - it('does not compute checksum of untouched file', async function() { + it('does not compute checksum of untouched file', async function () { const untouched = await builders .metafile() .path('untouched') @@ -93,7 +90,7 @@ onPlatform('darwin', () => { should(checksum).not.have.been.called() }) - it('does not compute checksum after only a path normalization change', async function() { + it('does not compute checksum after only a path normalization change', async function () { const old = await builders .metafile() .path('énoncé'.normalize('NFC')) diff --git a/test/unit/local/chokidar/watcher.js b/test/unit/local/chokidar/watcher.js index 12cd14747..891f8a112 100644 --- a/test/unit/local/chokidar/watcher.js +++ b/test/unit/local/chokidar/watcher.js @@ -17,18 +17,18 @@ const { onPlatform } = require('../../../support/helpers/platform') const pouchHelpers = require('../../../support/helpers/pouch') onPlatform('darwin', () => { - describe('ChokidarWatcher Tests', function() { + describe('ChokidarWatcher Tests', function () { let builders before('instanciate config', configHelpers.createConfig) before('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('instanciate local watcher', function() { + beforeEach('instanciate local watcher', function () { builders = new Builders({ pouch: this.pouch }) this.prep = {} const events = { emit: sinon.stub() } this.watcher = new Watcher(this.syncPath, this.prep, this.pouch, events) }) - afterEach('stop watcher and clean path', function(done) { + afterEach('stop watcher and clean path', function (done) { this.watcher.stop(true) this.watcher.checksumer.kill() fse.emptyDir(this.syncPath, done) @@ -36,12 +36,12 @@ onPlatform('darwin', () => { after('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - describe('start', function() { - it('calls the callback when initial scan is done', function() { + describe('start', function () { + it('calls the callback when initial scan is done', function () { this.watcher.start() }) - it('calls addFile/putFolder for files that are aleady here', async function() { + it('calls addFile/putFolder for files that are aleady here', async function () { fse.ensureDirSync(path.join(this.syncPath, 'aa')) fse.ensureFileSync(path.join(this.syncPath, 'aa/ab')) this.prep.putFolderAsync = sinon.stub().resolves() @@ -57,7 +57,7 @@ onPlatform('darwin', () => { ) }) - it('only recomputes checksums of changed files', async function() { + it('only recomputes checksums of changed files', async function () { const unchangedFilename = 'unchanged-file.txt' const changedFilename = 'changed-file.txt' const unchangedPath = path.join(this.syncPath, unchangedFilename) @@ -104,7 +104,7 @@ onPlatform('darwin', () => { } }) - it('ignores the temporary directory', async function() { + it('ignores the temporary directory', async function () { fse.ensureDirSync(path.join(this.syncPath, TMP_DIR_NAME)) fse.ensureFileSync(path.join(this.syncPath, TMP_DIR_NAME, 'ac')) this.prep.putFolder = sinon.spy() @@ -121,18 +121,18 @@ onPlatform('darwin', () => { const relpath = 'foo.txt' let abspath - beforeEach(function() { + beforeEach(function () { abspath = path.join(this.syncPath, relpath) }) - it('resolves with the md5sum for the given relative path', async function() { + it('resolves with the md5sum for the given relative path', async function () { await fse.outputFile(abspath, 'foo') await should(this.watcher.checksum(relpath)).be.fulfilledWith( 'rL0Y20zC+Fzt72VPzMSk2A==' ) // foo }) - it('does not swallow errors', async function() { + it('does not swallow errors', async function () { await should(this.watcher.checksum(relpath)).be.rejectedWith({ code: 'ENOENT' }) @@ -140,11 +140,11 @@ onPlatform('darwin', () => { }) describe('onFlush', () => { - beforeEach(function() { + beforeEach(function () { this.prep.addFileAsync = sinon.stub().resolves() this.prep.putFolderAsync = sinon.stub().resolves() }) - afterEach(function() { + afterEach(function () { delete this.prep.addFileAsync delete this.prep.putFolderAsync }) @@ -152,7 +152,7 @@ onPlatform('darwin', () => { context( 'when processing the initial events of an empty sync directory', () => { - it('calls the initial scan step', async function() { + it('calls the initial scan step', async function () { sinon.spy(this.watcher.pouch, 'initialScanDocs') try { @@ -182,7 +182,7 @@ onPlatform('darwin', () => { context('while an initial scan is being processed', () => { const trigger = new EventEmitter() const SECOND_FLUSH_TRIGGER = 'second-flush' - beforeEach(function() { + beforeEach(function () { // Make sure we're in initial scan mode this.watcher.initialScanParams = { paths: [], @@ -196,16 +196,14 @@ onPlatform('darwin', () => { // Make sure the first initial scan does not end until we've flushed a // second time. const originalInitialScanDocs = this.watcher.pouch.initialScanDocs - sinon - .stub(this.watcher.pouch, 'initialScanDocs') - .callsFake(async () => { - return new Promise(async resolve => { - trigger.on(SECOND_FLUSH_TRIGGER, async () => { - const data = await originalInitialScanDocs() - resolve(data) - }) + sinon.stub(this.watcher.pouch, 'initialScanDocs').callsFake(() => { + return new Promise(resolve => { + trigger.on(SECOND_FLUSH_TRIGGER, async () => { + const data = await originalInitialScanDocs() + resolve(data) }) }) + }) // Flush an initial scan event this.watcher.buffer.push({ @@ -215,11 +213,11 @@ onPlatform('darwin', () => { }) this.watcher.buffer.flush() }) - afterEach(function() { + afterEach(function () { this.watcher.pouch.initialScanDocs.restore() }) - it('does not trigger a new initial scan', async function() { + it('does not trigger a new initial scan', async function () { this.watcher.buffer.push({ type: 'add', path: __filename, @@ -228,7 +226,7 @@ onPlatform('darwin', () => { await new Promise(resolve => { const flushDone = this.watcher.buffer.flush() trigger.emit(SECOND_FLUSH_TRIGGER) - flushDone.then(resolve()) + return flushDone.then(resolve()) }) should(this.watcher.pouch.initialScanDocs).have.been.calledOnce() @@ -242,9 +240,9 @@ onPlatform('darwin', () => { return } - it('detects when a file is created', function(done) { - this.watcher.start().then(() => { - this.prep.addFileAsync = function(side, doc) { + it('detects when a file is created', function () { + return this.watcher.start().then(() => { + this.prep.addFileAsync = function (side, doc) { side.should.equal('local') doc.should.have.properties({ path: 'aaa.jpg', @@ -252,16 +250,16 @@ onPlatform('darwin', () => { md5sum: '+HBGS7uN4XdB0blqLv5tFQ==', size: 29865 }) - done() - return Promise.resolve() + return } let src = path.join(__dirname, '../../../fixtures/chat-mignon.jpg') let dst = path.join(this.syncPath, 'aaa.jpg') fse.copySync(src, dst) + return }) }) - it('does not skip checksum computation when an identity conflict could occur during initial scan', async function() { + it('does not skip checksum computation when an identity conflict could occur during initial scan', async function () { const syncDir = new ContextDir(this.syncPath) const existing = await builders .metafile() @@ -281,47 +279,46 @@ onPlatform('darwin', () => { }) }) - describe('onAddDir', function() { + describe('onAddDir', function () { if (process.env.APPVEYOR) { it('is unstable on AppVeyor') return } - it('detects when a folder is created', function(done) { - this.watcher.start().then(() => { - this.prep.putFolderAsync = function(side, doc) { + it('detects when a folder is created', function () { + return this.watcher.start().then(() => { + this.prep.putFolderAsync = function (side, doc) { side.should.equal('local') doc.should.have.properties({ path: 'aba', docType: 'folder' }) doc.should.have.properties(['updated_at', 'ino']) - done() - return Promise.resolve() + return } fse.mkdirSync(path.join(this.syncPath, 'aba')) - return Promise.resolve() + return }) }) - it('detects when a sub-folder is created', function(done) { - this.watcher.start().then(() => { + it('detects when a sub-folder is created', function () { + return this.watcher.start().then(() => { this.prep.putFolderAsync = () => { // For abb folder - this.prep.putFolderAsync = function(side, doc) { + this.prep.putFolderAsync = function (side, doc) { side.should.equal('local') doc.should.have.properties({ path: path.normalize('abb/abc'), docType: 'folder' }) doc.should.have.properties(['updated_at']) - done() - return Promise.resolve() + return } fse.mkdirSync(path.join(this.syncPath, 'abb/abc')) - return Promise.resolve() + return } fse.mkdirSync(path.join(this.syncPath, 'abb')) + return }) }) }) @@ -332,19 +329,18 @@ onPlatform('darwin', () => { return } - it.skip('detects when a file is deleted', function(done) { + it.skip('detects when a file is deleted', function () { // This test does not create the file in pouchdb. // the watcher will not find a inode number for the unlink // and therefore discard it. fse.ensureFileSync(path.join(this.syncPath, 'aca')) this.prep.addFileAsync = () => { // For aca file - this.prep.trashFileAsync = function(side, doc) { + this.prep.trashFileAsync = function (side, doc) { side.should.equal('local') doc.should.have.properties({ path: 'aca' }) - done() return Promise.resolve() } fse.unlinkSync(path.join(this.syncPath, 'aca')) @@ -360,19 +356,18 @@ onPlatform('darwin', () => { return } - it.skip('detects when a folder is deleted', function(done) { + it.skip('detects when a folder is deleted', function () { // This test does not create the file in pouchdb. // the watcher will not find a inode number for the unlink // and therefore discard it. fse.mkdirSync(path.join(this.syncPath, 'ada')) this.prep.putFolderAsync = () => { // For ada folder - this.prep.trashFolderAsync = function(side, doc) { + this.prep.trashFolderAsync = function (side, doc) { side.should.equal('local') doc.should.have.properties({ path: 'ada' }) - done() return Promise.resolve() } fse.rmdirSync(path.join(this.syncPath, 'ada')) @@ -383,12 +378,12 @@ onPlatform('darwin', () => { }) describe('onChange', () => - it('detects when a file is changed', function(done) { + it('detects when a file is changed', function () { let src = path.join(__dirname, '../../../fixtures/chat-mignon.jpg') let dst = path.join(this.syncPath, 'aea.jpg') fse.copySync(src, dst) this.prep.addFileAsync = () => { - this.prep.updateFileAsync = function(side, doc) { + this.prep.updateFileAsync = function (side, doc) { side.should.equal('local') doc.should.have.properties({ path: 'aea.jpg', @@ -396,7 +391,6 @@ onPlatform('darwin', () => { md5sum: 'tdmDwDisJe/rJn+2fV+rNA==', size: 36901 }) - done() return Promise.resolve() } src = src.replace(/\.jpg$/, '-mod.jpg') @@ -408,11 +402,11 @@ onPlatform('darwin', () => { this.watcher.start() })) - describe('when a file is moved', function() { + describe('when a file is moved', function () { beforeEach('instanciate pouch', pouchHelpers.createDatabase) afterEach('clean pouch', pouchHelpers.cleanDatabase) - it.skip('deletes the source and adds the destination', function(done) { + it.skip('deletes the source and adds the destination', function () { // This test does not create the file in pouchdb. // the watcher will not find a inode number for the unlink // and therefore discard it. @@ -424,40 +418,42 @@ onPlatform('darwin', () => { return this.pouch.db.put(doc) } this.prep.updateFileAsync = sinon.stub().resolves() - this.watcher.start().then(() => { - setTimeout(() => { - this.prep.deleteFileAsync = sinon.stub().resolves() - this.prep.addFileAsync = sinon.stub().resolves() - this.prep.moveFileAsync = (side, doc, was) => { - this.prep.deleteFileAsync.called.should.be.false() - this.prep.addFileAsync.called.should.be.false() - side.should.equal('local') - doc.should.have.properties({ - path: 'afb.jpg', - docType: 'file', - md5sum: '+HBGS7uN4XdB0blqLv5tFQ==', - size: 29865 - }) - was.should.have.properties({ - path: 'afa.jpg', - docType: 'file', - md5sum: '+HBGS7uN4XdB0blqLv5tFQ==', - size: 29865 - }) - done() - return Promise.resolve() - } - fse.renameSync(dst, path.join(this.syncPath, 'afb.jpg')) - }, 2000) + return this.watcher.start().then(() => { + return new Promise(resolve => { + setTimeout(() => { + this.prep.deleteFileAsync = sinon.stub().resolves() + this.prep.addFileAsync = sinon.stub().resolves() + this.prep.moveFileAsync = (side, doc, was) => { + this.prep.deleteFileAsync.called.should.be.false() + this.prep.addFileAsync.called.should.be.false() + side.should.equal('local') + doc.should.have.properties({ + path: 'afb.jpg', + docType: 'file', + md5sum: '+HBGS7uN4XdB0blqLv5tFQ==', + size: 29865 + }) + was.should.have.properties({ + path: 'afa.jpg', + docType: 'file', + md5sum: '+HBGS7uN4XdB0blqLv5tFQ==', + size: 29865 + }) + return + } + fse.renameSync(dst, path.join(this.syncPath, 'afb.jpg')) + resolve() + }, 2000) + }) }) }) }) - describe('when a directory is moved', function() { + describe('when a directory is moved', function () { beforeEach('instanciate pouch', pouchHelpers.createDatabase) afterEach('clean pouch', pouchHelpers.cleanDatabase) - it.skip('deletes the source and adds the destination', function(done) { + it.skip('deletes the source and adds the destination', function () { // This test does not create the file in pouchdb. // the watcher will not find a inode number for the unlink // and therefore discard it. @@ -470,38 +466,44 @@ onPlatform('darwin', () => { return this.pouch.db.put(doc) } this.prep.updateFileAsync = sinon.stub().resolves() - this.watcher.start().then(() => { - setTimeout(() => { - this.prep.updateFileAsync = sinon.stub().resolves() - this.prep.addFileAsync = sinon.stub().resolves() - this.prep.deleteFileAsync = sinon.stub().resolves() - this.prep.moveFileAsync = sinon.stub().resolves() - this.prep.deleteFolderAsync = sinon.stub().resolves() - this.prep.trashFolderAsync = sinon.stub().resolves() - this.prep.putFolderAsync = (side, doc) => { - side.should.equal('local') - doc.should.have.properties({ - path: 'agb', - docType: 'folder' - }) - setTimeout(() => { - this.prep.addFileAsync.called.should.be.false() - this.prep.deleteFileAsync.called.should.be.false() - this.prep.moveFileAsync.called.should.be.true() - src = this.prep.moveFileAsync.args[0][2] - src.should.have.properties({ path: path.normalize('aga/agc') }) - dst = this.prep.moveFileAsync.args[0][1] - dst.should.have.properties({ path: path.normalize('agb/agc') }) - // FIXME: Delete moved dirs - this.prep.trashFolderAsync.called.should.be.true() - let args = this.prep.trashFolderAsync.args[0][1] - args.should.have.properties({ path: 'aga' }) - done() - }, 5000) - return Promise.resolve() - } - fse.renameSync(src, dst) - }, 1800) + return this.watcher.start().then(() => { + return new Promise(resolve => { + setTimeout(() => { + this.prep.updateFileAsync = sinon.stub().resolves() + this.prep.addFileAsync = sinon.stub().resolves() + this.prep.deleteFileAsync = sinon.stub().resolves() + this.prep.moveFileAsync = sinon.stub().resolves() + this.prep.deleteFolderAsync = sinon.stub().resolves() + this.prep.trashFolderAsync = sinon.stub().resolves() + this.prep.putFolderAsync = (side, doc) => { + side.should.equal('local') + doc.should.have.properties({ + path: 'agb', + docType: 'folder' + }) + setTimeout(() => { + this.prep.addFileAsync.called.should.be.false() + this.prep.deleteFileAsync.called.should.be.false() + this.prep.moveFileAsync.called.should.be.true() + src = this.prep.moveFileAsync.args[0][2] + src.should.have.properties({ + path: path.normalize('aga/agc') + }) + dst = this.prep.moveFileAsync.args[0][1] + dst.should.have.properties({ + path: path.normalize('agb/agc') + }) + // FIXME: Delete moved dirs + this.prep.trashFolderAsync.called.should.be.true() + let args = this.prep.trashFolderAsync.args[0][1] + args.should.have.properties({ path: 'aga' }) + }, 5000) + return Promise.resolve() + } + fse.renameSync(src, dst) + resolve() + }, 1800) + }) }) }) }) diff --git a/test/unit/local/index.js b/test/unit/local/index.js index 7ad5d8fef..db638c19e 100644 --- a/test/unit/local/index.js +++ b/test/unit/local/index.js @@ -22,21 +22,17 @@ const CHAT_MIGNON_MOD_PATH = 'test/fixtures/chat-mignon-mod.jpg' const streamer = (doc, content, err) => ({ createReadStreamAsync(docToStream) { docToStream.should.equal(doc) - const stream = new Builders() - .stream() - .push(content) - .error(err) - .build() + const stream = new Builders().stream().push(content).error(err).build() return Promise.resolve(stream) } }) -describe('Local', function() { +describe('Local', function () { let builders, syncDir before('instanciate config', configHelpers.createConfig) before('instanciate pouch', pouchHelpers.createDatabase) - before('instanciate local', function() { + before('instanciate local', function () { this.prep = {} this.events = { emit: () => {} } this.local = new Local({ ...this, sendToTrash }) @@ -47,30 +43,30 @@ describe('Local', function() { after('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - describe('constructor', function() { - it('has a base path', function() { + describe('constructor', function () { + it('has a base path', function () { this.local.syncPath.should.equal(this.syncPath) }) - it('has a tmp path', function() { + it('has a tmp path', function () { let tmpPath = syncDir.abspath(TMP_DIR_NAME) this.local.tmpPath.should.equal(tmpPath) }) - it('has a side name', function() { + it('has a side name', function () { should(this.local.name).eql('local') }) }) - describe('createReadStream', function() { - it('throws an error if no file for this document', async function() { + describe('createReadStream', function () { + it('throws an error if no file for this document', async function () { let doc = { path: 'no-such-file' } await should(this.local.createReadStreamAsync(doc)).be.rejectedWith( /ENOENT/ ) }) - it('creates a readable stream for the document', async function() { + it('creates a readable stream for the document', async function () { const image = await fse.readFile(CHAT_MIGNON_MOD_PATH) const src = CHAT_MIGNON_MOD_PATH @@ -91,7 +87,7 @@ describe('Local', function() { }) describe('updateMetadataAsync', () => { - it('chmod -x for a non-executable file', async function() { + it('chmod -x for a non-executable file', async function () { const doc = { docType: 'file', path: 'non-exec-file' @@ -104,62 +100,53 @@ describe('Local', function() { process.platform === 'win32' ? WINDOWS_DEFAULT_MODE : '644' ) }) - }) - // TODO: Port to updateMetadataAsync() - describe('metadataUpdater', function() { - it('chmod +x for an executable file', function(done) { + it('chmod +x for an executable file', async function () { let date = new Date('2015-11-09T05:06:07Z') let filePath = syncDir.abspath('exec-file') fse.ensureFileSync(filePath) - let updater = this.local.metadataUpdater({ + + await this.local.updateMetadataAsync({ docType: 'file', path: 'exec-file', updated_at: date, executable: true }) - updater(function(err) { - should.not.exist(err) - const mode = +fse.statSync(filePath).mode - if (process.platform === 'win32') { - should(mode & 0o100).equal(0) - } else { - should(mode & 0o100).not.equal(0) - } - done() - }) + + const mode = (await fse.stat(filePath)).mode + if (process.platform === 'win32') { + should(+mode & 0o100).equal(0) + } else { + should(+mode & 0o100).not.equal(0) + } }) - it('updates mtime for a file', function(done) { + it('updates mtime for a file', async function () { let date = new Date('2015-10-09T05:06:07Z') let filePath = syncDir.abspath('utimes-file') fse.ensureFileSync(filePath) - let updater = this.local.metadataUpdater({ + + await this.local.updateMetadataAsync({ path: 'utimes-file', updated_at: date }) - updater(function(err) { - should.not.exist(err) - const mtime = +fse.statSync(filePath).mtime - should(mtime).equal(+date) - done() - }) + + const mtime = (await fse.stat(filePath)).mtime + should(+mtime).equal(+date) }) - it('updates mtime for a directory', function(done) { + it('updates mtime for a directory', async function () { let date = new Date('2015-10-09T05:06:07Z') let folderPath = syncDir.abspath('utimes-folder') fse.ensureDirSync(folderPath) - let updater = this.local.metadataUpdater({ + + await this.local.updateMetadataAsync({ path: 'utimes-folder', updated_at: date }) - updater(function(err) { - should.not.exist(err) - const mtime = +fse.statSync(folderPath).mtime - should(mtime).equal(+date) - done() - }) + + const mtime = (await fse.statSync(folderPath)).mtime + should(+mtime).equal(+date) }) }) @@ -170,7 +157,7 @@ describe('Local', function() { fullPath = doc => syncDir.abspath(doc.path) }) - it('sets ino for a file', function(done) { + it('sets ino for a file', function (done) { const doc /*: { path: string, ino?: number } */ = { path: 'file-needs-ino' } @@ -183,7 +170,7 @@ describe('Local', function() { }) }) - it('sets ino for a directory', function(done) { + it('sets ino for a directory', function (done) { const doc /*: { path: string, ino?: number } */ = { path: 'dir-needs-ino' } @@ -198,7 +185,7 @@ describe('Local', function() { }) describe('fileExistsLocally', () => { - it('checks file existence as a binary in the db and on disk', async function() { + it('checks file existence as a binary in the db and on disk', async function () { const filePath = path.resolve(this.syncPath, 'folder', 'testfile') await should(this.local.fileExistsLocally('deadcafe')).be.fulfilledWith( false @@ -221,15 +208,15 @@ describe('Local', function() { }) }) - describe('addFile', function() { - beforeEach(function() { + describe('addFile', function () { + beforeEach(function () { sinon.spy(this.events, 'emit') }) - afterEach(function() { + afterEach(function () { this.events.emit.restore() }) - it('creates the file by downloading it', async function() { + it('creates the file by downloading it', async function () { const content = 'foobar' const doc = builders .metafile() @@ -255,7 +242,7 @@ describe('Local', function() { } }) - it('creates the file from another file with same checksum', async function() { + it('creates the file from another file with same checksum', async function () { sinon.spy(this.local, 'fileExistsLocally') const content = 'foo bar baz' @@ -292,7 +279,7 @@ describe('Local', function() { } }) - it('can create a file in the root', async function() { + it('can create a file in the root', async function () { const content = 'foobaz' const doc = builders .metafile() @@ -317,7 +304,7 @@ describe('Local', function() { } }) - it('aborts when the download is incorrect', async function() { + it('aborts when the download is incorrect', async function () { const content = 'foo' const invalidContent = 'bar' const doc = builders @@ -339,7 +326,7 @@ describe('Local', function() { } }) - it('adds write permission to existing read-only Cozy Note', async function() { + it('adds write permission to existing read-only Cozy Note', async function () { const doc = { docType: 'file', mime: 'text/vnd.cozy.note+markdown', @@ -372,30 +359,30 @@ describe('Local', function() { let doc beforeEach('set up doc', () => { - doc = builders - .metafile() - .data(corruptData) - .build() + doc = builders.metafile().data(corruptData).build() doc.size = validData.length }) - beforeEach('stub #createReadStreamAsync() on the other side', function() { - this.local.other = streamer(doc, corruptData) - }) + beforeEach( + 'stub #createReadStreamAsync() on the other side', + function () { + this.local.other = streamer(doc, corruptData) + } + ) afterEach( 'restore #createReadStreamAsync() on the other side', - function() { + function () { this.local.other = null } ) - it('rejects', async function() { + it('rejects', async function () { await should(this.local.addFileAsync(doc)).be.rejectedWith(message) }) - const addFileRejection = async function() { - await this.local.addFileAsync(doc).catch({ message }, () => {}) + const addFileRejection = async function () { + await this.local.addFileAsync(doc).catch(() => {}) } describe('existing local file with valid data', () => { @@ -403,7 +390,7 @@ describe('Local', function() { afterEach(() => syncDir.unlink(doc)) beforeEach(addFileRejection) - it('is not overridden to prevent valid data loss', async function() { + it('is not overridden to prevent valid data loss', async function () { await should(syncDir.readFile(doc)).be.fulfilledWith(validData) }) }) @@ -411,7 +398,7 @@ describe('Local', function() { describe('missing local file', () => { beforeEach(addFileRejection) - it('is not downloaded to prevent confusion', async function() { + it('is not downloaded to prevent confusion', async function () { await should(syncDir.exists(doc)).be.fulfilledWith(false) }) }) @@ -423,31 +410,31 @@ describe('Local', function() { let doc beforeEach('set up doc', () => { - doc = builders - .metafile() - .data(data) - .build() + doc = builders.metafile().data(data).build() }) - beforeEach('stub #createReadStreamAsync() on the other side', function() { - this.local.other = streamer(doc, data, new Error(message)) - }) + beforeEach( + 'stub #createReadStreamAsync() on the other side', + function () { + this.local.other = streamer(doc, data, new Error(message)) + } + ) afterEach( 'restore #createReadStreamAsync() on the other side', - function() { + function () { this.local.other = null } ) - it('rejects', async function() { + it('rejects', async function () { await should(this.local.addFileAsync(doc)).be.rejectedWith(message) }) }) }) - describe('addFolder', function() { - it('creates the folder', async function() { + describe('addFolder', function () { + it('creates the folder', async function () { const doc = builders .metadir() .path('parent/folder-to-create') @@ -463,7 +450,7 @@ describe('Local', function() { should(doc.ino).be.a.Number() }) - it('updates mtime if the folder already exists', async function() { + it('updates mtime if the folder already exists', async function () { const doc = builders .metadir() .path('parent/folder-to-create') @@ -481,7 +468,7 @@ describe('Local', function() { }) describe('overwriteFile', () => { - it('writes the new content of a file', async function() { + it('writes the new content of a file', async function () { const newContent = 'Hello world' const doc = builders .metafile() @@ -510,7 +497,7 @@ describe('Local', function() { }) describe('updateFileMetadata', () => { - it('updates metadata', async function() { + it('updates metadata', async function () { const doc = builders .metafile() .path('file-to-update') @@ -525,11 +512,8 @@ describe('Local', function() { }) describe('updateFolder', () => { - it('calls addFolder', async function() { - const doc = builders - .metadir() - .path('a-folder-to-update') - .build() + it('calls addFolder', async function () { + const doc = builders.metadir().path('a-folder-to-update').build() sinon.stub(this.local, 'addFolderAsync').resolves() await this.local.updateFolderAsync(doc) should(this.local.addFolderAsync).be.calledWith(doc) @@ -537,15 +521,12 @@ describe('Local', function() { }) }) - describe('move', function() { - context('with file', function() { + describe('move', function () { + context('with file', function () { let dstFile, srcFile beforeEach(async () => { - srcFile = builders - .metafile() - .path('src/file') - .build() + srcFile = builders.metafile().path('src/file').build() dstFile = builders .metafile() .path('dst/file') @@ -555,7 +536,7 @@ describe('Local', function() { await fse.emptyDir(syncDir.root) }) - it('moves the file and updates its mtime', async function() { + it('moves the file and updates its mtime', async function () { await syncDir.outputFile(srcFile, 'foobar') await syncDir.ensureParentDir(dstFile) @@ -568,7 +549,7 @@ describe('Local', function() { should(await syncDir.readFile(dstFile)).equal('foobar') }) - it('throws ENOENT on missing source', async function() { + it('throws ENOENT on missing source', async function () { await syncDir.emptyDir(path.dirname(srcFile.path)) await syncDir.emptyDir(path.dirname(dstFile.path)) @@ -579,7 +560,7 @@ describe('Local', function() { should(await syncDir.tree()).deepEqual(['dst/', 'src/']) }) - it('throws ENOENT on missing destination parent', async function() { + it('throws ENOENT on missing destination parent', async function () { await syncDir.outputFile(srcFile, 'foobar') await syncDir.removeParentDir(dstFile) @@ -590,7 +571,7 @@ describe('Local', function() { should(await syncDir.tree()).deepEqual(['src/', 'src/file']) }) - it('throws a custom Error on existing destination', async function() { + it('throws a custom Error on existing destination', async function () { await syncDir.outputFile(srcFile, 'src/file content') await syncDir.outputFile(dstFile, 'dst/file content') @@ -606,7 +587,7 @@ describe('Local', function() { ]) }) - it('throws a custom Error on existing destination (and missing source)', async function() { + it('throws a custom Error on existing destination (and missing source)', async function () { await syncDir.ensureParentDir(srcFile) await syncDir.outputFile(dstFile, 'dst/file content') @@ -618,24 +599,17 @@ describe('Local', function() { }) }) - context('with folder', function() { + context('with folder', function () { let dstDir, srcDir beforeEach(async () => { - srcDir = builders - .metadir() - .path('src/dir') - .build() - dstDir = builders - .metadir() - .path('dst/dir') - .olderThan(srcDir) - .build() + srcDir = builders.metadir().path('src/dir').build() + dstDir = builders.metadir().path('dst/dir').olderThan(srcDir).build() await fse.emptyDir(syncDir.root) }) - it('moves the folder and updates its mtime', async function() { + it('moves the folder and updates its mtime', async function () { await syncDir.ensureDir(srcDir) await syncDir.ensureParentDir(dstDir) @@ -647,7 +621,7 @@ describe('Local', function() { ) }) - it('throws ENOENT on missing source', async function() { + it('throws ENOENT on missing source', async function () { await syncDir.ensureParentDir(srcDir) await syncDir.ensureParentDir(dstDir) @@ -658,7 +632,7 @@ describe('Local', function() { should(await syncDir.tree()).deepEqual(['dst/', 'src/']) }) - it('throws ENOENT on missing destination parent', async function() { + it('throws ENOENT on missing destination parent', async function () { await syncDir.ensureDir(srcDir) await should(this.local.moveAsync(dstDir, srcDir)).be.rejectedWith({ @@ -668,7 +642,7 @@ describe('Local', function() { should(await syncDir.tree()).deepEqual(['src/', 'src/dir/']) }) - it('throws a custom Error on existing destination', async function() { + it('throws a custom Error on existing destination', async function () { await syncDir.ensureDir(srcDir) await syncDir.ensureDir(dstDir) @@ -684,7 +658,7 @@ describe('Local', function() { ]) }) - it('throws a custom Error on existing destination (and missing source)', async function() { + it('throws a custom Error on existing destination (and missing source)', async function () { await syncDir.ensureParentDir(srcDir) await syncDir.ensureDir(dstDir) @@ -698,7 +672,7 @@ describe('Local', function() { }) describe('trash', () => { - it('deletes a file from the local filesystem', async function() { + it('deletes a file from the local filesystem', async function () { const doc = await builders .metafile() .path('FILE-TO-DELETE') @@ -712,7 +686,7 @@ describe('Local', function() { await should(fse.exists(filePath)).be.fulfilledWith(false) }) - it('deletes a folder from the local filesystem', async function() { + it('deletes a folder from the local filesystem', async function () { const doc = await builders .metadir() .path('FOLDER-TO-DELETE') @@ -727,7 +701,7 @@ describe('Local', function() { }) context('when the document is missing on the filesystem', () => { - it('does not throw', async function() { + it('does not throw', async function () { const doc = await builders .metafile() .path('FILE-TO-DELETE') diff --git a/test/unit/merge.js b/test/unit/merge.js index 7715bb4bb..ee6dc23b4 100644 --- a/test/unit/merge.js +++ b/test/unit/merge.js @@ -97,12 +97,12 @@ function increasedSides(sides, sideName, count) { } } -describe('Merge', function() { +describe('Merge', function () { let builders before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('instanciate merge', function() { + beforeEach('instanciate merge', function () { this.side = 'local' this.merge = new Merge(this.pouch) this.merge.local = stubSide('local') @@ -132,8 +132,8 @@ describe('Merge', function() { afterEach('clean remote', cozyHelpers.deleteAll) after('clean config directory', configHelpers.cleanConfig) - describe('addFile', function() { - it('saves the new file', async function() { + describe('addFile', function () { + it('saves the new file', async function () { const doc = builders .metafile() .path('new-file') @@ -159,13 +159,13 @@ describe('Merge', function() { }) }) - context('remote', function() { + context('remote', function () { context( 'when an unsynced local file record with the same path but different content exists', () => { const filepath = 'BUZZ.JPG' - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { await builders .metafile() .path(filepath) @@ -174,7 +174,7 @@ describe('Merge', function() { .create() }) - it('creates a remote conflict', async function() { + it('creates a remote conflict', async function () { const newRemoteFile = await builders .remoteFile() .inRootDir() @@ -209,7 +209,7 @@ describe('Merge', function() { const filepath = 'BUZZ.JPG' let file - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { file = await builders .metafile() .path(filepath) @@ -218,7 +218,7 @@ describe('Merge', function() { .create() }) - it('updates the record with the remote metadata', async function() { + it('updates the record with the remote metadata', async function () { const newRemoteFile = await builders .remoteFile() .inRootDir() @@ -275,7 +275,7 @@ describe('Merge', function() { const filepath = 'BUZZ.JPG' let remoteFile, deleted - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { remoteFile = await builders .remoteFile() .inRootDir() @@ -296,7 +296,7 @@ describe('Merge', function() { .create() }) - it('replaces the existing record with a new remote file record', async function() { + it('replaces the existing record with a new remote file record', async function () { const newRemoteFile = await builders .remoteFile(remoteFile) .data('updated content') @@ -333,7 +333,7 @@ describe('Merge', function() { const filepath = 'BUZZ.JPG' let file - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { file = await builders .metafile() .path(filepath) @@ -343,7 +343,7 @@ describe('Merge', function() { .create() }) - it('updates the existing record', async function() { + it('updates the existing record', async function () { const newRemoteFile = await builders .remoteFile() .inRootDir() @@ -380,14 +380,14 @@ describe('Merge', function() { ) }) - context('local', function() { + context('local', function () { const filepath = 'BUZZ.JPG' context( 'when an unsynced remote file record with the same path but different content exists', () => { let file - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { const remoteFile = await builders .remoteFile() .inRootDir() @@ -403,7 +403,7 @@ describe('Merge', function() { .create() }) - it('creates a local conflict', async function() { + it('creates a local conflict', async function () { const doc = await builders .metafile() .path(filepath) @@ -430,7 +430,7 @@ describe('Merge', function() { 'when an unsynced remote file record with the same path and content exists', () => { let file - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { const remoteFile = await builders .remoteFile() .inRootDir() @@ -446,7 +446,7 @@ describe('Merge', function() { .create() }) - it('updates the record with the local metadata', async function() { + it('updates the record with the local metadata', async function () { const doc = await builders .metafile() .path(filepath) @@ -489,7 +489,7 @@ describe('Merge', function() { 'when a deleted remote file record with the same path and content exists', () => { let synced - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { const remoteFile = await builders .remoteFile() .inRootDir() @@ -510,7 +510,7 @@ describe('Merge', function() { .create() }) - it('does not overwrite the existing record', async function() { + it('does not overwrite the existing record', async function () { const doc = await builders .metafile(synced) .unmerged('local') @@ -532,7 +532,7 @@ describe('Merge', function() { 'when a record with an unsynced remote deletion and different content exists', () => { let synced, deleted - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { const remoteFile = await builders .remoteFile() .inRootDir() @@ -553,7 +553,7 @@ describe('Merge', function() { .create() }) - it('updates the existing record as a new local file', async function() { + it('updates the existing record as a new local file', async function () { const doc = await builders .metafile(synced) .data('local content') @@ -587,7 +587,7 @@ describe('Merge', function() { 'when an up-to-date file record with the same path exists', () => { let file - beforeEach('create a file', async function() { + beforeEach('create a file', async function () { file = await builders .metafile() .path(filepath) @@ -597,7 +597,7 @@ describe('Merge', function() { .create() }) - it('updates the existing record', async function() { + it('updates the existing record', async function () { const doc = builders .metafile() .path(filepath) @@ -633,10 +633,10 @@ describe('Merge', function() { ) }) - context('when the path was used in the past', function() { + context('when the path was used in the past', function () { const path = 'file-created-deleted-and-then-recreated' - beforeEach(async function() { + beforeEach(async function () { const was = await builders .metafile() .path(path) @@ -646,7 +646,7 @@ describe('Merge', function() { await this.pouch.remove(was) }) - it('saves the new file with the correct side number', async function() { + it('saves the new file with the correct side number', async function () { const doc = builders .metafile() .path(path) @@ -673,17 +673,9 @@ describe('Merge', function() { }) onPlatforms(['win32', 'darwin'], () => { - it('resolves an identity conflict with an existing file', async function() { - await builders - .metafile() - .path('bar') - .upToDate() - .create() - const doc = builders - .metafile() - .path('BAR') - .unmerged('remote') - .build() + it('resolves an identity conflict with an existing file', async function () { + await builders.metafile().path('bar').upToDate().create() + const doc = builders.metafile().path('BAR').unmerged('remote').build() const sideEffects = await mergeSideEffects(this, () => this.merge.addFileAsync('remote', _.cloneDeep(doc)) @@ -697,17 +689,9 @@ describe('Merge', function() { }) onPlatform('linux', () => { - it('does not have identity conflicts', async function() { - await builders - .metafile() - .path('bar') - .upToDate() - .create() - const doc = builders - .metafile() - .path('BAR') - .unmerged('remote') - .build() + it('does not have identity conflicts', async function () { + await builders.metafile().path('bar').upToDate().create() + const doc = builders.metafile().path('BAR').unmerged('remote').build() const sideEffects = await mergeSideEffects(this, () => this.merge.addFileAsync('remote', _.cloneDeep(doc)) @@ -727,7 +711,7 @@ describe('Merge', function() { }) }) - it('resolves a conflict with an existing dir', async function() { + it('resolves a conflict with an existing dir', async function () { const existingLocalDir = await builders .metadir() .sides({ local: 1 }) @@ -750,15 +734,9 @@ describe('Merge', function() { }) }) - it('does nothing for an already merged file (aka idempotence)', async function() { - const mergedFile = await builders - .metafile() - .sides({ remote: 1 }) - .create() - const sameFile = builders - .metafile(mergedFile) - .unmerged('remote') - .build() + it('does nothing for an already merged file (aka idempotence)', async function () { + const mergedFile = await builders.metafile().sides({ remote: 1 }).create() + const sameFile = builders.metafile(mergedFile).unmerged('remote').build() const sideEffects = await mergeSideEffects(this, () => this.merge.addFileAsync('remote', _.cloneDeep(sameFile)) @@ -771,7 +749,7 @@ describe('Merge', function() { }) context('when content is the same as an existing file', () => { - it('updates the PouchDB record without marking changes from a local update', async function() { + it('updates the PouchDB record without marking changes from a local update', async function () { const mergedFile = await builders .metafile() .updatedAt(new Date(2020, 5, 19, 11, 9, 0)) @@ -801,7 +779,7 @@ describe('Merge', function() { }) }) - it('sets the local metadata when it is missing', async function() { + it('sets the local metadata when it is missing', async function () { const mergedFile = await builders .metafile() .updatedAt(new Date(2020, 5, 19, 11, 9, 0)) @@ -813,10 +791,7 @@ describe('Merge', function() { const { rev } = await this.pouch.db.put(mergedFile) mergedFile._rev = rev - const sameFile = builders - .metafile(mergedFile) - .unmerged('local') - .build() + const sameFile = builders.metafile(mergedFile).unmerged('local').build() const sideEffects = await mergeSideEffects(this, () => this.merge.addFileAsync('local', _.cloneDeep(sameFile)) @@ -836,7 +811,7 @@ describe('Merge', function() { }) }) - it('keeps an existing local metadata when it is not present in the new doc', async function() { + it('keeps an existing local metadata when it is not present in the new doc', async function () { const oldRemoteFile = await builders .remoteFile() .updatedAt(2020, 5, 19, 11, 9, 0) @@ -875,8 +850,8 @@ describe('Merge', function() { }) }) - context('on initial scan', function() { - it('saves an offline update after an unsynced local addition', async function() { + context('on initial scan', function () { + it('saves an offline update after an unsynced local addition', async function () { const initialFile = await builders .metafile() .sides({ local: 1 }) @@ -909,7 +884,7 @@ describe('Merge', function() { }) }) - it('saves an offline update after an unsynced local update', async function() { + it('saves an offline update after an unsynced local update', async function () { const initial = await builders .metafile() .path('yafile') @@ -948,7 +923,7 @@ describe('Merge', function() { }) }) - it('does nothing for an locally untouched file after an unsynced remote update', async function() { + it('does nothing for an locally untouched file after an unsynced remote update', async function () { const synced = await builders .metafile() .data('previous content') @@ -959,10 +934,7 @@ describe('Merge', function() { .data('remote update') .changedSide('remote') .create() - const sameAsSynced = builders - .metafile(synced) - .unmerged('local') - .build() + const sameAsSynced = builders.metafile(synced).unmerged('local').build() const sideEffects = await mergeSideEffects(this, () => this.merge.addFileAsync('local', _.cloneDeep(sameAsSynced)) @@ -976,7 +948,7 @@ describe('Merge', function() { // XXX: This sides are increased on the remote update to make sure it will // get synced. - it('creates a conflict for an oflline local update after an unsynced remote update', async function() { + it('creates a conflict for an oflline local update after an unsynced remote update', async function () { const synced = await builders .metafile() .data('initial content') @@ -1022,7 +994,7 @@ describe('Merge', function() { describe('updateFile', () => { let file - beforeEach('create synced file', async function() { + beforeEach('create synced file', async function () { file = await builders .metafile() .path('FIZZBUZZ.JPG') @@ -1035,7 +1007,7 @@ describe('Merge', function() { .create() }) - it('creates the file if it does not exist', async function() { + it('creates the file if it does not exist', async function () { const doc = builders .metafile() .path('NEW-FILE') @@ -1062,7 +1034,7 @@ describe('Merge', function() { }) context('when content is the same', () => { - it('updates the PouchDB record without marking changes from a remote update', async function() { + it('updates the PouchDB record without marking changes from a remote update', async function () { const doc = builders .metafile(file) .tags('bar', 'baz') @@ -1092,7 +1064,7 @@ describe('Merge', function() { // XXX: Here we don't increase the sides as we don't want to propagate a // simple change of modification date. - it('updates the PouchDB record without marking changes from a local update', async function() { + it('updates the PouchDB record without marking changes from a local update', async function () { const doc = builders .metafile(file) .updatedAt(new Date()) @@ -1118,7 +1090,7 @@ describe('Merge', function() { }) }) - it('does nothing when the modification date is the same', async function() { + it('does nothing when the modification date is the same', async function () { const doc = builders .metafile(file) .md5sum('xxx') @@ -1137,16 +1109,13 @@ describe('Merge', function() { }) }) - it('sets the local metadata when it is missing', async function() { + it('sets the local metadata when it is missing', async function () { // Remove local attribute for the test delete file.local const { rev } = await this.pouch.db.put(file) file._rev = rev - const doc = builders - .metafile(file) - .unmerged('local') - .build() + const doc = builders.metafile(file).unmerged('local').build() const sideEffects = await mergeSideEffects(this, () => this.merge.updateFileAsync('local', _.cloneDeep(doc)) @@ -1165,7 +1134,7 @@ describe('Merge', function() { }) }) - it('keeps an existing local metadata for a remote update', async function() { + it('keeps an existing local metadata for a remote update', async function () { const doc = builders .metafile(file) .data('updated content') @@ -1192,7 +1161,7 @@ describe('Merge', function() { }) }) - it('keeps an existing remote metadata for a local update', async function() { + it('keeps an existing remote metadata for a local update', async function () { const doc = builders .metafile(file) .data('new content') @@ -1219,12 +1188,9 @@ describe('Merge', function() { }) }) - it('keeps the overwrite attribute if it exists', async function() { + it('keeps the overwrite attribute if it exists', async function () { // Overwrite file with a move - const src = await builders - .metafile() - .changedSide(this.side) - .create() + const src = await builders.metafile().changedSide(this.side).create() const dst = await builders .metafile() .moveFrom(src) @@ -1262,7 +1228,7 @@ describe('Merge', function() { }) }) - it('keeps the overwrite attribute if it exists', async function() { + it('keeps the overwrite attribute if it exists', async function () { const firstUpdateDate = new Date() const firstUpdate = await builders .metafile(file) @@ -1301,7 +1267,7 @@ describe('Merge', function() { }) }) - it('rejects an unresolvable conflict with an existing directory', async function() { + it('rejects an unresolvable conflict with an existing directory', async function () { // FIXME: Why don't we resolve the conflict like everywhere else? const existingLocalDir = await builders .metadir() @@ -1318,17 +1284,14 @@ describe('Merge', function() { ).be.rejectedWith(/conflict/) }) - it('resolves a conflict between a new remote update and a previous local version', async function() { + it('resolves a conflict between a new remote update and a previous local version', async function () { const initial = await builders .metafile() .sides({ local: 1 }) .ino(456) .data('initial content') .create() - const synced = await builders - .metafile(initial) - .upToDate() - .create() + const synced = await builders.metafile(initial).upToDate().create() const mergedLocalUpdate = await builders .metafile(synced) .changedSide('local') @@ -1363,7 +1326,7 @@ describe('Merge', function() { }) }) - it('does not overwrite an unsynced remote update with a locally unchanged file', async function() { + it('does not overwrite an unsynced remote update with a locally unchanged file', async function () { const synced = await builders .metafile() .data('initial content') @@ -1376,10 +1339,7 @@ describe('Merge', function() { .changedSide('remote') .noRecord() // XXX: Prevent Pouch conflict from reusing `synced`'s _id .create() - const unchangedLocal = builders - .metafile(synced) - .unmerged('local') - .build() + const unchangedLocal = builders.metafile(synced).unmerged('local').build() const sideEffects = await mergeSideEffects(this, () => this.merge.updateFileAsync('local', _.cloneDeep(unchangedLocal)) @@ -1391,7 +1351,7 @@ describe('Merge', function() { }) }) - it('does not overwrite an unsynced remote update with a locally updated file and creates a local conflict', async function() { + it('does not overwrite an unsynced remote update with a locally updated file and creates a local conflict', async function () { const synced = await builders .metafile() .data('initial content') @@ -1433,7 +1393,7 @@ describe('Merge', function() { }) context('when existing file is the same and up-to-date', () => { - it('updates the PouchDB record without marking changes', async function() { + it('updates the PouchDB record without marking changes', async function () { const initial = await builders .metafile() .data('initial content') @@ -1471,7 +1431,7 @@ describe('Merge', function() { }) context('when the file is a Cozy Note export', () => { - it('does not create a conflict', async function() { + it('does not create a conflict', async function () { const remoteNote = await builders .remoteNote() .name('my-note.cozy-note') @@ -1511,7 +1471,7 @@ describe('Merge', function() { }) describe('putFolder', () => { - it('saves the new folder', async function() { + it('saves the new folder', async function () { const doc = builders .metadir() .path('NEW-FOLDER') @@ -1536,7 +1496,7 @@ describe('Merge', function() { }) }) - it('saves a new version of an existing folder', async function() { + it('saves a new version of an existing folder', async function () { const old = await builders .metadir() .path('existing-folder') @@ -1568,10 +1528,10 @@ describe('Merge', function() { }) }) - context('when the path was used in the past', function() { + context('when the path was used in the past', function () { const path = 'folder-created-deleted-and-then-recreated' - beforeEach(async function() { + beforeEach(async function () { const was = await builders .metadir() .path(path) @@ -1580,12 +1540,8 @@ describe('Merge', function() { await this.pouch.remove(was) }) - it('saves the new folder with the correct side number', async function() { - const doc = builders - .metadir() - .path(path) - .unmerged(this.side) - .build() + it('saves the new folder with the correct side number', async function () { + const doc = builders.metadir().path(path).unmerged(this.side).build() const sideEffects = await mergeSideEffects(this, () => this.merge.putFolderAsync(this.side, _.cloneDeep(doc)) @@ -1605,16 +1561,13 @@ describe('Merge', function() { }) }) - it('does nothing when existing folder is up to date', async function() { + it('does nothing when existing folder is up to date', async function () { const old = await builders .metadir() .path('up-to-date-folder') .upToDate() .create() - const doc = builders - .metadir(old) - .unmerged(this.side) - .build() + const doc = builders.metadir(old).unmerged(this.side).build() const sideEffects = await mergeSideEffects(this, () => this.merge.putFolderAsync(this.side, _.cloneDeep(doc)) @@ -1633,11 +1586,8 @@ describe('Merge', function() { // issues). // Until we find a way to mark specific events as obsolete, our only // recourse is to discard these modification date changes. - it('does nothing when only the modification date has changed', async function() { - const mergedFolder = await builders - .metadir() - .upToDate() - .create() + it('does nothing when only the modification date has changed', async function () { + const mergedFolder = await builders.metadir().upToDate().create() const sameFolder = builders .metadir(mergedFolder) .updatedAt(new Date()) @@ -1654,7 +1604,7 @@ describe('Merge', function() { }) }) - it('resolves a conflict with an existing file', async function() { + it('resolves a conflict with an existing file', async function () { const existingLocalFile = await builders .metafile() .sides({ local: 1 }) @@ -1677,7 +1627,7 @@ describe('Merge', function() { }) }) - it('sets the local metadata when it is missing', async function() { + it('sets the local metadata when it is missing', async function () { const mergedFolder = await builders .metadir() .updatedAt(new Date(2020, 5, 19, 11, 9, 0)) @@ -1712,7 +1662,7 @@ describe('Merge', function() { }) }) - it('keeps existing local metadata when it is not present in the new doc', async function() { + it('keeps existing local metadata when it is not present in the new doc', async function () { const oldRemoteDir = await builders .remoteDir() .updatedAt(2020, 5, 19, 11, 9, 0) @@ -1757,7 +1707,7 @@ describe('Merge', function() { () => { let Alfred - beforeEach(async function() { + beforeEach(async function () { await builders .metadir() .path('alfred') @@ -1771,7 +1721,7 @@ describe('Merge', function() { }) onPlatforms(['win32', 'darwin'], () => { - it('resolves the conflict', async function() { + it('resolves the conflict', async function () { const sideEffects = await mergeSideEffects(this, () => this.merge.putFolderAsync(this.side, _.cloneDeep(Alfred)) ) @@ -1786,7 +1736,7 @@ describe('Merge', function() { }) onPlatform('linux', () => { - it('saves the doc as a new doc', async function() { + it('saves the doc as a new doc', async function () { const sideEffects = await mergeSideEffects(this, () => this.merge.putFolderAsync(this.side, _.cloneDeep(Alfred)) ) @@ -1808,17 +1758,13 @@ describe('Merge', function() { ) }) - describe('moveFileAsync', function() { - beforeEach('create parent folder', async function() { - await builders - .metadir() - .path('FOO') - .upToDate() - .create() + describe('moveFileAsync', function () { + beforeEach('create parent folder', async function () { + await builders.metadir().path('FOO').upToDate().create() }) context('local', () => { - it('saves the moved file', async function() { + it('saves the moved file', async function () { const was = await builders .metafile() .path('FOO/OLD') @@ -1861,7 +1807,7 @@ describe('Merge', function() { }) context('remote', () => { - it('saves the moved file', async function() { + it('saves the moved file', async function () { const oldRemoteFile = await builders .remoteFile() .inRootDir() @@ -1913,7 +1859,7 @@ describe('Merge', function() { }) }) - it('adds missing fields', async function() { + it('adds missing fields', async function () { const was = await builders .metafile() .path('FOO/OLD-MISSING-FIELDS.JPG') @@ -1954,7 +1900,7 @@ describe('Merge', function() { context('when the destination exists', () => { let existing - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metafile() .path('DST_FILE') @@ -1963,7 +1909,7 @@ describe('Merge', function() { .create() }) - it('erases the existing destination record and saves the moved file', async function() { + it('erases the existing destination record and saves the moved file', async function () { const was = await builders .metafile() .path('SRC_FILE') @@ -2005,7 +1951,7 @@ describe('Merge', function() { }) }) - it('keeps the overwrite attribute if it exists', async function() { + it('keeps the overwrite attribute if it exists', async function () { const overwritten = await builders .metafile(existing) .overwrite(existing) @@ -2056,7 +2002,7 @@ describe('Merge', function() { }) context('and we have unapplied modifications on the other side', () => { - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metafile(existing) .data('new content') @@ -2064,7 +2010,7 @@ describe('Merge', function() { .create() }) - it('resolves a conflict', async function() { + it('resolves a conflict', async function () { const was = await builders .metafile() .path('SRC_FILE') @@ -2113,7 +2059,7 @@ describe('Merge', function() { context('when the destination has existed', () => { const path = 'DST_FILE' - beforeEach(async function() { + beforeEach(async function () { const previous = await builders .metafile() .path(path) @@ -2122,7 +2068,7 @@ describe('Merge', function() { await this.pouch.remove(previous) }) - it('saves the moved file with the correct side', async function() { + it('saves the moved file with the correct side', async function () { const was = await builders .metafile() .path('SRC_FILE') @@ -2159,7 +2105,7 @@ describe('Merge', function() { }) }) - it('replaces a local move with an addition for a local-only file', async function() { + it('replaces a local move with an addition for a local-only file', async function () { const was = await builders .metafile() .path('FOO/OLD') @@ -2190,7 +2136,7 @@ describe('Merge', function() { }) }) - it('replaces a remote move with an addition for a remote-only file', async function() { + it('replaces a remote move with an addition for a remote-only file', async function () { const oldRemoteFile = builders .remoteFile() .inRootDir() @@ -2229,12 +2175,8 @@ describe('Merge', function() { }) }) - it('does not identify the child file move following another unsynced move as an addition', async function() { - const src = await builders - .metadir() - .path('SRC') - .upToDate() - .create() + it('does not identify the child file move following another unsynced move as an addition', async function () { + const src = await builders.metadir().path('SRC').upToDate().create() const file = await builders .metafile() .path('SRC/FILE') @@ -2252,11 +2194,7 @@ describe('Merge', function() { ) const was = await this.pouch.bySyncedPath(file2.path) - const dst = builders - .metadir(src) - .path('DST') - .unmerged('local') - .build() + const dst = builders.metadir(src).path('DST').unmerged('local').build() const sideEffects = await mergeSideEffects(this, () => this.merge.moveFolderAsync('local', _.cloneDeep(dst), _.cloneDeep(src)) @@ -2296,22 +2234,10 @@ describe('Merge', function() { }) }) - it('does not identify the local move of a file following an unsynced child move as an addition', async function() { - const src = await builders - .metadir() - .path('SRC') - .upToDate() - .create() - await builders - .metafile() - .path('SRC/FILE') - .upToDate() - .create() - const dst = builders - .metadir(src) - .path('DST') - .unmerged('local') - .build() + it('does not identify the local move of a file following an unsynced child move as an addition', async function () { + const src = await builders.metadir().path('SRC').upToDate().create() + await builders.metafile().path('SRC/FILE').upToDate().create() + const dst = builders.metadir(src).path('DST').unmerged('local').build() await this.merge.moveFolderAsync( 'local', _.cloneDeep(dst), @@ -2346,7 +2272,7 @@ describe('Merge', function() { }) onPlatforms(['win32', 'darwin'], () => { - it('does not identify an identical renaming as a conflict', async function() { + it('does not identify an identical renaming as a conflict', async function () { const banana = await builders .metafile() .path('banana') @@ -2382,17 +2308,9 @@ describe('Merge', function() { }) }) - it('resolves an identity conflict with an existing file', async function() { - await builders - .metafile() - .path('QUX') - .upToDate() - .create() - const was = await builders - .metafile() - .path('baz') - .upToDate() - .create() + it('resolves an identity conflict with an existing file', async function () { + await builders.metafile().path('QUX').upToDate().create() + const was = await builders.metafile().path('baz').upToDate().create() const doc = builders .metafile(was) .path('qux') @@ -2417,7 +2335,7 @@ describe('Merge', function() { }) onPlatform('linux', () => { - it('does not identify an identical renaming as a conflict', async function() { + it('does not identify an identical renaming as a conflict', async function () { const banana = await builders .metafile() .path('banana') @@ -2453,17 +2371,9 @@ describe('Merge', function() { }) }) - it('does not have identity conflicts', async function() { - const was = await builders - .metafile() - .path('baz') - .upToDate() - .create() - await builders - .metafile() - .path('QUX') - .upToDate() - .create() + it('does not have identity conflicts', async function () { + const was = await builders.metafile().path('baz').upToDate().create() + await builders.metafile().path('QUX').upToDate().create() const doc = builders .metafile(was) .path('qux') @@ -2496,9 +2406,9 @@ describe('Merge', function() { }) }) - describe('moveFolderAsync', function() { + describe('moveFolderAsync', function () { context('local', () => { - it('saves the new folder and deletes the old one with hints for writers', async function() { + it('saves the new folder and deletes the old one with hints for writers', async function () { const was = await builders .metadir() .path('OLD') @@ -2506,11 +2416,7 @@ describe('Merge', function() { .tags('courge', 'quux') .upToDate() .create() - const doc = builders - .metadir(was) - .path('NEW') - .unmerged('local') - .build() + const doc = builders.metadir(was).path('NEW').unmerged('local').build() const sideEffects = await mergeSideEffects(this, () => this.merge.moveFolderAsync( @@ -2537,7 +2443,7 @@ describe('Merge', function() { }) context('when the folder has children marked for deletion', () => { - it('does not move them', async function() { + it('does not move them', async function () { const was = await builders .metadir() .path('OLD') @@ -2584,7 +2490,7 @@ describe('Merge', function() { context('when the folder does not exist remotely', () => { let was, child - beforeEach(async function() { + beforeEach(async function () { was = await builders .metadir() .path('OLD') @@ -2599,7 +2505,7 @@ describe('Merge', function() { .create() }) - it('saves a local folder addition', async function() { + it('saves a local folder addition', async function () { const doc = builders .metadir(was) .path('NEW') @@ -2641,7 +2547,7 @@ describe('Merge', function() { context('and the destination exists', () => { let existing context('and it is up-to-date', () => { - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metadir() .path('NEW') @@ -2649,7 +2555,7 @@ describe('Merge', function() { .create() }) - it('overwrites the destination', async function() { + it('overwrites the destination', async function () { const doc = builders .metadir(was) .path(existing.path) @@ -2699,7 +2605,7 @@ describe('Merge', function() { context( 'and it is not at least up-to-date on the movement side', () => { - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metadir() .path('NEW') @@ -2707,7 +2613,7 @@ describe('Merge', function() { .create() }) - it('resolves a conflict', async function() { + it('resolves a conflict', async function () { const doc = builders .metadir(was) .path(existing.path) @@ -2761,7 +2667,7 @@ describe('Merge', function() { }) context('remote', () => { - it('saves the moved folder', async function() { + it('saves the moved folder', async function () { const oldRemoteDir = builders .remoteDir() .inRootDir() @@ -2812,12 +2718,8 @@ describe('Merge', function() { context('when the folder does not exist locally', () => { let oldRemoteDir, was, child - beforeEach(async function() { - oldRemoteDir = builders - .remoteDir() - .inRootDir() - .name('OLD') - .build() + beforeEach(async function () { + oldRemoteDir = builders.remoteDir().inRootDir().name('OLD').build() was = await builders .metadir() .fromRemote(oldRemoteDir) @@ -2835,7 +2737,7 @@ describe('Merge', function() { .create() }) - it('saves a remote folder addition', async function() { + it('saves a remote folder addition', async function () { const newRemoteDir = builders .remoteDir(oldRemoteDir) .name('NEW') @@ -2883,7 +2785,7 @@ describe('Merge', function() { context('and the destination exists', () => { let existing context('and it is up-to-date', () => { - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metadir() .path('NEW') @@ -2891,7 +2793,7 @@ describe('Merge', function() { .create() }) - it('overwrites the destination', async function() { + it('overwrites the destination', async function () { const newRemoteDir = builders .remoteDir(oldRemoteDir) .name('NEW') @@ -2948,7 +2850,7 @@ describe('Merge', function() { context( 'and it is not at least up-to-date on the movement side', () => { - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metadir() .path('NEW') @@ -2956,7 +2858,7 @@ describe('Merge', function() { .create() }) - it('resolves a conflict', async function() { + it('resolves a conflict', async function () { const newRemoteDir = builders .remoteDir(oldRemoteDir) .name('NEW') @@ -3021,7 +2923,7 @@ describe('Merge', function() { let existing context('and it is up-to-date', () => { - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metadir() .path('DST_DIR') @@ -3029,7 +2931,7 @@ describe('Merge', function() { .create() }) - it('overwrites the destination', async function() { + it('overwrites the destination', async function () { const was = await builders .metadir() .path('SRC_DIR') @@ -3073,7 +2975,7 @@ describe('Merge', function() { }) context('and it is not at least up-to-date on the movement side', () => { - beforeEach(async function() { + beforeEach(async function () { existing = await builders .metadir() .path('DST_DIR') @@ -3081,7 +2983,7 @@ describe('Merge', function() { .create() }) - it('resolves a conflict', async function() { + it('resolves a conflict', async function () { const was = await builders .metadir() .path('SRC_DIR') @@ -3128,26 +3030,14 @@ describe('Merge', function() { context('when the destination has existed', () => { const path = 'DST_DIR' - beforeEach(async function() { - const previous = await builders - .metadir() - .path(path) - .upToDate() - .create() + beforeEach(async function () { + const previous = await builders.metadir().path(path).upToDate().create() await this.pouch.remove(previous) }) - it('saves the new directory with the correct side', async function() { - const was = await builders - .metadir() - .path('SRC_DIR') - .upToDate() - .create() - const doc = builders - .metadir(was) - .path(path) - .unmerged(this.side) - .build() + it('saves the new directory with the correct side', async function () { + const was = await builders.metadir().path('SRC_DIR').upToDate().create() + const doc = builders.metadir(was).path(path).unmerged(this.side).build() const sideEffects = await mergeSideEffects(this, () => this.merge.moveFolderAsync( @@ -3174,17 +3064,13 @@ describe('Merge', function() { }) }) - it('does not create conflict for local-only existing folder.', async function() { + it('does not create conflict for local-only existing folder.', async function () { const existing = await builders .metadir() .path('DST_DIR') .sides({ [this.side]: 1 }) .create() - const was = await builders - .metadir() - .path('SRC_DIR') - .upToDate() - .create() + const was = await builders.metadir().path('SRC_DIR').upToDate().create() const doc = builders .metadir(was) .path(existing.path) @@ -3221,12 +3107,8 @@ describe('Merge', function() { }) onPlatforms(['win32', 'darwin'], () => { - it('does not identify an identical renaming as a conflict', async function() { - const apple = await builders - .metadir() - .path('apple') - .upToDate() - .create() + it('does not identify an identical renaming as a conflict', async function () { + const apple = await builders.metadir().path('apple').upToDate().create() const APPLE = builders .metadir(apple) .path('APPLE') @@ -3257,12 +3139,8 @@ describe('Merge', function() { }) }) - it('resolves an identity conflict when moving a synced folder to an existing path', async function() { - await builders - .metadir() - .path('LINUX') - .upToDate() - .create() + it('resolves an identity conflict when moving a synced folder to an existing path', async function () { + await builders.metadir().path('LINUX').upToDate().create() const torvalds = await builders .metadir() .path('torvalds') @@ -3290,12 +3168,8 @@ describe('Merge', function() { }) onPlatform('linux', () => { - it('does not identify an identical renaming as a conflict', async function() { - const apple = await builders - .metadir() - .path('apple') - .upToDate() - .create() + it('does not identify an identical renaming as a conflict', async function () { + const apple = await builders.metadir().path('apple').upToDate().create() const APPLE = builders .metadir(apple) .path('APPLE') @@ -3326,17 +3200,9 @@ describe('Merge', function() { }) }) - it('does not have identity conflicts', async function() { - await builders - .metadir() - .path('NUKEM') - .upToDate() - .create() - const duke = await builders - .metadir() - .path('duke') - .upToDate() - .create() + it('does not have identity conflicts', async function () { + await builders.metadir().path('NUKEM').upToDate().create() + const duke = await builders.metadir().path('duke').upToDate().create() const nukem = builders .metadir(duke) .path('nukem') @@ -3368,22 +3234,14 @@ describe('Merge', function() { }) }) - it('handles overwritten descendants', async function() { - const srcDir = await builders - .metadir() - .path('src') - .upToDate() - .create() + it('handles overwritten descendants', async function () { + const srcDir = await builders.metadir().path('src').upToDate().create() const srcFile = await builders .metafile() .path('src/file') .upToDate() .create() - const oldDst = await builders - .metadir() - .path('dst') - .upToDate() - .create() + const oldDst = await builders.metadir().path('dst').upToDate().create() const oldDstFile = await builders .metafile() .path('dst/file') @@ -3446,13 +3304,9 @@ describe('Merge', function() { }) }) - describe('moveFolderRecursively', function() { - it('moves the folder and files/folders inside it', async function() { - const was = await builders - .metadir() - .path('my-folder') - .upToDate() - .create() + describe('moveFolderRecursively', function () { + it('moves the folder and files/folders inside it', async function () { + const was = await builders.metadir().path('my-folder').upToDate().create() const subdir = await builders .metadir() .path('my-folder/folder-9') @@ -3528,7 +3382,7 @@ describe('Merge', function() { }) context('local with an unsynced remote file', () => { - it('adds the remote file to the destination folder', async function() { + it('adds the remote file to the destination folder', async function () { const was = await builders .metadir() .path('ADDED_DIR') @@ -3585,7 +3439,7 @@ describe('Merge', function() { }) context('remote with an unsynced local file', () => { - it('adds the local file to the destination folder', async function() { + it('adds the local file to the destination folder', async function () { const oldRemoteDir = builders .remoteDir() .inRootDir() @@ -3648,26 +3502,14 @@ describe('Merge', function() { context('when the destination has existed', () => { const path = 'DST_DIR' - beforeEach(async function() { - const previous = await builders - .metadir() - .path(path) - .upToDate() - .create() + beforeEach(async function () { + const previous = await builders.metadir().path(path).upToDate().create() await this.pouch.remove(previous) }) - it('saves the new directory with the correct side', async function() { - const was = await builders - .metadir() - .path('SRC_DIR') - .upToDate() - .create() - const doc = builders - .metadir(was) - .path(path) - .unmerged(this.side) - .build() + it('saves the new directory with the correct side', async function () { + const was = await builders.metadir().path('SRC_DIR').upToDate().create() + const doc = builders.metadir(was).path(path).unmerged(this.side).build() const sideEffects = await mergeSideEffects(this, () => this.merge.moveFolderRecursivelyAsync( @@ -3698,7 +3540,7 @@ describe('Merge', function() { const parentPath = 'DST_DIR' const childName = 'CHILD' - beforeEach(async function() { + beforeEach(async function () { const previous = await builders .metadata() .path(`${parentPath}/${childName}`) @@ -3707,12 +3549,8 @@ describe('Merge', function() { await this.pouch.remove(previous) }) - it('saves the new child with the correct side', async function() { - const was = await builders - .metadir() - .path('SRC_DIR') - .upToDate() - .create() + it('saves the new child with the correct side', async function () { + const was = await builders.metadir().path('SRC_DIR').upToDate().create() const child = await builders .metadata() .path(`SRC_DIR/${childName}`) @@ -3771,7 +3609,7 @@ describe('Merge', function() { context( 'when the parent normalization differs in its children paths', () => { - it('correctly replaces the NFD parent part in the children paths', async function() { + it('correctly replaces the NFD parent part in the children paths', async function () { const nfdParentPath = 'Énoncés'.normalize('NFD') const nfcParentPath = nfdParentPath.normalize('NFC') const was = await builders @@ -3851,7 +3689,7 @@ describe('Merge', function() { }) }) - it('correctly replaces the NFC parent part in the children paths', async function() { + it('correctly replaces the NFC parent part in the children paths', async function () { const nfdParentPath = 'Énoncés'.normalize('NFD') const nfcParentPath = nfdParentPath.normalize('NFC') const was = await builders @@ -3937,7 +3775,7 @@ describe('Merge', function() { describe('deleteFileAsync', () => { context('when a record is found in Pouch', () => { - it('deletes a file', async function() { + it('deletes a file', async function () { const doc = await builders .metafile() .path('FILE') @@ -3963,7 +3801,7 @@ describe('Merge', function() { }) }) - it('removes move hints', async function() { + it('removes move hints', async function () { const old = await builders .metafile() .path('FILE') @@ -3997,17 +3835,14 @@ describe('Merge', function() { }) context('when a record marked for deletion is found in Pouch', () => { - it('keeps the deletion marker and updates sides info', async function() { + it('keeps the deletion marker and updates sides info', async function () { const was = await builders .metafile() .path('FILE') .trashed() .changedSide(otherSide(this.side)) .create() - const doc = builders - .metafile(was) - .unmerged(this.side) - .build() + const doc = builders.metafile(was).unmerged(this.side).build() const sideEffects = await mergeSideEffects(this, () => this.merge.deleteFileAsync(this.side, _.cloneDeep(doc)) @@ -4032,18 +3867,18 @@ describe('Merge', function() { }) }) - describe('deleteFolderAsync', function() { - before(function() { + describe('deleteFolderAsync', function () { + before(function () { // XXX: deleteFolderAsync is only used for remote deletions this.side = 'remote' }) - after(function() { + after(function () { // XXX: 'local' is the current side value but it could change this.side = 'local' }) context('when a record is found in Pouch', () => { - it('marks the folder for deletion on the local filesystem', async function() { + it('marks the folder for deletion on the local filesystem', async function () { const doc = await builders .metadir() .path('FOLDER') @@ -4069,7 +3904,7 @@ describe('Merge', function() { }) context('and it has children', () => { - it('marks children for deletion on the local filesystem', async function() { + it('marks children for deletion on the local filesystem', async function () { const doc = await builders .metadir() .path('FOLDER') @@ -4134,7 +3969,7 @@ describe('Merge', function() { context( 'and child was moved into the folder on the local filesystem', () => { - it('marks it for deletion on the remote Cozy', async function() { + it('marks it for deletion on the remote Cozy', async function () { const doc = await builders .metadir() .path('folder') @@ -4187,7 +4022,7 @@ describe('Merge', function() { }) context('and it was moved on the local filesystem', () => { - it('removes move hints', async function() { + it('removes move hints', async function () { const old = await builders .metadir() .path('FOLDER') @@ -4221,7 +4056,7 @@ describe('Merge', function() { }) context('with children', () => { - it('marks the children for deletion on the local filesystem', async function() { + it('marks the children for deletion on the local filesystem', async function () { const dir = await builders .metadir() .path('folder') @@ -4299,7 +4134,7 @@ describe('Merge', function() { }) context('overwriting another document', () => { - it('marks the overwritten document for deletion on the remote Cozy', async function() { + it('marks the overwritten document for deletion on the remote Cozy', async function () { const overwritten = await builders .metafile() .path('MOVED') @@ -4353,7 +4188,7 @@ describe('Merge', function() { }) context('and it was moved on the remote Cozy', () => { - it('marks the previous location for deletion on the local filesystem', async function() { + it('marks the previous location for deletion on the local filesystem', async function () { const old = await builders .metadir() .path('FOLDER') @@ -4390,7 +4225,7 @@ describe('Merge', function() { }) context('when a record marked for deletion is found in Pouch', () => { - it('keeps the deletion marker and updates sides info', async function() { + it('keeps the deletion marker and updates sides info', async function () { const was = await builders .metadir() .path('FOLDER') @@ -4424,11 +4259,8 @@ describe('Merge', function() { describe('trashFileAsync', () => { context('when record is found in Pouch', () => { - it('marks it for deletion and updates sides info', async function() { - const was = await builders - .metafile() - .upToDate() - .create() + it('marks it for deletion and updates sides info', async function () { + const was = await builders.metafile().upToDate().create() const doc = builders.metafile(was).build() const sideEffects = await mergeSideEffects(this, () => @@ -4456,7 +4288,7 @@ describe('Merge', function() { context('when a record marked for deletion is found in Pouch', () => { context('and the record was modified on the other side', () => { - it('completely erases the document from PouchDB', async function() { + it('completely erases the document from PouchDB', async function () { const was = await builders .metafile() .trashed() @@ -4486,7 +4318,7 @@ describe('Merge', function() { }) context('and the record was modified on the same side', () => { - it('does nothing', async function() { + it('does nothing', async function () { const was = await builders .metafile() .trashed() @@ -4511,11 +4343,8 @@ describe('Merge', function() { }) context('when no records are found in Pouch', () => { - it('does nothing', async function() { - const was = await builders - .metafile() - .upToDate() - .create() + it('does nothing', async function () { + const was = await builders.metafile().upToDate().create() const doc = builders.metafile(was).build() // Erase record from PouchDB @@ -4537,15 +4366,9 @@ describe('Merge', function() { }) context('when docType of found record does not match', () => { - it('does nothing', async function() { - const was = await builders - .metafile() - .upToDate() - .create() - const doc = builders - .metadir() - .path(was.path) - .build() + it('does nothing', async function () { + const was = await builders.metafile().upToDate().create() + const doc = builders.metadir().path(was.path).build() const sideEffects = await mergeSideEffects(this, () => this.merge.trashFileAsync( @@ -4563,7 +4386,7 @@ describe('Merge', function() { }) context('when found record was not synced', () => { - it('marks it for deletion and upadtes sides info', async function() { + it('marks it for deletion and upadtes sides info', async function () { const was = await builders .metafile() .sides({ [this.side]: 1 }) @@ -4596,16 +4419,12 @@ describe('Merge', function() { context('when found record was moved on the same side', () => { let initial, src - beforeEach(async function() { - initial = await builders - .metafile() - .path('initial') - .upToDate() - .create() + beforeEach(async function () { + initial = await builders.metafile().path('initial').upToDate().create() src = await builders.metafile(initial).create() }) - it('marks the moved document for deletion', async function() { + it('marks the moved document for deletion', async function () { const was = await builders .metafile() .path('moved') @@ -4638,15 +4457,11 @@ describe('Merge', function() { context('and the move was overwriting an existing doc', () => { let existing - beforeEach(async function() { - existing = await builders - .metafile() - .path('moved') - .upToDate() - .create() + beforeEach(async function () { + existing = await builders.metafile().path('moved').upToDate().create() }) - it('marks the moved document for deletion', async function() { + it('marks the moved document for deletion', async function () { const was = await builders .metafile() .path('moved') @@ -4688,7 +4503,7 @@ describe('Merge', function() { }) context('when found record was modified on the same side', () => { - it('marks it for deletion and updates sides info', async function() { + it('marks it for deletion and updates sides info', async function () { const initial = await builders .metafile() .data('initial') @@ -4726,7 +4541,7 @@ describe('Merge', function() { }) context('when found record was modified on the other side', () => { - it('dissociates the record from the trashed side which is not saved', async function() { + it('dissociates the record from the trashed side which is not saved', async function () { const initial = await builders .metafile() .data('initial') @@ -4763,7 +4578,7 @@ describe('Merge', function() { context('when trashed on local side', () => { context('and found record was moved on the remote side', () => { - it('dissociates the record from the local side so it can be downloaded again', async function() { + it('dissociates the record from the local side so it can be downloaded again', async function () { const initial = await builders .metafile() .path('initial') @@ -4807,7 +4622,7 @@ describe('Merge', function() { // its `trashed` attribute. // We need to find a solution for this (e.g. restore the file before // moving it to its destination). - it('updates the record remote revs so it can be restored', async function() { + it('updates the record remote revs so it can be restored', async function () { const initialRemote = await builders .remoteFile() .name('initial') @@ -4827,10 +4642,7 @@ describe('Merge', function() { .remoteFile(initialRemote) .trashed() .build() - const doc = builders - .metafile() - .fromRemote(trashedRemote) - .build() + const doc = builders.metafile().fromRemote(trashedRemote).build() const sideEffects = await mergeSideEffects(this, () => this.merge.trashFileAsync( @@ -4859,11 +4671,8 @@ describe('Merge', function() { describe('trashFolderAsync', () => { context('when record is found in Pouch', () => { - it('marks it for deletion and updates sides info', async function() { - const was = await builders - .metadir() - .upToDate() - .create() + it('marks it for deletion and updates sides info', async function () { + const was = await builders.metadir().upToDate().create() const doc = builders.metadir(was).build() const sideEffects = await mergeSideEffects(this, () => @@ -4891,7 +4700,7 @@ describe('Merge', function() { context('when a record marked for deletion is found in Pouch', () => { context('and the record was modified on the other side', () => { - it('completely erases the record from PouchDB', async function() { + it('completely erases the record from PouchDB', async function () { const was = await builders .metadir() .trashed() @@ -4921,7 +4730,7 @@ describe('Merge', function() { }) context('and the record was modified on the same side', () => { - it('does nothing', async function() { + it('does nothing', async function () { const was = await builders .metadir() .trashed() @@ -4946,11 +4755,8 @@ describe('Merge', function() { }) context('when no records are found in Pouch', () => { - it('does nothing', async function() { - const was = await builders - .metadir() - .upToDate() - .create() + it('does nothing', async function () { + const was = await builders.metadir().upToDate().create() const doc = builders.metadir(was).build() // Erase record from PouchDB @@ -4972,15 +4778,9 @@ describe('Merge', function() { }) context('when docType of found record does not match', () => { - it('does nothing', async function() { - const was = await builders - .metadir() - .upToDate() - .create() - const doc = builders - .metafile() - .path(was.path) - .build() + it('does nothing', async function () { + const was = await builders.metadir().upToDate().create() + const doc = builders.metafile().path(was.path).build() const sideEffects = await mergeSideEffects(this, () => this.merge.trashFolderAsync( @@ -4998,7 +4798,7 @@ describe('Merge', function() { }) context('when found record was not synced', () => { - it('marks it for deletion and upadtes sides info', async function() { + it('marks it for deletion and upadtes sides info', async function () { const was = await builders .metadir() .sides({ [this.side]: 1 }) diff --git a/test/unit/metadata.js b/test/unit/metadata.js index ffa4c5e67..7f8a00be5 100644 --- a/test/unit/metadata.js +++ b/test/unit/metadata.js @@ -44,12 +44,12 @@ import type { RemoteBase } from '../../core/remote/document' const { platform } = process -describe('metadata', function() { +describe('metadata', function () { let builders before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach(function() { + beforeEach(function () { builders = new Builders({ pouch: this.pouch }) }) afterEach('clean pouch', pouchHelpers.cleanDatabase) @@ -140,8 +140,8 @@ describe('metadata', function() { }) }) - describe('invalidPath', function() { - should.Assertion.add('invalidPath', function() { + describe('invalidPath', function () { + should.Assertion.add('invalidPath', function () { this.params = { operator: 'to make metadata.invalidPath() return', expected: true @@ -149,7 +149,7 @@ describe('metadata', function() { should(invalidPath(this.obj)).be.exactly(true) }) - it('returns true if the path is incorrect', function() { + it('returns true if the path is incorrect', function () { should({ path: path.sep }).have.invalidPath() should({ path: '/' }).have.invalidPath() should({ path: '' }).have.invalidPath() @@ -160,138 +160,78 @@ describe('metadata', function() { should({ path: 'f/../oo/../../bar/./baz' }).have.invalidPath() }) - it('returns false if everything is OK', function() { + it('returns false if everything is OK', function () { should({ path: 'foo' }).not.have.invalidPath() should({ path: 'foo/bar' }).not.have.invalidPath() should({ path: 'foo/bar/baz.jpg' }).not.have.invalidPath() }) - it('returns false for paths with a leading slash', function() { + it('returns false for paths with a leading slash', function () { should({ path: '/foo/bar' }).not.have.invalidPath() should({ path: '/foo/bar/baz.bmp' }).not.have.invalidPath() }) }) - describe('invalidChecksum', function() { - it('returns true if the checksum is missing for a file', function() { + describe('invalidChecksum', function () { + it('returns true if the checksum is missing for a file', function () { const missingMd5sum = builders.metafile().build() delete missingMd5sum.md5sum should(invalidChecksum(missingMd5sum)).be.true() should( - invalidChecksum( - builders - .metafile() - .md5sum(null) - .build() - ) + invalidChecksum(builders.metafile().md5sum(null).build()) ).be.true() should( - invalidChecksum( - builders - .metafile() - .md5sum(undefined) - .build() - ) + invalidChecksum(builders.metafile().md5sum(undefined).build()) ).be.true() }) - it('returns false if the checksum is missing for a folder', function() { + it('returns false if the checksum is missing for a folder', function () { should(invalidChecksum(builders.metadir().build())).be.false() }) - it('returns true if the checksum is incorrect', function() { - should( - invalidChecksum( - builders - .metafile() - .md5sum('') - .build() - ) - ).be.true() + it('returns true if the checksum is incorrect', function () { + should(invalidChecksum(builders.metafile().md5sum('').build())).be.true() should( - invalidChecksum( - builders - .metafile() - .md5sum('f00') - .build() - ) + invalidChecksum(builders.metafile().md5sum('f00').build()) ).be.true() const sha1 = '68b329da9893e34099c7d8ad5cb9c94068b329da' should( - invalidChecksum( - builders - .metafile() - .md5sum(sha1) - .build() - ) + invalidChecksum(builders.metafile().md5sum(sha1).build()) ).be.true() const md5hex = 'adc83b19e793491b1c6ea0fd8b46cd9f' should( - invalidChecksum( - builders - .metafile() - .md5sum(md5hex) - .build() - ) + invalidChecksum(builders.metafile().md5sum(md5hex).build()) ).be.true() const md5base64truncated = 'rcg7GeeTSRscbqD9i0bNn' should( - invalidChecksum( - builders - .metafile() - .md5sum(md5base64truncated) - .build() - ) + invalidChecksum(builders.metafile().md5sum(md5base64truncated).build()) ).be.true() const sha1base64 = 'aLMp2piT40CZx9itXLnJQGizKdo=' should( - invalidChecksum( - builders - .metafile() - .md5sum(sha1base64) - .build() - ) + invalidChecksum(builders.metafile().md5sum(sha1base64).build()) ).be.true() const md5base64NonPadded = 'rcg7GeeTSRscbqD9i0bNnw' should( - invalidChecksum( - builders - .metafile() - .md5sum(md5base64NonPadded) - .build() - ) + invalidChecksum(builders.metafile().md5sum(md5base64NonPadded).build()) ).be.true() }) - it('returns false if the checksum is OK', function() { - should( - invalidChecksum( - builders - .metafile() - .data('') - .build() - ) - ).be.false() + it('returns false if the checksum is OK', function () { + should(invalidChecksum(builders.metafile().data('').build())).be.false() }) }) describe('detectIncompatibilities', () => { const syncPath = ';' - it('is null when all names in the path are compatible', function() { - const doc = builders - .metafile() - .path('foo/bar') - .build() + it('is null when all names in the path are compatible', function () { + const doc = builders.metafile().path('foo/bar').build() should(detectIncompatibilities(doc, syncPath)).deepEqual([]) }) onPlatform('win32', () => { - it('lists platform incompatibilities for all names in the path', function() { - const doc = builders - .metafile() - .path('f?o:o\\ba|r\\baz\\q"ux') - .build() + it('lists platform incompatibilities for all names in the path', function () { + const doc = builders.metafile().path('f?o:o\\ba|r\\baz\\q"ux').build() should(detectIncompatibilities(doc, syncPath)).deepEqual([ { type: 'reservedChars', @@ -323,29 +263,26 @@ describe('metadata', function() { onPlatforms(['darwin', 'linux'], () => { it('does not list Windows incompatibilities', () => { - const doc = builders - .metadir() - .path('foo/b:ar/qux') - .build() + const doc = builders.metadir().path('foo/b:ar/qux').build() should(detectIncompatibilities(doc, syncPath)).deepEqual([]) }) }) }) - describe('extractRevNumber', function() { - it('extracts the revision number', function() { + describe('extractRevNumber', function () { + it('extracts the revision number', function () { const infos = { _rev: '42-0123456789' } should(extractRevNumber(infos)).equal(42) }) - it('returns 0 if not found', function() { + it('returns 0 if not found', function () { // $FlowFixMe the _rev attribute is missing on purpose should(extractRevNumber({})).equal(0) }) }) describe('isUpToDate', () => { - it('is false when the given side is undefined in doc', function() { + it('is false when the given side is undefined in doc', function () { const doc = builders .metafile() .rev('1-0123456') @@ -354,7 +291,7 @@ describe('metadata', function() { should(metadata.isUpToDate('local', doc)).be.false() }) - it('is true when the given side equals the target in doc', function() { + it('is true when the given side equals the target in doc', function () { const doc = builders .metafile() .rev('2-0123456') @@ -363,7 +300,7 @@ describe('metadata', function() { should(metadata.isUpToDate('local', doc)).be.true() }) - it('is false when the given side is lower than the target in doc', function() { + it('is false when the given side is lower than the target in doc', function () { const doc = builders .metafile() .rev('3-0123456') @@ -372,7 +309,7 @@ describe('metadata', function() { should(metadata.isUpToDate('local', doc)).be.false() }) - it('is true when the given side is the only one', function() { + it('is true when the given side is the only one', function () { const doc = builders .metafile() .rev('3-0123456') @@ -383,18 +320,15 @@ describe('metadata', function() { // XXX: We implemented the same workaround as in `isAtLeastUpToDate()` // although we haven't encountered the same issue yet but it is possible. - it('is true when the given side is the only one and lower than the target', function() { - const doc = builders - .metafile() - .rev('3-0123456') - .build() + it('is true when the given side is the only one and lower than the target', function () { + const doc = builders.metafile().rev('3-0123456').build() doc.sides = { local: 2, target: 35 } should(metadata.isUpToDate('local', doc)).be.true() }) }) describe('isAtLeastUpToDate', () => { - it('is false when the given side is undefined in doc', function() { + it('is false when the given side is undefined in doc', function () { const doc = builders .metafile() .rev('1-0123456') @@ -403,7 +337,7 @@ describe('metadata', function() { should(metadata.isAtLeastUpToDate('local', doc)).be.false() }) - it('is true when the given side equals the target in doc', function() { + it('is true when the given side equals the target in doc', function () { const doc = builders .metafile() .rev('2-0123456') @@ -412,7 +346,7 @@ describe('metadata', function() { should(metadata.isAtLeastUpToDate('local', doc)).be.true() }) - it('is true when the given side is greater than the target in doc', function() { + it('is true when the given side is greater than the target in doc', function () { const doc = builders .metafile() .rev('3-0123456') @@ -421,7 +355,7 @@ describe('metadata', function() { should(metadata.isAtLeastUpToDate('local', doc)).be.true() }) - it('is false when the given side is lower than the target in doc', function() { + it('is false when the given side is lower than the target in doc', function () { const doc = builders .metafile() .rev('3-0123456') @@ -430,7 +364,7 @@ describe('metadata', function() { should(metadata.isAtLeastUpToDate('local', doc)).be.false() }) - it('is true when the given side is the only one', function() { + it('is true when the given side is the only one', function () { const doc = builders .metafile() .rev('3-0123456') @@ -442,23 +376,17 @@ describe('metadata', function() { // XXX: It is yet unknown how we end up in this situation but it seems like // it can happen when we have sync errors and maybe some side dissociation. // Until we figure out the root cause, we try to prevent its consequences. - it('is true when the given side is the only one and lower than the target', function() { - const doc = builders - .metafile() - .rev('3-0123456') - .build() + it('is true when the given side is the only one and lower than the target', function () { + const doc = builders.metafile().rev('3-0123456').build() doc.sides = { local: 2, target: 35 } should(metadata.isAtLeastUpToDate('local', doc)).be.true() }) }) describe('assignMaxDate', () => { - it('assigns the previous timestamp to the doc when it is more recent than the current one to prevent updated_at < created_at errors on remote sync', function() { + it('assigns the previous timestamp to the doc when it is more recent than the current one to prevent updated_at < created_at errors on remote sync', function () { const was = builders.metafile().build() - const doc = builders - .metafile() - .olderThan(was) - .build() + const doc = builders.metafile().olderThan(was).build() should(() => { assignMaxDate(doc, was) }).changeOnly(doc, { @@ -466,49 +394,34 @@ describe('metadata', function() { }) }) - it('does nothing when the doc has no previous version', function() { + it('does nothing when the doc has no previous version', function () { const doc = builders.metafile().build() should(() => { assignMaxDate(doc) }).not.change(doc) }) - it('does nothing when both current and previous timestamps are the same', function() { + it('does nothing when both current and previous timestamps are the same', function () { const was = builders.metafile().build() - const doc = builders - .metafile() - .updatedAt(was.updated_at) - .build() + const doc = builders.metafile().updatedAt(was.updated_at).build() should(() => { assignMaxDate(doc, was) }).not.change(doc) }) - it('does nothing when the current timestamp is more recent than the previous one', function() { + it('does nothing when the current timestamp is more recent than the previous one', function () { const was = builders.metafile().build() - const doc = builders - .metafile() - .newerThan(was) - .build() + const doc = builders.metafile().newerThan(was).build() should(() => { assignMaxDate(doc, was) }).not.change(doc) }) - it('nevers changes the previous doc', function() { + it('nevers changes the previous doc', function () { const was = builders.metafile().build() - const sameDateDoc = builders - .metafile() - .updatedAt(was.updated_at) - .build() - const newerDoc = builders - .metafile() - .newerThan(was) - .build() - const olderDoc = builders - .metafile() - .olderThan(was) - .build() + const sameDateDoc = builders.metafile().updatedAt(was.updated_at).build() + const newerDoc = builders.metafile().newerThan(was).build() + const olderDoc = builders.metafile().olderThan(was).build() should(() => { assignMaxDate(sameDateDoc, was) }).not.change(was) @@ -523,7 +436,7 @@ describe('metadata', function() { describe('equivalent', () => { describe('with folders', () => { - it('returns true if the folders are the same', function() { + it('returns true if the folders are the same', function () { const a = builders .metadir() .ino(234) @@ -602,7 +515,7 @@ describe('metadata', function() { ).be.true() }) - it('does not fail when a property is absent on one side and undefined on the other', function() { + it('does not fail when a property is absent on one side and undefined on the other', function () { const a = builders .metadir() .path('foo/bar') @@ -645,7 +558,7 @@ describe('metadata', function() { }) describe('with files', () => { - it('returns true if the files are the same', function() { + it('returns true if the files are the same', function () { const a = builders .metafile() .path('foo/bar') @@ -713,10 +626,7 @@ describe('metadata', function() { .metafile(a) .ino(a.ino + 1) .build() - const h = builders - .metafile(a) - .remoteId('321') - .build() + const h = builders.metafile(a).remoteId('321').build() should(equivalent(a, a)).be.true() should(equivalent(a, b)).be.false() should(equivalent(a, c)).be.false() @@ -754,7 +664,7 @@ describe('metadata', function() { ) ).be.true() }) - it('does not fail when a property is absent on one side and undefined on the other', function() { + it('does not fail when a property is absent on one side and undefined on the other', function () { const a = builders .metafile() .path('foo/bar') @@ -801,8 +711,8 @@ describe('metadata', function() { }) }) - describe('sameBinary', function() { - it('returns true for two docs with the same checksum', function() { + describe('sameBinary', function () { + it('returns true for two docs with the same checksum', function () { const one = builders .metafile() .md5sum('adc83b19e793491b1c6ea0fd8b46cd9f32e592fc') @@ -814,7 +724,7 @@ describe('metadata', function() { should(sameBinary(one, two)).be.true() }) - it('returns false for two docs with different checksums', function() { + it('returns false for two docs with different checksums', function () { const one = builders .metafile() .md5sum('adc83b19e793491b1c6ea0fd8b46cd9f32e592fc') @@ -827,26 +737,26 @@ describe('metadata', function() { }) }) - describe('markSide', function() { + describe('markSide', function () { const path = 'path' for (const kind of ['File', 'Dir']) { let stats - beforeEach(async function() { + beforeEach(async function () { stats = kind === 'File' ? await stater.stat(__filename) : await stater.stat(__dirname) }) - it(`marks local: 1 for a new ${kind}`, async function() { + it(`marks local: 1 for a new ${kind}`, async function () { const doc = metadata[`build${kind}`](path, stats) markSide('local', doc) should(doc).have.properties({ sides: { target: 1, local: 1 } }) }) - it(`increments the side from the _rev of an already existing ${kind}`, async function() { + it(`increments the side from the _rev of an already existing ${kind}`, async function () { const prev = metadata[`build${kind}`](path, stats) prev.sides = { target: 5, local: 3, remote: 5 } prev._rev = '5-0123' @@ -868,44 +778,23 @@ describe('metadata', function() { it('increments existing sides by 1 in-place', () => { should(sidesAfterInc({})).deepEqual(undefined) + should(sidesAfterInc(builders.metadata().sides({}).build())).deepEqual({ + target: 0 + }) should( - sidesAfterInc( - builders - .metadata() - .sides({}) - .build() - ) - ).deepEqual({ target: 0 }) - should( - sidesAfterInc( - builders - .metadata() - .sides({ local: 1 }) - .build() - ) + sidesAfterInc(builders.metadata().sides({ local: 1 }).build()) ).deepEqual({ target: 2, local: 2 }) should( - sidesAfterInc( - builders - .metadata() - .sides({ remote: 1 }) - .build() - ) + sidesAfterInc(builders.metadata().sides({ remote: 1 }).build()) ).deepEqual({ target: 2, remote: 2 }) should( sidesAfterInc( - builders - .metadata() - .sides({ local: 2, remote: 2 }) - .build() + builders.metadata().sides({ local: 2, remote: 2 }).build() ) ).deepEqual({ target: 3, local: 3, remote: 3 }) should( sidesAfterInc( - builders - .metadata() - .sides({ local: 3, remote: 2 }) - .build() + builders.metadata().sides({ local: 3, remote: 2 }).build() ) ).deepEqual({ target: 4, local: 4, remote: 3 }) }) @@ -915,10 +804,7 @@ describe('metadata', function() { it('returns `local` if `remote` side is absent', () => { should( metadata.detectSingleSide( - builders - .metadata() - .sides({ local: 1 }) - .build() + builders.metadata().sides({ local: 1 }).build() ) ).equal('local') }) @@ -926,22 +812,14 @@ describe('metadata', function() { it('returns `remote` if `local` side is absent', () => { should( metadata.detectSingleSide( - builders - .metadata() - .sides({ remote: 1 }) - .build() + builders.metadata().sides({ remote: 1 }).build() ) ).equal('remote') }) it('returns undefined if both sides are absent', () => { should( - metadata.detectSingleSide( - builders - .metadata() - .sides({}) - .build() - ) + metadata.detectSingleSide(builders.metadata().sides({}).build()) ).be.undefined() }) @@ -951,8 +829,8 @@ describe('metadata', function() { }) }) - describe('buildFile', function() { - it('creates a document for an existing file', async function() { + describe('buildFile', function () { + it('creates a document for an existing file', async function () { const stats = await fse.stat( path.join(__dirname, '../fixtures/chat-mignon.jpg') ) @@ -976,7 +854,7 @@ describe('metadata', function() { ).deepEqual(remote) }) - it('sets the correct MIME type for Cozy Notes', async function() { + it('sets the correct MIME type for Cozy Notes', async function () { const stats = await fse.stat( path.join(__dirname, '../fixtures/chat-mignon.jpg') ) @@ -1001,7 +879,7 @@ describe('metadata', function() { }) if (platform !== 'win32') { - it('sets the executable bit', async function() { + it('sets the executable bit', async function () { const filePath = path.join(__dirname, '../../tmp/test/executable') const whateverChecksum = '1B2M2Y8AsgTpgAmY7PhCfg==' await fse.ensureFile(filePath) @@ -1014,7 +892,7 @@ describe('metadata', function() { }) describe('buildDir', () => { - it('creates a document for an existing folder', async function() { + it('creates a document for an existing folder', async function () { const stats = await fse.stat(path.join(__dirname, '../fixtures')) const doc = buildDir('fixtures', stats) should(doc).have.properties({ @@ -1036,37 +914,13 @@ describe('metadata', function() { const ino = 123 should( - buildDir( - path, - builders - .stats() - .ino(ino) - .mtime(d1) - .ctime(d1) - .build() - ) + buildDir(path, builders.stats().ino(ino).mtime(d1).ctime(d1).build()) ).have.property('updated_at', d1.toISOString()) should( - buildDir( - path, - builders - .stats() - .ino(ino) - .mtime(d1) - .ctime(d2) - .build() - ) + buildDir(path, builders.stats().ino(ino).mtime(d1).ctime(d2).build()) ).have.property('updated_at', d1.toISOString()) should( - buildDir( - path, - builders - .stats() - .ino(ino) - .mtime(d2) - .ctime(d1) - .build() - ) + buildDir(path, builders.stats().ino(ino).mtime(d2).ctime(d1).build()) ).have.property('updated_at', d2.toISOString()) }) @@ -1076,12 +930,7 @@ describe('metadata', function() { const remote = builders.remoteDir().build() const doc = buildDir( path, - builders - .stats() - .ctime(ctime) - .mtime(ctime) - .ino(123) - .build(), + builders.stats().ctime(ctime).mtime(ctime).ino(123).build(), remote ) should(doc.remote).deepEqual(remote) @@ -1090,12 +939,8 @@ describe('metadata', function() { describe('invariants', () => { let doc - beforeEach(function() { - doc = builders - .metadata() - .remoteId('badbeef') - .upToDate() - .build() + beforeEach(function () { + doc = builders.metadata().remoteId('badbeef').upToDate().build() }) it('throws when trying to put bad doc (no sides)', () => { @@ -1112,12 +957,8 @@ describe('metadata', function() { ) }) - it('throws when trying to put bad doc (no md5sum)', function() { - doc = builders - .metafile() - .remoteId('badbeef') - .upToDate() - .build() + it('throws when trying to put bad doc (no md5sum)', function () { + doc = builders.metafile().remoteId('badbeef').upToDate().build() // $FlowFixMe md5sum is null on purpose should(() => invariants(Object.assign(doc, { md5sum: null }))).throw( /checksum/ @@ -1143,11 +984,7 @@ describe('metadata', function() { describe('markAsUpToDate', () => { let doc beforeEach(async () => { - doc = await builders - .metadata() - .notUpToDate() - .remoteId('badbeef') - .build() + doc = await builders.metadata().notUpToDate().remoteId('badbeef').build() }) it('increments the doc target', () => { @@ -1161,17 +998,13 @@ describe('metadata', function() { it('returns the new target', () => { const target = markAsUpToDate(doc) - should(target) - .be.a.Number() - .and.eql(doc.sides.target) + should(target).be.a.Number().and.eql(doc.sides.target) }) it('sets both sides to the new target', () => { markAsUpToDate(doc) - should(doc.sides.local) - .eql(doc.sides.remote) - .and.eql(doc.sides.target) + should(doc.sides.local).eql(doc.sides.remote).and.eql(doc.sides.target) }) it('removes errors', () => { @@ -1185,59 +1018,39 @@ describe('metadata', function() { describe('outOfDateSide', () => { it('returns nothing if sides are not set', () => { - const doc1 = builders - .metadata() - .sides({}) - .build() + const doc1 = builders.metadata().sides({}).build() should(outOfDateSide(doc1)).be.undefined() - const doc2 = builders - .metadata() - .sides() - .build() + const doc2 = builders.metadata().sides().build() should(outOfDateSide(doc2)).be.undefined() }) it('returns nothing if sides are equal', () => { - const doc = builders - .metadata() - .sides({ local: 1, remote: 1 }) - .build() + const doc = builders.metadata().sides({ local: 1, remote: 1 }).build() should(outOfDateSide(doc)).be.undefined() }) it('returns "local" if the local side is smaller than the remote one', () => { - const doc = builders - .metadata() - .sides({ local: 1, remote: 2 }) - .build() + const doc = builders.metadata().sides({ local: 1, remote: 2 }).build() should(outOfDateSide(doc)).equal('local') }) it('returns "remote" if the remote side is smaller than the local one', () => { - const doc = builders - .metadata() - .sides({ local: 2, remote: 1 }) - .build() + const doc = builders.metadata().sides({ local: 2, remote: 1 }).build() should(outOfDateSide(doc)).equal('remote') }) }) - describe('createConflictingDoc', function() { + describe('createConflictingDoc', function () { const filepath = 'parent/dir/file.txt' let doc - beforeEach(function() { - doc = builders - .metafile() - .path(filepath) - .build() + beforeEach(function () { + doc = builders.metafile().path(filepath).build() }) it('returns a doc with a different path', () => { const newDoc = createConflictingDoc(doc) - should(newDoc.path) - .be.a.String() - .and.not.equal(filepath) + should(newDoc.path).be.a.String().and.not.equal(filepath) }) it('does not change the other attributes', () => { @@ -1258,19 +1071,13 @@ describe('metadata', function() { isIgnored.restore() }) - it('calls isIgnored with the document normalized path', function() { + it('calls isIgnored with the document normalized path', function () { metadata.shouldIgnore( - builders - .metadir() - .path('échange/nourriture') - .build(), + builders.metadir().path('échange/nourriture').build(), ignore ) metadata.shouldIgnore( - builders - .metafile() - .path('échange/nourriture') - .build(), + builders.metafile().path('échange/nourriture').build(), ignore ) @@ -1278,10 +1085,7 @@ describe('metadata', function() { }) it('returns true when document is a folder', () => { - const doc = builders - .metadir() - .path('échange/nourriture') - .build() + const doc = builders.metadir().path('échange/nourriture').build() metadata.shouldIgnore(doc, ignore) should(isIgnored.calledOnce).be.true() @@ -1290,11 +1094,8 @@ describe('metadata', function() { ]) }) - it('returns false when document is a file', function() { - const doc = builders - .metafile() - .path('échange/nourriture') - .build() + it('returns false when document is a file', function () { + const doc = builders.metafile().path('échange/nourriture').build() metadata.shouldIgnore(doc, ignore) should(isIgnored.args[0]).deepEqual([ @@ -1428,13 +1229,8 @@ describe('metadata', function() { }) describe('updateLocal', () => { - it('adds the local attribute if it is missing', function() { - const doc = builders - .metafile() - .ino(1) - .unmerged('local') - .noLocal() - .build() + it('adds the local attribute if it is missing', function () { + const doc = builders.metafile().ino(1).unmerged('local').noLocal().build() const expectedAttributes = process.platform === 'win32' ? metadata.LOCAL_ATTRIBUTES @@ -1446,7 +1242,7 @@ describe('metadata', function() { should(doc.local).have.properties(expectedAttributes) }) - it('fetches the local attributes from the main doc', function() { + it('fetches the local attributes from the main doc', function () { const file1 = builders .metafile() .ino(1) @@ -1482,9 +1278,7 @@ describe('metadata', function() { metadata.updateLocal(file2) - should(file2.local) - .have.property('executable') - .be.false() + should(file2.local).have.property('executable').be.false() const dir = builders .metadir() @@ -1510,7 +1304,7 @@ describe('metadata', function() { ]) }) - it('prefers the provided local attributes', function() { + it('prefers the provided local attributes', function () { const file = builders .metafile() .ino(1) @@ -1547,13 +1341,9 @@ describe('metadata', function() { }) describe('updateRemote', () => { - it('adds the remote attribute if it is missing', function() { + it('adds the remote attribute if it is missing', function () { const remoteFile = builders.remoteFile().build() - const doc = builders - .metafile() - .unmerged('remote') - .noRemote() - .build() + const doc = builders.metafile().unmerged('remote').noRemote().build() metadata.updateRemote(doc, remoteFile) @@ -1570,7 +1360,7 @@ describe('metadata', function() { ]) }) - it('keeps non-overwritten remote attributes', function() { + it('keeps non-overwritten remote attributes', function () { const file = builders .metafile() .path('parent/OLD') @@ -1598,24 +1388,14 @@ describe('metadata', function() { }) }) - describe('comparators', function() { + describe('comparators', function () { let file, folder - beforeEach(async function() { - file = await builders - .metafile() - .ino(1) - .tags('qux') - .upToDate() - .create() - folder = await builders - .metadir() - .ino(1) - .tags('qux') - .upToDate() - .create() + beforeEach(async function () { + file = await builders.metafile().ino(1).tags('qux').upToDate().create() + folder = await builders.metadir().ino(1).tags('qux').upToDate().create() }) - context('when doc is up-to-date', function() { + context('when doc is up-to-date', function () { it('equivalentLocal returns true when comparing doc to its local side', () => { should(equivalentLocal(file, file.local)).be.true() should(equivalentLocal(folder, folder.local)).be.true() @@ -1627,8 +1407,8 @@ describe('metadata', function() { }) }) - context('when local only attribute changed', function() { - beforeEach(async function() { + context('when local only attribute changed', function () { + beforeEach(async function () { file = await builders .metafile(file) .ino(2) @@ -1652,8 +1432,8 @@ describe('metadata', function() { }) }) - context('when local attribute changed', function() { - beforeEach(async function() { + context('when local attribute changed', function () { + beforeEach(async function () { file = await builders .metafile(file) .path('newPath') @@ -1677,8 +1457,8 @@ describe('metadata', function() { }) }) - context('when remote only attribute changed', function() { - beforeEach(async function() { + context('when remote only attribute changed', function () { + beforeEach(async function () { file = await builders .metafile(file) .tags('foo') @@ -1702,8 +1482,8 @@ describe('metadata', function() { }) }) - context('when remote attribute changed', function() { - beforeEach(async function() { + context('when remote attribute changed', function () { + beforeEach(async function () { file = await builders .metafile(file) .path('newPath') @@ -1727,8 +1507,8 @@ describe('metadata', function() { }) }) - context('when local updated_at attribute changed', function() { - beforeEach(async function() { + context('when local updated_at attribute changed', function () { + beforeEach(async function () { file = await builders .metafile(file) .updatedAt(new Date()) @@ -1752,8 +1532,8 @@ describe('metadata', function() { }) }) - context('when remote updated_at attribute changed', function() { - beforeEach(async function() { + context('when remote updated_at attribute changed', function () { + beforeEach(async function () { file = await builders .metafile(file) .updatedAt(new Date()) diff --git a/test/unit/move.js b/test/unit/move.js index 3fac41081..5f7dd5b78 100644 --- a/test/unit/move.js +++ b/test/unit/move.js @@ -13,7 +13,7 @@ describe('move', () => { let builders before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('prepare builders', function() { + beforeEach('prepare builders', function () { builders = new Builders({ pouch: this.pouch }) }) afterEach('clean pouch', pouchHelpers.cleanDatabase) @@ -65,9 +65,7 @@ describe('move', () => { move.child('local', src, dst) - should(dst) - .have.propertyByPath('moveFrom', 'childMove') - .eql(true) + should(dst).have.propertyByPath('moveFrom', 'childMove').eql(true) }) }) @@ -76,15 +74,8 @@ describe('move', () => { let src, dst beforeEach(async () => { - src = await builders - .metadata() - .path('src') - .upToDate() - .create() - dst = builders - .metadata(src) - .path('destination') - .build() + src = await builders.metadata().path('src').upToDate().create() + dst = builders.metadata(src).path('destination').build() move(side, src, dst) move.convertToDestinationAddition(side, src, dst) diff --git a/test/unit/pouch/index.js b/test/unit/pouch/index.js index cd2bbeca3..0b1919fb9 100644 --- a/test/unit/pouch/index.js +++ b/test/unit/pouch/index.js @@ -20,14 +20,14 @@ const pouchHelpers = require('../../support/helpers/pouch') import type { Migration } from '../../../core/pouch/migrations' */ -describe('Pouch', function() { +describe('Pouch', function () { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) let createdDocs - beforeEach('create folders and files', async function() { + beforeEach('create folders and files', async function () { createdDocs = [await pouchHelpers.createParentFolder(this.pouch)] for (let i of [1, 2, 3]) { createdDocs.push( @@ -46,7 +46,7 @@ describe('Pouch', function() { }) describe('lock', () => { - it('ensures nobody else accesses Pouch until released', async function() { + it('ensures nobody else accesses Pouch until released', async function () { const promiseLock1 = this.pouch.lock('lock1') await should(promiseLock1).be.fulfilled() const releaseLock1 = promiseLock1.value() @@ -69,7 +69,7 @@ describe('Pouch', function() { describe('runMigrations', () => { let currentSchemaVersion /* number */ let availableMigrations /*: Migration[] */ - beforeEach('create migrations', async function() { + beforeEach('create migrations', async function () { currentSchemaVersion = await migrations.currentSchemaVersion( this.pouch.db ) @@ -110,7 +110,7 @@ describe('Pouch', function() { ] }) - it('runs all given migrations', async function() { + it('runs all given migrations', async function () { await this.pouch.runMigrations(availableMigrations) const docs = await this.pouch.byRecursivePath('') @@ -121,7 +121,7 @@ describe('Pouch', function() { }) }) - it('retries failed migrations', async function() { + it('retries failed migrations', async function () { let calls = 0 const migrationFailingOnce = { baseSchemaVersion: availableMigrations[1].baseSchemaVersion, @@ -152,7 +152,7 @@ describe('Pouch', function() { }) }) - it('throws a MigrationFailedError in case both attempts failed', async function() { + it('throws a MigrationFailedError in case both attempts failed', async function () { const migrationFailing = { baseSchemaVersion: availableMigrations[1].baseSchemaVersion, targetSchemaVersion: availableMigrations[1].targetSchemaVersion, @@ -183,22 +183,18 @@ describe('Pouch', function() { }) }) - describe('ODM', function() { + describe('ODM', function () { describe('put', () => { let doc, old - beforeEach(async function() { + beforeEach(async function () { const builders = new Builders({ pouch: this.pouch }) - old = await builders - .metafile() - .path('doc') - .upToDate() - .create() + old = await builders.metafile().path('doc').upToDate().create() doc = _.cloneDeep(old) }) - it('does not update doc without sides', async function() { + it('does not update doc without sides', async function () { _.unset(doc, 'sides') await should(this.pouch.put(doc)).be.rejected() @@ -206,11 +202,11 @@ describe('Pouch', function() { }) context('when doc is not deleted', () => { - beforeEach(function() { + beforeEach(function () { doc._deleted = false }) - it('does not update doc with a remote side and no remote', async function() { + it('does not update doc with a remote side and no remote', async function () { _.assign(doc, { remote: undefined, sides: { remote: 1 } }) await should(this.pouch.put(doc)).be.rejected() @@ -219,12 +215,12 @@ describe('Pouch', function() { }) context('when doc is not up to date', () => { - beforeEach(function() { + beforeEach(function () { doc.sides.local = 1 doc.sides.remote = 2 }) - it('does not update doc with a remote side and no remote', async function() { + it('does not update doc with a remote side and no remote', async function () { _.assign(doc, { remote: undefined }) await should(this.pouch.put(doc)).be.rejected() @@ -236,18 +232,14 @@ describe('Pouch', function() { describe('remove', () => { let doc, old - beforeEach(async function() { + beforeEach(async function () { const builders = new Builders({ pouch: this.pouch }) - old = await builders - .metafile() - .path('doc') - .upToDate() - .create() + old = await builders.metafile().path('doc').upToDate().create() doc = _.clone(old) }) - it('updates the _deleted attribute of the doc', async function() { + it('updates the _deleted attribute of the doc', async function () { await (() => { this.pouch.remove(doc) }).should.not.throw() @@ -263,40 +255,26 @@ describe('Pouch', function() { describe('bulkDocs', () => { let builders, doc1, doc2, old1, old2 - beforeEach(async function() { + beforeEach(async function () { builders = new Builders({ pouch: this.pouch }) - old1 = await builders - .metafile() - .path('doc1') - .upToDate() - .create() - old2 = await builders - .metafile() - .path('doc2') - .upToDate() - .create() + old1 = await builders.metafile().path('doc1').upToDate().create() + old2 = await builders.metafile().path('doc2').upToDate().create() doc1 = _.clone(old1) doc2 = _.clone(old2) }) - it('adds missing ids', async function() { + it('adds missing ids', async function () { await should( this.pouch.bulkDocs([ - builders - .metafile() - .upToDate() - .build(), - builders - .metadir() - .upToDate() - .build() + builders.metafile().upToDate().build(), + builders.metadir().upToDate().build() ]) ).be.fulfilled() }) - it(`does not save two docs swallowing error on first one`, async function() { + it(`does not save two docs swallowing error on first one`, async function () { doc1._rev = '2-badbeef' await should(this.pouch.bulkDocs([doc1, doc2])).be.rejectedWith({ status: 409 @@ -305,7 +283,7 @@ describe('Pouch', function() { should((await this.pouch.db.get(doc2._id))._rev).not.equal(old2._rev) }) - it(`does not save two docs swallowing error on second one`, async function() { + it(`does not save two docs swallowing error on second one`, async function () { doc2._rev = '2-badbeef' await should(this.pouch.bulkDocs([doc1, doc2])).be.rejectedWith({ status: 409 @@ -316,7 +294,7 @@ describe('Pouch', function() { }) describe('getAll', () => { - it('returns all the documents matching the query', async function() { + it('returns all the documents matching the query', async function () { const params = { startkey: [metadata.id('my-folder') + path.sep, ''], endkey: [metadata.id('my-folder') + path.sep, '\ufff0'], @@ -331,7 +309,7 @@ describe('Pouch', function() { }) describe('byIdMaybe', () => { - it('resolves with a doc matching the given _id if any', async function() { + it('resolves with a doc matching the given _id if any', async function () { const existing = await this.pouch.db.post({ docType: 'folder', path: 'my-folder' @@ -343,12 +321,12 @@ describe('Pouch', function() { }) }) - it('resolves with nothing otherwise', async function() { + it('resolves with nothing otherwise', async function () { const doc = await this.pouch.byIdMaybe('not-found') should(doc).be.undefined() }) - it('does not swallow non-404 errors', async function() { + it('does not swallow non-404 errors', async function () { const get = sinon.stub(this.pouch.db, 'get').rejects(REV_CONFLICT) try { await should( @@ -361,20 +339,20 @@ describe('Pouch', function() { }) describe('bySyncedPath', () => { - it('resolves with the doc whose path attribute matches the given path', async function() { + it('resolves with the doc whose path attribute matches the given path', async function () { for (const doc of createdDocs) { await should(this.pouch.bySyncedPath(doc.path)).be.fulfilledWith(doc) } }) - it('resolves with nothing otherwise', async function() { + it('resolves with nothing otherwise', async function () { const doc = await this.pouch.bySyncedPath('not-found') should(doc).be.undefined() }) }) describe('byChecksum', () => { - it('gets all the files with this checksum', async function() { + it('gets all the files with this checksum', async function () { const filePath = path.join('my-folder', 'file-1') const checksum = `111111111111111111111111111111111111111${filePath}` const docs = await this.pouch.byChecksum(checksum) @@ -384,8 +362,8 @@ describe('Pouch', function() { }) }) - describe('byPath', function() { - it('gets all the files and folders in this path', async function() { + describe('byPath', function () { + it('gets all the files and folders in this path', async function () { const docs = await this.pouch.byPath(metadata.id('my-folder')) should(docs).have.length(6) should(docs).containDeep( @@ -393,7 +371,7 @@ describe('Pouch', function() { ) }) - it('gets only files and folders in the first level', async function() { + it('gets only files and folders in the first level', async function () { createdDocs.push( await pouchHelpers.createFile( this.pouch, @@ -409,14 +387,14 @@ describe('Pouch', function() { }) }) - it('ignores design documents', async function() { + it('ignores design documents', async function () { const docs = await this.pouch.byPath('_design') docs.length.should.be.equal(0) }) }) - describe('byRecurivePath', function() { - it('gets the files and folders in this path recursively', async function() { + describe('byRecurivePath', function () { + it('gets the files and folders in this path recursively', async function () { const docs = await this.pouch.byRecursivePath('my-folder') docs.length.should.be.equal(6) for (let i = 1; i <= 3; i++) { @@ -433,7 +411,7 @@ describe('Pouch', function() { } }) - it('gets the files and folders from root', async function() { + it('gets the files and folders from root', async function () { const docs = await this.pouch.byRecursivePath('') docs.length.should.be.equal(7) docs[0].should.have.properties({ @@ -456,7 +434,7 @@ describe('Pouch', function() { }) context('in descending mode', () => { - it('sorts the results in descending path order', async function() { + it('sorts the results in descending path order', async function () { const docs = await this.pouch.byRecursivePath('', { descending: true }) @@ -471,7 +449,7 @@ describe('Pouch', function() { }) }) - it('does not return the content of other folders starting with the same path', async function() { + it('does not return the content of other folders starting with the same path', async function () { // create my-folder/folder-11 const similarFolderPath = path.join('my-folder', 'folder-1 other') await pouchHelpers.createFolder(this.pouch, similarFolderPath) @@ -490,8 +468,8 @@ describe('Pouch', function() { }) }) - describe('byRemoteId', function() { - it('gets all the file with this remote id', async function() { + describe('byRemoteId', function () { + it('gets all the file with this remote id', async function () { const filePath = path.join('my-folder', 'file-1') const id = `1234567890-${filePath}` const doc = await this.pouch.byRemoteId(id) @@ -500,7 +478,7 @@ describe('Pouch', function() { should.exist(doc.docType) }) - it('returns a 404 error if no file matches', async function() { + it('returns a 404 error if no file matches', async function () { let id = 'abcdef' await should(this.pouch.byRemoteId(id)).be.rejectedWith({ status: 404 @@ -508,8 +486,8 @@ describe('Pouch', function() { }) }) - describe('byRemoteIdMaybe', function() { - it('does the same as byRemoteId() when document exists', async function() { + describe('byRemoteIdMaybe', function () { + it('does the same as byRemoteId() when document exists', async function () { const filePath = path.join('my-folder', 'file-1') const id = `1234567890-${filePath}` const doc = await this.pouch.byRemoteIdMaybe(id) @@ -518,13 +496,13 @@ describe('Pouch', function() { should.exist(doc.docType) }) - it('returns null when document does not exist', async function() { + it('returns null when document does not exist', async function () { let id = 'abcdef' const doc = await this.pouch.byRemoteIdMaybe(id) should.equal(null, doc) }) - it('returns any non-404 error', async function() { + it('returns any non-404 error', async function () { const otherError = new Error('not a 404') sinon.stub(this.pouch, 'byRemoteId').throws(otherError) @@ -537,7 +515,7 @@ describe('Pouch', function() { describe('#allByRemoteIds()', () => { let dir, file - beforeEach(async function() { + beforeEach(async function () { const builders = new Builders({ pouch: this.pouch }) dir = await builders .metadir() @@ -551,14 +529,14 @@ describe('Pouch', function() { .create() }) - it('resolves with docs matching the given remoteIds, in the same order', async function() { + it('resolves with docs matching the given remoteIds, in the same order', async function () { const expectedDocs = [file, dir] const remoteIds = expectedDocs.map(doc => doc.remote._id) const docs = await this.pouch.allByRemoteIds(remoteIds) should(docs).deepEqual(expectedDocs) }) - it('resolves with matching docs except missing ones', async function() { + it('resolves with matching docs except missing ones', async function () { const docs = await this.pouch.allByRemoteIds([ dir.remote._id, 'missing', @@ -567,23 +545,23 @@ describe('Pouch', function() { should(docs).deepEqual([dir, file]) }) - it('resolves to an empty Array when given a single missing remote id', async function() { + it('resolves to an empty Array when given a single missing remote id', async function () { const docs = await this.pouch.allByRemoteIds(['missing']) should(docs).deepEqual([]) }) - it('resolves to an empty Array when given an empty Array', async function() { + it('resolves to an empty Array when given an empty Array', async function () { const docs = await this.pouch.allByRemoteIds([]) should(docs).deepEqual([]) }) - it('does not care about duplicate ids & docs', async function() { + it('does not care about duplicate ids & docs', async function () { const id = dir.remote._id const docs = await this.pouch.allByRemoteIds([id, id]) should(docs).deepEqual([dir, dir]) }) - it('can take a Set of remoteIds instead of an Array', async function() { + it('can take a Set of remoteIds instead of an Array', async function () { const expectedDocs = [dir, file] const remoteIds = new Set(expectedDocs.map(doc => doc.remote._id)) const docs = await this.pouch.allByRemoteIds(remoteIds) @@ -592,13 +570,9 @@ describe('Pouch', function() { }) describe('initialScanDocs', () => { - it('returns only existing docs with local side and metadata', async function() { + it('returns only existing docs with local side and metadata', async function () { const builders = new Builders({ pouch: this.pouch }) - const dir = await builders - .metadir() - .path('dir') - .upToDate() - .create() + const dir = await builders.metadir().path('dir').upToDate().create() const file = await builders .metafile() .path('file') @@ -635,15 +609,15 @@ describe('Pouch', function() { }) }) - describe('Views', function() { - describe('createDesignDoc', function() { + describe('Views', function () { + describe('createDesignDoc', function () { const query = `function (doc) { if (doc.docType === 'file') { emit(doc._id) } }` - it('creates a new design doc', async function() { + it('creates a new design doc', async function () { await this.pouch.createDesignDoc('file', query) const docs = await this.pouch.getAll('file') should(docs).have.length(3) @@ -652,7 +626,7 @@ describe('Pouch', function() { } }) - it('does not update the same design doc', async function() { + it('does not update the same design doc', async function () { await this.pouch.createDesignDoc('file', query) const was = await this.pouch.db.get('_design/file') await this.pouch.createDesignDoc('file', query) @@ -661,7 +635,7 @@ describe('Pouch', function() { designDoc._rev.should.equal(was._rev) }) - it('updates the design doc if the query change', async function() { + it('updates the design doc if the query change', async function () { await this.pouch.createDesignDoc('file', query) const was = await this.pouch.db.get('_design/file') let newQuery = query.replace('file', 'File') @@ -674,7 +648,7 @@ describe('Pouch', function() { }) describe('addByPathView', () => { - it('creates the byPath view', async function() { + it('creates the byPath view', async function () { await this.pouch.addByPathView() const doc = await this.pouch.db.get('_design/byPath') should.exist(doc) @@ -682,7 +656,7 @@ describe('Pouch', function() { }) describe('addByChecksumView', () => { - it('creates the byChecksum view', async function() { + it('creates the byChecksum view', async function () { await this.pouch.addByChecksumView() const doc = await this.pouch.db.get('_design/byChecksum') should.exist(doc) @@ -690,7 +664,7 @@ describe('Pouch', function() { }) describe('addByRemoteIdView', () => { - it('creates the byRemoteId view', async function() { + it('creates the byRemoteId view', async function () { await this.pouch.addByRemoteIdView() const doc = await this.pouch.db.get('_design/byRemoteId') should.exist(doc) @@ -698,7 +672,7 @@ describe('Pouch', function() { }) describe('removeDesignDoc', () => { - it('removes given view', async function() { + it('removes given view', async function () { let query = `function (doc) { if (doc.docType === 'folder') { emit(doc._id); @@ -714,9 +688,9 @@ describe('Pouch', function() { }) }) - describe('Helpers', function() { + describe('Helpers', function () { describe('getPreviousRev', () => { - it('retrieves previous document informations', async function() { + it('retrieves previous document informations', async function () { const dirPath = path.join('my-folder', 'folder-1') const doc = await this.pouch.bySyncedPath(dirPath) @@ -750,17 +724,17 @@ describe('Pouch', function() { describe('localTree', () => { let builders - beforeEach(async function() { + beforeEach(async function () { builders = new Builders({ pouch: this.pouch }) }) - it('returns the local paths of all saved documents', async function() { + it('returns the local paths of all saved documents', async function () { await should(this.pouch.localTree()).be.fulfilledWith( createdDocs.map(d => d.local.path).sort() ) }) - it('does not return the paths of remote only documents', async function() { + it('does not return the paths of remote only documents', async function () { await builders .metafile() .path('my-folder/remote-file') @@ -772,7 +746,7 @@ describe('Pouch', function() { ) }) - it('resturns the paths of local only documents', async function() { + it('resturns the paths of local only documents', async function () { const localFile = await builders .metafile() .path('my-folder/local-file') @@ -789,15 +763,15 @@ describe('Pouch', function() { }) }) - describe('Sequence numbers', function() { + describe('Sequence numbers', function () { describe('getLocalSeq', () => { - it('gets 0 when the local seq number is not initialized', async function() { + it('gets 0 when the local seq number is not initialized', async function () { await should(this.pouch.getLocalSeq()).be.fulfilledWith(0) }) }) describe('setLocalSeq', () => { - it('saves the local sequence number', async function() { + it('saves the local sequence number', async function () { await this.pouch.setLocalSeq(21) await should(this.pouch.getLocalSeq()).be.fulfilledWith(21) await this.pouch.setLocalSeq(22) @@ -806,20 +780,20 @@ describe('Pouch', function() { }) describe('getRemoteSeq', () => { - it('gets 0 when the remote seq number is not initialized', async function() { + it('gets 0 when the remote seq number is not initialized', async function () { await should(this.pouch.getRemoteSeq()).be.fulfilledWith('0') }) }) - describe('setRemoteSeq', function() { - it('saves the remote sequence number', async function() { + describe('setRemoteSeq', function () { + it('saves the remote sequence number', async function () { await this.pouch.setRemoteSeq('31') await should(this.pouch.getRemoteSeq()).be.fulfilledWith('31') await this.pouch.setRemoteSeq('32') await should(this.pouch.getRemoteSeq()).be.fulfilledWith('32') }) - it('can be called multiple times in parallel', async function() { + it('can be called multiple times in parallel', async function () { await Promise.map( _.range(1, 101), seq => this.pouch.setRemoteSeq(String(seq)), @@ -829,32 +803,32 @@ describe('Pouch', function() { }) }) - describe('unsyncedDocIds', function() { - it('returns the list of changed docs since the current local sequence', async function() { + describe('unsyncedDocIds', function () { + it('returns the list of changed docs since the current local sequence', async function () { const changedDocIds = createdDocs.map(d => d._id) await should(this.pouch.unsyncedDocIds()).be.fulfilledWith(changedDocIds) }) - it('can be called multiple times in a row', async function() { + it('can be called multiple times in a row', async function () { const unsyncedDocIds = await this.pouch.unsyncedDocIds() await should(this.pouch.unsyncedDocIds()).be.fulfilledWith(unsyncedDocIds) }) }) - describe('touchDocs', function() { - it('does nothing when no document ids are given', async function() { + describe('touchDocs', function () { + it('does nothing when no document ids are given', async function () { await should(this.pouch.touchDocs([])).be.fulfilledWith([]) }) - it('does nothing when no documents exist with the given ids', async function() { + it('does nothing when no documents exist with the given ids', async function () { await should( this.pouch.touchDocs(['inexistant-doc-id']) ).be.fulfilledWith([]) }) - it('updates the _rev value of all existing documents with the given ids', async function() { + it('updates the _rev value of all existing documents with the given ids', async function () { const touchResult = await this.pouch.touchDocs( createdDocs.map(d => d._id) ) diff --git a/test/unit/pouch/migrations.js b/test/unit/pouch/migrations.js index bfcb8c2f1..6df0ec1c7 100644 --- a/test/unit/pouch/migrations.js +++ b/test/unit/pouch/migrations.js @@ -25,14 +25,14 @@ import type { Migration } from '../../../core/pouch/migrations' import type { SavedMetadata } from '../../../core/metadata' */ -describe('core/pouch/migrations', function() { +describe('core/pouch/migrations', function () { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) let createdDocs - beforeEach('create folders and files', async function() { + beforeEach('create folders and files', async function () { createdDocs = [await pouchHelpers.createParentFolder(this.pouch)] for (let i of [1, 2, 3]) { createdDocs.push( @@ -52,13 +52,13 @@ describe('core/pouch/migrations', function() { describe('currentSchemaVersion()', () => { context('without schema', () => { - beforeEach('remove schema', async function() { + beforeEach('remove schema', async function () { if (await this.pouch.byIdMaybe(SCHEMA_DOC_ID)) { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, _deleted: true }) } }) - it('returns SCHEMA_INITIAL_VERSION', async function() { + it('returns SCHEMA_INITIAL_VERSION', async function () { await should(currentSchemaVersion(this.pouch.db)).be.fulfilledWith( SCHEMA_INITIAL_VERSION ) @@ -66,11 +66,11 @@ describe('core/pouch/migrations', function() { }) context('with a schema missing its version', () => { - beforeEach('corrupt schema', async function() { + beforeEach('corrupt schema', async function () { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, version: undefined }) }) - it('returns SCHEMA_INITIAL_VERSION', async function() { + it('returns SCHEMA_INITIAL_VERSION', async function () { await should(currentSchemaVersion(this.pouch.db)).be.fulfilledWith( SCHEMA_INITIAL_VERSION ) @@ -80,11 +80,11 @@ describe('core/pouch/migrations', function() { context('with a valid schema', () => { const version = 12 - beforeEach('create schema', async function() { + beforeEach('create schema', async function () { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, version }) }) - it('returns the version of the schema', async function() { + it('returns the version of the schema', async function () { await should(currentSchemaVersion(this.pouch.db)).be.fulfilledWith( version ) @@ -96,13 +96,13 @@ describe('core/pouch/migrations', function() { const version = 12 context('without schema', () => { - beforeEach('remove schema', async function() { + beforeEach('remove schema', async function () { if (await this.pouch.byIdMaybe(SCHEMA_DOC_ID)) { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, _deleted: true }) } }) - it('creates the schema with the given version', async function() { + it('creates the schema with the given version', async function () { await should(updateSchemaVersion(version, this.pouch.db)).be.fulfilled() await should(currentSchemaVersion(this.pouch.db)).be.fulfilledWith( version @@ -111,11 +111,11 @@ describe('core/pouch/migrations', function() { }) context('with a schema missing its version', () => { - beforeEach('corrupt schema', async function() { + beforeEach('corrupt schema', async function () { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, version: undefined }) }) - it('creates the schema with the given version', async function() { + it('creates the schema with the given version', async function () { await should(updateSchemaVersion(version, this.pouch.db)).be.fulfilled() await should(currentSchemaVersion(this.pouch.db)).be.fulfilledWith( version @@ -126,11 +126,11 @@ describe('core/pouch/migrations', function() { context('with a valid schema', () => { const version = 12 - beforeEach('create schema', async function() { + beforeEach('create schema', async function () { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, version }) }) - it('updates the version of the schema', async function() { + it('updates the version of the schema', async function () { const newVersion = version + 1 await should( updateSchemaVersion(newVersion, this.pouch.db) @@ -156,30 +156,31 @@ describe('core/pouch/migrations', function() { })) } + let migrationRunSpy beforeEach('spy on migration.run', () => { - sinon.spy(migration, 'run') + migrationRunSpy = sinon.spy(migration, 'run') }) afterEach('remove spy', () => { - migration.run.restore() + migrationRunSpy.restore() }) context( 'when the current schema version is lower than the migration base schema version', () => { - beforeEach('set schema version', async function() { + beforeEach('set schema version', async function () { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, version: migration.baseSchemaVersion - 1 }) }) - it('does not run the migration', async function() { + it('does not run the migration', async function () { await migrate(migration, this.pouch) should(migration.run).not.have.been.called() }) - it('does not update the schema version', async function() { + it('does not update the schema version', async function () { const previousSchemaVersion = await currentSchemaVersion( this.pouch.db ) @@ -195,19 +196,19 @@ describe('core/pouch/migrations', function() { context( 'when the current schema version is higher than the migration base schema version', () => { - beforeEach('set schema version', async function() { + beforeEach('set schema version', async function () { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, version: migration.baseSchemaVersion + 1 }) }) - it('does not run the migration', async function() { + it('does not run the migration', async function () { await migrate(migration, this.pouch) should(migration.run).not.have.been.called() }) - it('does not update the schema version', async function() { + it('does not update the schema version', async function () { const previousSchemaVersion = await currentSchemaVersion( this.pouch.db ) @@ -223,7 +224,7 @@ describe('core/pouch/migrations', function() { context( 'when the current schema version equals the migration base schema version', () => { - beforeEach('set schema version', async function() { + beforeEach('set schema version', async function () { await this.pouch.db.put({ _id: SCHEMA_DOC_ID, version: migration.baseSchemaVersion @@ -231,15 +232,18 @@ describe('core/pouch/migrations', function() { }) context('and no docs needed to be migrated', () => { + let migrationAffectedDocsStub beforeEach('mark all docs as unaffected', () => { - sinon.stub(migration, 'affectedDocs').callsFake(() => []) + migrationAffectedDocsStub = sinon + .stub(migration, 'affectedDocs') + .callsFake(() => []) }) afterEach('remove stub', () => { - migration.affectedDocs.restore() + migrationAffectedDocsStub.restore() }) - it('does not save any docs', async function() { + it('does not save any docs', async function () { await migrate(migration, this.pouch) const docs = await this.pouch.allDocs() @@ -247,7 +251,7 @@ describe('core/pouch/migrations', function() { should(migratedDocs).be.empty() }) - it('sets the schema version to the migration target schema version', async function() { + it('sets the schema version to the migration target schema version', async function () { await migrate(migration, this.pouch) await should(currentSchemaVersion(this.pouch.db)).be.fulfilledWith( migration.targetSchemaVersion @@ -256,15 +260,15 @@ describe('core/pouch/migrations', function() { }) context('and some docs needed to be migrated', () => { - it('runs the migration on all affected docs', async function() { + it('runs the migration on all affected docs', async function () { const docs = await this.pouch.allDocs() await migrate(migration, this.pouch) should(migration.run).have.been.calledOnce() - should(migration.run.getCall(0).args).deepEqual([docs]) + should(migrationRunSpy.firstCall.args).deepEqual([docs]) }) - it('saves the migrated docs', async function() { + it('saves the migrated docs', async function () { await migrate(migration, this.pouch) const docs = await this.pouch.allDocs() @@ -273,14 +277,14 @@ describe('core/pouch/migrations', function() { }) context('and the docs were successfully saved', () => { - it('sets the schema version to the migration target schema version', async function() { + it('sets the schema version to the migration target schema version', async function () { await migrate(migration, this.pouch) await should( currentSchemaVersion(this.pouch.db) ).be.fulfilledWith(migration.targetSchemaVersion) }) - it('sets the localSeq to the last change seq', async function() { + it('sets the localSeq to the last change seq', async function () { const expected = await this.pouch.db.changes({ since: 0 }) await migrate(migration, this.pouch) await should(this.pouch.getLocalSeq()).be.fulfilledWith( @@ -288,14 +292,14 @@ describe('core/pouch/migrations', function() { ) }) - it('does not update the remoteSeq', async function() { + it('does not update the remoteSeq', async function () { const expected = await this.pouch.getRemoteSeq() await migrate(migration, this.pouch) await should(this.pouch.getRemoteSeq()).be.fulfilledWith(expected) }) - it('does not prevent synchronizing merged changes', async function() { + it('does not prevent synchronizing merged changes', async function () { // We should have 7 unsynced docs, created in the main beforeEach const unsyncedDocIds = createdDocs.map(d => d._id) @@ -313,7 +317,7 @@ describe('core/pouch/migrations', function() { const isCorruptedDoc = index => index % 2 === 1 beforeEach('stub migration.run() to return invalid docs', () => { - migration.run.restore() + migrationRunSpy.restore() sinon.stub(migration, 'run').callsFake(docs => docs.map((doc, index) => { const newDoc = { @@ -331,14 +335,14 @@ describe('core/pouch/migrations', function() { ) }) - it('reverts all changes', async function() { + it('reverts all changes', async function () { const docs = await this.pouch.allDocs() await migrate(migration, this.pouch) await should(this.pouch.allDocs()).be.fulfilledWith(docs) }) - it('does not update the schema version', async function() { + it('does not update the schema version', async function () { const previousSchemaVersion = await currentSchemaVersion( this.pouch.db ) @@ -349,14 +353,14 @@ describe('core/pouch/migrations', function() { ).be.fulfilledWith(previousSchemaVersion) }) - it('does not update the localSeq', async function() { + it('does not update the localSeq', async function () { const expected = await this.pouch.getLocalSeq() await migrate(migration, this.pouch) await should(this.pouch.getLocalSeq()).be.fulfilledWith(expected) }) - it('does not update the remoteSeq', async function() { + it('does not update the remoteSeq', async function () { const expected = await this.pouch.getRemoteSeq() await migrate(migration, this.pouch) @@ -370,7 +374,7 @@ describe('core/pouch/migrations', function() { describe('save()', () => { context('with no docs', () => { - it('returns a MigrationNoop result', async function() { + it('returns a MigrationNoop result', async function () { await should(save([], this.pouch.db)).be.fulfilledWith({ type: 'MigrationNoop', errors: [] @@ -380,21 +384,21 @@ describe('core/pouch/migrations', function() { context('with only valid docs', () => { let docs - beforeEach('fetch and update docs', async function() { + beforeEach('fetch and update docs', async function () { docs = await this.pouch.allDocs() docs.forEach(d => { d.migrated = true }) }) - it('returns a MigrationComplete result', async function() { + it('returns a MigrationComplete result', async function () { await should(save(docs, this.pouch.db)).be.fulfilledWith({ type: 'MigrationComplete', errors: [] }) }) - it('saves the new version of all documents', async function() { + it('saves the new version of all documents', async function () { await save(docs, this.pouch.db) const savedDocs = await this.pouch.allDocs() @@ -407,7 +411,7 @@ describe('core/pouch/migrations', function() { const isCorruptedDoc = index => index % 2 === 1 let docs - beforeEach('fetch and update docs', async function() { + beforeEach('fetch and update docs', async function () { docs = await this.pouch.allDocs() docs.forEach((d, index) => { d.migrated = true @@ -415,7 +419,7 @@ describe('core/pouch/migrations', function() { }) }) - it('returns a MigrationFailed result', async function() { + it('returns a MigrationFailed result', async function () { await should(save(docs, this.pouch.db)).be.fulfilledWith({ type: 'MigrationFailed', errors: docs @@ -431,7 +435,7 @@ describe('core/pouch/migrations', function() { }) }) - it('saves the new version of all valid documents', async function() { + it('saves the new version of all valid documents', async function () { await save(docs, this.pouch.db) const maybeMigratedDocs = await this.pouch.allDocs() @@ -450,7 +454,7 @@ describe('core/pouch/migrations', function() { const migration = migrations[0] describe('affectedDocs()', () => { - it('returns an empty array when all docs have sides.target', async function() { + it('returns an empty array when all docs have sides.target', async function () { const docs = (await this.pouch.allDocs()).map(doc => { doc.sides.target = 2 return doc @@ -458,7 +462,7 @@ describe('core/pouch/migrations', function() { should(migration.affectedDocs(docs)).be.empty() }) - it('returns only docs missing sides.target', async function() { + it('returns only docs missing sides.target', async function () { const docs = await this.pouch.allDocs() const incompleteDocs = docs.filter((doc, index) => index % 2 === 0) docs @@ -472,7 +476,7 @@ describe('core/pouch/migrations', function() { }) describe('run()', () => { - it('sets sides.target with the short rev extracted from _rev', async function() { + it('sets sides.target with the short rev extracted from _rev', async function () { const docs = await this.pouch.allDocs() const expected = docs.map(doc => ({ ...doc, diff --git a/test/unit/prep.js b/test/unit/prep.js index d2b3dc32b..c30b7ba04 100644 --- a/test/unit/prep.js +++ b/test/unit/prep.js @@ -6,8 +6,8 @@ const should = require('should') const { Ignore } = require('../../core/ignore') const Prep = require('../../core/prep') -describe('Prep', function() { - beforeEach('instanciate prep', function() { +describe('Prep', function () { + beforeEach('instanciate prep', function () { this.side = 'local' this.merge = { addFileAsync: sinon.stub(), @@ -26,15 +26,15 @@ describe('Prep', function() { this.prep = new Prep(this.merge, this.ignore) }) - describe('Put', function() { - describe('addFile', function() { - it('expects a doc with a valid path', async function() { + describe('Put', function () { + describe('addFile', function () { + it('expects a doc with a valid path', async function () { await should( this.prep.addFileAsync(this.side, { path: '/' }) ).be.rejectedWith('Invalid path') }) - it('rejects a doc with no checksum', async function() { + it('rejects a doc with no checksum', async function () { this.merge.addFileAsync.resolves() let doc = { path: 'no-checksum', @@ -45,7 +45,7 @@ describe('Prep', function() { ) }) - it('rejects doc with an invalid checksum', async function() { + it('rejects doc with an invalid checksum', async function () { let doc = { path: 'invalid-checksum', md5sum: 'foobar' @@ -55,7 +55,7 @@ describe('Prep', function() { ) }) - it('calls Merge with the correct fields', async function() { + it('calls Merge with the correct fields', async function () { this.merge.addFileAsync.resolves() let doc = { path: 'foo/missing-fields', @@ -67,7 +67,7 @@ describe('Prep', function() { // FIXME: should.exist(doc.updated_at) }) - it('does nothing for ignored paths on local', async function() { + it('does nothing for ignored paths on local', async function () { let doc = { path: 'ignored', md5sum: 'rcg7GeeTSRscbqD9i0bNnw==' @@ -77,14 +77,14 @@ describe('Prep', function() { }) }) - describe('updateFile', function() { - it('expects a doc with a valid path', async function() { + describe('updateFile', function () { + it('expects a doc with a valid path', async function () { await should( this.prep.updateFileAsync(this.side, { path: '/' }) ).be.rejectedWith('Invalid path') }) - it('rejects doc with no checksum', async function() { + it('rejects doc with no checksum', async function () { this.merge.updateFileAsync.resolves() let doc = { path: 'no-checksum', @@ -95,7 +95,7 @@ describe('Prep', function() { ) }) - it('rejects doc with an invalid checksum', async function() { + it('rejects doc with an invalid checksum', async function () { let doc = { path: 'no-checksum', md5sum: 'foobar' @@ -105,7 +105,7 @@ describe('Prep', function() { ) }) - it('calls Merge with the correct fields', async function() { + it('calls Merge with the correct fields', async function () { this.merge.updateFileAsync.resolves() let doc = { path: 'foobar/missing-fields', @@ -117,7 +117,7 @@ describe('Prep', function() { // FIXME: should.exist(doc.updated_at) }) - it('does nothing for ignored paths on local', async function() { + it('does nothing for ignored paths on local', async function () { let doc = { path: 'ignored', md5sum: 'rcg7GeeTSRscbqD9i0bNnw==' @@ -127,14 +127,14 @@ describe('Prep', function() { }) }) - describe('putFolder', function() { - it('expects a doc with a valid path', async function() { + describe('putFolder', function () { + it('expects a doc with a valid path', async function () { await should( this.prep.putFolderAsync(this.side, { path: '..' }) ).be.rejectedWith('Invalid path') }) - it('calls Merge with the correct fields', async function() { + it('calls Merge with the correct fields', async function () { this.merge.putFolderAsync.resolves() let doc = { path: 'foo/folder-missing-fields' } await this.prep.putFolderAsync(this.side, doc) @@ -143,7 +143,7 @@ describe('Prep', function() { // FIXME: should.exist(doc.updated_at) }) - it('does nothing for ignored paths on local', async function() { + it('does nothing for ignored paths on local', async function () { let doc = { path: 'ignored' } await this.prep.putFolderAsync('local', doc) this.merge.putFolderAsync.called.should.be.false() @@ -151,9 +151,9 @@ describe('Prep', function() { }) }) - describe('Move', function() { - describe('moveFile', function() { - it('expects a doc with a valid path', async function() { + describe('Move', function () { + describe('moveFile', function () { + it('expects a doc with a valid path', async function () { let doc = { path: '' } let was = { path: 'foo/baz' } await should( @@ -161,7 +161,7 @@ describe('Prep', function() { ).be.rejectedWith('Invalid path') }) - it('expects a was with a valid path', async function() { + it('expects a was with a valid path', async function () { let doc = { path: 'foo/bar' } let was = { path: '' } await should( @@ -169,7 +169,7 @@ describe('Prep', function() { ).be.rejectedWith('Invalid path') }) - it('expects a doc with a valid checksum', async function() { + it('expects a doc with a valid checksum', async function () { let doc = { path: 'foo/bar', docType: 'file', @@ -181,7 +181,7 @@ describe('Prep', function() { ).be.rejectedWith('Invalid checksum') }) - it('expects a revision for was', async function() { + it('expects a revision for was', async function () { let doc = { path: 'foo/bar', docType: 'file', @@ -197,7 +197,7 @@ describe('Prep', function() { ).be.rejectedWith('Missing rev') }) - it('calls updateFileAsync if src and dst paths are the same', async function() { + it('calls updateFileAsync if src and dst paths are the same', async function () { sinon.spy(this.prep, 'updateFileAsync') let doc = { @@ -216,7 +216,7 @@ describe('Prep', function() { this.prep.updateFileAsync.restore() }) - it('calls Merge with the correct fields', async function() { + it('calls Merge with the correct fields', async function () { this.merge.moveFileAsync.resolves() let doc = { path: 'FOO/new-missing-fields.jpg', @@ -242,8 +242,8 @@ describe('Prep', function() { }) }) - describe('moveFolder', function() { - it('expects a doc with a valid path', async function() { + describe('moveFolder', function () { + it('expects a doc with a valid path', async function () { let doc = { path: '' } let was = { path: 'foo/baz' } await should( @@ -251,7 +251,7 @@ describe('Prep', function() { ).be.rejectedWith('Invalid path') }) - it('expects a was with a valid id', async function() { + it('expects a was with a valid id', async function () { let doc = { path: 'foo/bar' } let was = { path: '' } await should( @@ -259,7 +259,7 @@ describe('Prep', function() { ).be.rejectedWith('Invalid path') }) - it('expects a revision for was', async function() { + it('expects a revision for was', async function () { let doc = { path: 'foo/bar', docType: 'folder' @@ -273,7 +273,7 @@ describe('Prep', function() { ).be.rejectedWith('Missing rev') }) - it('calls putFolderAsync if src and dst paths are the same', async function() { + it('calls putFolderAsync if src and dst paths are the same', async function () { sinon.spy(this.prep, 'putFolderAsync') let doc = { @@ -290,7 +290,7 @@ describe('Prep', function() { this.prep.putFolderAsync.restore() }) - it('calls Merge with the correct fields', async function() { + it('calls Merge with the correct fields', async function () { this.merge.moveFolderAsync.resolves() let doc = { path: 'FOOBAR/new-missing-fields' } let was = { @@ -310,15 +310,15 @@ describe('Prep', function() { }) }) - describe('Delete', function() { - describe('deleteFile', function() { - it('expects a doc with a valid path', async function() { + describe('Delete', function () { + describe('deleteFile', function () { + it('expects a doc with a valid path', async function () { await should( this.prep.deleteFileAsync(this.side, { path: '/' }) ).be.rejectedWith('Invalid path') }) - it('calls Merge with the correct fields', async function() { + it('calls Merge with the correct fields', async function () { this.merge.deleteFileAsync.resolves() let doc = { path: 'kill/file' } await this.prep.deleteFileAsync(this.side, doc) @@ -326,21 +326,21 @@ describe('Prep', function() { doc.docType.should.equal('file') }) - it('does nothing for ignored paths on local', async function() { + it('does nothing for ignored paths on local', async function () { let doc = { path: 'ignored' } await this.prep.deleteFileAsync('local', doc) this.merge.deleteFileAsync.called.should.be.false() }) }) - describe('deleteFolder', function() { - it('expects a doc with a valid path', async function() { + describe('deleteFolder', function () { + it('expects a doc with a valid path', async function () { await should( this.prep.deleteFolderAsync(this.side, { path: '/' }) ).be.rejectedWith('Invalid path') }) - it('calls Merge with the correct fields', async function() { + it('calls Merge with the correct fields', async function () { this.merge.deleteFolderAsync.resolves() let doc = { path: 'kill/folder' } await this.prep.deleteFolderAsync(this.side, doc) @@ -348,7 +348,7 @@ describe('Prep', function() { doc.docType.should.equal('folder') }) - it('does nothing for ignored paths on local', async function() { + it('does nothing for ignored paths on local', async function () { let doc = { path: 'ignored' } await this.prep.deleteFolderAsync('local', doc) this.merge.deleteFolderAsync.called.should.be.false() @@ -357,15 +357,16 @@ describe('Prep', function() { }) describe('trashFileAsync', () => { - it('throws when the trashed path is invalid', async function() { + it('throws when the trashed path is invalid', async function () { const doc = { path: '/' } - return this.prep - .trashFileAsync(this.side, doc) - .then(() => should.fail(), err => err.should.match(/Invalid path/)) + return this.prep.trashFileAsync(this.side, doc).then( + () => should.fail(), + err => err.should.match(/Invalid path/) + ) }) - it('calls Merge with the trashed record when none is passed', async function() { + it('calls Merge with the trashed record when none is passed', async function () { const was = { path: 'file-to-be-trashed', md5sum: 'rcg7GeeTSRscbqD9i0bNnw==' @@ -379,7 +380,7 @@ describe('Prep', function() { }) // FIXME - xit('does nothing for ignored paths on local', async function() { + xit('does nothing for ignored paths on local', async function () { const doc = { path: 'ignored' } await this.prep.trashFileAsync(this.side, doc) @@ -389,15 +390,16 @@ describe('Prep', function() { }) describe('trashFolderAsync', () => { - it('throws when the trashed path is invalid', async function() { + it('throws when the trashed path is invalid', async function () { const doc = { path: '/' } - return this.prep - .trashFolderAsync(this.side, doc) - .then(() => should.fail(), err => err.should.match(/Invalid path/)) + return this.prep.trashFolderAsync(this.side, doc).then( + () => should.fail(), + err => err.should.match(/Invalid path/) + ) }) - it('calls Merge with the trashed record when none is passed', async function() { + it('calls Merge with the trashed record when none is passed', async function () { const was = { path: 'folder-to-be-trashed' } await this.prep.trashFolderAsync(this.side, was) @@ -408,7 +410,7 @@ describe('Prep', function() { }) // FIXME - xit('does nothing for ignored paths on local', async function() { + xit('does nothing for ignored paths on local', async function () { const doc = { path: 'ignored' } await this.prep.trashFolderAsync(this.side, doc) diff --git a/test/unit/regressions/850.js b/test/unit/regressions/850.js index ffc979158..feefeebd2 100644 --- a/test/unit/regressions/850.js +++ b/test/unit/regressions/850.js @@ -24,17 +24,17 @@ const Builders = require('../../support/builders') const stubSide = require('../../support/doubles/side') onPlatform('darwin', () => { - describe('issue 850', function() { + describe('issue 850', function () { this.timeout(10000) let builders before('instanciate config', configHelpers.createConfig) before('instanciate pouch', pouchHelpers.createDatabase) - before('prepare builders', function() { + before('prepare builders', function () { builders = new Builders({ pouch: this.pouch }) }) - before('instanciate local watcher', function() { + before('instanciate local watcher', function () { this.merge = new Merge(this.pouch) this.local = stubSide('local') this.remote = stubSide('remote') @@ -60,7 +60,7 @@ onPlatform('darwin', () => { this.events ) }) - after('stop watcher and clean path', async function() { + after('stop watcher and clean path', async function () { this.watcher.stop(true) this.watcher.checksumer.kill() await fse.emptyDir(this.syncPath) @@ -68,20 +68,15 @@ onPlatform('darwin', () => { after('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - before('create dst dir', async function() { + before('create dst dir', async function () { const dirPath = path.join(this.syncPath, 'dst') await fse.mkdirp(dirPath) const stat = await fse.stat(dirPath) - await builders - .metadir() - .path(dirPath) - .ino(stat.ino) - .upToDate() - .create() + await builders.metadir().path(dirPath).ino(stat.ino).upToDate().create() await this.sync.sync() }) - it('is fixed', async function() { + it('is fixed', async function () { let filePath = path.join(this.syncPath, 'file') let dstPath = path.join(this.syncPath, 'dst', 'file') await fse.outputFile(filePath, 'whatever') @@ -115,12 +110,7 @@ onPlatform('darwin', () => { _rev: '1-fakeRev' } return metadata.fromRemoteDoc( - builders - .remoteFile() - .inRootDir() - .name('file') - .size('8') - .build() + builders.remoteFile().inRootDir().name('file').size('8').build() ) } diff --git a/test/unit/remote/change.js b/test/unit/remote/change.js index 5d6536357..be40a6d41 100644 --- a/test/unit/remote/change.js +++ b/test/unit/remote/change.js @@ -387,21 +387,12 @@ describe('sorter()', () => { }, { type: 'FileTrashing', - doc: builders - .metafile() - .path(deletedPath) - .build(), - was: builders - .metafile() - .path(createdPath) - .build() + doc: builders.metafile().path(deletedPath).build(), + was: builders.metafile().path(createdPath).build() }, { type: 'FileAddition', - doc: builders - .metafile() - .path(createdPath) - .build() + doc: builders.metafile().path(createdPath).build() } ] @@ -922,26 +913,17 @@ describe('sortByPath', () => { const one = { type: 'IgnoredChange', doc: { _id: 'whatever', _rev: '2-xxx', _deleted: true }, - was: builders - .metafile() - .path('spreadsheet') - .build(), + was: builders.metafile().path('spreadsheet').build(), detail: 'Deleted document' } const two = { - doc: builders - .metafile() - .path('doc') - .build(), + doc: builders.metafile().path('doc').build(), type: 'FileAddition' } const three = { type: 'IgnoredChange', doc: { _id: 'whatever', _rev: '2-xxx', _deleted: true }, - was: builders - .metadir() - .path('dir') - .build(), + was: builders.metadir().path('dir').build(), detail: 'Deleted document' } diff --git a/test/unit/remote/cozy.js b/test/unit/remote/cozy.js index 8234113cd..99dd62a82 100644 --- a/test/unit/remote/cozy.js +++ b/test/unit/remote/cozy.js @@ -40,7 +40,7 @@ const CHROMIUM_ERROR = new electronFetch.FetchError( new Error('mojo result not ok') ) -describe('RemoteCozy', function() { +describe('RemoteCozy', function () { before(() => cozyStackDouble.start()) beforeEach(deleteAll) before('instanciate config', configHelpers.createConfig) @@ -51,7 +51,7 @@ describe('RemoteCozy', function() { let remoteCozy - beforeEach(function() { + beforeEach(function () { this.config.cozyUrl = COZY_URL remoteCozy = new RemoteCozy(this.config) // Use real OAuth client @@ -93,10 +93,7 @@ describe('RemoteCozy', function() { describe('createFile', () => { context('when the name starts or ends with a space', () => { it('creates the file with the given name', async () => { - const data = builders - .stream() - .push('') - .build() + const data = builders.stream().push('').build() const checksum = builders.checksum('').build() should( @@ -137,11 +134,7 @@ describe('RemoteCozy', function() { }) it('rejects with a 409 FetchError if a doc with the same path exists', async () => { - await builders - .remoteDir() - .inRootDir() - .name('foo') - .create() + await builders.remoteDir().inRootDir().name('foo').create() stubFetch() await should( @@ -164,22 +157,16 @@ describe('RemoteCozy', function() { stubFetch() await should( - remoteCozy.createFile( - builders - .stream() - .push(data) - .build(), - { - name: 'foo', - dirID: ROOT_DIR_ID, - contentType: 'text/plain', - contentLength: data.length - 1, - checksum, - executable: false, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString() - } - ) + remoteCozy.createFile(builders.stream().push(data).build(), { + name: 'foo', + dirID: ROOT_DIR_ID, + contentType: 'text/plain', + contentLength: data.length - 1, + checksum, + executable: false, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }) ).be.rejectedWith(FetchError, { status: 412 }) }) @@ -189,22 +176,16 @@ describe('RemoteCozy', function() { stubFetch() await should( - remoteCozy.createFile( - builders - .stream() - .push(data) - .build(), - { - name: 'foo', - dirID: ROOT_DIR_ID, - contentType: 'text/plain', - contentLength: data.length + 1, - checksum, - executable: false, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString() - } - ) + remoteCozy.createFile(builders.stream().push(data).build(), { + name: 'foo', + dirID: ROOT_DIR_ID, + contentType: 'text/plain', + contentLength: data.length + 1, + checksum, + executable: false, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }) ).be.rejectedWith(FetchError, { status: 412 }) }) @@ -251,22 +232,16 @@ describe('RemoteCozy', function() { stubFetch() await should( - remoteCozy.createFile( - builders - .stream() - .push(data) - .build(), - { - name: 'foo', - dirID: ROOT_DIR_ID, - contentType: 'text/plain', - contentLength: data.length, - checksum: 'md5sum', // Force a request failure with a bad checksum - executable: false, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString() - } - ) + remoteCozy.createFile(builders.stream().push(data).build(), { + name: 'foo', + dirID: ROOT_DIR_ID, + contentType: 'text/plain', + contentLength: data.length, + checksum: 'md5sum', // Force a request failure with a bad checksum + executable: false, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }) ).be.rejectedWith(CHROMIUM_ERROR) }) }) @@ -300,10 +275,7 @@ describe('RemoteCozy', function() { .data('initial content') .create() - const data = builders - .stream() - .push('') - .build() + const data = builders.stream().push('').build() const checksum = builders.checksum('').build() should( @@ -386,48 +358,31 @@ describe('RemoteCozy', function() { }) }) - describe('changes', function() { - context('when no seq given', function() { + describe('changes', function () { + context('when no seq given', function () { // XXX: This test might timeout if a lot of changes were made on the // remote Cozy as we're doing an initial fetch here and thus cannot speed // it up by ignoring the previous changes. - it('resolves only with non trashed, non deleted docs', async function() { + it('resolves only with non trashed, non deleted docs', async function () { const dir = await builders.remoteDir().create() - const file = await builders - .remoteFile() - .inDir(dir) - .create() - const deletedFile = await builders - .remoteFile() - .inDir(dir) - .create() + const file = await builders.remoteFile().inDir(dir).create() + const deletedFile = await builders.remoteFile().inDir(dir).create() await builders.remoteErased(deletedFile).create() - const trashedFile = await builders - .remoteFile() - .inDir(dir) - .create() - await builders - .remoteFile(trashedFile) - .trashed() - .update() + const trashedFile = await builders.remoteFile().inDir(dir).create() + await builders.remoteFile(trashedFile).trashed().update() const { docs } = await remoteCozy.changes() const ids = docs.map(doc => doc._id) - should(ids) - .containDeep([dir._id, file._id]) - .and.have.length(2) + should(ids).containDeep([dir._id, file._id]).and.have.length(2) }) }) - it('resolves with changes since the given seq', async function() { + it('resolves with changes since the given seq', async function () { const last_seq = await remoteCozy.fetchLastSeq() const dir = await builders.remoteDir().create() - const file = await builders - .remoteFile() - .inDir(dir) - .create() + const file = await builders.remoteFile().inDir(dir).create() const { docs } = await remoteCozy.changes(last_seq) const ids = docs.map(doc => doc._id) @@ -435,24 +390,16 @@ describe('RemoteCozy', function() { should(ids.sort()).eql([file._id, dir._id].sort()) }) - it('resolves with docs ordered by path asc', async function() { + it('resolves with docs ordered by path asc', async function () { const last_seq = await remoteCozy.fetchLastSeq() - const dirB = await builders - .remoteDir() - .inRootDir() - .name('dirB') - .create() + const dirB = await builders.remoteDir().inRootDir().name('dirB').create() const fileB = await builders .remoteFile() .inRootDir() .name('fileB') .create() - const dirA = await builders - .remoteDir() - .inRootDir() - .name('dirA') - .create() + const dirA = await builders.remoteDir().inRootDir().name('dirA').create() const fileA = await builders .remoteFile() .inDir(dirA) @@ -464,7 +411,7 @@ describe('RemoteCozy', function() { should(docs).containDeepOrdered([dirA, fileA, dirB, fileB]) }) - it('does not swallow errors', function() { + it('does not swallow errors', function () { this.config.cozyUrl = cozyStackDouble.url() const remoteCozy = new RemoteCozy(this.config) @@ -523,8 +470,8 @@ describe('RemoteCozy', function() { }) }) - describe('find', function() { - it('fetches a remote directory matching the given id', async function() { + describe('find', function () { + it('fetches a remote directory matching the given id', async function () { const remoteDir = await builders.remoteDir().create() const foundDir = await remoteCozy.find(remoteDir._id) @@ -532,7 +479,7 @@ describe('RemoteCozy', function() { foundDir.should.be.deepEqual(remoteDir) }) - it('fetches a remote root file including its path', async function() { + it('fetches a remote root file including its path', async function () { const remoteFile = await builders .remoteFile() .inRootDir() @@ -544,7 +491,7 @@ describe('RemoteCozy', function() { foundFile.should.deepEqual(_.defaults({ path: '/foo' }, remoteFile)) }) - it('fetches a remote non-root file including its path', async function() { + it('fetches a remote non-root file including its path', async function () { const remoteDir = await builders .remoteDir() .name('foo') @@ -562,8 +509,8 @@ describe('RemoteCozy', function() { }) }) - describe('findMaybe', function() { - it('does the same as find() when file or directory exists', async function() { + describe('findMaybe', function () { + it('does the same as find() when file or directory exists', async function () { const remoteDir = await builders.remoteDir().create() const foundDir = await remoteCozy.findMaybe(remoteDir._id) @@ -571,30 +518,22 @@ describe('RemoteCozy', function() { foundDir.should.deepEqual(remoteDir) }) - it('returns null when file or directory is not found', async function() { + it('returns null when file or directory is not found', async function () { const found = await remoteCozy.findMaybe('missing') should.not.exist(found) }) }) - describe('isNameTaken', function() { + describe('isNameTaken', function () { it('returns true when a doc with the given name exists in the given directory', async () => { const remoteDir = await builders .remoteDir() .name('foo') .inRootDir() .create() - await builders - .remoteFile() - .name('bar') - .inDir(remoteDir) - .create() - await builders - .remoteDir() - .name('baz') - .inDir(remoteDir) - .create() + await builders.remoteFile().name('bar').inDir(remoteDir).create() + await builders.remoteDir().name('baz').inDir(remoteDir).create() await should( remoteCozy.isNameTaken({ name: 'bar', dir_id: remoteDir._id }) @@ -622,10 +561,7 @@ describe('RemoteCozy', function() { .name('foo') .inRootDir() .create() - await builders - .remoteFile() - .name('bar') - .create() + await builders.remoteFile().name('bar').create() await should( remoteCozy.isNameTaken({ name: 'bar', dir_id: remoteDir._id }) @@ -633,13 +569,10 @@ describe('RemoteCozy', function() { }) }) - describe('findDirectoryByPath', function() { - it('resolves when the directory exists remotely', async function() { + describe('findDirectoryByPath', function () { + it('resolves when the directory exists remotely', async function () { const dir = await builders.remoteDir().create() - const subdir = await builders - .remoteDir() - .inDir(dir) - .create() + const subdir = await builders.remoteDir().inDir(dir).create() const foundDir = await remoteCozy.findDirectoryByPath(dir.path) should(foundDir).have.properties(dir) @@ -648,12 +581,8 @@ describe('RemoteCozy', function() { should(foundSubdir).have.properties(subdir) }) - it('rejects when the directory does not exist remotely', async function() { - await builders - .remoteFile() - .name('existing') - .inRootDir() - .create() + it('rejects when the directory does not exist remotely', async function () { + await builders.remoteFile().name('existing').inRootDir().create() for (let path of ['/missing', '/existing/missing']) { await remoteCozy @@ -662,12 +591,8 @@ describe('RemoteCozy', function() { } }) - it('rejects when the path matches a file', async function() { - await builders - .remoteFile() - .name('foo') - .inRootDir() - .create() + it('rejects when the path matches a file', async function () { + await builders.remoteFile().name('foo').inRootDir().create() await remoteCozy .findDirectoryByPath('/foo') @@ -676,7 +601,7 @@ describe('RemoteCozy', function() { }) describe('trashById', () => { - it('resolves with a RemoteDoc representing the newly trashed item', async function() { + it('resolves with a RemoteDoc representing the newly trashed item', async function () { const orig = await builders .remoteFile() .createdAt(2017, 1, 1, 1, 1, 1) @@ -701,50 +626,38 @@ describe('RemoteCozy', function() { }) describe('isEmpty', () => { - it('is true when the folder with the given id is empty', async function() { + it('is true when the folder with the given id is empty', async function () { const dir = await builders.remoteDir().create() should(await remoteCozy.isEmpty(dir._id)).be.true() - const subdir = await builders - .remoteDir() - .inDir(dir) - .create() + const subdir = await builders.remoteDir().inDir(dir).create() should(await remoteCozy.isEmpty(dir._id)).be.false() should(await remoteCozy.isEmpty(subdir._id)).be.true() - await builders - .remoteFile() - .inDir(dir) - .create() + await builders.remoteFile().inDir(dir).create() should(await remoteCozy.isEmpty(dir._id)).be.false() should(await remoteCozy.isEmpty(subdir._id)).be.true() - await builders - .remoteFile() - .inDir(subdir) - .create() + await builders.remoteFile().inDir(subdir).create() should(await remoteCozy.isEmpty(dir._id)).be.false() should(await remoteCozy.isEmpty(subdir._id)).be.false() }) - it('rejects when given a file id', async function() { + it('rejects when given a file id', async function () { const file = await builders.remoteFile().create() await should(remoteCozy.isEmpty(file._id)).be.rejectedWith(/wrong type/) }) - it('rejects when no document matches the id', async function() { + it('rejects when no document matches the id', async function () { await should(remoteCozy.isEmpty('missing')).be.rejectedWith({ status: 404 }) }) }) - describe('downloadBinary', function() { - it('resolves with a Readable stream of the file content', async function() { - const remoteFile = await builders - .remoteFile() - .data('foo') - .create() + describe('downloadBinary', function () { + it('resolves with a Readable stream of the file content', async function () { + const remoteFile = await builders.remoteFile().data('foo').create() const stream = await remoteCozy.downloadBinary(remoteFile._id) @@ -759,7 +672,7 @@ describe('RemoteCozy', function() { }) describe('#warnings()', () => { - beforeEach(function() { + beforeEach(function () { this.config.cozyUrl = cozyStackDouble.url() remoteCozy = new RemoteCozy(this.config) }) @@ -812,7 +725,7 @@ describe('RemoteCozy', function() { }) describe('#capabilities', () => { - beforeEach(async function() { + beforeEach(async function () { this.config.cozyUrl = cozyStackDouble.url() remoteCozy = new RemoteCozy(this.config) remoteCozy.client.oauth = true @@ -864,7 +777,7 @@ describe('RemoteCozy', function() { }) describe('#getDirectoryContent', () => { - beforeEach(function() { + beforeEach(function () { remoteCozy.client = new OldCozyClient({ cozyURL: this.config.cozyUrl, token: process.env.COZY_STACK_TOKEN @@ -895,10 +808,7 @@ describe('RemoteCozy', function() { }) it('does not fail on an empty directory', async () => { - const dir = await builders - .remoteDir() - .name('dir') - .create() + const dir = await builders.remoteDir().name('dir').create() await should(remoteCozy.getDirectoryContent(dir)).be.fulfilledWith([]) }) @@ -941,7 +851,7 @@ describe('RemoteCozy.newClient', () => { afterEach('clean config directory', configHelpers.cleanConfig) let webappCozy - beforeEach(function() { + beforeEach(function () { webappCozy = new RemoteCozy(this.config) webappCozy.client = cozyHelpers.cozy }) @@ -957,7 +867,7 @@ describe('RemoteCozy.newClient', () => { afterEach('clean config directory', configHelpers.cleanConfig) let oauthCozy - beforeEach(async function() { + beforeEach(async function () { oauthCozy = new RemoteCozy(this.config) oauthCozy.client = await cozyHelpers.oauthCozy(this.config) }) @@ -967,7 +877,7 @@ describe('RemoteCozy.newClient', () => { }) context('when the client was not authorized yet', () => { - it('handles OAuth cozy-client-js clients without credentials', async function() { + it('handles OAuth cozy-client-js clients without credentials', async function () { oauthCozy.client = new OldCozyClient({ cozyURL: this.config.cozyUrl, oauth: { diff --git a/test/unit/remote/index.js b/test/unit/remote/index.js index 5a78c3569..e403d574a 100644 --- a/test/unit/remote/index.js +++ b/test/unit/remote/index.js @@ -30,16 +30,16 @@ import type { RemoteDoc, RemoteJsonDoc } from '../../../core/remote/document' */ const CHAT_MIGNON_MOD_PATH = 'test/fixtures/chat-mignon-mod.jpg' -describe('remote.Remote', function() { +describe('remote.Remote', function () { let builders, couchdbFolder before('instanciate config', configHelpers.createConfig) before('register OAuth client', configHelpers.registerClient) beforeEach('instanciate pouch', pouchHelpers.createDatabase) - beforeEach('prepare builders', function() { + beforeEach('prepare builders', function () { builders = new Builders({ cozy, pouch: this.pouch }) }) - beforeEach('instanciate remote', function() { + beforeEach('instanciate remote', function () { this.prep = sinon.createStubInstance(Prep) this.events = new EventEmitter() this.remote = new remote.Remote(this) @@ -49,34 +49,30 @@ describe('remote.Remote', function() { this.remote.remoteCozy.client = cozy }) beforeEach(deleteAll) - beforeEach('create the couchdb folder', async function() { + beforeEach('create the couchdb folder', async function () { couchdbFolder = await builders .remoteDir() .name('couchdb-folder') .inRootDir() .create() - await builders - .metadir() - .fromRemote(couchdbFolder) - .upToDate() - .create() + await builders.metadir().fromRemote(couchdbFolder).upToDate().create() }) afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) describe('constructor', () => { - it('has a remoteCozy and a watcher', function() { + it('has a remoteCozy and a watcher', function () { should.exist(this.remote.remoteCozy) should.exist(this.remote.watcher) }) - it('has a side name', function() { + it('has a side name', function () { should(this.remote.name).eql('remote') }) }) describe('createReadStream', () => { - it('create a readable stream from a remote binary', async function() { + it('create a readable stream from a remote binary', async function () { const expectedChecksum = '2NqmrnZqa1zTER40NtPGJg==' const fixture = 'test/fixtures/cool-pillow.jpg' @@ -98,13 +94,13 @@ describe('remote.Remote', function() { }) }) - describe('addFileAsync', function() { + describe('addFileAsync', function () { let image before('read image', async () => { image = await fse.readFile(CHAT_MIGNON_MOD_PATH) }) - it('adds a file to the remote Cozy', async function() { + it('adds a file to the remote Cozy', async function () { const doc = await builders .metafile() .path('cat2.jpg') @@ -138,7 +134,7 @@ describe('remote.Remote', function() { ) }) - it('fails if the md5sum does not match the content', async function() { + it('fails if the md5sum does not match the content', async function () { const doc = await builders .metafile() .path('cat2b.jpg') @@ -160,7 +156,7 @@ describe('remote.Remote', function() { }) }) - it('does not throw if the file does not exists locally anymore', async function() { + it('does not throw if the file does not exists locally anymore', async function () { const doc /*: Metadata */ = builders .metafile() .path('foo') @@ -172,12 +168,10 @@ describe('remote.Remote', function() { } } await this.remote.addFileAsync(doc) - should(doc) - .have.property('trashed') - .and.not.have.property('remote') + should(doc).have.property('trashed').and.not.have.property('remote') }) - it('rejects with a DirectoryNotFound error if its parent is missing on the Cozy', async function() { + it('rejects with a DirectoryNotFound error if its parent is missing on the Cozy', async function () { const doc /*: Metadata */ = builders .metafile() .path('dir/foo') @@ -194,7 +188,7 @@ describe('remote.Remote', function() { ) }) - it('rejects if there is not enough space on the Cozy', async function() { + it('rejects if there is not enough space on the Cozy', async function () { sinon .stub(this.remote.remoteCozy, 'createFile') .rejects( @@ -229,7 +223,7 @@ describe('remote.Remote', function() { }) describe('addFolderAsync', () => { - it('adds a folder on the remote Cozy', async function() { + it('adds a folder on the remote Cozy', async function () { const doc = builders .metadir() .path('folder-1') @@ -252,7 +246,7 @@ describe('remote.Remote', function() { ) }) - it('throws an error if a conflicting folder exists', async function() { + it('throws an error if a conflicting folder exists', async function () { const remoteDir = await builders .remoteDir() .inRootDir() @@ -269,7 +263,7 @@ describe('remote.Remote', function() { await should(this.remote.addFolderAsync(doc)).be.rejectedWith(/Conflict/) }) - it('throws an error if the parent folder is missing', async function() { + it('throws an error if the parent folder is missing', async function () { const doc /*: Metadata */ = builders .metadir() .path(path.join('foo', 'bar', 'qux')) @@ -283,8 +277,8 @@ describe('remote.Remote', function() { if (process.platform === 'win32' && process.env.CI) { it.skip('overwrites the binary content (unstable on AppVeyor)', () => {}) } else { - describe('overwriteFileAsync', function() { - it('overwrites the binary content', async function() { + describe('overwriteFileAsync', function () { + it('overwrites the binary content', async function () { const created = await builders .remoteFile() .data('foo') @@ -307,10 +301,7 @@ describe('remote.Remote', function() { this.remote.other = { createReadStreamAsync(localDoc) { localDoc.should.equal(doc) - const stream = builders - .stream() - .push('bar') - .build() + const stream = builders.stream().push('bar').build() return Promise.resolve(stream) } } @@ -330,11 +321,8 @@ describe('remote.Remote', function() { should(doc.remote._rev).equal(file._rev) }) - it('throws an error if the checksum is invalid', async function() { - const created = await builders - .remoteFile() - .data('foo') - .create() + it('throws an error if the checksum is invalid', async function () { + const created = await builders.remoteFile().data('foo').create() const old = await builders .metafile() .fromRemote(created) @@ -349,10 +337,7 @@ describe('remote.Remote', function() { this.remote.other = { createReadStreamAsync() { - const stream = builders - .stream() - .push('bar') - .build() + const stream = builders.stream().push('bar').build() return Promise.resolve(stream) } } @@ -367,7 +352,7 @@ describe('remote.Remote', function() { }) }) - it('does not throw if the file does not exists locally anymore', async function() { + it('does not throw if the file does not exists locally anymore', async function () { const doc /*: Metadata */ = builders .metafile() .path('foo') @@ -385,7 +370,7 @@ describe('remote.Remote', function() { .and.not.have.propertyByPath('remote') }) - it('sends a request if the file is a Cozy Note', async function() { + it('sends a request if the file is a Cozy Note', async function () { const created = await builders .remoteNote() .name('My Note.cozy-note') @@ -407,10 +392,7 @@ describe('remote.Remote', function() { this.remote.other = { createReadStreamAsync(localDoc) { should(localDoc).deepEqual(doc) - const stream = builders - .stream() - .push('bar') - .build() + const stream = builders.stream().push('bar').build() return Promise.resolve(stream) } } @@ -432,7 +414,7 @@ describe('remote.Remote', function() { ) }) - it('rejects if there is not enough space on the Cozy', async function() { + it('rejects if there is not enough space on the Cozy', async function () { sinon .stub(this.remote.remoteCozy, 'updateFileById') .rejects( @@ -461,10 +443,7 @@ describe('remote.Remote', function() { this.remote.other = { createReadStreamAsync(localDoc) { localDoc.should.equal(doc) - const stream = builders - .stream() - .push('bar') - .build() + const stream = builders.stream().push('bar').build() return Promise.resolve(stream) } } @@ -479,7 +458,7 @@ describe('remote.Remote', function() { } }) - it('sends the most recent modification date', async function() { + it('sends the most recent modification date', async function () { const created = await builders .remoteFile() .data('foo') @@ -504,10 +483,7 @@ describe('remote.Remote', function() { this.remote.other = { createReadStreamAsync(localDoc) { localDoc.should.equal(doc1) - const stream = builders - .stream() - .push('bar') - .build() + const stream = builders.stream().push('bar').build() return Promise.resolve(stream) } } @@ -533,10 +509,7 @@ describe('remote.Remote', function() { this.remote.other = { createReadStreamAsync(localDoc) { localDoc.should.equal(doc2) - const stream = builders - .stream() - .push('baz') - .build() + const stream = builders.stream().push('baz').build() return Promise.resolve(stream) } } @@ -574,10 +547,7 @@ describe('remote.Remote', function() { this.remote.other = { createReadStreamAsync(localDoc) { localDoc.should.equal(doc3) - const stream = builders - .stream() - .push('boom') - .build() + const stream = builders.stream().push('boom').build() return Promise.resolve(stream) } } @@ -594,11 +564,8 @@ describe('remote.Remote', function() { } describe('updateFileMetadataAsync', () => { - it('makes the remote file executable when the local one was made too', async function() { - const oldRemote = await builders - .remoteFile() - .executable(false) - .create() + it('makes the remote file executable when the local one was made too', async function () { + const oldRemote = await builders.remoteFile().executable(false).create() const doc = builders .metafile() .fromRemote(oldRemote) @@ -608,20 +575,15 @@ describe('remote.Remote', function() { await this.remote.updateFileMetadataAsync(doc) - should(doc) - .have.propertyByPath('remote', '_rev') - .not.eql(oldRemote._rev) + should(doc).have.propertyByPath('remote', '_rev').not.eql(oldRemote._rev) const newRemote = await cozy.files.statById(oldRemote._id) should(newRemote) .have.propertyByPath('attributes', 'executable') .eql(true) }) - it('makes the remote file non-executable when the local one is not anymore', async function() { - const oldRemote = await builders - .remoteFile() - .executable(true) - .create() + it('makes the remote file non-executable when the local one is not anymore', async function () { + const oldRemote = await builders.remoteFile().executable(true).create() const doc = builders .metafile() .fromRemote(oldRemote) @@ -631,20 +593,15 @@ describe('remote.Remote', function() { await this.remote.updateFileMetadataAsync(doc) - should(doc) - .have.propertyByPath('remote', '_rev') - .not.eql(oldRemote._rev) + should(doc).have.propertyByPath('remote', '_rev').not.eql(oldRemote._rev) const newRemote = await cozy.files.statById(oldRemote._id) should(newRemote) .have.propertyByPath('attributes', 'executable') .eql(false) }) - it('updates the last modification date of the remote file', async function() { - const dir = await builders - .remoteDir() - .name('dir') - .create() + it('updates the last modification date of the remote file', async function () { + const dir = await builders.remoteDir().name('dir').create() const created = await builders .remoteFile() .name('file-7') @@ -673,8 +630,8 @@ describe('remote.Remote', function() { }) }) - describe('updateFolder', function() { - it('updates the metadata of a folder', async function() { + describe('updateFolder', function () { + it('updates the metadata of a folder', async function () { const created = await builders .remoteDir() .inRootDir() @@ -706,7 +663,7 @@ describe('remote.Remote', function() { }) }) - it('throws an error if the directory does not exist', async function() { + it('throws an error if the directory does not exist', async function () { const deletedDir = await builders .remoteDir() .name('deleted-dir') @@ -725,7 +682,7 @@ describe('remote.Remote', function() { ) }) - it('throws an error if it has no remote info', async function() { + it('throws an error if it has no remote info', async function () { const remoteDir = await builders .remoteDir() .name('foo') @@ -761,11 +718,7 @@ describe('remote.Remote', function() { .name('moved-to') .inRootDir() .create() - await builders - .metadir() - .fromRemote(newDir) - .upToDate() - .create() + await builders.metadir().fromRemote(newDir).upToDate().create() const remoteDoc = await builders .remoteFile() .name('cat6.jpg') @@ -783,7 +736,7 @@ describe('remote.Remote', function() { .build() }) - it('moves the file', async function() { + it('moves the file', async function () { await this.remote.moveAsync(doc, old) const file = await cozy.files.statById(doc.remote._id) @@ -803,8 +756,8 @@ describe('remote.Remote', function() { }) }) - context('with a folder', function() { - it('moves the folder in the Cozy', async function() { + context('with a folder', function () { + it('moves the folder in the Cozy', async function () { const created = await builders .remoteDir() .name('folder-4') @@ -868,11 +821,8 @@ describe('remote.Remote', function() { .create() }) - it('moves the file on the Cozy', async function() { - const old = builders - .metafile(file) - .changedSide('local') - .build() + it('moves the file on the Cozy', async function () { + const old = builders.metafile(file).changedSide('local').build() const doc = builders .metafile() .moveFrom(old) @@ -896,7 +846,7 @@ describe('remote.Remote', function() { } ) - context('when overwriting an existing file', function() { + context('when overwriting an existing file', function () { const existingRefs = [{ _id: 'blah', _type: 'io.cozy.photos.albums' }] let existingRemote @@ -911,11 +861,7 @@ describe('remote.Remote', function() { .name('moved-to') .inRootDir() .create() - await builders - .metadir() - .fromRemote(newDir) - .upToDate() - .create() + await builders.metadir().fromRemote(newDir).upToDate().create() existingRemote = await builders .remoteFile() @@ -930,11 +876,7 @@ describe('remote.Remote', function() { .name('cat6.jpg') .data('meow') .create() - old = await builders - .metafile() - .fromRemote(remote2) - .upToDate() - .create() + old = await builders.metafile().fromRemote(remote2).upToDate().create() }) const saveMetadata = async () => { @@ -956,7 +898,7 @@ describe('remote.Remote', function() { .build() } - it('moves the file', async function() { + it('moves the file', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -979,7 +921,7 @@ describe('remote.Remote', function() { ) }) - it('trashes the existing file at target location', async function() { + it('trashes the existing file at target location', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -989,7 +931,7 @@ describe('remote.Remote', function() { .be.true() }) - it('transfers the existing file references to the moved one', async function() { + it('transfers the existing file references to the moved one', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -999,7 +941,7 @@ describe('remote.Remote', function() { .eql(existingRefs.map(ref => ({ id: ref._id, type: ref._type }))) }) - it('updates the remote attribute', async function() { + it('updates the remote attribute', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -1021,7 +963,7 @@ describe('remote.Remote', function() { .update() }) - it('successfuly moves the file', async function() { + it('successfuly moves the file', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -1038,7 +980,7 @@ describe('remote.Remote', function() { }) }) - it('transfers the existing file references to the moved one', async function() { + it('transfers the existing file references to the moved one', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -1050,11 +992,11 @@ describe('remote.Remote', function() { }) context('when the overwritten file does not exist anymore', () => { - beforeEach(async function() { + beforeEach(async function () { await cozy.files.destroyById(existingRemote._id) }) - it('successfuly moves the file', async function() { + it('successfuly moves the file', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -1071,7 +1013,7 @@ describe('remote.Remote', function() { }) }) - it('does not transfer the deleted file references', async function() { + it('does not transfer the deleted file references', async function () { await saveMetadata() await this.remote.moveAsync(doc, old) @@ -1085,7 +1027,7 @@ describe('remote.Remote', function() { }) describe('trash', () => { - it('moves the file or folder to the Cozy trash', async function() { + it('moves the file or folder to the Cozy trash', async function () { const folder = await builders.remoteDir().create() const doc = builders .metadir() @@ -1101,7 +1043,7 @@ describe('remote.Remote', function() { .eql(TRASH_DIR_ID) }) - it('does nothing when file or folder does not exist anymore', async function() { + it('does nothing when file or folder does not exist anymore', async function () { const folder = await builders.remoteDir().build() const doc = builders .metadir() @@ -1118,7 +1060,7 @@ describe('remote.Remote', function() { }) describe('assignNewRemote', () => { - it('updates the remote attribute of a moved document', async function() { + it('updates the remote attribute of a moved document', async function () { const remoteSrc = await builders .remoteDir() .name('src-dir') @@ -1129,21 +1071,13 @@ describe('remote.Remote', function() { .name('foo') .inDir(remoteSrc) .create() - const file = builders - .metafile() - .fromRemote(remoteFile) - .upToDate() - .build() + const file = builders.metafile().fromRemote(remoteFile).upToDate().build() const remoteDir = await builders .remoteDir() .name('foo-dir') .inDir(remoteSrc) .create() - const dir = builders - .metadir() - .fromRemote(remoteDir) - .upToDate() - .build() + const dir = builders.metadir().fromRemote(remoteDir).upToDate().build() await this.remote.remoteCozy.updateAttributesById(remoteSrc._id, { name: 'dst-dir' @@ -1168,19 +1102,19 @@ describe('remote.Remote', function() { }) describe('ping', () => { - beforeEach(function() { + beforeEach(function () { sinon.stub(this.remote.remoteCozy, 'diskUsage') }) - afterEach(function() { + afterEach(function () { this.remote.remoteCozy.diskUsage.restore() }) - it('resolves to true if we can successfuly fetch the remote disk usage', async function() { + it('resolves to true if we can successfuly fetch the remote disk usage', async function () { this.remote.remoteCozy.diskUsage.resolves() await should(this.remote.ping()).be.fulfilledWith(true) }) - it('resolves to false if we cannot successfuly fetch the remote disk usage', async function() { + it('resolves to false if we cannot successfuly fetch the remote disk usage', async function () { this.remote.remoteCozy.diskUsage.rejects() await should(this.remote.ping()).be.fulfilledWith(false) }) @@ -1188,11 +1122,8 @@ describe('remote.Remote', function() { describe('findDirectoryByPath', () => { let oldRemoteDir, newRemoteDir, oldDir, dir - beforeEach(async function() { - oldRemoteDir = await builders - .remoteDir() - .name('old') - .create() + beforeEach(async function () { + oldRemoteDir = await builders.remoteDir().name('old').create() oldDir = await builders .metadir() .fromRemote(oldRemoteDir) @@ -1204,13 +1135,10 @@ describe('remote.Remote', function() { .path('dir') .changedSide('local') .create() - newRemoteDir = await builders - .remoteDir() - .name('dir') - .create() + newRemoteDir = await builders.remoteDir().name('dir').create() }) - it('returns the directory metadata saved in PouchDB', async function() { + it('returns the directory metadata saved in PouchDB', async function () { await should(this.remote.findDirectoryByPath('dir')).be.fulfilledWith( dir.remote ) @@ -1224,7 +1152,7 @@ describe('remote.Remote', function() { }) }) - it('handles different local and remote paths formats', async function() { + it('handles different local and remote paths formats', async function () { // XXX: The synced path of this directory on Windows will be // `whatever\childDir` and since we search by synced path, this tests that // we handle the conversion. @@ -1239,7 +1167,7 @@ describe('remote.Remote', function() { ).be.fulfilledWith(childDir.remote) }) - it('returns the remote root directory for path .', async function() { + it('returns the remote root directory for path .', async function () { // $FlowFixMe Root is a directory const root /*: RemoteDir */ = remoteJsonToRemoteDoc( // XXX: We call the cozy-client-js method directly to increase the @@ -1256,35 +1184,24 @@ describe('remote.Remote', function() { }) }) - it('returns a DirectoryNotFound error if the directory cannot be found in PouchDB', async function() { - await builders - .remoteDir() - .name('missing') - .create() + it('returns a DirectoryNotFound error if the directory cannot be found in PouchDB', async function () { + await builders.remoteDir().name('missing').create() await should(this.remote.findDirectoryByPath('missing')).be.rejectedWith( DirectoryNotFound ) }) - it('returns a DirectoryNotFound error if the local document is not a directory', async function() { - await builders - .metafile() - .path('wrong-type') - .upToDate() - .create() + it('returns a DirectoryNotFound error if the local document is not a directory', async function () { + await builders.metafile().path('wrong-type').upToDate().create() await should( this.remote.findDirectoryByPath('wrong-type') ).be.rejectedWith(DirectoryNotFound) }) - it('returns a DirectoryNotFound error if the directory has no remote side', async function() { - await builders - .metadir() - .path('no-remote') - .sides({ local: 1 }) - .create() + it('returns a DirectoryNotFound error if the directory has no remote side', async function () { + await builders.metadir().path('no-remote').sides({ local: 1 }).create() await should( this.remote.findDirectoryByPath('no-remote') @@ -1294,11 +1211,8 @@ describe('remote.Remote', function() { describe('resolveConflict', () => { let remoteFile, file - beforeEach(async function() { - remoteFile = await builders - .remoteFile() - .name('file.txt') - .create() + beforeEach(async function () { + remoteFile = await builders.remoteFile().name('file.txt').create() file = await builders .metafile() .fromRemote(remoteFile) @@ -1306,24 +1220,21 @@ describe('remote.Remote', function() { .create() }) - it('fails if there are no remote documents with the given path', async function() { + it('fails if there are no remote documents with the given path', async function () { await this.remote.remoteCozy.destroyById(remoteFile._id) await should(this.remote.resolveConflict(file)).be.rejected() }) - it('renames the remote document with a conflict suffix', async function() { + it('renames the remote document with a conflict suffix', async function () { await this.remote.resolveConflict(file) should(await this.remote.remoteCozy.find(remoteFile._id)) .have.property('name') .match(CONFLICT_REGEXP) }) - it('fails with a 412 error if file changes on remote Cozy during the call', async function() { - await builders - .remoteFile(remoteFile) - .data('update') - .update() + it('fails with a 412 error if file changes on remote Cozy during the call', async function () { + await builders.remoteFile(remoteFile).data('update').update() await should(this.remote.resolveConflict(file)).be.rejectedWith({ name: 'FetchError', @@ -1333,9 +1244,9 @@ describe('remote.Remote', function() { }) }) -describe('remote', function() { +describe('remote', function () { describe('.dirAndName()', () => { - it('returns the remote path and name', function() { + it('returns the remote path and name', function () { should(remote.dirAndName('foo')).deepEqual(['.', 'foo']) should(remote.dirAndName(path.normalize('foo/bar'))).deepEqual([ 'foo', diff --git a/test/unit/remote/offline.js b/test/unit/remote/offline.js index 457c80ac8..067dae52b 100644 --- a/test/unit/remote/offline.js +++ b/test/unit/remote/offline.js @@ -21,11 +21,11 @@ import type { Metadata } from '../../../core/metadata' import type { RemoteDoc } from '../../../core/remote/document' */ -describe('Remote', function() { +describe('Remote', function () { before('instanciate config', configHelpers.createConfig) before('register OAuth client', configHelpers.registerClient) before('instanciate pouch', pouchHelpers.createDatabase) - before('instanciate remote', function() { + before('instanciate remote', function () { this.prep = sinon.createStubInstance(Prep) this.prep.config = this.config this.events = new EventEmitter() @@ -34,19 +34,15 @@ describe('Remote', function() { this.remote.remoteCozy.client = cozyHelpers.cozy }) beforeEach(cozyHelpers.deleteAll) - beforeEach('create the couchdb folder', async function() { - await builders - .remoteDir() - .name('couchdb-folder') - .inRootDir() - .create() + beforeEach('create the couchdb folder', async function () { + await builders.remoteDir().name('couchdb-folder').inRootDir().create() }) after('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) describe('offline management', () => { - it('The remote can be started when offline ', async function() { - sinon + it('The remote can be started when offline ', async function () { + const fetchStub = sinon .stub(global, 'fetch') .rejects(new FetchError('net::ERR_INTERNET_DISCONNECTED')) sinon.spy(this.events, 'emit') @@ -56,9 +52,8 @@ describe('Remote', function() { 'RemoteWatcher:error', { code: remoteErrors.UNREACHABLE_COZY_CODE } ) - - fetch.restore() - this.events.emit.reset() + fetchStub.restore() + this.events.emit.resetHistory() await this.remote.watcher.watch() should(this.events.emit).not.have.been.calledWith('RemoteWatcher:error') diff --git a/test/unit/remote/registration.js b/test/unit/remote/registration.js index 3125fcb03..f2e8a1877 100644 --- a/test/unit/remote/registration.js +++ b/test/unit/remote/registration.js @@ -6,22 +6,22 @@ const Registration = require('../../../core/remote/registration') const configHelpers = require('../../support/helpers/config') -describe('Registration', function() { +describe('Registration', function () { before('instanciate config', configHelpers.createConfig) after('clean config directory', configHelpers.cleanConfig) - before('create a registration', function() { + before('create a registration', function () { this.registration = new Registration(this.config.cozyUrl, this.config) }) - it('generates a unique device name', function() { + it('generates a unique device name', function () { const params = this.registration.clientParams({}) should(params.clientName).not.be.empty() const otherName = this.registration.clientParams({}).clientName should(params.clientName).should.not.equal(otherName) }) - it('configures correctly the OAuth client', function() { + it('configures correctly the OAuth client', function () { const pkg = { homepage: 'https//github.com/cozy-labs/cozy-desktop', logo: 'https://cozy.io/cozy-desktop.logo', diff --git a/test/unit/remote/watcher.js b/test/unit/remote/watcher.js index 6d2489a2b..e0a15f6c3 100644 --- a/test/unit/remote/watcher.js +++ b/test/unit/remote/watcher.js @@ -55,22 +55,14 @@ const saveTree = async (remoteTree, builders) => { for (const key in remoteTree) { const remoteDoc = remoteTree[key] if (remoteDoc.type === 'folder') { - await builders - .metadir() - .fromRemote(remoteDoc) - .upToDate() - .create() + await builders.metadir().fromRemote(remoteDoc).upToDate().create() } else { - await builders - .metafile() - .fromRemote(remoteDoc) - .upToDate() - .create() + await builders.metafile().fromRemote(remoteDoc).upToDate().create() } } } -describe('RemoteWatcher', function() { +describe('RemoteWatcher', function () { let builders, remoteTree /*: Object */ before('instanciate config', configHelpers.createConfig) @@ -88,7 +80,7 @@ describe('RemoteWatcher', function() { this.watcher = new RemoteWatcher(this) builders = new Builders({ cozy: cozyHelpers.cozy, pouch: this.pouch }) }) - beforeEach(async function() { + beforeEach(async function () { remoteTree = await builders.createRemoteTree([ 'my-folder/', 'my-folder/folder-1/', @@ -100,7 +92,7 @@ describe('RemoteWatcher', function() { ]) await saveTree(remoteTree, builders) }) - afterEach(function() { + afterEach(function () { this.watcher.stop() }) afterEach(function removeEventListeners() { @@ -110,7 +102,7 @@ describe('RemoteWatcher', function() { afterEach(cozyHelpers.deleteAll) after(configHelpers.cleanConfig) - describe('start', function() { + describe('start', function () { const fatalError = new remoteErrors.RemoteError({ code: remoteErrors.COZY_CLIENT_REVOKED_CODE, message: remoteErrors.COZY_CLIENT_REVOKED_MESSAGE, @@ -118,18 +110,18 @@ describe('RemoteWatcher', function() { }) const nonFatalError = new Error('from watch') - beforeEach(function() { + beforeEach(function () { sinon.stub(this.watcher, 'watch') sinon.spy(this.events, 'emit') this.watcher.watch.resolves() }) - afterEach(function() { + afterEach(function () { this.watcher.watch.restore() this.events.emit.restore() }) - it('starts the watch timeout loop', async function() { + it('starts the watch timeout loop', async function () { sinon.spy(this.watcher, 'resetTimeout') await this.watcher.start() @@ -140,7 +132,7 @@ describe('RemoteWatcher', function() { this.watcher.resetTimeout.restore() }) - it('can be called multiple times without resetting the timeout', async function() { + it('can be called multiple times without resetting the timeout', async function () { await this.watcher.start() const timeoutID = this.watcher.watchTimeout.ref() await this.watcher.start() @@ -148,7 +140,7 @@ describe('RemoteWatcher', function() { should(this.watcher.watchTimeout.ref()).eql(timeoutID) }) - it('emits a RemoteWatcher:fatal event on fatal error during first watch()', async function() { + it('emits a RemoteWatcher:fatal event on fatal error during first watch()', async function () { this.watcher.watch.resolves(fatalError) await this.watcher.start() @@ -158,7 +150,7 @@ describe('RemoteWatcher', function() { ) }) - it('emits a RemoteWatcher:fatal event on fatal error during second watch()', async function() { + it('emits a RemoteWatcher:fatal event on fatal error during second watch()', async function () { this.watcher.watch .onFirstCall() .resolves() @@ -173,7 +165,7 @@ describe('RemoteWatcher', function() { ) }) - it('emits a RemoteWatcher:error event on non-fatal error during first watch()', async function() { + it('emits a RemoteWatcher:error event on non-fatal error during first watch()', async function () { this.watcher.watch.resolves(nonFatalError) await this.watcher.start() @@ -183,7 +175,7 @@ describe('RemoteWatcher', function() { ) }) - it('emits a RemoteWatcher:error event on non-fatal error during second watch()', async function() { + it('emits a RemoteWatcher:error event on non-fatal error during second watch()', async function () { this.watcher.watch .onFirstCall() .resolves() @@ -199,23 +191,23 @@ describe('RemoteWatcher', function() { }) }) - describe('stop', function() { - beforeEach(function() { + describe('stop', function () { + beforeEach(function () { sinon.stub(this.watcher, 'watch').resolves() }) - afterEach(function() { + afterEach(function () { this.watcher.watch.restore() }) - it('ensures watch is not called anymore', async function() { + it('ensures watch is not called anymore', async function () { await this.watcher.start() this.watcher.stop() should(this.watcher.running).be.false() should(this.watcher.watchTimeout._destroyed).be.true() }) - it('can be called multiple times', async function() { + it('can be called multiple times', async function () { await this.watcher.start() this.watcher.stop() this.watcher.stop() @@ -224,8 +216,8 @@ describe('RemoteWatcher', function() { }) }) - describe('resetTimeout', function() { - beforeEach(async function() { + describe('resetTimeout', function () { + beforeEach(async function () { sinon.stub(this.watcher, 'watch') sinon.spy(this.events, 'emit') @@ -234,29 +226,29 @@ describe('RemoteWatcher', function() { this.watcher.watch.resetHistory() }) - afterEach(function() { + afterEach(function () { this.events.emit.restore() this.watcher.watch.restore() this.watcher.stop() }) - it('clears the watch timeout', async function() { - sinon.spy(global, 'clearTimeout') + it('clears the watch timeout', async function () { + const clearTimeoutSpy = sinon.spy(global, 'clearTimeout') const timeoutID = this.watcher.watchTimeout await this.watcher.resetTimeout() should(clearTimeout).have.been.calledWith(timeoutID) - clearTimeout.restore() + clearTimeoutSpy.restore() }) context('when the watcher is running', () => { - it('calls watch()', async function() { + it('calls watch()', async function () { await this.watcher.resetTimeout() should(this.watcher.watch).have.been.calledOnce() }) - it('schedules another watch timeout', async function() { + it('schedules another watch timeout', async function () { const timeoutID = this.watcher.watchTimeout await this.watcher.resetTimeout() should(this.watcher.watchTimeout._destroyed).be.false() @@ -264,13 +256,13 @@ describe('RemoteWatcher', function() { }) context('but is stopped while watch() was being executed', () => { - beforeEach(function() { + beforeEach(function () { this.watcher.watch.callsFake(async () => { this.watcher.running = false }) }) - it('does not schedule another watch timeout', async function() { + it('does not schedule another watch timeout', async function () { await this.watcher.resetTimeout() should(this.watcher.watch).have.been.calledOnce() should(this.watcher.watchTimeout._destroyed).be.true() @@ -279,11 +271,11 @@ describe('RemoteWatcher', function() { }) context('when the watcher is stopped', () => { - beforeEach(function() { + beforeEach(function () { this.watcher.running = false }) - it('does not call watch()', async function() { + it('does not call watch()', async function () { await this.watcher.resetTimeout() should(this.watcher.watch).not.have.been.called() }) @@ -294,7 +286,7 @@ describe('RemoteWatcher', function() { let err context('when next #watch() has no chance to work anymore', () => { - beforeEach(function() { + beforeEach(function () { err = new remoteErrors.RemoteError({ code: remoteErrors.COZY_CLIENT_REVOKED_CODE, message: remoteErrors.COZY_CLIENT_REVOKED_MESSAGE, @@ -303,13 +295,13 @@ describe('RemoteWatcher', function() { this.watcher.watch.resolves(err) }) - it('stops the watcher', async function() { + it('stops the watcher', async function () { await this.watcher.resetTimeout() should(this.watcher.running).be.false() }) context('during a scheduled run', () => { - it('emits a RemoteWatcher:fatal event', async function() { + it('emits a RemoteWatcher:fatal event', async function () { await this.watcher.resetTimeout() await should(this.events.emit).have.been.calledWith( 'RemoteWatcher:fatal', @@ -319,13 +311,13 @@ describe('RemoteWatcher', function() { }) context('during a manual run', () => { - it('returns the error', async function() { + it('returns the error', async function () { await should( this.watcher.resetTimeout({ manualRun: true }) ).be.fulfilledWith(err) }) - it('does not emit any event', async function() { + it('does not emit any event', async function () { await this.watcher.resetTimeout({ manualRun: true }) await should(this.events.emit).not.have.been.called() }) @@ -333,7 +325,7 @@ describe('RemoteWatcher', function() { }) context('when next #watch() could work', () => { - beforeEach(function() { + beforeEach(function () { err = new remoteErrors.RemoteError({ code: remoteErrors.UNREACHABLE_COZY_CODE, message: 'Cannot reach remote Cozy', @@ -342,13 +334,13 @@ describe('RemoteWatcher', function() { this.watcher.watch.resolves(err) }) - it('does not stop the watcher', async function() { + it('does not stop the watcher', async function () { await this.watcher.resetTimeout() should(this.watcher.running).be.true() }) context('during a scheduled run', () => { - it('emits a RemoteWatcher:error event', async function() { + it('emits a RemoteWatcher:error event', async function () { await this.watcher.resetTimeout() await should(this.events.emit).have.been.calledWith( 'RemoteWatcher:error', @@ -358,13 +350,13 @@ describe('RemoteWatcher', function() { }) context('during a manual run', () => { - it('returns the error', async function() { + it('returns the error', async function () { await should( this.watcher.resetTimeout({ manualRun: true }) ).be.fulfilledWith(err) }) - it('does not emit any event', async function() { + it('does not emit any event', async function () { await this.watcher.resetTimeout({ manualRun: true }) await should(this.events.emit).not.have.been.called() }) @@ -373,19 +365,19 @@ describe('RemoteWatcher', function() { }) }) - describe('watch', function() { + describe('watch', function () { const lastLocalSeq = '123' const lastRemoteSeq = lastLocalSeq + '456' let changes - beforeEach(function() { + beforeEach(function () { changes = { last_seq: lastRemoteSeq, docs: [builders.remoteFile().build(), builders.remoteDir().build()] } }) - beforeEach(function() { + beforeEach(function () { sinon.stub(this.pouch, 'getRemoteSeq') sinon.stub(this.pouch, 'setRemoteSeq') sinon.stub(this.watcher, 'pullMany') @@ -397,7 +389,7 @@ describe('RemoteWatcher', function() { this.remoteCozy.changes.resolves(changes) }) - afterEach(function() { + afterEach(function () { this.events.emit.restore() this.remoteCozy.changes.restore() this.watcher.pullMany.restore() @@ -405,14 +397,14 @@ describe('RemoteWatcher', function() { this.pouch.getRemoteSeq.restore() }) - it('pulls the changed files/dirs', async function() { + it('pulls the changed files/dirs', async function () { await this.watcher.watch() this.watcher.pullMany.should.be .calledOnce() .and.be.calledWithExactly(changes.docs) }) - it('updates the last update sequence in local db', async function() { + it('updates the last update sequence in local db', async function () { await this.watcher.watch() this.pouch.setRemoteSeq.should.be .calledOnce() @@ -423,7 +415,7 @@ describe('RemoteWatcher', function() { const randomMessage = faker.random.words let err - beforeEach(function() { + beforeEach(function () { const response = {} // FetchError objects defined in `cozy-stack-client` have the same // signature as FetchError objects defined in `cozy-client-js`. @@ -431,7 +423,7 @@ describe('RemoteWatcher', function() { this.remoteCozy.changes.rejects(err) }) - it('resolves with a higher-level error', async function() { + it('resolves with a higher-level error', async function () { err.status = 400 // Revoked await should(this.watcher.watch()).be.fulfilledWith( new remoteErrors.RemoteError({ @@ -461,11 +453,11 @@ describe('RemoteWatcher', function() { } } - beforeEach(function() { + beforeEach(function () { this.watcher.pullMany.throws(reservedIdsError) }) - it('does not return client revoked error', async function() { + it('does not return client revoked error', async function () { should(await this.watcher.watch()).match({ code: remoteErrors.UNKNOWN_REMOTE_ERROR_CODE }) @@ -481,11 +473,11 @@ describe('RemoteWatcher', function() { return doc } - describe('pullMany', function() { + describe('pullMany', function () { let apply let findMaybe let remoteDocs - beforeEach(function() { + beforeEach(function () { apply = sinon.stub(this.watcher, 'apply') findMaybe = sinon.stub(this.remoteCozy, 'findMaybe') remoteDocs = [ @@ -494,17 +486,17 @@ describe('RemoteWatcher', function() { ] }) - afterEach(function() { + afterEach(function () { apply.restore() findMaybe.restore() }) - it('pulls many changed files/dirs given their ids', async function() { + it('pulls many changed files/dirs given their ids', async function () { apply.resolves() await this.watcher.pullMany(remoteDocs) - apply.callCount.should.equal(2) + should(apply).be.calledTwice() // Changes are sorted before applying (first one was given Metadata since // it is valid while the second one got the original RemoteDeletion since // it is ignored) @@ -512,23 +504,25 @@ describe('RemoteWatcher', function() { should(apply.args[1][0].doc).deepEqual(remoteDocs[1]) }) - context('when apply() returns an error for some file/dir', function() { - beforeEach(function() { - apply.callsFake(async ( - change /*: RemoteChange */ - ) /*: Promise */ => { - if (change.type === 'FileAddition') - return { change, err: new Error(change.doc) } - }) + context('when apply() returns an error for some file/dir', function () { + beforeEach(function () { + apply.callsFake( + async ( + change /*: RemoteChange */ + ) /*: Promise */ => { + if (change.type === 'FileAddition') + return { change, err: new Error(change.doc) } + } + ) }) - it('rejects with the first error', async function() { + it('rejects with the first error', async function () { await should(this.watcher.pullMany(remoteDocs)).be.rejectedWith( new Error(remoteDocs[0]) ) }) - it('still tries to pull other files/dirs', async function() { + it('still tries to pull other files/dirs', async function () { await this.watcher.pullMany(remoteDocs).catch(() => {}) should(apply.args[0][0]).have.properties({ type: 'FileAddition', @@ -540,7 +534,7 @@ describe('RemoteWatcher', function() { }) }) - it('retries failed changes application until none can be applied', async function() { + it('retries failed changes application until none can be applied', async function () { const remoteDocs = [ builders.remoteFile().build(), builders.remoteErased().build(), @@ -566,24 +560,21 @@ describe('RemoteWatcher', function() { }) }) - it('releases the Pouch lock', async function() { + it('releases the Pouch lock', async function () { await this.watcher.pullMany(remoteDocs).catch(() => {}) const nextLockPromise = this.pouch.lock('nextLock') await should(nextLockPromise).be.fulfilled() }) - it('does not update the remote sequence', async function() { + it('does not update the remote sequence', async function () { const remoteSeq = await this.pouch.getRemoteSeq() await this.watcher.pullMany(remoteDocs).catch(() => {}) should(this.pouch.getRemoteSeq()).be.fulfilledWith(remoteSeq) }) }) - it('applies the changes when the document still exists on remote', async function() { - const remoteDoc = builders - .remoteFile() - .name('whatever') - .build() + it('applies the changes when the document still exists on remote', async function () { + const remoteDoc = builders.remoteFile().name('whatever').build() await this.watcher.pullMany([remoteDoc]) @@ -591,7 +582,7 @@ describe('RemoteWatcher', function() { should(apply.args[0][0].doc).deepEqual(validMetadata(remoteDoc)) }) - it('tries to apply a deletion otherwise', async function() { + it('tries to apply a deletion otherwise', async function () { const remoteDeletion /*: RemoteDeletion */ = { _id: 'missing', _rev: 'whatever', @@ -604,7 +595,7 @@ describe('RemoteWatcher', function() { should(apply.args[0][0].doc).deepEqual(remoteDeletion) }) - it('fetches the content of old directories added to the feed', async function() { + it('fetches the content of old directories added to the feed', async function () { const tree /*: RemoteTree */ = await builders.createRemoteTree([ 'dir/', 'dir/subdir/', @@ -624,7 +615,7 @@ describe('RemoteWatcher', function() { ) }) - it('does not fetch the content of known directories present in the feed', async function() { + it('does not fetch the content of known directories present in the feed', async function () { const dir = (remoteTree['my-folder/'] /*: any */) const updatedDir = await builders .remoteDir((dir /*: MetadataRemoteDir */)) @@ -635,7 +626,7 @@ describe('RemoteWatcher', function() { should(apply.args[0][0].doc).deepEqual(validMetadata(updatedDir)) }) - it('applies only changed content changes when already present in the feed', async function() { + it('applies only changed content changes when already present in the feed', async function () { const tree /*: RemoteTree */ = await builders.createRemoteTree([ 'dir/', 'dir/subdir/', @@ -682,11 +673,8 @@ describe('RemoteWatcher', function() { describe('analyse', () => { describe('case-only renaming', () => { - it('is identified as a move', async function() { - const oldRemote = builders - .remoteFile() - .name('foo') - .build() + it('is identified as a move', async function () { + const oldRemote = builders.remoteFile().name('foo').build() const oldDoc = metadata.fromRemoteDoc(oldRemote) metadata.ensureValidPath(oldDoc) const newRemote = _.defaults( @@ -701,19 +689,15 @@ describe('RemoteWatcher', function() { const changes = await this.watcher.analyse([newRemote], [oldDoc]) should(changes.map(c => c.type)).deepEqual(['FileMove']) - should(changes[0]) - .have.propertyByPath('doc', 'path') - .eql('FOO') - should(changes[0]) - .have.propertyByPath('was', 'path') - .eql('foo') + should(changes[0]).have.propertyByPath('doc', 'path').eql('FOO') + should(changes[0]).have.propertyByPath('was', 'path').eql('foo') }) }) onPlatform('darwin', () => { describe('file update', () => { context('at root with normalization change', () => { - it('is not identified as a move', async function() { + it('is not identified as a move', async function () { const oldRemote = builders .remoteFile() .name('énoncé'.normalize('NFC')) @@ -738,7 +722,7 @@ describe('RemoteWatcher', function() { }) context('in accented folder with normalization change', () => { - it('is not identified as a move', async function() { + it('is not identified as a move', async function () { const oldRemoteDir = builders .remoteDir() .name('énoncés'.normalize('NFD')) @@ -785,7 +769,7 @@ describe('RemoteWatcher', function() { context( 'in accented folder with different local/remote normalizations', () => { - it('is not identified as a move', async function() { + it('is not identified as a move', async function () { const oldRemoteDir = builders .remoteDir() .name('énoncés'.normalize('NFC')) @@ -828,7 +812,7 @@ describe('RemoteWatcher', function() { context( 'in renamed accented folder with different local/remote normalizations', () => { - it('is identified as a descendant change with old parent normalization', async function() { + it('is identified as a descendant change with old parent normalization', async function () { const oldRemoteDir = builders .remoteDir() .name('énoncés'.normalize('NFC')) @@ -886,7 +870,7 @@ describe('RemoteWatcher', function() { context( 'in renamed folder with different local/remote normalizations', () => { - it('is identified as a descendant change with old parent normalization', async function() { + it('is identified as a descendant change with old parent normalization', async function () { const oldRemoteDir = builders .remoteDir() .name('énoncés'.normalize('NFC')) @@ -946,7 +930,7 @@ describe('RemoteWatcher', function() { context( 'in accented folder with different local/remote normalizations', () => { - it('is identified as an addition with old parent normalization', async function() { + it('is identified as an addition with old parent normalization', async function () { const oldRemoteDir = builders .remoteDir() .name('énoncés'.normalize('NFC')) @@ -981,7 +965,7 @@ describe('RemoteWatcher', function() { context( 'in created folder in accented folder with different local/remote normalizations', () => { - it('is identified as an addition with old ancestor normalization', async function() { + it('is identified as an addition with old ancestor normalization', async function () { const remoteParentDir = builders .remoteDir() .name('énoncés'.normalize('NFC')) @@ -1024,7 +1008,7 @@ describe('RemoteWatcher', function() { context( 'with the folder creation ordered after the file creation', () => { - it('is identified as an addition with old ancestor normalization', async function() { + it('is identified as an addition with old ancestor normalization', async function () { const remoteParentDir = builders .remoteDir() .name('énoncés'.normalize('NFC')) @@ -1077,7 +1061,7 @@ describe('RemoteWatcher', function() { context( 'with different local/remote normalizations to accented folder with different local/remote normalizations', () => { - it('is identified as move with old normalization and new parent normalization', async function() { + it('is identified as move with old normalization and new parent normalization', async function () { const oldRemoteDir = builders .remoteDir() .name('énoncés'.normalize('NFC')) @@ -1185,7 +1169,7 @@ describe('RemoteWatcher', function() { return props }) - it('is detected when moved source is first', async function() { + it('is detected when moved source is first', async function () { const remoteDocs = [srcFileMoved, dstFileTrashed] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1202,7 +1186,7 @@ describe('RemoteWatcher', function() { ]) }) - it('is detected when trashed destination is first', async function() { + it('is detected when trashed destination is first', async function () { const remoteDocs = [dstFileTrashed, srcFileMoved] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1275,7 +1259,7 @@ describe('RemoteWatcher', function() { describe('when moved source is first', () => { onPlatforms(['win32', 'darwin'], () => { - it('sorts the trashing before the move to prevent id confusion', async function() { + it('sorts the trashing before the move to prevent id confusion', async function () { const remoteDocs = [srcFileMoved, dstFileTrashed] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1294,7 +1278,7 @@ describe('RemoteWatcher', function() { }) onPlatform('linux', () => { - it('sorts the move before the trashing', async function() { + it('sorts the move before the trashing', async function () { const remoteDocs = [srcFileMoved, dstFileTrashed] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1315,7 +1299,7 @@ describe('RemoteWatcher', function() { describe('when trashed destination is first', () => { onPlatforms(['win32', 'darwin'], () => { - it('sorts the trashing before the move to prevent id confusion', async function() { + it('sorts the trashing before the move to prevent id confusion', async function () { const remoteDocs = [dstFileTrashed, srcFileMoved] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1334,7 +1318,7 @@ describe('RemoteWatcher', function() { }) onPlatform('linux', () => { - it('sorts the move before the trashing', async function() { + it('sorts the move before the trashing', async function () { const remoteDocs = [dstFileTrashed, srcFileMoved] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1407,7 +1391,7 @@ describe('RemoteWatcher', function() { return props }) - it('is detected when moved source is first', async function() { + it('is detected when moved source is first', async function () { const remoteDocs = [srcMoved, dstTrashed] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1424,7 +1408,7 @@ describe('RemoteWatcher', function() { ]) }) - it('is detected when trashed destination is first', async function() { + it('is detected when trashed destination is first', async function () { const remoteDocs = [dstTrashed, srcMoved] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1497,7 +1481,7 @@ describe('RemoteWatcher', function() { describe('when moved source is first', () => { onPlatforms(['win32', 'darwin'], () => { - it('sorts the trashing before the move to prevent id confusion', async function() { + it('sorts the trashing before the move to prevent id confusion', async function () { const remoteDocs = [srcMoved, dstTrashed] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1516,7 +1500,7 @@ describe('RemoteWatcher', function() { }) onPlatform('linux', () => { - it('sorts the trashing before the move ', async function() { + it('sorts the trashing before the move ', async function () { const remoteDocs = [srcMoved, dstTrashed] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1537,7 +1521,7 @@ describe('RemoteWatcher', function() { describe('when trashed destination is first', () => { onPlatforms(['win32', 'darwin'], () => { - it('sorts the trashing before the move to prevent id confusion', async function() { + it('sorts the trashing before the move to prevent id confusion', async function () { const remoteDocs = [dstTrashed, srcMoved] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1556,7 +1540,7 @@ describe('RemoteWatcher', function() { }) onPlatform('linux', () => { - it('sorts the trashing before the move', async function() { + it('sorts the trashing before the move', async function () { const remoteDocs = [dstTrashed, srcMoved] const changes = await this.watcher.analyse(remoteDocs, olds) should(relevantChangesProps(changes)).deepEqual([ @@ -1577,11 +1561,8 @@ describe('RemoteWatcher', function() { }) describe('descendantMoves', () => { - it('handles correctly descendantMoves', async function() { - const remoteDir1 = builders - .remoteDir() - .name('src') - .build() + it('handles correctly descendantMoves', async function () { + const remoteDir1 = builders.remoteDir().name('src').build() const remoteDir2 = builders .remoteDir() .name('parent') @@ -1676,7 +1657,7 @@ describe('RemoteWatcher', function() { }) describe('identifyAll', () => { - it('identifies all descendant moves', function() { + it('identifies all descendant moves', function () { const remotePaths = [ ['parent/', 1], ['parent/src/', 1], @@ -1796,7 +1777,7 @@ describe('RemoteWatcher', function() { ]) }) - it('identifies move from inside move', function() { + it('identifies move from inside move', function () { const remotePaths = [ ['parent/', 1], ['parent/src/', 1], @@ -1979,7 +1960,7 @@ describe('RemoteWatcher', function() { ] }) - it('sorts correctly order1', function() { + it('sorts correctly order1', function () { const order1 = [ remoteDocsByPath['parent/dst/dir2/'], remoteDocsByPath['parent/dst/'], @@ -2018,7 +1999,7 @@ describe('RemoteWatcher', function() { ]) }) - it('sorts correctly order2', function() { + it('sorts correctly order2', function () { const order2 = [ remoteDocsByPath['parent/dst/dir2/subdir/'], remoteDocsByPath['parent/dst/'], @@ -2059,12 +2040,9 @@ describe('RemoteWatcher', function() { }) }) - describe('identifyChange', function() { - it('does not fail when the path is missing', function() { - const remoteDoc = builders - .remoteFile() - .name('whatever') - .build() + describe('identifyChange', function () { + it('does not fail when the path is missing', function () { + const remoteDoc = builders.remoteFile().name('whatever').build() remoteDoc.path = '' const change /*: RemoteInvalidChange */ = this.watcher.identifyChange( @@ -2081,11 +2059,8 @@ describe('RemoteWatcher', function() { // TODO: file without checksum onPlatform('win32', () => { - it('detects path/platform incompatibilities if any', async function() { - const remoteDir = builders - .remoteDir() - .name('f:oo') - .build() + it('detects path/platform incompatibilities if any', async function () { + const remoteDir = builders.remoteDir().name('f:oo').build() const remoteDoc = builders .remoteFile() .inDir(remoteDir) @@ -2121,7 +2096,7 @@ describe('RemoteWatcher', function() { ]) }) - it('does not detect any when file/dir is in the trash', async function() { + it('does not detect any when file/dir is in the trash', async function () { const remoteDoc = builders .remoteFile() .name('f:oo/br') @@ -2139,11 +2114,8 @@ describe('RemoteWatcher', function() { }) onPlatform('darwin', () => { - it('does not mistakenly assume a new file is incompatible', async function() { - const remoteDir = builders - .remoteDir() - .name('f:oo') - .build() + it('does not mistakenly assume a new file is incompatible', async function () { + const remoteDir = builders.remoteDir().name('f:oo').build() const remoteDoc = builders .remoteFile() .inDir(remoteDir) @@ -2161,7 +2133,7 @@ describe('RemoteWatcher', function() { }) }) - it('calls addDoc for a new doc', async function() { + it('calls addDoc for a new doc', async function () { this.prep.addFileAsync = sinon.stub() this.prep.addFileAsync.resolves(null) const remoteDoc = builders @@ -2189,7 +2161,7 @@ describe('RemoteWatcher', function() { should(change.doc).not.have.properties(['_rev', 'path', 'name']) }) - it('calls updateDoc when tags are updated', async function() { + it('calls updateDoc when tags are updated', async function () { this.prep.updateFileAsync = sinon.stub() this.prep.updateFileAsync.resolves(null) const remoteDoc = builders @@ -2220,7 +2192,7 @@ describe('RemoteWatcher', function() { }) }) - it('calls updateDoc when content is overwritten', async function() { + it('calls updateDoc when content is overwritten', async function () { this.prep.updateFileAsync = sinon.stub().resolves(null) const remoteDoc = builders @@ -2252,7 +2224,7 @@ describe('RemoteWatcher', function() { should(change.doc).not.have.properties(['_rev', 'path', 'name']) }) - it('calls moveFile when file is renamed', async function() { + it('calls moveFile when file is renamed', async function () { this.prep.moveFileAsync = sinon.stub() this.prep.moveFileAsync.resolves(null) const remoteDoc = builders @@ -2285,13 +2257,10 @@ describe('RemoteWatcher', function() { should(change.doc).not.have.properties(['_rev', 'path', 'name']) }) - it('calls moveFile when file is moved', async function() { + it('calls moveFile when file is moved', async function () { this.prep.moveFileAsync = sinon.stub() this.prep.moveFileAsync.resolves(null) - const remoteDir = builders - .remoteDir() - .name('other-folder') - .build() + const remoteDir = builders.remoteDir().name('other-folder').build() const remoteDoc = builders .remoteFile(remoteTree['my-folder/file-2']) .inDir(remoteDir) @@ -2323,7 +2292,7 @@ describe('RemoteWatcher', function() { should(change.doc).not.have.properties(['_rev', 'path', 'name']) }) - it('detects when file was both moved and updated', async function() { + it('detects when file was both moved and updated', async function () { const file = await builders .remoteFile() .name('meow.txt') @@ -2347,20 +2316,12 @@ describe('RemoteWatcher', function() { type: 'FileMove', update: true }) - should(change) - .have.propertyByPath('was', 'path') - .eql(was.path) - should(change) - .have.propertyByPath('doc', 'path') - .eql(file.name) + should(change).have.propertyByPath('was', 'path').eql(was.path) + should(change).have.propertyByPath('doc', 'path').eql(file.name) }) - it('is invalid when local or remote file is corrupt', async function() { - const remoteDoc = builders - .remoteFile() - .size('123') - .shortRev(1) - .build() + it('is invalid when local or remote file is corrupt', async function () { + const remoteDoc = builders.remoteFile().size('123').shortRev(1).build() const was /*: Metadata */ = builders .metafile() .fromRemote(remoteDoc) @@ -2380,28 +2341,20 @@ describe('RemoteWatcher', function() { should(change.error).match(/corrupt/) }) - xit('calls deleteDoc & addDoc when trashed', async function() { - this.prep.deleteFolderAsync = sinon.stub() - this.prep.deleteFolderAsync.returnsPromise().resolves(null) - this.prep.addFolderAsync = sinon.stub() - this.prep.addFolderAsync.returnsPromise().resolves(null) - const oldDir = builders - .remoteDir() - .name('foo') - .build() + xit('calls deleteDoc & addDoc when trashed', async function () { + this.prep.deleteFolderAsync = sinon.stub().resolves(null) + this.prep.addFolderAsync = sinon.stub().resolves(null) + const oldDir = builders.remoteDir().name('foo').build() const oldMeta /*: Metadata */ = await builders .metadir() .fromRemote(oldDir) .create() - const newDir = builders - .remoteDir(oldDir) - .trashed() - .build() + const newDir = builders.remoteDir(oldDir).trashed().build() this.watcher.identifyChange(newDir, null, [], []) - should(this.prep.deleteFolderAsync.called).be.true() - should(this.prep.addFolderAsync.called).be.true() + should(this.prep.deleteFolderAsync).be.called() + should(this.prep.addFolderAsync).be.called() const deleteArgs = this.prep.deleteFolderAsync.args[0] // FIXME: Make sure oldMeta timestamps are formatted as expected by PouchDB delete oldMeta.updated_at @@ -2412,28 +2365,19 @@ describe('RemoteWatcher', function() { should(addArgs[1]).have.properties(metadata.fromRemoteDoc(newDir)) }) - xit('calls deleteDoc & addDoc when restored', async function() { - this.prep.deleteFolder = sinon.stub() - this.prep.deleteFolder.returnsPromise().resolves(null) - this.prep.addFolderAsync = sinon.stub() - this.prep.addFolderAsync.returnsPromise().resolves(null) - const oldDir = builders - .remoteDir() - .name('foo') - .trashed() - .build() + xit('calls deleteDoc & addDoc when restored', async function () { + this.prep.deleteFolder = sinon.stub().resolves(null) + this.prep.addFolderAsync = sinon.stub().resolves(null) + const oldDir = builders.remoteDir().name('foo').trashed().build() const oldMeta /*: Metadata */ = await builders.metadir .fromRemote(oldDir) .create() - const newDir = builders - .remoteDir(oldDir) - .restored() - .build() + const newDir = builders.remoteDir(oldDir).restored().build() this.watcher.identifyChange(newDir, null, [], []) - should(this.prep.deleteFolder.called).be.true() - should(this.prep.addFolderAsync.called).be.true() + should(this.prep.deleteFolder).be.called() + should(this.prep.addFolderAsync).be.called() const deleteArgs = this.prep.deleteFolder.args[0] // FIXME: Make sure oldMeta timestamps are formatted as expected by PouchDB delete oldMeta.updated_at @@ -2445,7 +2389,7 @@ describe('RemoteWatcher', function() { }) describe('restored file before trashing was synced', () => { - it('returns a FileAddition', function() { + it('returns a FileAddition', function () { const origFile = builders .remoteFile() .name('foo') @@ -2476,21 +2420,15 @@ describe('RemoteWatcher', function() { }) describe('file moved while deleted on local filesystem', () => { - it('returns a FileMove', function() { - const origFile = builders - .remoteFile() - .name('foo') - .build() + it('returns a FileMove', function () { + const origFile = builders.remoteFile().name('foo').build() const trashedFile = builders .metafile() .fromRemote(origFile) .trashed() .changedSide('local') .build() - const movedFile = builders - .remoteFile(origFile) - .name('bar') - .build() + const movedFile = builders.remoteFile(origFile).name('bar').build() const doc = metadata.fromRemoteDoc(movedFile) @@ -2541,7 +2479,7 @@ describe('RemoteWatcher', function() { should(metadata.extractRevNumber(was.remote)).equal(2) }) - it('assumes the file is up-to-date since remote rev number is lower', async function() { + it('assumes the file is up-to-date since remote rev number is lower', async function () { const change = this.watcher.identifyChange(remoteDoc, was, [], []) should(change.type).equal('UpToDate') }) diff --git a/test/unit/sync/dependency_graph.js b/test/unit/sync/dependency_graph.js index 640f28123..1af8021fc 100644 --- a/test/unit/sync/dependency_graph.js +++ b/test/unit/sync/dependency_graph.js @@ -3,14 +3,13 @@ const should = require('should') const { DependencyGraph } = require('../../../core/sync/dependency_graph') // The dependencies are defined as a map of Path -> Path dependencies -const dependencyBasedCompare = dependencies => ( - { doc: { path: pathA } }, - { doc: { path: pathB } } -) => { - if (dependencies[pathA] && dependencies[pathA].includes(pathB)) return 1 - if (dependencies[pathB] && dependencies[pathB].includes(pathA)) return -1 - return 0 -} +const dependencyBasedCompare = + dependencies => + ({ doc: { path: pathA } }, { doc: { path: pathB } }) => { + if (dependencies[pathA] && dependencies[pathA].includes(pathB)) return 1 + if (dependencies[pathB] && dependencies[pathB].includes(pathA)) return -1 + return 0 + } describe('DependencyGraph', () => { describe('toArray', () => { diff --git a/test/unit/sync/index.js b/test/unit/sync/index.js index bf44ffa4f..c1e4505ae 100644 --- a/test/unit/sync/index.js +++ b/test/unit/sync/index.js @@ -44,13 +44,13 @@ const remoteSyncError = (msg, doc) => doc }) -describe('Sync', function() { +describe('Sync', function () { before('instanciate config', configHelpers.createConfig) beforeEach('instanciate pouch', pouchHelpers.createDatabase) afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - beforeEach('instanciate sync', function() { + beforeEach('instanciate sync', function () { this.local = stubSide('local') this.remote = stubSide('remote') this.ignore = new Ignore(['ignored']) @@ -65,17 +65,17 @@ describe('Sync', function() { ) }) - afterEach(async function() { + afterEach(async function () { await this.sync.stop() }) let builders - beforeEach('prepare builders', function() { + beforeEach('prepare builders', function () { builders = new Builders(this) }) - describe('start', function() { - beforeEach('instanciate sync', function() { + describe('start', function () { + beforeEach('instanciate sync', function () { this.local.start = sinon.stub().resolves() this.local.watcher.running = Promise.resolve() this.local.stop = sinon.stub().resolves() @@ -89,7 +89,7 @@ describe('Sync', function() { sinon.spy(this.sync.events, 'emit') }) - it('starts the metadata replication of both sides', async function() { + it('starts the metadata replication of both sides', async function () { this.sync.start() await this.sync.started() should(this.local.start).have.been.calledOnce() @@ -98,59 +98,59 @@ describe('Sync', function() { }) context('if local watcher fails to start', () => { - beforeEach(function() { + beforeEach(function () { this.local.start = sinon.stub().rejects(new Error('failed')) }) - it('does not start replication', async function() { + it('does not start replication', async function () { await this.sync.start() should(this.sync.sync).not.have.been.called() }) - it('does not start remote watcher', async function() { + it('does not start remote watcher', async function () { await this.sync.start() should(this.remote.start).not.have.been.called() }) - it('stops local watcher', async function() { + it('stops local watcher', async function () { await this.sync.start() should(this.local.stop).have.been.calledOnce() }) - it('emits a Sync:fatal event', async function() { + it('emits a Sync:fatal event', async function () { await this.sync.start() should(this.sync.events.emit).have.been.calledWith('Sync:fatal') }) }) context('if remote watcher fails to start', () => { - beforeEach(function() { + beforeEach(function () { this.remote.start = sinon.stub().callsFake(() => { this.remote.watcher.fatal(new Error('failed')) }) }) - it('does not start replication', async function() { + it('does not start replication', async function () { await this.sync.start() should(this.sync.sync).not.have.been.called() }) - it('starts local watcher', async function() { + it('starts local watcher', async function () { await this.sync.start() should(this.local.start).have.been.calledOnce() }) - it('stops local watcher', async function() { + it('stops local watcher', async function () { await this.sync.start() should(this.local.stop).have.been.calledOnce() }) - it('stops remote watcher', async function() { + it('stops remote watcher', async function () { await this.sync.start() should(this.remote.stop).have.been.calledOnce() }) - it('emits a Sync:fatal event', async function() { + it('emits a Sync:fatal event', async function () { await this.sync.start() should(this.sync.events.emit).have.been.calledWith('Sync:fatal') }) @@ -158,7 +158,7 @@ describe('Sync', function() { context('if local watcher rejects while running', () => { let rejectLocalWatcher - beforeEach(async function() { + beforeEach(async function () { this.local.watcher.running = new Promise((resolve, reject) => { rejectLocalWatcher = reject }) @@ -166,25 +166,25 @@ describe('Sync', function() { await this.sync.started() }) - it('stops replication', async function() { + it('stops replication', async function () { rejectLocalWatcher(new Error('failed')) await this.sync.stopped() should(this.sync.stop).have.been.calledOnce() }) - it('stops local watcher', async function() { + it('stops local watcher', async function () { rejectLocalWatcher(new Error('failed')) await this.sync.stopped() should(this.local.stop).have.been.calledOnce() }) - it('stops remote watcher', async function() { + it('stops remote watcher', async function () { rejectLocalWatcher(new Error('failed')) await this.sync.stopped() should(this.remote.stop).have.been.calledOnce() }) - it('emits a Sync:fatal event', async function() { + it('emits a Sync:fatal event', async function () { rejectLocalWatcher(new Error('failed')) await this.sync.stopped() should(this.sync.events.emit).have.been.calledWith('Sync:fatal') @@ -194,18 +194,18 @@ describe('Sync', function() { // TODO: Test lock request/acquisition/release - describe('sync', function() { - beforeEach('stub lifecycle', function() { + describe('sync', function () { + beforeEach('stub lifecycle', function () { this.sync.events = new EventEmitter() this.sync.lifecycle.end('start') }) - afterEach('restore lifecycle', function() { + afterEach('restore lifecycle', function () { this.sync.events.emit('stopped') delete this.sync.events this.sync.lifecycle.end('stop') }) - it('waits for and applies available changes', async function() { + it('waits for and applies available changes', async function () { const apply = sinon.stub(this.sync, 'apply') apply.callsFake(change => this.pouch.setLocalSeq(change.seq)) @@ -228,8 +228,8 @@ describe('Sync', function() { }) }) - describe('apply', function() { - it('does nothing for an ignored document', async function() { + describe('apply', function () { + it('does nothing for an ignored document', async function () { const change = { seq: 121, doc: await builders @@ -243,36 +243,27 @@ describe('Sync', function() { should(this.sync.applyDoc).have.not.been.called() }) - it('does nothing for an up-to-date document', async function() { + it('does nothing for an up-to-date document', async function () { const change = { seq: 122, - doc: await builders - .metadir() - .path('foo') - .upToDate() - .create() + doc: await builders.metadir().path('foo').upToDate().create() } this.sync.applyDoc = sinon.spy() await this.sync.apply(change) should(this.sync.applyDoc).have.not.been.called() }) - it('does nothing for an up-to-date _deleted document', async function() { + it('does nothing for an up-to-date _deleted document', async function () { const change = { seq: 122, - doc: await builders - .metadir() - .path('foo') - .erased() - .upToDate() - .create() + doc: await builders.metadir().path('foo').erased().upToDate().create() } this.sync.applyDoc = sinon.spy() await this.sync.apply(change) should(this.sync.applyDoc).have.not.been.called() }) - it('trashes a locally deleted file', async function() { + it('trashes a locally deleted file', async function () { const change = { seq: 145, doc: await builders @@ -299,7 +290,7 @@ describe('Sync', function() { } }) - it('trashes a locally deleted folder with content', async function() { + it('trashes a locally deleted folder with content', async function () { const deletedChild = await builders .metadata() .path('foo/bar') @@ -334,7 +325,7 @@ describe('Sync', function() { } }) - it('skips trashing a locally deleted file if its parent is deleted', async function() { + it('skips trashing a locally deleted file if its parent is deleted', async function () { const deletedChild = await builders .metadata() .path('foo/bar') @@ -369,7 +360,7 @@ describe('Sync', function() { } }) - it('calls applyDoc for a modified file', async function() { + it('calls applyDoc for a modified file', async function () { const initial = await builders .metafile() .path('foo/bar') @@ -400,7 +391,7 @@ describe('Sync', function() { should(await this.pouch.getLocalSeq()).equal(123) }) - it('calls applyDoc for a modified folder', async function() { + it('calls applyDoc for a modified folder', async function () { const initial = await builders .metadir() .path('foo/baz') @@ -428,7 +419,7 @@ describe('Sync', function() { should(await this.pouch.getLocalSeq()).equal(124) }) - it('calls addFileAsync for an added file', async function() { + it('calls addFileAsync for an added file', async function () { const doc = await builders .metafile() .path('foo/bar') @@ -439,7 +430,7 @@ describe('Sync', function() { should(this.remote.addFileAsync).have.been.calledWith(doc) }) - it('calls overwriteFileAsync for an overwritten file', async function() { + it('calls overwriteFileAsync for an overwritten file', async function () { const initial = await builders .metafile() .path('overwrite/foo/bar') @@ -465,7 +456,7 @@ describe('Sync', function() { let file, merged, change - beforeEach('set up merged local file update', async function() { + beforeEach('set up merged local file update', async function () { file = await builders .metafile() .upToDate() @@ -482,17 +473,17 @@ describe('Sync', function() { change = { seq, doc: _.cloneDeep(merged) } sinon.stub(this.sync, 'getNextChanges').returns([change]) }) - afterEach(function() { + afterEach(function () { this.sync.getNextChanges.restore() }) describe('when apply throws a NEEDS_REMOTE_MERGE_CODE error', () => { - beforeEach(function() { + beforeEach(function () { sinon.stub(this.sync, 'blockSyncFor').callsFake(() => { this.sync.lifecycle.end('stop') }) }) - beforeEach('simulate error', async function() { + beforeEach('simulate error', async function () { this.sync.lifecycle.end('start') sinon.stub(this.sync, 'apply').rejects( new syncErrors.SyncError({ @@ -510,15 +501,15 @@ describe('Sync', function() { await this.sync.syncBatch() this.sync.apply.restore() }) - afterEach(function() { + afterEach(function () { this.sync.blockSyncFor.restore() }) - it('removes moveFrom and overwrite attributes', async function() { + it('removes moveFrom and overwrite attributes', async function () { should(change.doc).not.have.properties(['moveFrom', 'overwrite']) }) - it('blocks the synchronization so we can retry applying the change', async function() { + it('blocks the synchronization so we can retry applying the change', async function () { should(this.sync.blockSyncFor).have.been.calledOnce() should(this.sync.blockSyncFor).have.been.calledWithMatch({ err: { code: remoteErrors.NEEDS_REMOTE_MERGE_CODE }, @@ -528,7 +519,7 @@ describe('Sync', function() { }) }) - it('calls updateFileMetadataAsync with previous revision for updated file metadata', async function() { + it('calls updateFileMetadataAsync with previous revision for updated file metadata', async function () { const doc = await builders .metafile() .path('udpate/foo/without-errors') @@ -551,7 +542,7 @@ describe('Sync', function() { should(this.remote.updateFileMetadataAsync).have.been.calledWith(updated) }) - it('calls moveAsync for a moved file', async function() { + it('calls moveAsync for a moved file', async function () { const was = await builders .metafile() .path('foo/bar') @@ -571,7 +562,7 @@ describe('Sync', function() { should(this.remote.moveAsync).have.been.calledWith(doc, was) }) - it('calls moveAsync and overwriteFileAsync for a moved-updated file', async function() { + it('calls moveAsync and overwriteFileAsync for a moved-updated file', async function () { const was = await builders .metafile() .path('foo/bar') @@ -595,7 +586,7 @@ describe('Sync', function() { should(this.remote.overwriteFileAsync).have.been.calledWith(doc) }) - it('calls trashAsync for a deleted synced file', async function() { + it('calls trashAsync for a deleted synced file', async function () { const doc = await builders .metafile() .path('foo') @@ -606,7 +597,7 @@ describe('Sync', function() { should(this.local.trashAsync).have.been.calledWith(doc) }) - it('does nothing for a deleted file that was not synced', async function() { + it('does nothing for a deleted file that was not synced', async function () { const doc = await builders .metafile() .path('tmp/fooz') @@ -617,7 +608,7 @@ describe('Sync', function() { should(this.remote.trashAsync).not.have.been.called() }) - it('calls addFolderAsync for an added folder', async function() { + it('calls addFolderAsync for an added folder', async function () { const doc = await builders .metadir() .path('foobar/bar') @@ -629,7 +620,7 @@ describe('Sync', function() { should(this.remote.addFolderAsync).have.been.calledWith(doc) }) - it('does not call updateFolderAsync for an updated folder', async function() { + it('does not call updateFolderAsync for an updated folder', async function () { const initial = await builders .metadir() .path('foobar/baz') @@ -644,7 +635,7 @@ describe('Sync', function() { should(this.local.updateFolderAsync).not.have.been.calledWith(doc) }) - it('calls moveAsync for a moved folder', async function() { + it('calls moveAsync for a moved folder', async function () { const was = await builders .metadir() .path('foobar/bar') @@ -664,7 +655,7 @@ describe('Sync', function() { should(this.remote.moveAsync).have.been.calledWith(doc, was) }) - it('calls trashAsync for a deleted synced folder', async function() { + it('calls trashAsync for a deleted synced folder', async function () { const doc = await builders .metadir() .path('baz') @@ -675,7 +666,7 @@ describe('Sync', function() { should(this.local.trashAsync).have.been.calledWith(doc) }) - it('does nothing for a deleted folder that was not added', async function() { + it('does nothing for a deleted folder that was not added', async function () { const doc = await builders .metadir() .path('tmp/foobaz') @@ -687,8 +678,8 @@ describe('Sync', function() { }) }) - describe('updateErrors', function() { - it('retries on first local -> remote sync error', async function() { + describe('updateErrors', function () { + it('retries on first local -> remote sync error', async function () { const doc = await builders .metadata() .path('first/failure') @@ -705,7 +696,7 @@ describe('Sync', function() { should(actual._rev).not.equal(doc._rev) }) - it('retries on second remote -> local sync error', async function() { + it('retries on second remote -> local sync error', async function () { const doc = await builders .metadata() .path('second/failure') @@ -725,7 +716,7 @@ describe('Sync', function() { }) for (const syncSide of ['local', 'remote']) { - describe(`updateRevs at end of ${syncSide} Sync`, function() { + describe(`updateRevs at end of ${syncSide} Sync`, function () { const mergedSide = otherSide(syncSide) const updateRevs = ({ sync }, doc) => @@ -733,7 +724,7 @@ describe('Sync', function() { let doc, upToDate, syncedTarget, mergedTarget - beforeEach(async function() { + beforeEach(async function () { upToDate = await builders .metadata() .upToDate() // 2, 2 @@ -749,8 +740,8 @@ describe('Sync', function() { .create() // rev == 3 }) - context('without changes merged during Sync', function() { - it('marks doc as up-to-date', async function() { + context('without changes merged during Sync', function () { + it('marks doc as up-to-date', async function () { await updateRevs(this, _.cloneDeep(doc)) const updated = await this.pouch.bySyncedPath(doc.path) @@ -762,10 +753,10 @@ describe('Sync', function() { for (const extraChanges of [1, 2]) { context( `with ${extraChanges} ${mergedSide} changes merged during Sync`, - function() { + function () { let updated - beforeEach(async function() { + beforeEach(async function () { await builders .metadata(doc) .sides({ @@ -779,7 +770,7 @@ describe('Sync', function() { updated = await this.pouch.bySyncedPath(doc.path) }) - it(`keeps ${syncSide} out-of-date information`, async function() { + it(`keeps ${syncSide} out-of-date information`, async function () { should(metadata.outOfDateSide(updated)).equal(syncSide) }) @@ -789,7 +780,7 @@ describe('Sync', function() { ) }) - it(`keeps the doc rev coherent with its ${mergedSide} side`, async function() { + it(`keeps the doc rev coherent with its ${mergedSide} side`, async function () { should(metadata.target(updated)).equal( metadata.side(updated, mergedSide) ) @@ -800,8 +791,8 @@ describe('Sync', function() { }) } - describe('selectSide', function() { - it('selects the local side if remote is up-to-date', function() { + describe('selectSide', function () { + it('selects the local side if remote is up-to-date', function () { const doc1 = builders .metafile() .path('selectSide/1') @@ -817,7 +808,7 @@ describe('Sync', function() { should(this.sync.selectSide({ doc: doc2 })).eql(this.sync.local) }) - it('selects the remote side if local is up-to-date', function() { + it('selects the remote side if local is up-to-date', function () { const doc1 = builders .metafile() .path('selectSide/3') @@ -833,7 +824,7 @@ describe('Sync', function() { should(this.sync.selectSide({ doc: doc2 })).eql(this.sync.remote) }) - it('returns an empty array if both sides are up-to-date', function() { + it('returns an empty array if both sides are up-to-date', function () { const doc = builders .metafile() .path('selectSide/5') @@ -842,7 +833,7 @@ describe('Sync', function() { should(this.sync.selectSide({ doc })).be.null() }) - it('returns an empty array if a local only doc is erased', function() { + it('returns an empty array if a local only doc is erased', function () { const doc = builders .metafile() .path('selectSide/5') @@ -852,7 +843,7 @@ describe('Sync', function() { should(this.sync.selectSide({ doc })).be.null() }) - it('returns an empty array if a remote only doc is erased', function() { + it('returns an empty array if a remote only doc is erased', function () { const doc = builders .metafile() .path('selectSide/5') @@ -864,14 +855,14 @@ describe('Sync', function() { }) describe('blockSyncFor', () => { - beforeEach(function() { + beforeEach(function () { sinon.spy(this.events, 'emit') this.remote.watcher = { start: sinon.stub().returns(), stop: sinon.stub().returns() } }) - afterEach(function() { + afterEach(function () { delete this.remote.watcher this.events.emit.restore() }) @@ -881,17 +872,17 @@ describe('Sync', function() { new FetchError({ status: 500 }, 'UnreachableCozy test error'), 'remote' ) - beforeEach(function() { + beforeEach(function () { this.sync.blockSyncFor({ err: unreachableSyncError }) }) - it('emits offline event', function() { + it('emits offline event', function () { should(this.events.emit).have.been.calledWith('offline') }) - it('stops the remote watcher', function() { + it('stops the remote watcher', function () { should(this.remote.watcher.stop).have.been.called() }) @@ -902,7 +893,7 @@ describe('Sync', function() { // new interval without clearing the one created by the Sync error. // It this case we could have an endless Sync error retry loop. This test // checks that this does not occur. - it('does not allow multiple retry intervals', async function() { + it('does not allow multiple retry intervals', async function () { const unreachableRemoteError = remoteErrors.wrapError( new FetchError({ status: 500 }, 'Concurrent UnreachableCozy error') ) @@ -927,9 +918,9 @@ describe('Sync', function() { describe('retry', () => { context('after Cozy is reachable again', () => { - beforeEach(async function() { + beforeEach(async function () { // Reset calls history - this.events.emit.reset() + this.events.emit.resetHistory() // Cozy is reachable this.remote.ping = sinon.stub().resolves(true) @@ -940,19 +931,19 @@ describe('Sync', function() { await Promise.delay(1000) }) - it('emits online event', async function() { + it('emits online event', async function () { should(this.events.emit).have.been.calledWith('online') }) - it('restarts the remote watcher', function() { + it('restarts the remote watcher', function () { should(this.remote.watcher.start).have.been.called() }) }) context('while Cozy is still unreachable', () => { - beforeEach(async function() { + beforeEach(async function () { // Reset calls history - this.events.emit.reset() + this.events.emit.resetHistory() // Cozy is unreachable this.remote.ping = sinon.stub().resolves(false) @@ -963,11 +954,11 @@ describe('Sync', function() { await Promise.delay(1000) }) - it('emits offline event', async function() { + it('emits offline event', async function () { should(this.events.emit).have.been.calledWith('offline') }) - it('does not restart the remote watcher', function() { + it('does not restart the remote watcher', function () { should(this.remote.watcher.start).not.have.been.called() }) }) @@ -981,7 +972,7 @@ describe('Sync', function() { const seq = 2 beforeEach( 'set up merged local overwriting file move with update', - async function() { + async function () { const overwritten = await builders .metafile() .path('dst') @@ -1012,7 +1003,7 @@ describe('Sync', function() { } ) - beforeEach(function() { + beforeEach(function () { this.sync.blockSyncFor({ err: syncErrors.wrapError( remoteErrors.wrapError( @@ -1029,9 +1020,9 @@ describe('Sync', function() { }) describe('retry', () => { - beforeEach(async function() { + beforeEach(async function () { // Reset calls history - this.events.emit.reset() + this.events.emit.resetHistory() // Force call to `retry` this.events.emit('user-action-done') @@ -1039,23 +1030,23 @@ describe('Sync', function() { await Promise.delay(1000) }) - it('increases the record errors counter', async function() { + it('increases the record errors counter', async function () { const errors = merged.errors || 0 const synced = await this.pouch.bySyncedPath(merged.path) should(synced.errors).equal(errors + 1) }) - it('does not skip the change by saving seq', async function() { + it('does not skip the change by saving seq', async function () { should(await this.pouch.getLocalSeq()).equal(previousSeq) }) - it('keeps the out-of-date side', async function() { + it('keeps the out-of-date side', async function () { const outOfDateSide = metadata.outOfDateSide(merged) const synced = await this.pouch.bySyncedPath(merged.path) should(metadata.outOfDateSide(synced)).equal(outOfDateSide) }) - it('removes moveFrom and overwrite attributes', async function() { + it('removes moveFrom and overwrite attributes', async function () { // It actually only saves the record and the attributes need to be // removed before. // But this is the goal. @@ -1093,17 +1084,13 @@ describe('Sync', function() { } context('when one of the changes has no side', () => { - it('returns 0', async function() { + it('returns 0', async function () { const docA = await builders .metafile() .path('dir/file') .upToDate() .create() - const docB = await builders - .metadir() - .path('dir') - .upToDate() - .create() + const docB = await builders.metadir().path('dir').upToDate().create() const docC = await builders .metadir() .path('dir/subdir') @@ -1132,7 +1119,7 @@ describe('Sync', function() { }) context('when passing the same change twice', () => { - it('returns 0', async function() { + it('returns 0', async function () { const add = await builders .metafile() .path('add') @@ -1144,11 +1131,7 @@ describe('Sync', function() { .trashed() .changedSide('local') .create() - const src = await builders - .metafile() - .path('src') - .upToDate() - .create() + const src = await builders.metafile().path('src').upToDate().create() const move = await builders .metafile() .moveFrom(src) @@ -1170,7 +1153,7 @@ describe('Sync', function() { 'with a move outside a directory and the deletion of said directory', () => { let move, del - beforeEach(async function() { + beforeEach(async function () { const dir = await builders .metadir() .path('dir') @@ -1207,7 +1190,7 @@ describe('Sync', function() { 'with a move within a directory and the deletion of said directory', () => { let move, del - beforeEach(async function() { + beforeEach(async function () { const dir = await builders .metadir() .path('dir') @@ -1241,7 +1224,7 @@ describe('Sync', function() { 'with a move into a directory and the deletion of said directory', () => { let move, del - beforeEach(async function() { + beforeEach(async function () { const dir = await builders .metadir() .path('dir') @@ -1273,12 +1256,8 @@ describe('Sync', function() { context('with a directory move and an addition into said directory', () => { let move, add - beforeEach(async function() { - const srcDir = await builders - .metadir() - .path('src') - .upToDate() - .create() + beforeEach(async function () { + const srcDir = await builders.metadir().path('src').upToDate().create() const dstDir = await builders .metadir() .moveFrom(srcDir) @@ -1308,7 +1287,7 @@ describe('Sync', function() { 'with a directory addition and an addition into said directory', () => { let addDir, addFile - beforeEach(async function() { + beforeEach(async function () { const dir = await builders .metadir() .path('dir') @@ -1338,7 +1317,7 @@ describe('Sync', function() { 'with a directory deletion and a deletion within said directory', () => { let delDir, delFile - beforeEach(async function() { + beforeEach(async function () { const dir = await builders .metadir() .path('dir') @@ -1368,12 +1347,8 @@ describe('Sync', function() { context('with a directory move and the move of one of its children', () => { let moveDir, moveFile - beforeEach(async function() { - const srcDir = await builders - .metadir() - .path('src') - .upToDate() - .create() + beforeEach(async function () { + const srcDir = await builders.metadir().path('src').upToDate().create() const dstDir = await builders .metadir() .moveFrom(srcDir) @@ -1412,7 +1387,7 @@ describe('Sync', function() { 'with a directory addition and an addition into said directory', () => { let addDir, addFile - beforeEach(async function() { + beforeEach(async function () { const dir = await builders .metadir() .path('dir') diff --git a/test/unit/utils/conflicts.js b/test/unit/utils/conflicts.js index 78463a008..d008cc8f4 100644 --- a/test/unit/utils/conflicts.js +++ b/test/unit/utils/conflicts.js @@ -22,16 +22,12 @@ describe('Conflicts.generateConflictPath()', () => { it('returns a path with a conflict suffix', () => { const conflictPath = generateConflictPath(filepath) - should(conflictPath) - .be.a.String() - .and.match(CONFLICT_REGEXP) + should(conflictPath).be.a.String().and.match(CONFLICT_REGEXP) }) it('returns a path within the same parent', () => { const conflictPath = generateConflictPath(filepath) - should(conflictPath) - .be.a.String() - .and.startWith(ancestors) + should(conflictPath).be.a.String().and.startWith(ancestors) if (ancestors !== '') should(conflictPath).not.containEql(ancestors + ancestors) @@ -39,9 +35,7 @@ describe('Conflicts.generateConflictPath()', () => { it('returns a path with the same extension', () => { const conflictPath = generateConflictPath(filepath) - should(conflictPath) - .be.a.String() - .and.endWith(ext) + should(conflictPath).be.a.String().and.endWith(ext) }) it('returns a path with up to the first 180 characters of the original path', () => { @@ -117,8 +111,7 @@ describe('Conflicts.generateConflictPath()', () => { context('with long file name', () => { runSharedExamples({ - base: - 'Lorem ipsum dolor sit amet consectetur adipiscing elit Nam a velit at dolor euismod tincidunt sit amet id ante Cras vehicula lectus purus In lobortis risus lectus vitae rhoncus quam porta nullam', + base: 'Lorem ipsum dolor sit amet consectetur adipiscing elit Nam a velit at dolor euismod tincidunt sit amet id ante Cras vehicula lectus purus In lobortis risus lectus vitae rhoncus quam porta nullam', ext: '.pdf' }) }) diff --git a/test/unit/utils/fs.js b/test/unit/utils/fs.js index ff15325d5..49359b92c 100644 --- a/test/unit/utils/fs.js +++ b/test/unit/utils/fs.js @@ -22,7 +22,7 @@ describe('utils/fs', () => { const dirName = '.dir-to-hide' let parentPath, dirPath, missingPath - before(async function() { + before(async function () { parentPath = this.syncPath dirPath = path.join(parentPath, dirName) missingPath = path.join(parentPath, 'missing') @@ -49,7 +49,7 @@ describe('utils/fs', () => { }) describe('sendToTrash', () => { - it('removes the given file from the sync directory', async function() { + it('removes the given file from the sync directory', async function () { const fullpath = p => path.join(this.syncPath, p) await fse.ensureDir(fullpath('dir')) await fse.ensureFile(fullpath('dir/file')) @@ -59,7 +59,7 @@ describe('utils/fs', () => { await should(fse.exists(fullpath('dir/file'))).be.fulfilledWith(false) }) - it('removes the given directory and its content from the sync directory', async function() { + it('removes the given directory and its content from the sync directory', async function () { const fullpath = p => path.join(this.syncPath, p) await fse.ensureDir(fullpath('dir')) await fse.ensureFile(fullpath('dir/file')) @@ -69,7 +69,7 @@ describe('utils/fs', () => { await should(fse.exists(fullpath('dir/file'))).be.fulfilledWith(false) }) - it('throws an error with code ENOENT when the document is missing', async function() { + it('throws an error with code ENOENT when the document is missing', async function () { const fullpath = p => path.join(this.syncPath, p) try { await fse.remove(fullpath('doc')) diff --git a/test/unit/utils/mime.js b/test/unit/utils/mime.js index 0fc0e7b5b..996adc323 100644 --- a/test/unit/utils/mime.js +++ b/test/unit/utils/mime.js @@ -16,7 +16,7 @@ describe('utils/mime', () => { it('returns the same type as the sytem mime for other docs', () => { const filePaths = ['DS100.jpg', 'Report.md', 'stats.xls'] const mimes = filePaths.map(filePath => mime.lookup(filePath)) - const sysMimes = filePaths.map(filePath => sysMime.lookup(filePath)) + const sysMimes = filePaths.map(filePath => sysMime.getType(filePath)) should(mimes).eql(sysMimes) }) }) diff --git a/test/unit/utils/notes.js b/test/unit/utils/notes.js index f21916496..4bba3b208 100644 --- a/test/unit/utils/notes.js +++ b/test/unit/utils/notes.js @@ -23,21 +23,17 @@ describe('utils/notes', () => { afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - it('returns the Metadata with the given path', async function() { + it('returns the Metadata with the given path', async function () { const docPath = 'Notes/Some interesting stuff.cozy-note' const filePath = path.join(this.config.syncPath, docPath) const builders = new Builders(this) - const doc = await builders - .metafile() - .path(docPath) - .upToDate() - .create() + const doc = await builders.metafile().path(docPath).upToDate().create() await should(localDoc(filePath, this)).be.fulfilledWith(doc) }) - it('throws a CozyNoteError with code CozyDocumentMissingError if no doc exist with the given path', async function() { + it('throws a CozyNoteError with code CozyDocumentMissingError if no doc exist with the given path', async function () { const docPath = 'Notes/Some interesting stuff.cozy-note' const filePath = path.join(this.config.syncPath, docPath) @@ -46,16 +42,12 @@ describe('utils/notes', () => { }) }) - it('throws a CozyNoteError with code CozyDocumentMissingError if the note is not within the synced folder', async function() { + it('throws a CozyNoteError with code CozyDocumentMissingError if the note is not within the synced folder', async function () { const docPath = 'Notes/Some interesting stuff.cozy-note' const filePath = path.join(os.tmpdir(), docPath) const builders = new Builders(this) - await builders - .metafile() - .path(docPath) - .upToDate() - .create() + await builders.metafile().path(docPath).upToDate().create() await should(localDoc(filePath, this)).be.rejectedWith({ code: 'CozyDocumentMissingError' @@ -69,15 +61,12 @@ describe('utils/notes', () => { beforeEach('clean remote cozy', cozyHelpers.deleteAll) after('clean config directory', configHelpers.cleanConfig) - it('fetches the remote io.cozy.files document associated with the given local doc', async function() { + it('fetches the remote io.cozy.files document associated with the given local doc', async function () { const docPath = 'Some interesting stuff.cozy-note' const remoteHelpers = new RemoteTestHelpers(this) const builders = new Builders({ cozy }) - const remote = await builders - .remoteFile() - .name(docPath) - .create() + const remote = await builders.remoteFile().name(docPath).create() const doc = await builders .metafile() .fromRemote(remote) @@ -89,7 +78,7 @@ describe('utils/notes', () => { ).be.fulfilledWith(remote) }) - it('throws a CozyNoteError with code CozyDocumentMissingError if no remote doc exist for the given local doc', async function() { + it('throws a CozyNoteError with code CozyDocumentMissingError if no remote doc exist for the given local doc', async function () { const docPath = 'Some interesting stuff.cozy-note' const remoteHelpers = new RemoteTestHelpers(this) @@ -106,20 +95,13 @@ describe('utils/notes', () => { ).be.rejectedWith({ code: 'CozyDocumentMissingError' }) }) - it('throws a CozyNoteError with code CozyDocumentMissingError if the local doc is not associated with a remote doc', async function() { + it('throws a CozyNoteError with code CozyDocumentMissingError if the local doc is not associated with a remote doc', async function () { const docPath = 'Some interesting stuff.cozy-note' const remoteHelpers = new RemoteTestHelpers(this) const builders = new Builders({ cozy }) - await builders - .remoteFile() - .name(docPath) - .create() - const doc = await builders - .metafile() - .path(docPath) - .upToDate() - .build() + await builders.remoteFile().name(docPath).create() + const doc = await builders.metafile().path(docPath).upToDate().build() await should( remoteDoc(doc, { config: this.config, remote: remoteHelpers.side }) @@ -135,7 +117,7 @@ describe('utils/notes', () => { afterEach('clean pouch', pouchHelpers.cleanDatabase) after('clean config directory', configHelpers.cleanConfig) - it('throws an Error when filePath does not correspond to a synced note', async function() { + it('throws an Error when filePath does not correspond to a synced note', async function () { const docPath = 'Notes/Some interesting stuff.cozy-note' const filePath = path.join(this.config.syncPath, docPath) @@ -144,18 +126,14 @@ describe('utils/notes', () => { ) }) - it('throws a CozyNoteError with code CozyDocumentMissingError if the synced note does not exist anymore on the Cozy', async function() { + it('throws a CozyNoteError with code CozyDocumentMissingError if the synced note does not exist anymore on the Cozy', async function () { const docPath = 'Some interesting stuff.cozy-note' const filePath = path.join(this.config.syncPath, docPath) const localHelpers = new LocalTestHelpers(this) await localHelpers.syncDir.outputFile(docPath, 'Note content') const builders = new Builders({ cozy }) - await builders - .metafile() - .path(docPath) - .remoteId('3232') - .build() + await builders.metafile().path(docPath).remoteId('3232').build() await should(findNote(filePath, this)).be.rejectedWith({ code: 'CozyDocumentMissingError' diff --git a/test/unit/utils/sentry.js b/test/unit/utils/sentry.js index d33a574f2..9b77f8783 100644 --- a/test/unit/utils/sentry.js +++ b/test/unit/utils/sentry.js @@ -28,9 +28,9 @@ class CozyClientFetchError extends Error { } } -describe('Sentry', function() { - describe('toSentryContext', function() { - it('properly parse all urls', function() { +describe('Sentry', function () { + describe('toSentryContext', function () { + it('properly parse all urls', function () { sentry .toSentryContext('https://somedevcozy.cozy.localhost:8080') .should.deepEqual({ @@ -53,7 +53,7 @@ describe('Sentry', function() { }) }) - describe('format', function() { + describe('format', function () { it('formats Node system errors', () => { try { fs.readFileSync(`${__filename}.missing-file`) diff --git a/test/unit/utils/timestamp.js b/test/unit/utils/timestamp.js index cfaf2ed50..287994db6 100644 --- a/test/unit/utils/timestamp.js +++ b/test/unit/utils/timestamp.js @@ -63,7 +63,7 @@ describe('timestamp', () => { }) describe('almostSameDate', () => { - it('returns true if the date are nearly the same', function() { + it('returns true if the date are nearly the same', function () { let a = '2015-12-01T11:22:56.517Z' let b = '2015-12-01T11:22:56.000Z' let c = '2015-12-01T11:22:57.000Z' @@ -92,7 +92,7 @@ describe('timestamp', () => { should(maxDate(d1, d1)).deepEqual(d1) }) - it('increments the most recent date by 1 millisecond if it has more than 3 millisecond digits', function() { + it('increments the most recent date by 1 millisecond if it has more than 3 millisecond digits', function () { const d1 = '2015-12-31T23:59:59.999232345Z' const d2 = '2015-12-31T23:59:59.999Z' @@ -108,24 +108,24 @@ describe('timestamp', () => { }) describe('roundedRemoteDate', () => { - it('adds the milliseconds when they are missing', function() { + it('adds the milliseconds when they are missing', function () { const time = '2015-12-31T23:59:59Z' should(roundedRemoteDate(time)).equal('2015-12-31T23:59:59.000Z') }) - it('pads the milliseconds with 0s if they have less than 3 digits', function() { + it('pads the milliseconds with 0s if they have less than 3 digits', function () { const a = '2015-12-31T23:59:59.5Z' const b = '2015-12-31T23:59:59.54Z' should(roundedRemoteDate(a)).equal('2015-12-31T23:59:59.500Z') should(roundedRemoteDate(b)).equal('2015-12-31T23:59:59.540Z') }) - it('increments the time by 1 millisecond if they have more than 3 digits', function() { + it('increments the time by 1 millisecond if they have more than 3 digits', function () { const time = '2015-12-31T23:59:59.999232345Z' should(roundedRemoteDate(time)).equal('2016-01-01T00:00:00.000Z') }) - it('handles dates with timezones other than UTC', function() { + it('handles dates with timezones other than UTC', function () { // All previous examples with a different timezone const a = '2020-04-05T19:50:06+02:00' const b = '2020-04-05T19:50:06.029+02:00' diff --git a/test/world/case_and_encoding.js b/test/world/case_and_encoding.js index bd67948c2..0b9395af4 100644 --- a/test/world/case_and_encoding.js +++ b/test/world/case_and_encoding.js @@ -7,7 +7,7 @@ const should = require('should') const MacOSRelease = require('../support/helpers/MacOSRelease') -should.Assertion.add('hex', function(expectedPretty) { +should.Assertion.add('hex', function (expectedPretty) { const expected = expectedPretty.trim().split(/\s+/) const actual = Buffer.from(this.obj) .toString('hex') diff --git a/yarn.lock b/yarn.lock index f378e18c5..b8809b952 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,67 +16,971 @@ nan "2.14.1" prebuild-install "5.3.3" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@7.12.3": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" + integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/eslint-parser@^7.16.3": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz#48d3485091d6e36915358e4c0d0b2ebe6da90462" + integrity sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA== dependencies: - "@babel/highlight" "^7.0.0" + eslint-scope "^5.1.1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.6.3": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" - integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== +"@babel/generator@^7.12.1", "@babel/generator@^7.16.7", "@babel/generator@^7.16.8", "@babel/generator@^7.4.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: - "@babel/types" "^7.6.3" + "@babel/types" "^7.16.8" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.16.7" -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: - "@babel/types" "^7.0.0" + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/types" "^7.4.4" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" + integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.12.1", "@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" - integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== +"@babel/parser@^7.12.3", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.4.3", "@babel/parser@^7.9.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.8.tgz#61c243a3875f7d0b0962b0543a33ece6ff2f1f17" + integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0", "@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz#e418e3aa6f86edd6d327ce84eff188e479f571e0" + integrity sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/polyfill@^7.0.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.6.0.tgz#6d89203f8b6cd323e8d946e47774ea35dc0619cc" - integrity sha512-q5BZJI0n/B10VaQQvln1IlDK3BTBJFbADx7tv+oXDPIDZuTo37H5Adb9jhlXm/fEN4Y7/64qD9mnrJJG7rmaTw== +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== dependencies: - core-js "^2.6.5" - regenerator-runtime "^0.13.2" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" + integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-regenerator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.8.tgz#3339368701103edae708f0fba9e4bfb70a3e5872" + integrity sha512-6Kg2XHPFnIarNweZxmzbgYnnWsXxkx9WQUVk2sksBRL80lBC1RAQV3wQagWxdCHiYHqPN+oenwNIuttlYgIbQQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typescript@^7.16.7": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-typescript" "^7.16.7" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.16.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.8.tgz#e682fa0bcd1cf49621d64a8956318ddfb9a05af9" + integrity sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg== + dependencies: + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.7" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.16.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@^7.16.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.16.7" "@babel/runtime@7.0.0": version "7.0.0" @@ -85,14 +989,14 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd" - integrity sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg== +"@babel/runtime@7.16.7", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: - regenerator-runtime "^0.13.2" + regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.5": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.4": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== @@ -106,44 +1010,37 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.9.2": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" - integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.1.0", "@babel/template@^7.4.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.4.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" - integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.3" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.3" - "@babel/types" "^7.6.3" +"@babel/template@^7.10.4", "@babel/template@^7.16.7", "@babel/template@^7.4.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.3": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.8.tgz#bab2f2b09a5fe8a8d9cad22cbfe3ba1d126fef9c" + integrity sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.8" + "@babel/types" "^7.16.8" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0", "@babel/types@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" - integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== +"@babel/types@^7.12.1", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== dependencies: - esutils "^2.0.2" - lodash "^4.17.13" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@cozy/minilog@1.0.0": @@ -238,6 +1135,21 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@eslint/eslintrc@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" + integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.2.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@gyselroth/windows-fsstat@https://github.com/taratatach/node-windows-fsstat.git#1.0.0": version "1.0.0" resolved "https://github.com/taratatach/node-windows-fsstat.git#ece4512cfb40e58c5c8c00ac587a123a5e9dee52" @@ -245,6 +1157,20 @@ nan "^2.14.0" node-gyp "^5.0.4" +"@humanwhocodes/config-array@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914" + integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -256,129 +1182,222 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@nodelib/fs.scandir@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" - integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@nodelib/fs.stat" "2.0.4" + "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" - integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" - integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.4" + "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@octokit/rest@^15.12.1": - version "15.18.3" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.3.tgz#ff4ecbb784ca286c40cc1d568abceda6d99b36fc" - integrity sha512-oHABAvvC83tPIuvUfWRaw9eLThFrCxBgywl+KvEwfTFjoCrMOfEaMh0r39+Ub/EEbV345GJiMzN+zPZ4kqOvbA== - dependencies: - before-after-hook "^1.1.0" - btoa-lite "^1.0.0" - debug "^3.1.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.0" - lodash "^4.17.4" - node-fetch "^2.1.1" - universal-user-agent "^2.0.0" - url-template "^2.0.8" +"@octokit/auth-token@^2.4.4": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" + integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.5.1.tgz#8601ceeb1ec0e1b1b8217b960a413ed8e947809b" + integrity sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.6.0" + "@octokit/request-error" "^2.0.5" + "@octokit/types" "^6.0.3" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.12" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" + integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== + dependencies: + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" + integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== + dependencies: + "@octokit/request" "^5.6.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^11.2.0": + version "11.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" + integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== + +"@octokit/plugin-paginate-rest@^2.16.8": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7" + integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== + dependencies: + "@octokit/types" "^6.34.0" + +"@octokit/plugin-request-log@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== + +"@octokit/plugin-rest-endpoint-methods@^5.12.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba" + integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== + dependencies: + "@octokit/types" "^6.34.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" + integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== + dependencies: + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.6.0": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.2.tgz#1aa74d5da7b9e04ac60ef232edd9a7438dcf32d8" + integrity sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.1.0" + "@octokit/types" "^6.16.1" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" + universal-user-agent "^6.0.0" + +"@octokit/rest@^18.12.0": + version "18.12.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" + integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== + dependencies: + "@octokit/core" "^3.5.1" + "@octokit/plugin-paginate-rest" "^2.16.8" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^5.12.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": + version "6.34.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" + integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== + dependencies: + "@octokit/openapi-types" "^11.2.0" "@popperjs/core@^2.4.4": version "2.4.4" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.4.tgz#11d5db19bd178936ec89cd84519c4de439574398" integrity sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg== -"@sentry/browser@4.6.2 || ~4.6.4": - version "4.6.6" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-4.6.6.tgz#58ac3de9956c8a7033f3830c3ee9e011c2bd133a" - integrity sha512-+9VsQ+oQYU+PYlLJG2ex7JCMSVQbnUvWPI2uZOofWdI9sWIPUub3boWItMzRQNQ1T4S3FZd4FqAWNFd3azdnBw== +"@sentry/browser@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.7.1.tgz#e01144a08984a486ecc91d7922cc457e9c9bd6b7" + integrity sha512-R5PYx4TTvifcU790XkK6JVGwavKaXwycDU0MaAwfc4Vf7BLm5KCNJCsDySu1RPAap/017MVYf54p6dWvKiRviA== dependencies: - "@sentry/core" "4.6.6" - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.5" + "@sentry/core" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" tslib "^1.9.3" -"@sentry/core@4.6.2 || ~4.6.4", "@sentry/core@4.6.6": - version "4.6.6" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.6.6.tgz#dea96a88533a3bdbdcc86ae18e35272c57e0fd20" - integrity sha512-7z9HKLTNr3zVBR3tBRheTxkkkuK2IqISUc5Iyo3crN2OecOLtpptT96f5XjLndBEL2ab39eCBPpA5OFjbpzrIA== +"@sentry/core@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.7.1.tgz#c3aaa6415d06bec65ac446b13b84f073805633e3" + integrity sha512-VAv8OR/7INn2JfiLcuop4hfDcyC7mfL9fdPndQEhlacjmw8gRrgXjR7qyhnCTgzFLkHI7V5bcdIzA83TRPYQpA== dependencies: - "@sentry/hub" "4.6.5" - "@sentry/minimal" "4.6.5" - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.5" + "@sentry/hub" "6.7.1" + "@sentry/minimal" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" tslib "^1.9.3" -"@sentry/electron@^0.17.4": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@sentry/electron/-/electron-0.17.4.tgz#0684588d2b2aaed1098c6ff7789dfc4266ed1162" - integrity sha512-1IU0o+E8eY5Lrthj6Pqf+Dh8MptddHsFFmcOwKlft/bbZ+6RTKEefLtFOclKUMLR64C7GTqa80Yddq0ssjOv5w== - dependencies: - "@sentry/browser" "4.6.2 || ~4.6.4" - "@sentry/core" "4.6.2 || ~4.6.4" - "@sentry/minimal" "^4.5.0" - "@sentry/node" "4.6.2 || ~4.6.4" - "@sentry/types" "^4.5.0" - "@sentry/utils" "4.6.2 || ~4.6.4" - electron-fetch "1.3.0" - form-data "2.3.2" - util.promisify "1.0.0" - -"@sentry/hub@4.6.5": - version "4.6.5" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.6.5.tgz#451def7bc8d90d9cc007f58f364b3ce305c4701a" - integrity sha512-v9vee8s8C1fK/DPtNOzv6r+AMbPDOWfnasouNcBUkbQUSN5wUNyCDvt51QbWaw5kMMY5TSqjdVqY6gXQZI0APQ== - dependencies: - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.5" +"@sentry/electron@2.5.4": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@sentry/electron/-/electron-2.5.4.tgz#337b2f7e228e805a3e4eb3611c7b12c6cf87c618" + integrity sha512-tCCK+P581TmdjsDpHBQz7qYcldzGdUk1Fd6FPxPy1JKGzeY4uf/uSLKzR80Lzs5kTpEZFOwiMHSA8yjwFp5qoA== + dependencies: + "@sentry/browser" "6.7.1" + "@sentry/core" "6.7.1" + "@sentry/minimal" "6.7.1" + "@sentry/node" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + tslib "^2.2.0" + +"@sentry/hub@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.7.1.tgz#d46d24deec67f0731a808ca16796e6765b371bc1" + integrity sha512-eVCTWvvcp6xa0A5GGNHMQEWslmKPlisE5rGmsV/kjvSUv3zSrI0eIDfb51ikdnCiBjHpK2NBWP8Vy8cZOEJegg== + dependencies: + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" tslib "^1.9.3" -"@sentry/minimal@4.6.5", "@sentry/minimal@^4.5.0": - version "4.6.5" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.6.5.tgz#64433d2c9fda69eedbb61855a7ff8905f7b19218" - integrity sha512-tf+J+uUNmSgzC7d9JSN8Ekw1HeBAX87Efa/jyFbzLvaw80oibvTiLSLqDjQ9PgvyIzBUuuPImkS2NpvPQGWFtg== +"@sentry/minimal@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.7.1.tgz#babf85ee2f167e9dcf150d750d7a0b250c98449c" + integrity sha512-HDDPEnQRD6hC0qaHdqqKDStcdE1KhkFh0RCtJNMCDn0zpav8Dj9AteF70x6kLSlliAJ/JFwi6AmQrLz+FxPexw== dependencies: - "@sentry/hub" "4.6.5" - "@sentry/types" "4.5.3" + "@sentry/hub" "6.7.1" + "@sentry/types" "6.7.1" + tslib "^1.9.3" + +"@sentry/node@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.7.1.tgz#b09e2eca8e187168feba7bd865a23935bf0f5cc0" + integrity sha512-rtZo1O8ROv4lZwuljQz3iFZW89oXSlgXCG2VqkxQyRspPWu89abROpxLjYzsWwQ8djnur1XjFv51kOLDUTS6Qw== + dependencies: + "@sentry/core" "6.7.1" + "@sentry/hub" "6.7.1" + "@sentry/tracing" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/node@4.6.2 || ~4.6.4": - version "4.6.6" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.6.6.tgz#50531a1a857d836b7eaf94a5f90556bae3074435" - integrity sha512-+zZHE2uOwQTgypP6N9oBd0Io6BKXaJh6mdmZBauF0G46/8V28sBQ/dXBtJJNZ8tW7eVlLGpLSGuJb9Ai7c/rNw== - dependencies: - "@sentry/core" "4.6.6" - "@sentry/hub" "4.6.5" - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.5" - "@types/stack-trace" "0.0.29" - cookie "0.3.1" - https-proxy-agent "2.2.1" - lru_map "0.3.3" - lsmod "1.0.0" - stack-trace "0.0.10" +"@sentry/tracing@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.7.1.tgz#b11f0c17a6c5dc14ef44733e5436afb686683268" + integrity sha512-wyS3nWNl5mzaC1qZ2AIp1hjXnfO9EERjMIJjCihs2LWBz1r3efxrHxJHs8wXlNWvrT3KLhq/7vvF5CdU82uPeQ== + dependencies: + "@sentry/hub" "6.7.1" + "@sentry/minimal" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" tslib "^1.9.3" -"@sentry/types@4.5.3", "@sentry/types@^4.5.0": - version "4.5.3" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.5.3.tgz#3350dce2b7f9b936a8c327891c12e3aef7bd8852" - integrity sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag== +"@sentry/types@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.7.1.tgz#c8263e1886df5e815570c4668eb40a1cfaa1c88b" + integrity sha512-9AO7HKoip2MBMNQJEd6+AKtjj2+q9Ze4ooWUdEvdOVSt5drg7BGpK221/p9JEOyJAZwEPEXdcMd3VAIMiOb4MA== -"@sentry/utils@4.6.2 || ~4.6.4", "@sentry/utils@4.6.5": - version "4.6.5" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.6.5.tgz#4c960524914311eb76bbd6ca7f80f4d98c04db7f" - integrity sha512-rTISJtRRbWsd3UE+TkA3QG1C0VzPKPW8w74tieBwYhtTCGmOHNwz2nDC/MZGbGj4OgDmNKKl4CCyQr88EX08hA== +"@sentry/utils@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.7.1.tgz#909184ad580f0f6375e1e4d4a6ffd33dfe64a4d1" + integrity sha512-Tq2otdbWlHAkctD+EWTYKkEx6BL1Qn3Z/imkO06/PvzpWvVhJWQ5qHAzz5XnwwqNHyV03KVzYB6znq1Bea9HuA== dependencies: - "@sentry/types" "4.5.3" + "@sentry/types" "6.7.1" tslib "^1.9.3" "@sindresorhus/is@^0.14.0": @@ -386,10 +1405,45 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@sindresorhus/is@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1" + integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg== + +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^7.0.4": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb" + integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -398,15 +1452,27 @@ dependencies: defer-to-connect "^1.0.1" +"@szmarczak/http-timer@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/cacheable-request@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" "@types/debug@^4.1.5": version "4.1.5" @@ -420,10 +1486,30 @@ dependencies: "@types/node" "*" +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/hoist-non-react-statics@^3.3.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" @@ -440,22 +1526,41 @@ "@types/istanbul-lib-report" "*" "@types/jest@^26.0.20": - version "26.0.23" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" - integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== + version "26.0.24" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" + integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" +"@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/keyv@*", "@types/keyv@^3.1.1": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41" + integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg== + dependencies: + "@types/node" "*" + "@types/lodash@^4.14.170": - version "4.14.170" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" - integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== + version "4.14.178" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" "@types/node@*": - version "14.14.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313" - integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag== + version "17.0.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" + integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== "@types/node@^14.6.2": version "14.17.21" @@ -463,37 +1568,60 @@ integrity sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA== "@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== -"@types/react@^16.8.12": - version "16.9.9" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.9.tgz#a62c6f40f04bc7681be5e20975503a64fe783c3a" - integrity sha512-L+AudFJkDukk+ukInYvpoAPyJK5q1GanFOINOJnM0w6tUgITuWvJ4jyoBPFL7z4/L8hGLd+K/6xR5uUjXu0vVg== +"@types/react-redux@^7.1.20": + version "7.1.21" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.21.tgz#f32bbaf7cbc4b93f51e10d340aa54035c084b186" + integrity sha512-bLdglUiBSQNzWVVbmNPKGYYjrzp3/YDPwfOH3nLEz99I4awLlaRAPWjo6bZ2POpxztFWtDDXIPxBLVykXqBt+w== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + +"@types/react@*": + version "17.0.38" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" + integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== dependencies: "@types/prop-types" "*" - csstype "^2.2.0" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/responselike@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/semver@^6.0.1": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.0.2.tgz#5e8b09f0e4af53034b1d0fb9977a277847836205" integrity sha512-G1Ggy7/9Nsa1Jt2yiBR2riEuyK2DFNnqow6R7cromXPMNynackRY1vqFTLz/gwnef1LHokbXThcPhqMRjUbkpQ== -"@types/stack-trace@0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d" - integrity sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g== +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== dependencies: "@types/yargs-parser" "*" @@ -504,6 +1632,91 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^5.4.0": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.1.tgz#e5a86d7e1f9dc0b3df1e6d94feaf20dd838d066c" + integrity sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw== + dependencies: + "@typescript-eslint/experimental-utils" "5.9.1" + "@typescript-eslint/scope-manager" "5.9.1" + "@typescript-eslint/type-utils" "5.9.1" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.1.tgz#8c407c4dd5ffe522329df6e4c9c2b52206d5f7f1" + integrity sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.9.1" + "@typescript-eslint/types" "5.9.1" + "@typescript-eslint/typescript-estree" "5.9.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^5.4.0": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.9.1.tgz#b114011010a87e17b3265ca715e16c76a9834cef" + integrity sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g== + dependencies: + "@typescript-eslint/scope-manager" "5.9.1" + "@typescript-eslint/types" "5.9.1" + "@typescript-eslint/typescript-estree" "5.9.1" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.9.1.tgz#6c27be89f1a9409f284d95dfa08ee3400166fe69" + integrity sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ== + dependencies: + "@typescript-eslint/types" "5.9.1" + "@typescript-eslint/visitor-keys" "5.9.1" + +"@typescript-eslint/type-utils@5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.9.1.tgz#c6832ffe655b9b1fec642d36db1a262d721193de" + integrity sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg== + dependencies: + "@typescript-eslint/experimental-utils" "5.9.1" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.9.1.tgz#1bef8f238a2fb32ebc6ff6d75020d9f47a1593c6" + integrity sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ== + +"@typescript-eslint/typescript-estree@5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.1.tgz#d5b996f49476495070d2b8dd354861cf33c005d6" + integrity sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A== + dependencies: + "@typescript-eslint/types" "5.9.1" + "@typescript-eslint/visitor-keys" "5.9.1" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.1.tgz#f52206f38128dd4f675cf28070a41596eee985b7" + integrity sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg== + dependencies: + "@typescript-eslint/types" "5.9.1" + eslint-visitor-keys "^3.0.0" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -521,11 +1734,6 @@ abort-controller@3.0.0: dependencies: event-target-shim "^5.0.0" -abortcontroller-polyfill@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.5.0.tgz#2c562f530869abbcf88d949a2b60d1d402e87a7c" - integrity sha512-O6Xk757Jb4o0LMzMOMdWvxpHWrQzruYBaUruFaIOfAQRnWFxfdXYobw12jrVHGtoXk6WiiyYzc0QWN9aL62HQA== - abstract-leveldown@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.1.tgz#37b655151e13c3d9b20fa3a04ce63ccaa345fce4" @@ -558,15 +1766,15 @@ accessibility-developer-tools@^2.11.0: resolved "https://registry.yarnpkg.com/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz#3da0cce9d6ec6373964b84f35db7cfc3df7ab514" integrity sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ= -acorn-jsx@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^6.0.2, acorn@^6.0.7: - version "6.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" - integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== +acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== agent-base@2: version "2.1.1" @@ -576,17 +1784,10 @@ agent-base@2: extend "~3.0.0" semver "~5.0.1" -agent-base@4, agent-base@^4.1.0, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - agent-base@6: - version "6.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" - integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" @@ -608,7 +1809,7 @@ ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: +ajv@^6.1.0: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -618,6 +1819,16 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + ajv@^6.12.0: version "6.12.4" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" @@ -628,6 +1839,16 @@ ajv@^6.12.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -640,21 +1861,11 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@^4.1.1: +ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -670,10 +1881,10 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -683,21 +1894,12 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" -anymatch@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -746,6 +1948,13 @@ append-transform@^1.0.0: dependencies: default-require-extensions "^2.0.0" +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + applescript@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/applescript/-/applescript-1.0.0.tgz#bb87af568cad034a4e48c4bdaf6067a3a2701317" @@ -771,43 +1980,52 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + argsarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb" integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs= -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= +array-includes@^3.1.3, array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flatmap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +array.prototype.foreach@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array.prototype.foreach/-/array.prototype.foreach-1.0.2.tgz#592b177c8d6abb84e14de1649eb6e7cc5eb9c9ae" + integrity sha512-gCOgyBKIaFL5hekfQLhsNmF0TY4Y5JdtOyFKtbSpL72oiCAZ9Zi7TFvcfSsM1LnBFMog1RYVJF0PHgtnY+U5nA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + es-array-method-boxes-properly "^1.0.0" + get-intrinsic "^1.1.1" + is-string "^1.0.7" arrify@^1.0.1: version "1.0.1" @@ -815,9 +2033,9 @@ arrify@^1.0.1: integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" @@ -831,15 +2049,10 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-exit-hook@^2.0.1: version "2.0.1" @@ -856,6 +2069,11 @@ async@1.x: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +async@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -873,17 +2091,15 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -auto-bind@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-2.1.1.tgz#8ae509671ecdfbd5009fc99b0f19ae9c3a2abf50" - integrity sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A== - dependencies: - "@types/react" "^16.8.12" +auto-bind@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== auto-launch@^5.0.3: version "5.0.5" @@ -902,21 +2118,40 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -babel-eslint@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" - integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz#f81371be3fe499d39e074e272a1ef86533f3d268" + integrity sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.20.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" babel-polyfill@^6.26.0: version "6.26.0" @@ -927,6 +2162,25 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" +babel-preset-cozy-app@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-cozy-app/-/babel-preset-cozy-app-2.0.1.tgz#4dacfc21c803ed0fec17c1da97eb53640242bad6" + integrity sha512-8WNUgyEEkvW3do0wvYjfVUmXhJMry0n7qGPD9LN3mXlHiNGvnWA15tD5t7y36KeKCurh1zspYNzlOO9LNohOTw== + dependencies: + "@babel/core" "7.12.3" + "@babel/eslint-parser" "^7.16.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.4" + "@babel/preset-env" "^7.16.4" + "@babel/preset-react" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.3" + browserslist-config-cozy "^0.4.0" + lodash "^4.17.21" + typescript "^4.5.2" + babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -935,20 +2189,15 @@ babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babylon@7.0.0-beta.19: - version "7.0.0-beta.19" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.19.tgz#e928c7e807e970e0536b078ab3e0c48f9e052503" - integrity sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A== - bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2: version "1.3.1" @@ -960,19 +2209,6 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -980,15 +2216,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" - integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== - -big-integer@^1.6.17: - version "1.6.47" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.47.tgz#e1e9320e26c4cc81f64fbf4b3bb20e025bf18e2d" - integrity sha512-9t9f7X3as2XGX8b52GqG6ox0GvIdM86LyIXASJnDCFhYNgt+A+MByQZ3W2PyMRZjEvG5f8TEbSPfEotVuMJnQg== +before-after-hook@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" + integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== big.js@^5.2.2: version "5.2.2" @@ -1000,7 +2231,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -binary@^0.3.0, binary@~0.3.0: +binary@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= @@ -1008,14 +2239,7 @@ binary@^0.3.0, binary@~0.3.0: buffers "~0.1.1" chainsaw "~0.1.0" -bindings@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -binwrap@0.2.2, binwrap@^0.2.2: +binwrap@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/binwrap/-/binwrap-0.2.2.tgz#7d1ea74b28332f18dfdc75548aef993041ffafc9" integrity sha512-Y+Wvypk3JhH5GPZAvlwJAWOVH/OsOhQMSj37vySuWHwQivoALplPxfBA8b973rFJI7OS+O+1YmmYXIiEXVMAcw== @@ -1026,6 +2250,15 @@ binwrap@0.2.2, binwrap@^0.2.2: tar "^4.4.10" unzip-stream "^0.3.0" +binwrap@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/binwrap/-/binwrap-0.2.3.tgz#87c4e46fa022e2c78b8380e6dd465973bfc7fbca" + integrity sha512-N4Pm7iyDEv0BrAMs+dny8WQa+e0nNTdzn2ODkf/MM6XBtKSCxCSUA1ZOQGoc1n7mUqdgOS5pwjsW91rmXVxy2Q== + dependencies: + request "^2.88.0" + tar "^6.1.0" + unzip-stream "^0.3.1" + bl@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a" @@ -1042,21 +2275,16 @@ bluebird-lst@^1.0.9: dependencies: bluebird "^3.5.5" -bluebird@3.5.5, bluebird@~3.5.0: - version "3.5.5" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== +bluebird@3.7.2, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bluebird@^3.5.0, bluebird@^3.5.4, bluebird@^3.5.5: +bluebird@^3.5.0, bluebird@^3.5.5: version "3.7.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - body-scroll-lock@^2.5.8: version "2.7.1" resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-2.7.1.tgz#caf3f9c91773af1ffb684cd66ed9137b5b737014" @@ -1094,23 +2322,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -1122,10 +2334,21 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -btoa-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= +browserslist-config-cozy@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/browserslist-config-cozy/-/browserslist-config-cozy-0.4.0.tgz#0b3fd831ce59c69e70b799a4e57a206535468878" + integrity sha512-t2q4UoWotfnT9Zw/GKXgSh0nMyvUCQEji+EObSQXsUCnEwhac8Ae3AJYd2ySsEHZ/ufEX8f6kR6jPbWJqBpUUw== + +browserslist@^4.17.5, browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" btoa@^1.1.2, btoa@^1.2.1: version "1.2.1" @@ -1152,11 +2375,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-indexof-polyfill@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz#a9fb806ce8145d5428510ce72f278bb363a638bf" - integrity sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8= - buffer@^5.5.0: version "5.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" @@ -1214,45 +2432,25 @@ builder-util@22.8.1: stat-mode "^1.0.0" temp-file "^3.3.7" -bunyan@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-2.0.2.tgz#8dbb0feb1a320b9255bc42ba2d4460ad6c045028" - integrity sha1-jbsP6xoyC5JVvEK6LURgrWwEUCg= +bunyan@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-2.0.5.tgz#9dd056755220dddd8b5bb9cf76f3d0d766e96e71" + integrity sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA== dependencies: exeunt "1.1.0" optionalDependencies: dtrace-provider "~0.8" - moment "^2.10.6" + moment "^2.19.3" mv "~2" safe-json-stringify "~1" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" +cacheable-lookup@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz#87be64a18b925234875e10a9bb1ebca4adce6b38" + integrity sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg== + dependencies: + "@types/keyv" "^3.1.1" + keyv "^4.0.0" cacheable-request@^6.0.0: version "6.1.0" @@ -1267,37 +2465,58 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" +cacheable-request@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001286: + version "1.0.30001298" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz#0e690039f62e91c3ea581673d716890512e7ec52" + integrity sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -catharsis@~0.8.9: - version "0.8.11" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468" - integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== dependencies: - lodash "^4.17.14" + lodash "^4.17.15" caw@^2.0.1: version "2.0.1" @@ -1309,21 +2528,21 @@ caw@^2.0.1: tunnel-agent "^0.6.0" url-to-options "^1.0.1" -chai-like@^1.1.1: +chai-like@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chai-like/-/chai-like-1.1.1.tgz#8c558a414c34514e814d497c772547ceb7958f64" integrity sha512-VKa9z/SnhXhkT1zIjtPACFWSoWsqVoaz1Vg+ecrKo5DCKVlgL30F/pEyEvXPBOVwCgLZcWUleCM/C1okaKdTTA== -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== +chai@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== 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.0" + pathval "^1.1.1" type-detect "^4.0.5" chainsaw@~0.1.0: @@ -1333,7 +2552,7 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1350,18 +2569,10 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -1381,12 +2592,7 @@ character-reference-invalid@^1.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -charenc@~0.0.1: +charenc@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= @@ -1396,7 +2602,7 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -cheerio@^0.22.0: +cheerio@0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= @@ -1418,30 +2624,15 @@ cheerio@^0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" -chokidar-cli@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chokidar-cli/-/chokidar-cli-2.0.0.tgz#1de6104536991342003953cb15dec3127738cdd2" - integrity sha512-E3N0WlV1L4c60cs9owdGQpZXY5obZya5Xds7+sF6GTVWWZKwqlq9QG7c2ESPNtjS+5QusAg8VmUEnOnAtZYNcg== - dependencies: - bluebird "3.5.5" - chokidar "3.0.2" - lodash "4.17.15" - yargs "13.3.0" - -chokidar@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681" - integrity sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA== +chokidar-cli@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chokidar-cli/-/chokidar-cli-3.0.0.tgz#29283666063b9e167559d30f247ff8fc48794eb7" + integrity sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ== dependencies: - anymatch "^3.0.1" - braces "^3.0.2" - glob-parent "^5.0.0" - is-binary-path "^2.1.0" - is-glob "^4.0.1" - normalize-path "^3.0.0" - readdirp "^3.1.1" - optionalDependencies: - fsevents "^2.0.6" + chokidar "^3.5.2" + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + yargs "^13.3.0" chokidar@3.2.1: version "3.2.1" @@ -1458,7 +2649,7 @@ chokidar@3.2.1: optionalDependencies: fsevents "~2.1.0" -chokidar@^3.5.0: +chokidar@3.5.2, chokidar@^3.5.0, chokidar@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== @@ -1493,16 +2684,6 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - classnames@^2.2.5: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" @@ -1518,27 +2699,6 @@ cli-boxes@^2.2.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -1557,12 +2717,21 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-buffer@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= -clone-response@1.0.2, clone-response@^1.0.2: +clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -1579,14 +2748,6 @@ collapse-white-space@^1.0.2: resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1611,18 +2772,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@^1.3.2: +colors@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= - dependencies: - delayed-stream "~1.0.0" - combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1630,25 +2784,30 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== -commander@^2.11.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -compare-versions@^3.4.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.5.1.tgz#26e1f5cf0d48a77eced5046b9f67b6b61075a393" - integrity sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +commander@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +compare-versions@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== concat-map@0.0.1: version "0.0.1" @@ -1690,25 +2849,35 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +cookie@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== -core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: +core-js-compat@^3.20.0, core-js-compat@^3.20.2: + version "3.20.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b" + integrity sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + +core-js@^2.4.0, core-js@^2.5.0: version "2.6.10" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== core-js@^3.6.5: - version "3.18.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.18.2.tgz#63a551e8a29f305cd4123754846e65896619ba5b" - integrity sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ== + version "3.20.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.2.tgz#46468d8601eafc8b266bd2dd6bf9dee622779581" + integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw== core-util-is@1.0.2: version "1.0.2" @@ -1720,20 +2889,20 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cozy-client-js@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/cozy-client-js/-/cozy-client-js-0.19.0.tgz#ccfb0572d6c6f3aa7c187978c23dd89f04caf796" - integrity sha512-3EPLxLu7mg/GSmAHauW7rfdVMynCQb9Yj1vHvDO1Rpda/CV0xN04HRH1eq+3HhZiIx1g1L76zSh0jN1shgCknQ== +cozy-client-js@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/cozy-client-js/-/cozy-client-js-0.20.0.tgz#a507ef9ccbeb340aacd58ca1f1d0cdc9d000e853" + integrity sha512-ppguq9hkmtGpS2y+3pE4Pw0CcNOB25Lb82/q0I5r2k+pxCgrbI+6HB85TWQH8OEt/qJVoCCCa9dWE5WSZBUDYw== dependencies: core-js "^3.6.5" cross-fetch "^3.0.6" pouchdb-browser "7.0.0" pouchdb-find "7.0.0" -cozy-client@^27.1.0: - version "27.1.0" - resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-27.1.0.tgz#3611c9e407259b5701d6367bcea72f51b5ee423a" - integrity sha512-On/x99pUrZHvkZ3pCr9aSCnyPcVqP5DJAQHw42Gt4u5koOGGr2t8c07k5WrJQmF09n7sXVCZ89pLmwFNQ8JG+A== +cozy-client@^27.8.0: + version "27.8.0" + resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-27.8.0.tgz#08cbd8e778a3a721732b6e42b88d10775c0dd067" + integrity sha512-ZzdGJo4Jnjtf3v3mON5JjXpO+Qu+aKy1ePxyP037lktWq7N/eYvv3EMOgSbYztEbtnd9euIggEYgwN+sj2FhGg== dependencies: "@cozy/minilog" "1.0.0" "@types/jest" "^26.0.20" @@ -1742,11 +2911,12 @@ cozy-client@^27.1.0: cozy-device-helper "^1.12.0" cozy-flags "2.7.1" cozy-logger "^1.6.0" - cozy-stack-client "^27.1.0" + cozy-stack-client "^27.6.5" json-stable-stringify "^1.0.1" lodash "^4.17.13" microee "^0.0.6" node-fetch "^2.6.1" + node-polyglot "2.4.2" open "7.4.2" prop-types "^15.6.2" react-redux "^7.2.0" @@ -1757,9 +2927,9 @@ cozy-client@^27.1.0: url-search-params-polyfill "^8.0.0" cozy-device-helper@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.12.0.tgz#619a24b0d3caf2d3f616a1524daef7c7b71eab7a" - integrity sha512-7pFbltgkD8rSO0PEf8pd6aBB37RUnNYH7fb3pkbcvo5rk4quCfSLREV94gZwXxowzP4vjZcAumTM09DfI42mJA== + version "1.16.0" + resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.16.0.tgz#76f124724b340cac222d33789787e3c841f4b123" + integrity sha512-VcHkceUaYT79wu0wiYR8BrcTloVqY+GrLMGgJAFPdH1d8r3Vzcs3v/juor77TTOPcYEWuG702U93kx1u5rXpCg== dependencies: lodash "^4.17.19" @@ -1770,10 +2940,10 @@ cozy-flags@2.7.1: dependencies: microee "^0.0.6" -cozy-flags@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/cozy-flags/-/cozy-flags-2.8.0.tgz#1dfe47910811defa9af0cab97b53ba4b8a00095a" - integrity sha512-EVAb1jkBqIaXzz5IghCHvR/xatcT5tnQvhmBVEU2SDDftA+m5GdPZ4XjkjhVY2R34Rn3bAxQzhPTqwAL8fOOSQ== +cozy-flags@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/cozy-flags/-/cozy-flags-2.8.3.tgz#df6e75ed07bb5757f58a85e7469f00c791284324" + integrity sha512-0+EPr1RMEAlVZ6smWIItSZCu7b0/IkT2xG0UDe1xDcLBNMIm41aJVOZJnsK2SA4DTd7rEDMpk8iH+bSFTxxc8A== dependencies: microee "^0.0.6" @@ -1783,9 +2953,9 @@ cozy-interapp@0.5.4: integrity sha512-f0UaKpBkRUnIKgAWND0e1IwfTTINjizlgDmfQwX3aMyWp8t9wX0xkNFn53TSyKUoBUnfovrclS3hm9fngjEp7A== cozy-logger@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/cozy-logger/-/cozy-logger-1.6.0.tgz#51675e081e0a40baae6c38c64718cfaee5ee66ff" - integrity sha512-UkPR5lQDY6HldNv3N3c8HaxlfgcgAB/iRBFwJNFL2I17lhcM0u7w27vo1nuFeX6geMeFUjvedq/awawxZ1mTQg== + version "1.8.0" + resolved "https://registry.yarnpkg.com/cozy-logger/-/cozy-logger-1.8.0.tgz#8d37f8e52c0de02a65ca0606ad60b0ebf3a60ed6" + integrity sha512-0sBNsfwCwO/r23vrOncvj/EGRjDh/0Emh2WqWL0cYriPbOiidWrsULmh11Q9ykCB1IxBZ3z8PEpaqGTvAas2ug== dependencies: chalk "^2.4.2" json-stringify-safe "5.0.1" @@ -1800,10 +2970,10 @@ cozy-stack-client@^24.0.0: mime "^2.4.0" qs "^6.7.0" -cozy-stack-client@^27.1.0: - version "27.1.0" - resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-27.1.0.tgz#facc296e99b666c5fd56e449c65f95decac6ec8b" - integrity sha512-fcZJpoUd5E+rDRwiuQ5Whjg+jJlxlC/xpmDjdph0mlyDshAP5B8pdNpPIm7MYhnUbcS97JEZHLcQntdKZnHz5Q== +cozy-stack-client@^27.6.5: + version "27.6.5" + resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-27.6.5.tgz#4b40ad59821b957f161a77132b5346e99be0bc2c" + integrity sha512-aGkchVfvVGfI38qt+R8/BKv8nFN6Ihhx1LFsDYDtV+mW6OxOqVYdd22sIg9iHkusaqJgxgkMYnB9NcnDlC8Ajg== dependencies: cozy-flags "2.7.1" detect-node "^2.0.4" @@ -1842,28 +3012,21 @@ create-emotion@^10.0.4: "@emotion/sheet" "0.9.4" "@emotion/utils" "0.11.3" -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - -cross-env@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" - integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ== +cross-env@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: - cross-spawn "^6.0.5" + cross-spawn "^7.0.1" cross-fetch@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" - integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== dependencies: node-fetch "2.6.1" -cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -1883,7 +3046,16 @@ cross-spawn@7.0.0: shebang-command "^1.2.0" which "^1.2.9" -crypt@~0.0.1: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypt@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= @@ -1893,13 +3065,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-parse@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= - dependencies: - css "^2.0.0" - css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -1915,26 +3080,25 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== dependencies: - inherits "^2.0.3" + inherits "^2.0.4" source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -csstype@^2.2.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" - integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ== + source-map-resolve "^0.6.0" csstype@^2.5.7: version "2.6.13" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f" integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A== +csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1960,35 +3124,21 @@ debug-menu@^0.6.1: electron-debug "^1.1.0" electron-is-dev "^0.2.0" -debug@2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@3.2.6, debug@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: - ms "^2.1.1" + ms "2.1.2" -debug@^4.1.0, debug@^4.1.1: +debug@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -2002,11 +3152,16 @@ debug@^4.2.0: dependencies: ms "2.1.2" -decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2026,6 +3181,13 @@ decompress-response@^4.2.0: dependencies: mimic-response "^2.0.0" +decompress-response@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-5.0.0.tgz#7849396e80e3d1eba8cb2f75ef4930f76461cb0f" + integrity sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw== + dependencies: + mimic-response "^2.0.0" + deep-diff@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-1.0.2.tgz#afd3d1f749115be965e89c63edc7abb1506b9c26" @@ -2043,10 +3205,10 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^2.0.0: version "2.0.0" @@ -2055,11 +3217,23 @@ default-require-extensions@^2.0.0: dependencies: strip-bom "^3.0.0" +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + dependencies: + strip-bom "^4.0.0" + defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -2068,6 +3242,11 @@ deferred-leveldown@~5.3.0: abstract-leveldown "~6.2.1" inherits "^2.0.3" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -2075,28 +3254,6 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - del@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" @@ -2121,6 +3278,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -2145,10 +3307,10 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff@3.5.0, diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@5.0.0, diff@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== dir-glob@^3.0.1: version "3.0.1" @@ -2190,15 +3352,7 @@ dom-helpers@^3.2.1, dom-helpers@^3.4.0: dependencies: "@babel/runtime" "^7.1.2" -dom-serializer@0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" - integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^0.2.1: +dom-serializer@0, dom-serializer@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== @@ -2225,9 +3379,9 @@ domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== domhandler@^2.3.0: version "2.4.2" @@ -2297,13 +3451,6 @@ dtrace-provider@0.8.8, dtrace-provider@^0.8.8, dtrace-provider@~0.8: dependencies: nan "^2.14.0" -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -2352,17 +3499,10 @@ electron-debug@^1.1.0: electron-is-dev "^0.3.0" electron-localshortcut "^3.0.0" -electron-fetch@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.3.0.tgz#00d9bb1fe7a66ddc3fea538910e01b26fee9abb5" - integrity sha512-WzHnWZqKdiCKHqqHu+GphezoWRSUVH6BQ/f13vu16VwYKJRZNt2dUrx40eZJcyZcDGn6RJDTAHS6jVoHoglgNw== - dependencies: - encoding "^0.1.12" - -electron-fetch@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.1.tgz#2e777c42557652e28a67ae6ca29e825d280a195e" - integrity sha512-Vmzb6Lx/jghH5ZNI1ParfqQPKePMncI+Sg5oA92HBVa2TGUcEQJ/noU/zdf4gpugk/imh0qu3xcNY5C/5R8nlg== +electron-fetch@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.4.tgz#af975ab92a14798bfaa025f88dcd2e54a7b0b769" + integrity sha512-+fBLXEy4CJWQ5bz8dyaeSG1hD6JJ15kBZyj3eh24pIVrd3hLM47H/umffrdQfS6GZ0falF0g9JT9f3Rs6AVUhw== dependencies: encoding "^0.1.13" @@ -2391,18 +3531,17 @@ electron-localshortcut@^3.0.0: keyboardevent-from-electron-accelerator "^1.1.0" keyboardevents-areequal "^0.2.1" -electron-mocha@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/electron-mocha/-/electron-mocha-8.1.2.tgz#5023c74a5d6e4ee270a7527fc06056c3e78945f4" - integrity sha512-FZ9RzKtkjtsccnzjWQMNJF+RBuvdgUG1Xj+Q8q9wGanoNTt/W0YSNoEaZ5Z+GVrO11Q/PpVKHsb9x+wEehXmcQ== +electron-mocha@11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/electron-mocha/-/electron-mocha-11.0.2.tgz#f8fd6c3af539f3c7a9aed4aba29cf12c3f408810" + integrity sha512-fOk+zUgSIsmL2cuIrd7IlK4eRhGVi1PYIB3QvqiBO+6f6AP8XLkYkT9eORlL2xwaS3yAAk02Y+4OTuhtqHPkEQ== dependencies: ansi-colors "^4.1.1" electron-window "^0.8.0" - fs-extra "^8.1.0" - log-symbols "^3.0.0" - mocha "~6.2.0" - which "^1.3.1" - yargs "^14.0.0" + fs-extra "^10.0.0" + mocha "^9.1.1" + which "^2.0.2" + yargs "^16.2.0" electron-notarize@^0.1.1: version "0.1.1" @@ -2417,10 +3556,10 @@ electron-positioner@^4.0.0: resolved "https://registry.yarnpkg.com/electron-positioner/-/electron-positioner-4.1.0.tgz#e158f8f6aabd6725a8a9b4f2279b9504bcbea1b0" integrity sha512-726DfbI9ZNoCg+Fcu6XLuTKTnzf+6nFqv7h+K/V6Ug7IbaPMI7s9S8URnGtWFCy5N5PL4HSzRFF2mXuinftDdg== -electron-proxy-agent@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/electron-proxy-agent/-/electron-proxy-agent-1.2.0.tgz#35bdbaf80d466cb7f71f20ddf0c11ad7b0aefdb9" - integrity sha512-bqCSo6V1/l511yn5SqbcHXUFA+TbsBmbur4yfJJhSO5WXcU1xbYWutAfGsIKEIKgtL1F0kZBQ7Ap9PdapJ4kuQ== +electron-proxy-agent@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/electron-proxy-agent/-/electron-proxy-agent-1.2.1.tgz#3aa09546b31ab638b963eb08fdaf4f30f2339a14" + integrity sha512-sxAmdPUngywVIhpxlvB/44fJtb6qUJzQS48Zl+2qU1fUlLUYp8nLwzfiCqrIJlAtxs4NcZnMsh+sA4Xr3YtMiw== dependencies: agent-base "2" debug "2" @@ -2444,6 +3583,11 @@ electron-publish@22.8.1: lazy-val "^1.0.4" mime "^2.4.6" +electron-to-chromium@^1.4.17: + version "1.4.40" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.40.tgz#f5dbced7bfbc7072e5e7ca5487f8f9a42c8bc768" + integrity sha512-j+eVIyQGt2EU5xPWUblhpp5P5z5xyAdRgzogBgfe2F5JGV17gr9pfzWBua6DlPL00LavbOjxubWkWkbVQe9Wlw== + electron-updater@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.1.2.tgz#46a6e62cc8d0c7d935db7aff83207da2a21ff788" @@ -2474,12 +3618,12 @@ electron@^12.0.0: "@types/node" "^14.6.2" extract-zip "^1.0.3" -elm-format@elm0.19.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/elm-format/-/elm-format-0.8.2.tgz#402d32b96014476ccf98ab5c92f4d102f933565f" - integrity sha512-BRQaVQOGt9gxK1hqSJn1MISxDGdln22PSYzmHMjqpQY3S9OJY/3kPn5HoiH3bHQYQFwC+X0apsMZldK9VxySow== +elm-format@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/elm-format/-/elm-format-0.8.5.tgz#bd87c344d371ccd7eb694c6f7bccf29487596454" + integrity sha512-/Mjwz5RhJ8cdcMsHT98AEKprSIHyRde+URIPvnHez9WH7Xp+rFCOJx0FNMPIYrbHE9Ei7HDSVwhjDP0i+mlvpQ== dependencies: - binwrap "^0.2.2" + binwrap "^0.2.3" elm-test@^0.19.1: version "0.19.1" @@ -2504,19 +3648,18 @@ elm-test@^0.19.1: which "2.0.1" xmlbuilder "^13.0.2" -elm-upgrade@^0.19.6: - version "0.19.6" - resolved "https://registry.yarnpkg.com/elm-upgrade/-/elm-upgrade-0.19.6.tgz#5df3e2acb438f53f1035fbc4ec0cefa7ab5342d1" - integrity sha512-i7+z/6uAqKxOUD58nwyAJJGUCNKG7/wTBY1qBanveFSaQuX5vrfhQNH/3NWIGCufGoW3QEyADGhaLhAxNPVs5Q== +elm-upgrade@0.19.8: + version "0.19.8" + resolved "https://registry.yarnpkg.com/elm-upgrade/-/elm-upgrade-0.19.8.tgz#3594cb75005e5fab6dc7f347e867b074108db0cf" + integrity sha512-SwNzV40wu9IEe35TWR9b7F8WctIRUkpl6F3lzF0AqmYnCcKjbzrxbW6G7DYfA9ICUYjuSLcyYJKm5c86oMiH8w== dependencies: caw "^2.0.1" - fs-extra "^0.30.0" - got "^6.6.3" + fs-extra "^8.1.0" + got "^10.6.0" safename "^1.0.2" - semver "^5.3.0" - syncprompt "^2.0.0" - which "^1.2.11" - yn "^2.0.0" + semver "^7.1.3" + which "^2.0.2" + yn "^4.0.0" elm@^0.19.1: version "0.19.1" @@ -2562,20 +3705,13 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" -encoding@^0.1.11, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" -encoding@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" - end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2590,22 +3726,35 @@ end-stream@~0.1.0: dependencies: write-stream "~0.4.3" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -env-cmd@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/env-cmd/-/env-cmd-8.0.2.tgz#e3bf53b8e4676781bdc3a0b1a2f7612cbcda4da4" - integrity sha512-gHX8MnQXw1iS7dc2KeJdBdxca7spIkxkNwIuORLwm8kDg6xHh5wWnv1Yv3pc64nLZR6kufQSCmwTz16sRmd/rg== +entities@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + +env-cmd@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/env-cmd/-/env-cmd-10.1.0.tgz#c7f5d3b550c9519f137fdac4dd8fb6866a8c8c4b" + integrity sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA== dependencies: - cross-spawn "^6.0.5" + commander "^4.0.0" + cross-spawn "^7.0.0" env-paths@^1.0.0: version "1.0.0" @@ -2624,22 +3773,6 @@ errno@~0.1.1: dependencies: prr "~1.0.1" -es-abstract@^1.12.0, es-abstract@^1.15.0, es-abstract@^1.5.1, es-abstract@^1.7.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57" - integrity sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" - object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" - es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: version "1.17.6" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" @@ -2657,14 +3790,36 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.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.1" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-to-primitive@^1.2.1: version "1.2.1" @@ -2685,32 +3840,30 @@ es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@1.8.x: version "1.8.1" @@ -2724,167 +3877,201 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -eslint-config-cozy-app@^1.1.12: - version "1.3.3" - resolved "https://registry.yarnpkg.com/eslint-config-cozy-app/-/eslint-config-cozy-app-1.3.3.tgz#12bd7cad28cbd83470d4fe4f5258a5420b8cbd6e" - integrity sha512-RBtKaKHkzF8mQt9DNh9LxjdN29dEjeykHm8CcnXp2W6OQst6tIDd//z7Z7TYAZ3dl8EWdX5Np+emP4woBtbV4Q== - dependencies: - babel-eslint "10.0.1" - eslint "5.16.0" - eslint-config-prettier "4.3.0" - eslint-plugin-prettier "3.1.1" - eslint-plugin-react "7.14.3" - eslint-plugin-vue "5.2.3" - prettier "1.18.2" - -eslint-config-prettier@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz#c55c1fcac8ce4518aeb77906984e134d9eb5a4f0" - integrity sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA== - dependencies: - get-stdin "^6.0.0" +eslint-config-cozy-app@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-cozy-app/-/eslint-config-cozy-app-4.0.0.tgz#739a4ab6ad8c9f4d1548a680447fe135512bf6b8" + integrity sha512-VYbCmdQRQrxxNYglCgM6dYQIcNLFq91FQ+1ADJLbE9kkLWskJOBJUJ+9BYvDnOPHc8WTNHE/DF2e+p9jys/JkQ== + dependencies: + "@babel/eslint-parser" "^7.16.3" + "@typescript-eslint/eslint-plugin" "^5.4.0" + "@typescript-eslint/parser" "^5.4.0" + eslint "^8.3.0" + eslint-config-prettier "^8.3.0" + eslint-plugin-prettier "^4.0.0" + eslint-plugin-promise "^6.0.0" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-vue "^8.1.1" + prettier "^2.5.0" + typescript "^4.5.2" + +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== -eslint-plugin-es@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998" - integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA== +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== dependencies: - eslint-utils "^1.4.2" - regexpp "^2.0.1" + eslint-utils "^2.0.0" + regexpp "^3.0.0" -eslint-plugin-node@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964" - integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w== +eslint-plugin-node@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== dependencies: - eslint-plugin-es "^1.3.1" - eslint-utils "^1.3.1" - ignore "^5.0.2" + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" minimatch "^3.0.4" - resolve "^1.8.1" - semver "^5.5.0" + resolve "^1.10.1" + semver "^6.1.0" -eslint-plugin-prettier@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" - integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-promise@^4.1.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== +eslint-plugin-promise@6.0.0, eslint-plugin-promise@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" + integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== + +eslint-plugin-react-hooks@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== -eslint-plugin-react@7.14.3: - version "7.14.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13" - integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA== +eslint-plugin-react@^7.27.1: + version "7.28.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf" + integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw== dependencies: - array-includes "^3.0.3" + array-includes "^3.1.4" + array.prototype.flatmap "^1.2.5" doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.1.0" - object.entries "^1.1.0" - object.fromentries "^2.0.0" - object.values "^1.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.0" + object.values "^1.1.5" prop-types "^15.7.2" - resolve "^1.10.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.6" -eslint-plugin-vue@5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961" - integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw== +eslint-plugin-vue@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-8.2.0.tgz#b404bc10e3f43b2b7aad4ebb3b38090a58040202" + integrity sha512-cLIdTuOAMXyHeQ4drYKcZfoyzdwdBpH279X8/N0DgmotEI9yFKb5O/cAgoie/CkQZCH/MOmh0xw/KEfS90zY2A== dependencies: - vue-eslint-parser "^5.0.0" + eslint-utils "^3.0.0" + natural-compare "^1.4.0" + semver "^7.3.5" + vue-eslint-parser "^8.0.1" -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^4.0.0, eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== +eslint-scope@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-6.0.0.tgz#9cf45b13c5ac8f3d4c50f46a5121f61b3e318978" + integrity sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA== dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-utils@^1.3.1, eslint-utils@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" - integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== dependencies: - eslint-visitor-keys "^1.0.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -eslint@5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" + integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== + +eslint@^8.3.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.6.0.tgz#4318c6a31c5584838c1a2e940c478190f58d558e" + integrity sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw== + dependencies: + "@eslint/eslintrc" "^1.0.5" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" 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" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.1.0" + espree "^9.3.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" + glob-parent "^6.0.1" + 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 "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" + levn "^0.4.1" + lodash.merge "^4.6.2" 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" + regexpp "^3.2.0" + semver "^7.2.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" text-table "^0.2.0" + v8-compile-cache "^2.0.3" -espree@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" - integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== - dependencies: - acorn "^6.0.2" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== +espree@^9.0.0, espree@^9.2.0, espree@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8" + integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.1.0" esprima@2.7.x, esprima@^2.7.1: version "2.7.3" @@ -2896,30 +4083,35 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -2935,85 +4127,21 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - exeunt@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/exeunt/-/exeunt-1.1.0.tgz#af72db6f94b3cb75e921aee375d513049843d284" integrity sha1-r3Lbb5Szy3XpIa7jddUTBJhD0oQ= -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extract-zip@^1.0.3: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -3030,21 +4158,21 @@ extsprintf@1.3.0: integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -faker@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" - integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= +faker@5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -3066,20 +4194,31 @@ fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.2.9: + version "3.2.10" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.10.tgz#2734f83baa7f43b7fd41e13bc34438f4ffe284ee" + integrity sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" - integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -3105,30 +4244,18 @@ fetch-cookie@0.7.0: es6-denodeify "^0.1.1" tough-cookie "^2.3.1" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-uri-to-path@0: version "0.0.2" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz#37cdd1b5b905404b3f05e1b23645be694ff70f82" integrity sha1-N83RtbkFQEs/BeGyNkW+aU/3D4I= -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - filelist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.1.tgz#f10d1a3ae86c1694808e8f20906f43d4c9132dbb" @@ -3144,16 +4271,6 @@ fileset@^2.0.3: glob "^7.0.3" minimatch "^3.0.3" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3174,20 +4291,21 @@ find-parent-dir@^0.3.0: resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= -find-up@3.0.0, find-up@^3.0.0: +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -3206,68 +4324,62 @@ firstline@2.0.2: resolved "https://registry.yarnpkg.com/firstline/-/firstline-2.0.2.tgz#3fdfd894a80e181cd2fa478b07cadb8d446c53cd" integrity sha512-8KcmfI0jgSECnzdhucm0i7vrwef3BWwgjimW2YkRC5eSFwjb5DibVoA0YvgkYwwxuJi9c+7M7X3b3lX8o9B6wg== -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - is-buffer "~2.0.3" - -flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== - -flow-bin@^0.98.0: - version "0.98.1" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.98.1.tgz#a8d781621c91703df69928acc83c9777e2fcbb49" - integrity sha512-y1YzQgbFUX4EG6h2EO8PhyJeS0VxNgER8XsTwU8IXw4KozfneSmGVgw8y3TwAOza7rVhTlHEoli1xNuNW1rhPw== + flatted "^3.1.0" + rimraf "^3.0.2" -flow-typed@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.6.1.tgz#e991f53840ad121d9e1f61bd8f8b844cfae57ab1" - integrity sha512-UXhkAHcv4t+sSsuGud35zkV5CVXkEfIbGee545/1WnajM0+na1IKhmccuawg/PVu1Jtc3i127JcuKV/CLhF0oQ== - dependencies: - "@babel/polyfill" "^7.0.0" - "@octokit/rest" "^15.12.1" - colors "^1.3.2" - flowgen "^1.9.0" - fs-extra "^7.0.0" - glob "^7.1.3" - got "^8.3.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== + +flow-bin@0.109.0: + version "0.109.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.109.0.tgz#dcdcb7402dd85b58200392d8716ccf14e5a8c24c" + integrity sha512-tpcMTpAGIRivYhFV3KJq+zHI2HzcXo8MoGe9pXS4G/UZuey2Faq/e8/gdph2WF0erRlML5hmwfwiq7v9c25c7w== + +flow-typed@3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-3.6.1.tgz#b2fe4e896661f0b786d125977ebed8f0cfc8c0a4" + integrity sha512-sqBiG52+qK1mJs+CwVenGZOVgSCY1YVozDnIJ41kukqcx3fWuSxwY5FZoB9pLf/NdmMYtwCMunT9SKjOR56mOg== + dependencies: + "@octokit/rest" "^18.12.0" + colors "1.4.0" + flowgen "^1.10.0" + fs-extra "^8.1.0" + glob "^7.1.6" + got "^10.5.7" md5 "^2.2.1" - mkdirp "^0.5.1" - prettier "^1.18.2" - rimraf "^2.6.2" - semver "^5.5.1" - table "^5.0.2" - through "^2.3.8" - unzipper "^0.9.3" - which "^1.3.1" - yargs "^12.0.2" - -flowgen@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/flowgen/-/flowgen-1.10.0.tgz#a041ae31d543d22166e7ba7c296b8445deb3c2e4" - integrity sha512-3lsoaa1vxGXhnkHuoE4mLPJi/klvpR3ID8R9CFJ/GBNi+cxJXecWQaUPrWMdNI5tGs8Y+7wrIZaCVFKFLQiGOg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/highlight" "^7.0.0" - commander "^2.11.0" - lodash "^4.17.4" - paralleljs "^0.2.1" - prettier "^1.16.4" - shelljs "^0.8.3" - typescript "^3.4" + mkdirp "^1.0.3" + node-stream-zip "^1.15.0" + prettier "^1.19.1" + rimraf "^3.0.2" + semver "7.3.2" + table "^6.7.3" + which "^2.0.2" + yargs "^15.1.0" + +flowgen@^1.10.0: + version "1.16.2" + resolved "https://registry.yarnpkg.com/flowgen/-/flowgen-1.16.2.tgz#b198357f1169ed86c4cab2eb95119bdbda580c2c" + integrity sha512-7sh6eU94hI+NO+5pbBIbpgC6T1YfIeYVt27B5XtQR/sJ53l8/nfmU2spTHaDqSsn8+486pXK4p3isNbq2Kzz3g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/highlight" "^7.10.4" + commander "^6.1.0" + lodash "^4.17.20" + prettier "^2.5.1" + shelljs "^0.8.4" + typescript "~4.4.4" typescript-compiler "^1.4.1-2" for-each@^0.3.3: @@ -3277,25 +4389,11 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -3305,34 +4403,21 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formatio@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" - integrity sha1-87IWfZBoxGmKjVH092CjmlTYGOs= - dependencies: - samsam "1.x" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@7.0.1, fs-extra@^7.0.0: +fs-extra@10.0.0, fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -3341,7 +4426,7 @@ fs-extra@7.0.1, fs-extra@^7.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@8.1.0, fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: +fs-extra@8.1.0, fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -3350,17 +4435,6 @@ fs-extra@8.1.0, fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" @@ -3390,11 +4464,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.0.6: - version "2.3.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" - integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== - fsevents@~2.1.0: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" @@ -3405,16 +4474,6 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - ftp@~0.3.5: version "0.3.10" resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" @@ -3447,12 +4506,12 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -3462,6 +4521,15 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-proxy@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" @@ -3469,30 +4537,28 @@ get-proxy@^2.0.0: dependencies: npm-conf "^1.1.0" -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" -get-stream@^5.1.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-uri@1: version "1.1.0" resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-1.1.0.tgz#7375d04daf7fcb584b3632679cbdf339b51bb149" @@ -3505,11 +4571,6 @@ get-uri@1: ftp "~0.3.5" readable-stream "2" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -3522,24 +4583,24 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -glob-parent@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob-parent@^5.1.0, glob-parent@~5.1.0, glob-parent@~5.1.2: +glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3548,10 +4609,22 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.4, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + 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" + +glob@7.2.0, glob@^7.0.0, glob@^7.0.3, glob@^7.1.3, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3582,18 +4655,6 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - 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" - global-agent@^2.0.2: version "2.2.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.2.0.tgz#566331b0646e6bf79429a16877685c4a1fbf76dc" @@ -3632,11 +4693,18 @@ global@^4.3.0: min-document "^2.19.0" process "^0.11.10" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== + dependencies: + type-fest "^0.20.2" + globalthis@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" @@ -3656,45 +4724,38 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -got@^6.6.3: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" -got@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" +got@^10.5.7, got@^10.6.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/got/-/got-10.7.0.tgz#62889dbcd6cca32cd6a154cc2d0c6895121d091f" + integrity sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg== + dependencies: + "@sindresorhus/is" "^2.0.0" + "@szmarczak/http-timer" "^4.0.0" + "@types/cacheable-request" "^6.0.1" + cacheable-lookup "^2.0.0" + cacheable-request "^7.0.1" + decompress-response "^5.0.0" duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" + get-stream "^5.0.0" + lowercase-keys "^2.0.0" + mimic-response "^2.1.0" + p-cancelable "^2.0.0" + p-event "^4.0.0" + responselike "^2.0.0" + to-readable-stream "^2.0.0" + type-fest "^0.10.0" got@^9.6.0: version "9.6.0" @@ -3713,15 +4774,10 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.9: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== graceful-fs@^4.2.4: version "4.2.6" @@ -3738,14 +4794,15 @@ hammerjs@^2.0.8: resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE= -handlebars@^4.0.1, handlebars@^4.1.2: - version "4.4.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.3.tgz#180bae52c1d0e9ec0c15d7e82a4362d662762f6e" - integrity sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw== +handlebars@^4.0.1: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: + minimist "^1.2.5" neo-async "^2.6.0" - optimist "^0.6.1" source-map "^0.6.1" + wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" @@ -3754,14 +4811,19 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== +har-validator@~5.1.0, har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -3782,15 +4844,10 @@ has-symbol-support-x@^1.4.1: resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-to-string-tag-x@^1.2.0: version "1.4.1" @@ -3799,48 +4856,24 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -has@^1.0.1, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -3857,7 +4890,7 @@ highlight.js@^9.3.0: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.10.tgz#7b18ed75c90348c045eef9ed08ca1319a2219ad2" integrity sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw== -hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -3876,6 +4909,11 @@ hosted-git-info@^3.0.5: dependencies: lru-cache "^6.0.0" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + html-to-react@^1.3.4: version "1.4.2" resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.2.tgz#7b628ab56cd63a52f2d0b79d0fa838a51f088a57" @@ -3908,24 +4946,11 @@ htmlparser2@^4.0: domutils "^2.0.0" entities "^2.0.0" -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -3944,22 +4969,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== - dependencies: - agent-base "^4.1.0" - debug "^3.1.0" - -https-proxy-agent@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" - integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -3973,17 +4982,10 @@ humanize-plus@^1.8.1: resolved "https://registry.yarnpkg.com/humanize-plus/-/humanize-plus-1.8.2.tgz#a65b34459ad6367adbb3707a82a3c9f916167030" integrity sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA= -iconv-lite@^0.4.24, iconv-lite@~0.4.13: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -4007,10 +5009,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.2: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +ignore@^5.1.1, ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== ignore@^5.1.4: version "5.1.8" @@ -4032,10 +5034,10 @@ immediate@^3.2.3: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= -import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -4063,7 +5065,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4083,67 +5085,35 @@ ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - 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" + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" interpret@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== intersection-observer@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.11.0.tgz#f4ea067070326f68393ee161cc0a2ca4c0040c6f" integrity sha512-KZArj2QVnmdud9zTpKf279m2bbGfG+4/kn16UU0NL3pTVl52ZHiJ9IRNSsnn6jaHrL9EGLFM5eWjTx2fz/+zoQ== -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ip@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -4157,32 +5127,47 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" -is-binary-path@^2.1.0, is-binary-path@~2.1.0: +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1: +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.4, is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.3, is-callable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" @@ -4191,70 +5176,35 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-core-module@^2.2.0, is-core-module@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: - kind-of "^6.0.0" + has "^1.0.3" is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-electron-renderer@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz#a469d056f975697c58c98c6023eb0aa79af895a2" integrity sha1-pGnQVvl1aXxYyYxgI+sKp5r4laI= -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -4277,10 +5227,10 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -4297,17 +5247,22 @@ is-installed-globally@^0.3.1: global-dirs "^2.0.1" is-path-inside "^3.0.1" +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + is-npm@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== dependencies: - kind-of "^3.0.2" + has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" @@ -4320,9 +5275,9 @@ is-obj@^2.0.0: integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== is-path-cwd@^2.2.0: version "2.2.0" @@ -4339,34 +5294,20 @@ is-path-inside@^3.0.2: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: +is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-regex@^1.1.0: version "1.1.1" @@ -4375,52 +5316,66 @@ is-regex@^1.1.0: dependencies: has-symbols "^1.0.1" -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - has-symbols "^1.0.0" + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-whitespace-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-word-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" is-yarn-global@^0.3.0: version "0.3.0" @@ -4432,7 +5387,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -4447,35 +5402,23 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isomorphic-fetch@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= +isomorphic-fetch@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.0.0: - version "2.1.6" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.6.tgz#d61702a9d1c66ad89d92e66d401e16b0bda4a35f" - integrity sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA== +istanbul-api@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-3.0.0.tgz#eca53a6d3995eb39d59f2a9c1ee7071877770550" + integrity sha512-6KTQT5osUuuDT1ybWvrzJIXljrzDiZTHLxUkEr6WY1lAO2Q3PzZCH5+gSAEOaUhJf+qbaC79rQyCNeHGB6+6gw== dependencies: async "^2.6.2" compare-versions "^3.4.0" @@ -4485,18 +5428,31 @@ istanbul-api@^2.0.0: istanbul-lib-instrument "^3.3.0" istanbul-lib-report "^2.0.8" istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.4" + istanbul-reports "^2.2.5" js-yaml "^3.13.1" make-dir "^2.1.0" minimatch "^3.0.4" once "^1.4.0" + semver "^6.0.0" + +istanbul-lib-coverage@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-coverage@^2.0.0, istanbul-lib-coverage@^2.0.5: +istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== -istanbul-lib-hook@^2.0.0, istanbul-lib-hook@^2.0.7: +istanbul-lib-hook@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + +istanbul-lib-hook@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133" integrity sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== @@ -4536,14 +5492,14 @@ istanbul-lib-source-maps@^3.0.6: rimraf "^2.6.3" source-map "^0.6.1" -istanbul-reports@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== +istanbul-reports@^2.2.5: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== dependencies: - handlebars "^4.1.2" + html-escaper "^2.0.0" -istanbul@^0.4.5: +istanbul@0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= @@ -4601,14 +5557,21 @@ jest-get-type@^26.3.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.13.0, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@3.x, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + js-yaml@^3.14.0: version "3.14.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" @@ -4617,55 +5580,72 @@ js-yaml@^3.14.0: argparse "^1.0.7" esprima "^4.0.0" -js2xmlparser@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-3.0.0.tgz#3fb60eaa089c5440f9319f51760ccd07e2499733" - integrity sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM= +js2xmlparser@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" + integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== dependencies: - xmlcreate "^1.0.1" + xmlcreate "^2.0.4" jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdoc@~3.5.0: - version "3.5.5" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.5.5.tgz#484521b126e81904d632ff83ec9aaa096708fa4d" - integrity sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg== - dependencies: - babylon "7.0.0-beta.19" - bluebird "~3.5.0" - catharsis "~0.8.9" - escape-string-regexp "~1.0.5" - js2xmlparser "~3.0.0" - klaw "~2.0.0" - marked "~0.3.6" - mkdirp "~0.5.1" - requizzle "~0.2.1" - strip-json-comments "~2.0.1" +jsdoc@3.6.7: + version "3.6.7" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.7.tgz#00431e376bed7f9de4716c6f15caa80e64492b89" + integrity sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw== + dependencies: + "@babel/parser" "^7.9.4" + bluebird "^3.7.2" + catharsis "^0.9.0" + escape-string-regexp "^2.0.0" + js2xmlparser "^4.0.1" + klaw "^3.0.0" + markdown-it "^10.0.0" + markdown-it-anchor "^5.2.7" + marked "^2.0.3" + mkdirp "^1.0.4" + requizzle "^0.2.3" + strip-json-comments "^3.1.0" taffydb "2.6.2" - underscore "~1.8.3" + underscore "~1.13.1" jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" @@ -4698,13 +5678,6 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -4713,11 +5686,11 @@ jsonfile@^4.0.0: graceful-fs "^4.1.6" jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - universalify "^1.0.0" + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" @@ -4727,13 +5700,13 @@ jsonify@~0.0.0: integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" extsprintf "1.3.0" - json-schema "0.2.3" + json-schema "0.4.0" verror "1.10.0" jsverify@^0.8.4: @@ -4746,13 +5719,18 @@ jsverify@^0.8.4: trampa "^1.0.0" typify-parser "^1.1.0" -jsx-ast-utils@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" - integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: - array-includes "^3.0.3" - object.assign "^4.1.0" + array-includes "^3.1.3" + object.assign "^4.1.2" + +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== keyboardevent-from-electron-accelerator@^1.1.0: version "1.1.0" @@ -4769,13 +5747,6 @@ keycode@^2.1.7: resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== - dependencies: - json-buffer "3.0.0" - keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -4783,41 +5754,17 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= +keyv@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.5.tgz#bb12b467aba372fab2a44d4420c00d3c4ebd484c" + integrity sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA== dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + json-buffer "3.0.1" -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -klaw@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-2.0.0.tgz#59c128e0dc5ce410201151194eeb9cbf858650f6" - integrity sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY= +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== dependencies: graceful-fs "^4.1.9" @@ -4838,13 +5785,6 @@ lazy-val@^1.0.4: resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - level-codec@9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" @@ -4939,7 +5879,15 @@ levelup@4.4.0, levelup@^4.3.2: level-supports "~1.0.0" xtend "~4.0.0" -levn@^0.3.0, levn@~0.3.0: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -4947,10 +5895,12 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + dependencies: + uc.micro "^1.0.1" lnk@^1.1.0: version "1.1.0" @@ -4971,14 +5921,6 @@ loader-utils@^1.0.0, loader-utils@^1.1.0: emojis-list "^3.0.0" json5 "^1.0.1" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -4994,6 +5936,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.assignin@^4.0.9: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" @@ -5009,6 +5958,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -5029,6 +5983,11 @@ lodash.foreach@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -5039,7 +5998,7 @@ lodash.map@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= -lodash.merge@^4.4.0: +lodash.merge@^4.4.0, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -5064,34 +6023,33 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash@4.17.15, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@4.17.15, lodash@^4.17.11: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.17.10, lodash@^4.17.19: +lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: - chalk "^2.4.2" - -lolex@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" - integrity sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY= + chalk "^4.1.0" + is-unicode-supported "^0.1.0" loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -5100,11 +6058,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -5122,26 +6075,16 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru_map@0.3.3: +lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= -lsmod@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b" - integrity sha1-mgD3bco26yP6BTUK/htYXUKZ5ks= - ltgt@2.2.1, ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= -macos-release@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== - make-cancellable-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-1.0.0.tgz#826214115b0827ca7a45ba204df7c31546243870" @@ -5167,34 +6110,31 @@ make-event-props@^1.1.0: resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.2.0.tgz#96b87d88919533b8f8934b58b4c3d5679459a0cf" integrity sha512-BmWFkm/jZzVH9A0tEBdkjAARUz/eha+5IRyfOndeSMKRadkgR5DawoBHoRwLxkYmjJOI5bHkXKpaZocxj+dKgg== -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - markdown-escapes@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== -marked@~0.3.6: - version "0.3.19" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" - integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== +markdown-it-anchor@^5.2.7: + version "5.3.0" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" + integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== + +markdown-it@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" + integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== + dependencies: + argparse "^1.0.7" + entities "~2.0.0" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +marked@^2.0.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" + integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== matcher@^3.0.0: version "3.0.0" @@ -5204,13 +6144,13 @@ matcher@^3.0.0: escape-string-regexp "^4.0.0" md5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== dependencies: - charenc "~0.0.1" - crypt "~0.0.1" - is-buffer "~1.1.1" + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" mdast-add-list-metadata@1.0.1: version "1.0.1" @@ -5219,14 +6159,47 @@ mdast-add-list-metadata@1.0.1: dependencies: unist-util-visit-parents "1.1.2" -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" + unist-util-visit "^2.0.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-hast@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" + integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdurl@^1.0.0, mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= memdown@1.4.1: version "1.4.1" @@ -5250,7 +6223,7 @@ merge-class-names@^1.1.1: resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.3.0.tgz#c4cdc1a981a81dd9afc27aa4287e912a337c5dee" integrity sha512-k0Qaj36VBpKgdc8c188LEZvo6v/zzry/FUufwopWbMSp6/knfVFU/KIB55/hJjeIpg18IH2WskXJCRnM/1BrdQ== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -5260,24 +6233,21 @@ microee@0.0.6, microee@^0.0.6: resolved "https://registry.yarnpkg.com/microee/-/microee-0.0.6.tgz#a12bdb0103681e8b126a9b071eba4c467c78fffe" integrity sha1-oSvbAQNoHosSapsHHrpMRnx4//4= -micromatch@^3.1.0: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + +micromatch@4.0.4, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" micromatch@^4.0.2: version "4.0.2" @@ -5287,49 +6257,39 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.40.0" + mime-db "1.51.0" -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== mime@^2.4.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mime@^2.4.6: version "2.4.6" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mimic-response@^2.0.0: +mimic-response@^2.0.0, mimic-response@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== @@ -5363,11 +6323,6 @@ minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -5377,9 +6332,9 @@ minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: yallist "^3.0.0" minipass@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + version "3.1.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== dependencies: yallist "^4.0.0" @@ -5398,34 +6353,26 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mkdirp@^0.5.4: +mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mkdirp@^1.0.3: +mkdirp@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -5435,56 +6382,52 @@ mocha-clean@^1.0.0: resolved "https://registry.yarnpkg.com/mocha-clean/-/mocha-clean-1.0.0.tgz#7e769b16cb38745df62a28917077953b05fec064" integrity sha1-fnabFss4dF32KiiRcHeVOwX+wGQ= -mocha@~6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.1.tgz#da941c99437da9bac412097859ff99543969f94c" - integrity sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A== +mocha@^9.1.1: + version "9.1.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" + integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== dependencies: - 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.2" + debug "4.3.2" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.7" growl "1.10.5" he "1.2.0" - js-yaml "3.13.1" - log-symbols "2.2.0" + js-yaml "4.1.0" + log-symbols "4.1.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" - wide-align "1.1.3" - yargs "13.3.0" - yargs-parser "13.1.1" - yargs-unparser "1.6.0" - -moment@^2.10.6: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + ms "2.1.3" + nanoid "3.1.25" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.1.5" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +moment@^2.19.3: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -5499,11 +6442,6 @@ mustache@^3.0.1: resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372" integrity sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -5518,27 +6456,15 @@ mv@~2: ncp "~2.0.0" rimraf "~2.4.0" -nan@2.14.0, nan@2.14.1, nan@^2.14.0, nan@^2.4.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nan@2.14.1, nan@2.15.0, nan@^2.14.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nanoid@3.1.25: + version "3.1.25" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== napi-build-utils@^1.0.1: version "1.0.1" @@ -5550,11 +6476,6 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== -native-promise-only@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" - integrity sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE= - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5566,19 +6487,30 @@ ncp@~2.0.0: integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-abi@3.2.0, node-abi@^2.7.0, node-abi@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.2.0.tgz#c8ec6874f808b4da5fbd56e9506390ce65b152a2" - integrity sha512-/qb92JAb2uiwEQ4aXpVphXfGJU77qdCieXACDaIofcMz+YMPBmnCo8v0OlzJBuXh5QHmMiiI/GKyiCzbjOMn2g== +nise@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c" + integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^7.0.4" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + +node-abi@3.5.0, node-abi@^2.7.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.5.0.tgz#26e8b7b251c3260a5ac5ba5aef3b4345a0229248" + integrity sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw== dependencies: semver "^7.3.5" @@ -5597,31 +6529,22 @@ node-ensure@^0.0.0: resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" integrity sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc= -node-environment-flags@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" - integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch@2.6.0, node-fetch@^2.1.1: +node-fetch@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== -node-fetch@2.6.1, node-fetch@^2.0.0, node-fetch@^2.6.1: +node-fetch@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== +node-fetch@^2.0.0, node-fetch@^2.6.1: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" + whatwg-url "^5.0.0" node-gyp-build@~4.1.0: version "4.1.1" @@ -5645,6 +6568,17 @@ node-gyp@^5.0.4: tar "^4.4.12" which "1" +node-polyglot@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/node-polyglot/-/node-polyglot-2.4.2.tgz#e4876e6710b70dc00b1351a9a68de4af47a5d61d" + integrity sha512-AgTVpQ32BQ5XPI+tFHJ9bCYxWwSLvtmEodX8ooftFhEuyCgBG6ijWulIVb7pH3THigtgvc9uLiPn0IO51KHpkg== + dependencies: + array.prototype.foreach "^1.0.0" + has "^1.0.3" + object.entries "^1.1.4" + string.prototype.trim "^1.2.4" + warning "^4.0.3" + node-polyglot@^2.2.2: version "2.4.0" resolved "https://registry.yarnpkg.com/node-polyglot/-/node-polyglot-2.4.0.tgz#0d2717ed06640d9ff48a2aebe8d13e39ef03518f" @@ -5655,6 +6589,16 @@ node-polyglot@^2.2.2: string.prototype.trim "^1.1.2" warning "^4.0.3" +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +node-stream-zip@^1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" @@ -5682,20 +6626,16 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - normalize-url@^4.1.0: version "4.5.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + normalize.css@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-7.0.0.tgz#abfb1dd82470674e0322b53ceb1aaf412938e4bf" @@ -5709,13 +6649,6 @@ npm-conf@^1.1.0, npm-conf@^1.1.3: config-chain "^1.1.11" pify "^3.0.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -5748,19 +6681,10 @@ object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-inspect@^1.7.0: version "1.8.0" @@ -5772,14 +6696,7 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0, object.assign@^4.1.0: +object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -5789,50 +6706,50 @@ object.assign@4.1.0, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" - integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.fromentries@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.1.tgz#050f077855c7af8ae6649f45c80b16ee2d31e704" - integrity sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA== +object.entries@^1.1.4, object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.15.0" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.19.1" -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= +object.hasown@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== dependencies: - isobject "^3.0.1" + define-properties "^1.1.3" + es-abstract "^1.19.1" -object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.19.1" once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -5841,13 +6758,6 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - open@7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -5856,92 +6766,61 @@ open@7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" -opn@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.0.0.tgz#f8870d7cd969b218030cb6ce5a1285e795931df3" - integrity sha1-+IcNfNlpshgDDLbOWhKF55WTHfM= - dependencies: - is-wsl "^1.1.0" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= +open@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" - -os-locale@^3.0.0, os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" + word-wrap "~1.2.3" -os-name@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - macos-release "^2.2.0" - windows-release "^3.1.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + 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" p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-event@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" @@ -5956,12 +6835,12 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-limit "^1.1.0" + yocto-queue "^0.1.0" p-locate@^3.0.0: version "3.0.0" @@ -5977,6 +6856,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -5984,18 +6870,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -6016,11 +6897,6 @@ pako@^1.0.10: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== -paralleljs@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/paralleljs/-/paralleljs-0.2.1.tgz#ebca745d3e09c01e2bebcc14858891ff4510e926" - integrity sha1-68p0XT4JwB4r68wUhYiR/0UQ6SY= - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -6040,10 +6916,17 @@ parse-entities@^1.1.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" path-exists@^3.0.0: version "3.0.0" @@ -6060,30 +6943,25 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-key@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" - integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" @@ -6092,10 +6970,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pdfjs-dist@2.1.266: version "2.1.266" @@ -6115,10 +6993,15 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^2.0.5: version "2.2.2" @@ -6140,11 +7023,6 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - pouchdb-abstract-mapreduce@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.0.0.tgz#946d79073c9795ca03c9b5c318a64372422e8740" @@ -6456,16 +7334,16 @@ prebuild-install@5.3.3: tunnel-agent "^0.6.0" which-pm-runs "^1.0.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -6478,10 +7356,15 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@1.18.2, prettier@^1.16.4, prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +prettier@^2.5.0, prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" @@ -6508,7 +7391,16 @@ progress@^2.0.0, progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.8.1, prop-types@^15.6.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -6517,6 +7409,13 @@ prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, object-assign "^4.1.1" react-is "^16.8.1" +property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -6527,12 +7426,7 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -psl@^1.1.24: - version "1.4.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" - integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== - -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.24, psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -6563,23 +7457,16 @@ pupa@^2.0.1: escape-goat "^2.0.0" qs@^6.7.0: - version "6.9.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" - integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== queue-microtask@^1.2.2: version "1.2.3" @@ -6598,6 +7485,13 @@ ramda@^0.26: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + rc4@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/rc4/-/rc4-0.1.5.tgz#08c6e04a0168f6eb621c22ab6cb1151bd9f4a64d" @@ -6613,15 +7507,14 @@ rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" - integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== +react-dom@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.18.0" + scheduler "^0.20.2" react-event-listener@^0.6.0: version "0.6.6" @@ -6658,17 +7551,17 @@ react-input-autosize@^2.2.1: dependencies: prop-types "^15.5.8" -react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== - -react-is@^16.9.0: +react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: +react-is@^16.8.6: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + +react-is@^17.0.0, react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -6678,7 +7571,26 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-markdown@^4.0.8, react-markdown@^4.3.1: +react-markdown@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-6.0.3.tgz#625ec767fa321d91801129387e7d31ee0cb99254" + integrity sha512-kQbpWiMoBHnj9myLlmZG9T1JdoT/OEyHK7hqM6CqFT14MAkgWiWBUYijLyBmxbntaN6dCDicPcUhWhci1QYodg== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + prop-types "^15.7.2" + property-information "^5.3.0" + react-is "^17.0.0" + remark-parse "^9.0.0" + remark-rehype "^8.0.0" + space-separated-tokens "^1.1.0" + style-to-object "^0.3.0" + unified "^9.0.0" + unist-util-visit "^2.0.0" + vfile "^4.0.0" + +react-markdown@^4.0.8: version "4.3.1" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.3.1.tgz#39f0633b94a027445b86c9811142d05381300f2f" integrity sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw== @@ -6713,15 +7625,16 @@ react-popper@^2.2.3: warning "^4.0.2" react-redux@^7.2.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.1.tgz#8dedf784901014db2feca1ab633864dee68ad985" - integrity sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg== + version "7.2.6" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.6.tgz#49633a24fe552b5f9caf58feb8a138936ddfe9aa" + integrity sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ== dependencies: - "@babel/runtime" "^7.5.5" - hoist-non-react-statics "^3.3.0" + "@babel/runtime" "^7.15.4" + "@types/react-redux" "^7.1.20" + hoist-non-react-statics "^3.3.2" loose-envify "^1.4.0" prop-types "^15.7.2" - react-is "^16.9.0" + react-is "^17.0.2" react-select@2.2.0: version "2.2.0" @@ -6778,14 +7691,13 @@ react-transition-group@^2.2.1: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" - integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== +react@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" read-config-file@6.0.0: version "6.0.0" @@ -6828,7 +7740,7 @@ readable-stream@2, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.4.0: +"readable-stream@2 || 3", readable-stream@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== @@ -6847,7 +7759,7 @@ readable-stream@2, readable-stream@^2.2.2: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@~2.3.6: +readable-stream@^2.0.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -6860,18 +7772,20 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~0.0.2: version "0.0.4" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d" integrity sha1-8y124/uGM0SlSNeZIwBxc2ZbO40= -readdirp@^3.1.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - readdirp@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.3.tgz#d6e011ed5b9240a92f08651eeb40f7942ceb6cc1" @@ -6894,27 +7808,39 @@ rechoir@^0.6.2: resolve "^1.1.6" redux-thunk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" - integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== + version "2.4.1" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" + integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== -"redux@3 || 4": - version "4.1.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4" - integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g== +"redux@3 || 4", redux@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" + integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== dependencies: "@babel/runtime" "^7.9.2" -regedit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/regedit/-/regedit-3.0.3.tgz#0c2188e15f670de7d5740c5cea9bbebe99497749" - integrity sha512-SpHmMKOtiEYx0MiRRC48apBsmThoZ4svZNsYoK8leHd5bdUHV1nYb8pk8gh6Moou7/S9EDi1QsjBTpyXVQrPuQ== +regedit@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/regedit/-/regedit-5.0.0.tgz#7ec444ef027cc704e104fae00586f84752291116" + integrity sha512-4uSqj6Injwy5TPtXlE+1F/v2lOW/bMfCqNIAXyib4aG1ZwacG69oyK/yb6EF8KQRMhz7YINxkD+/HHc6i7YJtA== dependencies: debug "^4.1.0" if-async "^3.7.4" stream-slicer "0.0.6" through2 "^0.6.3" +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" @@ -6930,28 +7856,42 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + call-bind "^1.0.2" + define-properties "^1.1.3" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpp@^3.0.0, regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" registry-auth-token@^4.0.0: version "4.0.0" @@ -6968,6 +7908,18 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + remark-parse@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" @@ -6989,12 +7941,21 @@ remark-parse@^5.0.0: vfile-location "^2.0.0" xtend "^4.0.1" -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-rehype@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" + integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== + dependencies: + mdast-util-to-hast "^10.2.0" -repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.5.4: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -7021,7 +7982,7 @@ request-promise@^4.2.4: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.87.0, request@^2.88.0: +request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -7047,22 +8008,48 @@ request@^2.87.0, request@^2.88.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requizzle@~0.2.1: +requizzle@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== @@ -7074,63 +8061,62 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.3.2: + version "1.21.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== + dependencies: + is-core-module "^2.8.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.10.0: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== dependencies: path-parse "^1.0.6" -responselike@1.0.2, responselike@^1.0.2: +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= dependencies: lowercase-keys "^1.0.0" -restore-cursor@^2.0.0: +responselike@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + lowercase-keys "^2.0.0" reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@2.6.3, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: +rimraf@3.0.2, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -7144,6 +8130,13 @@ rimraf@~2.4.0: dependencies: glob "^6.0.1" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + roarr@^2.15.3: version "2.15.4" resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" @@ -7156,13 +8149,6 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -7170,17 +8156,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" @@ -7192,28 +8171,16 @@ safe-json-stringify@~1: resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - safename@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/safename/-/safename-1.0.2.tgz#e659f8ea3ce2148880fbf56de78d8e061f229031" integrity sha1-5ln46jziFIiA+/Vt542OBh8ikDE= -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -samsam@1.x, samsam@^1.1.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" - integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== - sanitize-filename@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" @@ -7226,10 +8193,10 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" - integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -7259,28 +8226,33 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^7.3.2: +semver@7.3.2, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@^7.3.5: +semver@7.3.5, semver@^7.1.3, semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + semver@~5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" @@ -7298,6 +8270,13 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + server-destroy@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" @@ -7308,21 +8287,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - shallow-equal@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" @@ -7340,15 +8304,27 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shelljs@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.4: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -7369,10 +8345,10 @@ should-format@^3.0.3: should-type "^1.3.0" should-type-adaptors "^1.0.1" -should-sinon@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/should-sinon/-/should-sinon-0.0.5.tgz#ffc8a851bf450767e7d0ad22ff8715650be950e4" - integrity sha1-/8ioUb9FB2fn0K0i/4cVZQvpUOQ= +should-sinon@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/should-sinon/-/should-sinon-0.0.6.tgz#be041a7c928f44ac9ccf5dc042d032618ce29f84" + integrity sha512-ScBOH5uW5QVFaONmUnIXANSR6z5B8IKzEmBP3HE5sPOCDuZ88oTMdUdnKoCVQdLcCIrRrhRLPS5YT+7H40a04g== should-type-adaptors@^1.0.1: version "1.1.0" @@ -7403,6 +8379,15 @@ should@^13.2.3: should-type-adaptors "^1.0.1" should-util "^1.0.0" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + sift@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/sift/-/sift-6.0.0.tgz#f93a778e5cbf05a5024ebc391e6b32511a6d1f82" @@ -7427,69 +8412,37 @@ simple-get@^3.0.3: once "^1.3.1" simple-concat "^1.0.0" -sinon@^2.3.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.4.1.tgz#021fd64b54cb77d9d2fb0d43cdedfae7629c3a36" - integrity sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw== +sinon@12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-12.0.1.tgz#331eef87298752e1b88a662b699f98e403c859e9" + integrity sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg== dependencies: - diff "^3.1.0" - formatio "1.2.0" - lolex "^1.6.0" - native-promise-only "^0.8.1" - path-to-regexp "^1.7.0" - samsam "^1.1.3" - text-encoding "0.6.4" - type-detect "^4.0.0" + "@sinonjs/commons" "^1.8.3" + "@sinonjs/fake-timers" "^8.1.0" + "@sinonjs/samsam" "^6.0.2" + diff "^5.0.0" + nise "^5.1.0" + supports-color "^7.2.0" slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - 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" smart-buffer@^1.0.13: version "1.1.15" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" integrity sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY= -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - socks-proxy-agent@2: version "2.1.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz#86ebb07193258637870e13b7bd99f26c663df3d3" @@ -7507,28 +8460,18 @@ socks@~1.1.5: ip "^1.1.4" smart-buffer "^1.0.13" -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= - dependencies: - is-plain-obj "^1.0.0" - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" -source-map-support@^0.5.11: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== +source-map-support@0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -7541,17 +8484,12 @@ source-map-support@^0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -7568,6 +8506,11 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" +space-separated-tokens@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + spark-md5@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.0.tgz#3722227c54e2faf24b1dc6d933cc144e6f71bfef" @@ -7604,13 +8547,6 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -7629,9 +8565,9 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -7643,11 +8579,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stack-trace@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - stat-mode@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" @@ -7658,14 +8589,6 @@ state-toggle@^1.0.0: resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -7674,12 +8597,7 @@ stealthy-require@^1.1.1: stream-slicer@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/stream-slicer/-/stream-slicer-0.0.6.tgz#f86b2ac5c2440b7a0a87b71f33665c0788046138" - integrity sha1-+GsqxcJEC3oKh7cfM2ZcB4gEYTg= - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + integrity sha1-+GsqxcJEC3oKh7cfM2ZcB4gEYTg= string-width@^1.0.1: version "1.0.2" @@ -7690,7 +8608,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -7707,7 +8625,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -7716,6 +8634,29 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + string.prototype.trim@^1.1.2: version "1.2.1" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" @@ -7725,6 +8666,15 @@ string.prototype.trim@^1.1.2: es-abstract "^1.17.0-next.1" function-bind "^1.1.1" +string.prototype.trim@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" + integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + string.prototype.trimend@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" @@ -7733,21 +8683,13 @@ string.prototype.trimend@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - function-bind "^1.1.1" string.prototype.trimstart@^1.0.1: version "1.0.1" @@ -7757,6 +8699,14 @@ string.prototype.trimstart@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -7797,40 +8747,50 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -stylus@^0.54.5: - version "0.54.7" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.7.tgz#c6ce4793965ee538bcebe50f31537bfc04d88cd2" - integrity sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug== +style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== dependencies: - css-parse "~2.0.0" - debug "~3.1.0" - glob "^7.1.3" - mkdirp "~0.5.x" + inline-style-parser "0.1.1" + +stylus@0.56.0: + version "0.56.0" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.56.0.tgz#13fc85c48082db483c90d2530942fe8b0be988eb" + integrity sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA== + dependencies: + css "^3.0.0" + debug "^4.3.2" + glob "^7.1.6" safer-buffer "^2.1.2" sax "~1.2.4" - semver "^6.0.0" source-map "^0.7.3" sublevel-pouchdb@7.2.2: @@ -7850,20 +8810,20 @@ sumchecker@^3.0.1: dependencies: debug "^4.1.0" -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@7.1.0, supports-color@^7.1.0: +supports-color@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: has-flag "^4.0.0" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" @@ -7885,23 +8845,28 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -syncprompt@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/syncprompt/-/syncprompt-2.0.0.tgz#b4f303d385e6a0e214614a12d22e8d97234669a4" - integrity sha512-tPYCsLGWTDRlET7cen2iAwbmO+lSwfIdKoLkUPC41t/54UhqbzpwXL4RhODu5fQnmZdQZlEFKeD0W/BysU5WEg== +supports-color@^7.1.0, supports-color@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - bindings "^1.2.1" - nan "^2.4.0" + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -table@^5.0.2, table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.7.3: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" taffydb@2.6.2: version "2.6.2" @@ -7929,6 +8894,18 @@ tar-stream@^2.0.0: inherits "^2.0.3" readable-stream "^3.1.1" +tar@6.1.11, tar@^6.1.0: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + tar@^4.4.10, tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -7942,18 +8919,6 @@ tar@^4.4.10, tar@^4.4.12: safe-buffer "^5.1.2" yallist "^3.0.3" -tar@^6.1.6: - version "6.1.6" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.6.tgz#c23d797b0a1efe5d479b1490805c5443f3560c5d" - integrity sha512-oaWyu5dQbHaYcyZCTfyPpC+VmI62/OM2RTUYavTk1MDr1cwW5Boi3baeYQKiZbY2uSQJGr+iMOzb/JFxLrft+g== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - temp-file@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.7.tgz#686885d635f872748e384e871855958470aeb18a" @@ -7974,11 +8939,6 @@ term-size@^2.1.0: resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== -text-encoding@0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" - integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8000,47 +8960,25 @@ through2@^0.6.3: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" -through@2, through@^2.3.6, through@^2.3.8: +through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" +to-readable-stream@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-2.1.0.tgz#82880316121bea662cdc226adb30addb50cb06e8" + integrity sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w== to-regex-range@^5.0.1: version "5.0.1" @@ -8049,17 +8987,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^2.3.1, tough-cookie@^2.3.3: +tough-cookie@^2.3.1, tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -8084,6 +9012,11 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + trampa@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trampa/-/trampa-1.0.1.tgz#b866bc192331f64b4f57a8acf4ab71d0e900b692" @@ -8121,10 +9054,22 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -tslib@^1.9.0, tslib@^1.9.3: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" tunnel-agent@^0.6.0: version "0.6.0" @@ -8143,6 +9088,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -8150,16 +9102,26 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.10.0.tgz#7f06b2b9fbfc581068d1341ffabd0349ceafc642" + integrity sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw== + type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -8182,28 +9144,45 @@ typescript-compiler@^1.4.1-2: resolved "https://registry.yarnpkg.com/typescript-compiler/-/typescript-compiler-1.4.1-2.tgz#ba4f7db22d91534a1929d90009dce161eb72fd3f" integrity sha1-uk99si2RU0oZKdkACdzhYety/T8= -typescript@^3.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" - integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== +typescript@^4.5.2: + version "4.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" + integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== + +typescript@~4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== typify-parser@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/typify-parser/-/typify-parser-1.1.0.tgz#ac73bfa5f25343468e2d0f3346c6117bc03d3c99" integrity sha1-rHO/pfJTQ0aOLQ8zRsYRe8A9PJk= +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + uglify-js@^3.1.4: - version "3.6.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.2.tgz#fd8048c86d990ddd29fe99d3300e0cb329103f4d" - integrity sha512-+gh/xFte41GPrgSMJ/oJVq15zYmqr74pY9VoM69UzMzq9NFk4YDylclb1/bhEzZSaUQjbW5RvniHeq1cdtRYjw== + version "3.14.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.5.tgz#cdabb7d4954231d80cb4a927654c4655e51f4859" + integrity sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: - commander "2.20.0" - source-map "~0.6.1" + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" -underscore@~1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= +underscore@~1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.2.tgz#276cea1e8b9722a8dbed0100a407dda572125881" + integrity sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g== unherit@^1.0.4: version "1.1.3" @@ -8213,6 +9192,29 @@ unherit@^1.0.4: inherits "^2.0.0" xtend "^4.0.0" +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + unified@^6.1.5: version "6.2.0" resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" @@ -8225,15 +9227,17 @@ unified@^6.1.5: vfile "^2.0.0" x-is-string "^0.1.0" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== +unified@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" unique-string@^2.0.0: version "2.0.0" @@ -8242,11 +9246,31 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + unist-util-is@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + unist-util-remove-position@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" @@ -8259,6 +9283,13 @@ unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + unist-util-visit-parents@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" @@ -8271,6 +9302,14 @@ unist-util-visit-parents@^2.0.0: dependencies: unist-util-is "^3.0.0" +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" @@ -8278,12 +9317,19 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: dependencies: unist-util-visit-parents "^2.0.0" -universal-user-agent@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" - integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== dependencies: - os-name "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" @@ -8295,24 +9341,16 @@ universalify@^1.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== untildify@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - unzip-stream@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/unzip-stream/-/unzip-stream-0.3.0.tgz#c30c054cd6b0d64b13a23cd3ece911eb0b2b52d8" @@ -8321,20 +9359,13 @@ unzip-stream@^0.3.0: binary "^0.3.0" mkdirp "^0.5.1" -unzipper@^0.9.3: - version "0.9.15" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.9.15.tgz#97d99203dad17698ee39882483c14e4845c7549c" - integrity sha512-2aaUvO4RAeHDvOCuEtth7jrHFaCKTSXPqUkXwADaLBzGbgZGzUDccoEdJ5lW+3RmfpOZYNx0Rw6F6PUzM6caIA== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" +unzip-stream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/unzip-stream/-/unzip-stream-0.3.1.tgz#2333b5cd035d29db86fb701ca212cf8517400083" + integrity sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw== + dependencies: + binary "^0.3.0" + mkdirp "^0.5.1" update-notifier@^4.1.0: version "4.1.1" @@ -8356,24 +9387,12 @@ update-notifier@^4.1.0: xdg-basedir "^4.0.0" uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -8386,21 +9405,11 @@ url-search-params-polyfill@^8.0.0: resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-8.1.1.tgz#9e69e4dba300a71ae7ad3cead62c7717fd99329f" integrity sha512-KmkCs6SjE6t4ihrfW9JelAPQIIIFbJweaaSLTh/4AO+c58JlDcb+GbdPt8yr5lRcFg4rPswRFRRhBGpWwh0K/Q== -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= - url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" @@ -8411,14 +9420,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - uuid@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" @@ -8429,11 +9430,21 @@ uuid@8.1.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -8463,6 +9474,14 @@ vfile-message@^1.0.0: dependencies: unist-util-stringify-position "^1.1.1" +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" @@ -8473,17 +9492,28 @@ vfile@^2.0.0: unist-util-stringify-position "^1.0.0" vfile-message "^1.0.0" -vue-eslint-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1" - integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g== +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== dependencies: - debug "^4.1.0" - eslint-scope "^4.0.0" - eslint-visitor-keys "^1.0.0" - espree "^4.1.0" - esquery "^1.0.1" - lodash "^4.17.11" + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vue-eslint-parser@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.0.1.tgz#25e08b20a414551531f3e19f999902e1ecf45f13" + integrity sha512-lhWjDXJhe3UZw2uu3ztX51SJAPGPey1Tff2RK3TyZURwbuI4vximQLzz4nQfCv8CZq4xx7uIiogHMMoSJPr33A== + dependencies: + debug "^4.3.2" + eslint-scope "^6.0.0" + eslint-visitor-keys "^3.0.0" + espree "^9.0.0" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^7.3.5" vuvuzela@1.0.3: version "1.0.3" @@ -8497,10 +9527,34 @@ warning@^4.0.1, warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -whatwg-fetch@>=0.10.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" - integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + 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" which-module@^2.0.0: version "2.0.0" @@ -8512,7 +9566,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@1, which@1.3.1, which@^1.1.1, which@^1.2.11, which@^1.2.9, which@^1.3.1: +which@1, which@^1.1.1, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -8526,7 +9580,14 @@ which@2.0.1: dependencies: isexe "^2.0.0" -wide-align@1.1.3, wide-align@^1.1.0: +which@2.0.2, which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== @@ -8540,28 +9601,21 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -windows-release@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== - dependencies: - execa "^1.0.0" - winreg@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b" integrity sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs= -wordwrap@^1.0.0, wordwrap@~1.0.0: +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - worker-loader@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac" @@ -8570,13 +9624,10 @@ worker-loader@^2.0.0: loader-utils "^1.0.0" schema-utils "^0.4.0" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" +workerpool@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== wrap-ansi@^5.1.0: version "5.1.0" @@ -8596,6 +9647,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8618,13 +9678,6 @@ write-stream@~0.4.3: dependencies: readable-stream "~0.0.2" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - x-is-string@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" @@ -8640,10 +9693,10 @@ xmlbuilder@^13.0.2: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== -xmlcreate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-1.0.2.tgz#fa6bf762a60a413fb3dd8f4b03c5b269238d308f" - integrity sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8= +xmlcreate@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" + integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== xregexp@2.0.0: version "2.0.0" @@ -8655,15 +9708,15 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.0, yallist@^3.0.3: version "3.1.1" @@ -8675,7 +9728,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.1, yargs-parser@^13.1.1: +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== @@ -8683,22 +9741,6 @@ yargs-parser@13.1.1, yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08" - integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -8707,81 +9749,58 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@13.3.0, yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== -yargs@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" 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" - yargs-parser "^9.0.2" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" -yargs@^12.0.2: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== +yargs@17.3.1: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" 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" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" -yargs@^14.0.0: - version "14.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" - integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg== +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== dependencies: cliui "^5.0.0" - decamelize "^1.2.0" find-up "^3.0.0" get-caller-file "^2.0.1" require-directory "^2.1.1" @@ -8790,9 +9809,9 @@ yargs@^14.0.0: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^15.0.0" + yargs-parser "^13.1.1" -yargs@^15.4.1: +yargs@^15.1.0, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -8817,7 +9836,12 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= +yn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-4.0.0.tgz#611480051ea43b510da1dfdbe177ed159f00a979" + integrity sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==