From d4fddc41b0c12116d700fde04ca29b1b5d29f0b0 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 5 Nov 2017 20:05:42 +0100 Subject: [PATCH 001/341] Remove useless declarations --- src/services/file/file.service.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/services/file/file.service.js b/src/services/file/file.service.js index 63ab364b..7bc12772 100644 --- a/src/services/file/file.service.js +++ b/src/services/file/file.service.js @@ -83,9 +83,6 @@ class FileService { constructor(configService) { this.configService = configService - - this._scripts = [] - this._modules = [] } runScript(scriptName) { From d097c25ac948735bd00c962b921b9120ee891b16 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 5 Nov 2017 23:03:26 +0100 Subject: [PATCH 002/341] New AlterationLogger service --- src/services/alteration-logger.js | 5 +++++ src/services/ateration-logger/alteration-logger.service.js | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 src/services/alteration-logger.js create mode 100644 src/services/ateration-logger/alteration-logger.service.js diff --git a/src/services/alteration-logger.js b/src/services/alteration-logger.js new file mode 100644 index 00000000..60987e7f --- /dev/null +++ b/src/services/alteration-logger.js @@ -0,0 +1,5 @@ +const { AlterationLoggerService } = require('./ateration-logger/alteration-logger.service') + +module.exports = exports = { + AlterationLoggerService +} diff --git a/src/services/ateration-logger/alteration-logger.service.js b/src/services/ateration-logger/alteration-logger.service.js new file mode 100644 index 00000000..f99c58d2 --- /dev/null +++ b/src/services/ateration-logger/alteration-logger.service.js @@ -0,0 +1,7 @@ +class AlterationLoggerService { + constructor(configService) { + this.configService = configService + } +} + +module.exports = exports = { AlterationLoggerService } From 2b603f96f5032963033b81d5a28e4b06ac6bde1f Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 5 Nov 2017 23:15:14 +0100 Subject: [PATCH 003/341] Init data folder --- .../ateration-logger/alteration-logger.service.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/services/ateration-logger/alteration-logger.service.js b/src/services/ateration-logger/alteration-logger.service.js index f99c58d2..afd67ff3 100644 --- a/src/services/ateration-logger/alteration-logger.service.js +++ b/src/services/ateration-logger/alteration-logger.service.js @@ -1,6 +1,18 @@ +const fs = require('fs') + +const { FsUtils } = require('../../shared/utils') + class AlterationLoggerService { + get dataPath() { + return `${this.configService.configFolderPath}/alterations` + } + constructor(configService) { this.configService = configService + + if (!FsUtils.fileExist(this.dataPath)) { + fs.mkdirSync(this.dataPath) + } } } From 181b1c7b67e68fd087afd62677f50a3791dd1dc1 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 5 Nov 2017 23:35:41 +0100 Subject: [PATCH 004/341] Add file / remove file --- .../alteration-logger.service.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/services/ateration-logger/alteration-logger.service.js b/src/services/ateration-logger/alteration-logger.service.js index afd67ff3..b363191b 100644 --- a/src/services/ateration-logger/alteration-logger.service.js +++ b/src/services/ateration-logger/alteration-logger.service.js @@ -14,6 +14,22 @@ class AlterationLoggerService { fs.mkdirSync(this.dataPath) } } + + alterationFilePath(moduleName) { + return `${this.dataPath}/${moduleName}.json` + } + + resetAlterations(moduleName) { + if (!FsUtils.fileExist(this.alterationFilePath(moduleName))) { + return + } + + fs.unlinkSync(this.alterationFilePath(moduleName)) + } + + addAlteration(moduleName, path, type) { + fs.writeFileSync(this.alterationFilePath(moduleName), JSON.stringify({}, null, 4)) + } } module.exports = exports = { AlterationLoggerService } From 53b2992b036a88350b217f7d799f8e042ea8589d Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 12 Nov 2017 22:13:58 +0100 Subject: [PATCH 005/341] Add types for node objects --- package.json | 1 + yarn.lock | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/package.json b/package.json index 473e2590..19fcb87b 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "inquirer": "^3.2.3" }, "devDependencies": { + "@types/node": "^8.0.51", "ava": "^0.22.0", "eslint": "^4.9.0", "eslint-config-standard": "^10.2.1", diff --git a/yarn.lock b/yarn.lock index 1f302a4f..7b61e626 100644 --- a/yarn.lock +++ b/yarn.lock @@ -44,6 +44,10 @@ dependencies: arrify "^1.0.1" +"@types/node@^8.0.51": + version "8.0.51" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" From 48e145574e4278b3a286bfa0455e31abf54dec32 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 12 Nov 2017 22:14:15 +0100 Subject: [PATCH 006/341] Write raw data --- .../alteration-logger.service.js | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/services/ateration-logger/alteration-logger.service.js b/src/services/ateration-logger/alteration-logger.service.js index b363191b..8e73378f 100644 --- a/src/services/ateration-logger/alteration-logger.service.js +++ b/src/services/ateration-logger/alteration-logger.service.js @@ -19,6 +19,12 @@ class AlterationLoggerService { return `${this.dataPath}/${moduleName}.json` } + alterationFile(moduleName) { + return FsUtils + .readFile(this.alterationFilePath(moduleName)) + .then(data => JSON.parse(data)) + } + resetAlterations(moduleName) { if (!FsUtils.fileExist(this.alterationFilePath(moduleName))) { return @@ -28,7 +34,25 @@ class AlterationLoggerService { } addAlteration(moduleName, path, type) { - fs.writeFileSync(this.alterationFilePath(moduleName), JSON.stringify({}, null, 4)) + return this + .alterationFile(moduleName) + .catch(error => { + if (error.code !== 'ENOENT') { + throw error + } + + return FsUtils + .writeFile(this.alterationFilePath(moduleName), JSON.stringify([])) + .then(_ => []) + }) + .then(alterations => { + alterations.push({ + path, + type + }) + + return FsUtils.writeFile(this.alterationFilePath(moduleName), JSON.stringify(alterations, null, 4)) + }) } } From dbb070dbb13ee7c3c6616f795c442478937d5e0f Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 12 Nov 2017 22:27:49 +0100 Subject: [PATCH 007/341] No duplicate data --- .../alteration-logger.service.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/services/ateration-logger/alteration-logger.service.js b/src/services/ateration-logger/alteration-logger.service.js index 8e73378f..bb6e1391 100644 --- a/src/services/ateration-logger/alteration-logger.service.js +++ b/src/services/ateration-logger/alteration-logger.service.js @@ -33,7 +33,11 @@ class AlterationLoggerService { fs.unlinkSync(this.alterationFilePath(moduleName)) } - addAlteration(moduleName, path, type) { + addAlteration(moduleName, path, type = 'created') { + if (!['created', 'renamed'].includes(type)) { + return Promise.reject(new Error('Bad type')) + } + return this .alterationFile(moduleName) .catch(error => { @@ -46,10 +50,12 @@ class AlterationLoggerService { .then(_ => []) }) .then(alterations => { - alterations.push({ - path, - type - }) + if (alterations.filter(alteration => alteration.path === path).length < 1) { + alterations.push({ + path, + type + }) + } return FsUtils.writeFile(this.alterationFilePath(moduleName), JSON.stringify(alterations, null, 4)) }) From e07ad5e705686971c165c42c03cecc612f81319e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20CHERRIER?= Date: Thu, 1 Mar 2018 16:05:55 +0100 Subject: [PATCH 008/341] Update barrels --- src/services/alteration-logger.js | 5 ----- src/services/ateration-logger/index.js | 5 +++++ src/services/config.js | 7 ------- src/services/config/index.js | 7 +++++++ src/services/file.js | 11 ----------- src/services/file/index.js | 11 +++++++++++ src/services/index.js | 9 +++++++++ 7 files changed, 32 insertions(+), 23 deletions(-) delete mode 100644 src/services/alteration-logger.js create mode 100644 src/services/ateration-logger/index.js delete mode 100644 src/services/config.js create mode 100644 src/services/config/index.js delete mode 100644 src/services/file.js create mode 100644 src/services/file/index.js create mode 100644 src/services/index.js diff --git a/src/services/alteration-logger.js b/src/services/alteration-logger.js deleted file mode 100644 index 60987e7f..00000000 --- a/src/services/alteration-logger.js +++ /dev/null @@ -1,5 +0,0 @@ -const { AlterationLoggerService } = require('./ateration-logger/alteration-logger.service') - -module.exports = exports = { - AlterationLoggerService -} diff --git a/src/services/ateration-logger/index.js b/src/services/ateration-logger/index.js new file mode 100644 index 00000000..3f2f120b --- /dev/null +++ b/src/services/ateration-logger/index.js @@ -0,0 +1,5 @@ +const { AlterationLoggerService } = require('./alteration-logger.service') + +module.exports = exports = { + AlterationLoggerService +} diff --git a/src/services/config.js b/src/services/config.js deleted file mode 100644 index ebe6983c..00000000 --- a/src/services/config.js +++ /dev/null @@ -1,7 +0,0 @@ -const { ConfigService } = require('./config/config.service') -const { ConfigurationFileNotExist } = require('./config/config-file-not-exist.error') - -module.exports = exports = { - ConfigService, - ConfigurationFileNotExist -} diff --git a/src/services/config/index.js b/src/services/config/index.js new file mode 100644 index 00000000..0c28a720 --- /dev/null +++ b/src/services/config/index.js @@ -0,0 +1,7 @@ +const { ConfigService } = require('./config.service') +const { ConfigurationFileNotExist } = require('./config-file-not-exist.error') + +module.exports = exports = { + ConfigService, + ConfigurationFileNotExist +} diff --git a/src/services/file.js b/src/services/file.js deleted file mode 100644 index 2c3a508b..00000000 --- a/src/services/file.js +++ /dev/null @@ -1,11 +0,0 @@ -const { FileService } = require('./file/file.service') -const { BadScriptPermission } = require('./file/bad-script-permission.error') -const { ScriptNotExist } = require('./file/script-not-exist.error') -const { TargetFileAlreadyExist } = require('./file/target-file-already-exist.error') - -module.exports = exports = { - FileService, - BadScriptPermission, - ScriptNotExist, - TargetFileAlreadyExist -} diff --git a/src/services/file/index.js b/src/services/file/index.js new file mode 100644 index 00000000..f77f8306 --- /dev/null +++ b/src/services/file/index.js @@ -0,0 +1,11 @@ +const { FileService } = require('./file.service') +const { BadScriptPermission } = require('./bad-script-permission.error') +const { ScriptNotExist } = require('./script-not-exist.error') +const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') + +module.exports = exports = { + FileService, + BadScriptPermission, + ScriptNotExist, + TargetFileAlreadyExist +} diff --git a/src/services/index.js b/src/services/index.js new file mode 100644 index 00000000..bde73f56 --- /dev/null +++ b/src/services/index.js @@ -0,0 +1,9 @@ +const ateration = require('./ateration-logger') +const config = require('./config') +const file = require('./file') + +module.exports = exports = { + ...alteration, + ...config, + ...file +} From 8ee30d7b9a671e776ad055979f22ee96bae4900e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20CHERRIER?= Date: Thu, 1 Mar 2018 16:05:55 +0100 Subject: [PATCH 009/341] Update barrels for services --- src/services/alteration-logger.js | 5 ----- src/services/ateration-logger/index.js | 5 +++++ src/services/config.js | 7 ------- src/services/config/index.js | 7 +++++++ src/services/file.js | 11 ----------- src/services/file/index.js | 11 +++++++++++ src/services/index.js | 9 +++++++++ 7 files changed, 32 insertions(+), 23 deletions(-) delete mode 100644 src/services/alteration-logger.js create mode 100644 src/services/ateration-logger/index.js delete mode 100644 src/services/config.js create mode 100644 src/services/config/index.js delete mode 100644 src/services/file.js create mode 100644 src/services/file/index.js create mode 100644 src/services/index.js diff --git a/src/services/alteration-logger.js b/src/services/alteration-logger.js deleted file mode 100644 index 60987e7f..00000000 --- a/src/services/alteration-logger.js +++ /dev/null @@ -1,5 +0,0 @@ -const { AlterationLoggerService } = require('./ateration-logger/alteration-logger.service') - -module.exports = exports = { - AlterationLoggerService -} diff --git a/src/services/ateration-logger/index.js b/src/services/ateration-logger/index.js new file mode 100644 index 00000000..3f2f120b --- /dev/null +++ b/src/services/ateration-logger/index.js @@ -0,0 +1,5 @@ +const { AlterationLoggerService } = require('./alteration-logger.service') + +module.exports = exports = { + AlterationLoggerService +} diff --git a/src/services/config.js b/src/services/config.js deleted file mode 100644 index ebe6983c..00000000 --- a/src/services/config.js +++ /dev/null @@ -1,7 +0,0 @@ -const { ConfigService } = require('./config/config.service') -const { ConfigurationFileNotExist } = require('./config/config-file-not-exist.error') - -module.exports = exports = { - ConfigService, - ConfigurationFileNotExist -} diff --git a/src/services/config/index.js b/src/services/config/index.js new file mode 100644 index 00000000..0c28a720 --- /dev/null +++ b/src/services/config/index.js @@ -0,0 +1,7 @@ +const { ConfigService } = require('./config.service') +const { ConfigurationFileNotExist } = require('./config-file-not-exist.error') + +module.exports = exports = { + ConfigService, + ConfigurationFileNotExist +} diff --git a/src/services/file.js b/src/services/file.js deleted file mode 100644 index 2c3a508b..00000000 --- a/src/services/file.js +++ /dev/null @@ -1,11 +0,0 @@ -const { FileService } = require('./file/file.service') -const { BadScriptPermission } = require('./file/bad-script-permission.error') -const { ScriptNotExist } = require('./file/script-not-exist.error') -const { TargetFileAlreadyExist } = require('./file/target-file-already-exist.error') - -module.exports = exports = { - FileService, - BadScriptPermission, - ScriptNotExist, - TargetFileAlreadyExist -} diff --git a/src/services/file/index.js b/src/services/file/index.js new file mode 100644 index 00000000..f77f8306 --- /dev/null +++ b/src/services/file/index.js @@ -0,0 +1,11 @@ +const { FileService } = require('./file.service') +const { BadScriptPermission } = require('./bad-script-permission.error') +const { ScriptNotExist } = require('./script-not-exist.error') +const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') + +module.exports = exports = { + FileService, + BadScriptPermission, + ScriptNotExist, + TargetFileAlreadyExist +} diff --git a/src/services/index.js b/src/services/index.js new file mode 100644 index 00000000..bde73f56 --- /dev/null +++ b/src/services/index.js @@ -0,0 +1,9 @@ +const ateration = require('./ateration-logger') +const config = require('./config') +const file = require('./file') + +module.exports = exports = { + ...alteration, + ...config, + ...file +} From f81640feccbbb90d153210e9c339144d168227ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20CHERRIER?= Date: Thu, 1 Mar 2018 16:12:38 +0100 Subject: [PATCH 010/341] Fix barrels for commands --- src/commands.js | 13 ------------- src/commands/index.js | 13 +++++++++++++ 2 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 src/commands.js create mode 100644 src/commands/index.js diff --git a/src/commands.js b/src/commands.js deleted file mode 100644 index 4bfd9eab..00000000 --- a/src/commands.js +++ /dev/null @@ -1,13 +0,0 @@ -const initCommand = require('./commands/init/init.command') -const runCommand = require('./commands/run.command') -const deployCommand = require('./commands/deploy/deploy.command') -const scriptsCommand = require('./commands/scripts.command') -const modulesCommand = require('./commands/modules.command') - -module.exports = exports = { - initCommand, - runCommand, - deployCommand, - scriptsCommand, - modulesCommand -} diff --git a/src/commands/index.js b/src/commands/index.js new file mode 100644 index 00000000..d262ff8b --- /dev/null +++ b/src/commands/index.js @@ -0,0 +1,13 @@ +const initCommand = require('./init/init.command') +const runCommand = require('./run.command') +const deployCommand = require('./deploy/deploy.command') +const scriptsCommand = require('./scripts.command') +const modulesCommand = require('./modules.command') + +module.exports = exports = { + initCommand, + runCommand, + deployCommand, + scriptsCommand, + modulesCommand +} From 9a2bd22fba53e91394fe865f3430335a8a85e5b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20CHERRIER?= Date: Thu, 1 Mar 2018 16:13:02 +0100 Subject: [PATCH 011/341] Use new barrels --- bin/configfile-modules.js | 4 +--- bin/configfile-scripts.js | 4 +--- bin/configfile.js | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index 9fdd4053..98b8f683 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -5,9 +5,7 @@ const fs = require('fs') const path = require('path') const { deployCommand, modulesCommand } = require('../src/commands') - -const { ConfigService } = require('../src/services/config') -const { FileService } = require('../src/services/file') +const { ConfigService, FileService } = require('../src/services/config') const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 72f581d6..07a6d0eb 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -5,9 +5,7 @@ const fs = require('fs') const path = require('path') const { runCommand, scriptsCommand } = require('../src/commands') - -const { ConfigService } = require('../src/services/config') -const { FileService } = require('../src/services/file') +const { ConfigService, FileService } = require("../src/services") const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) diff --git a/bin/configfile.js b/bin/configfile.js index 38ae6133..bf8627ba 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -4,7 +4,7 @@ const program = require('commander') const fs = require('fs') const path = require('path') -const { ConfigService } = require('../src/services/config') +const { ConfigService } = require('../src/services') const { initCommand } = require('../src/commands') From a2b78ab9aa58a4d87d325f98b2147d76d55548ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20CHERRIER?= Date: Thu, 1 Mar 2018 16:26:47 +0100 Subject: [PATCH 012/341] Home page for documentation --- docs/home.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/home.md diff --git a/docs/home.md b/docs/home.md new file mode 100644 index 00000000..2c0dbc11 --- /dev/null +++ b/docs/home.md @@ -0,0 +1,39 @@ +# Configfiles + +Configfiles is a command line interface application to help developer manages their development setup. + +## Getting Started + +To install Configfiles: + +```bash +npm install -g configfiles@latest +``` + +Generating first configuration: + +```bash +configfiles init +``` + +It is an interactive command. Answer questions. + +### Running unit tests + +Unit test will be available via: + +```bash +npm test +``` + +### Additional commands + +- [configfiles modules list]() +- [configfiles modules deploy]() +- [configfiles scripts list]() +- [configfiles scripts run]() + +## Configfiles Configuration + +- [Data folder structure]() +- [Module settings]() From a6ce2faed98155d804c7a298b64224c2cf91ffeb Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 1 Mar 2018 21:39:55 +0100 Subject: [PATCH 013/341] Externalize run method in their own class --- bin/configfile-scripts.js | 5 ++-- src/commands/run.command.js | 50 +++++++++++++++++-------------- src/services/exec.service.js | 34 +++++++++++++++++++++ src/services/file/file.service.js | 32 ++------------------ src/services/index.js | 6 ++-- 5 files changed, 71 insertions(+), 56 deletions(-) create mode 100644 src/services/exec.service.js diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 07a6d0eb..6c33a532 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -5,13 +5,14 @@ const fs = require('fs') const path = require('path') const { runCommand, scriptsCommand } = require('../src/commands') -const { ConfigService, FileService } = require("../src/services") +const { ExecService, FileService, ConfigService } = require('../src/services') const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) const configService = new ConfigService(optionsFilePath) const fileService = new FileService(configService) +const execService = new ExecService() program .version(packageData.version) @@ -27,6 +28,6 @@ program .command('run ') .alias('r') .description('run custom configuration scripts.') - .action(runCommand(configService, fileService)) + .action(runCommand(execService, fileService)) program.parse(process.argv) diff --git a/src/commands/run.command.js b/src/commands/run.command.js index c6aca0cc..88781997 100644 --- a/src/commands/run.command.js +++ b/src/commands/run.command.js @@ -3,27 +3,31 @@ const { LogUtils } = require('../shared/utils') const { ConfigurationFileNotExist } = require('../services/config') const { ScriptNotExist, BadScriptPermission } = require('../services/file') -module.exports = exports = (configService, fileService) => (scriptName, options) => { - Promise.resolve() - .then(scriptPath => LogUtils.log({ type: 'info', message: `Running "${scriptName}" script.` })) - .then(() => fileService.runScript(scriptName)) - .then(() => LogUtils.log({ type: 'success', message: `"${scriptName}" script execution is finished.` })) - .catch(error => { - if (error instanceof ConfigurationFileNotExist) { - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) - return - } - - if (error instanceof ScriptNotExist) { - LogUtils.log({ type: 'error', message: error.message }) - return - } - - if (error instanceof BadScriptPermission) { - LogUtils.log({ type: 'error', message: error.message, prefix: ' Fail ' }) - return - } - - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) - }) +module.exports = exports = (execService, fileService) => async (scriptName, options) => { + LogUtils.log({ type: 'info', message: `Running "${scriptName}" script.` }) + + const script = fileService.scriptByName(scriptName) + + try { + await execService.runScript(script) + + LogUtils.log({ type: 'success', message: `"${scriptName}" script execution is finished.` }) + } catch (error) { + if (error instanceof ConfigurationFileNotExist) { + LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + return + } + + if (error instanceof ScriptNotExist) { + LogUtils.log({ type: 'error', message: error.message }) + return + } + + if (error instanceof BadScriptPermission) { + LogUtils.log({ type: 'error', message: error.message, prefix: ' Fail ' }) + return + } + + LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) + } } diff --git a/src/services/exec.service.js b/src/services/exec.service.js new file mode 100644 index 00000000..561297aa --- /dev/null +++ b/src/services/exec.service.js @@ -0,0 +1,34 @@ +const { FsUtils, ProcessUtils, LogUtils } = require('../shared/utils') +const { ScriptNotExist } = require('./file/script-not-exist.error') +const { BadScriptPermission } = require('./file/bad-script-permission.error') + +class ExecService { + async runScript(script) { + if (script == null) { + throw new ScriptNotExist(script.script) + } + + await FsUtils.chmod(script.path, '0700') + + const child = ProcessUtils.execFile(script.path) + + child.stdout.on('data', data => { + LogUtils.log({ message: data.trim() }) + }) + child.stderr.on('data', data => { + LogUtils.log({ type: 'error', message: data.trim(), prefix: '' }) + }) + + try { + return await child.toPromise() + } catch (error) { + if (error.code === 'EACCES') { + throw new BadScriptPermission(script.script) + } + + throw error + } + } +} + +module.exports = exports = { ExecService } diff --git a/src/services/file/file.service.js b/src/services/file/file.service.js index 7bc12772..f4512ed1 100644 --- a/src/services/file/file.service.js +++ b/src/services/file/file.service.js @@ -1,9 +1,7 @@ const fs = require('fs') const path = require('path') -const { FsUtils, ProcessUtils, LogUtils } = require('../../shared/utils') -const { ScriptNotExist } = require('./script-not-exist.error') -const { BadScriptPermission } = require('./bad-script-permission.error') +const { FsUtils, LogUtils } = require('../../shared/utils') const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') class FileService { @@ -85,34 +83,10 @@ class FileService { this.configService = configService } - runScript(scriptName) { - const script = this.scripts + scriptByName(scriptName) { + return this.scripts .filter(({ script: name }) => name === scriptName) .shift() - - if (script == null) { - return Promise.reject(new ScriptNotExist(scriptName)) - } - - return FsUtils.chmod(script.path, '0700') - .then(() => { - const child = ProcessUtils.execFile(script.path) - child.stdout.on('data', data => { - LogUtils.log({ message: data.trim() }) - }) - child.stderr.on('data', data => { - LogUtils.log({ type: 'error', message: data.trim(), prefix: '' }) - }) - - return child.toPromise() - }) - .catch(error => { - if (error.code === 'EACCES') { - throw new BadScriptPermission(scriptName) - } - - throw error - }) } deployLocalFile({ source, target, global: isGlobalFile }, force = false) { diff --git a/src/services/index.js b/src/services/index.js index bde73f56..6140922a 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,9 +1,11 @@ -const ateration = require('./ateration-logger') +const alteration = require('./ateration-logger') const config = require('./config') const file = require('./file') +const exec = require('./exec.service') module.exports = exports = { ...alteration, ...config, - ...file + ...file, + ...exec } From f103042e07a9cd636fc5b254f00ccb6244d00c4a Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 1 Mar 2018 21:43:34 +0100 Subject: [PATCH 014/341] eorganize files --- .../{file => exec}/bad-script-permission.error.js | 0 src/services/{ => exec}/exec.service.js | 6 +++--- src/services/exec/index.js | 9 +++++++++ src/services/{file => exec}/script-not-exist.error.js | 0 src/services/file/index.js | 4 ---- src/services/index.js | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) rename src/services/{file => exec}/bad-script-permission.error.js (100%) rename src/services/{ => exec}/exec.service.js (75%) create mode 100644 src/services/exec/index.js rename src/services/{file => exec}/script-not-exist.error.js (100%) diff --git a/src/services/file/bad-script-permission.error.js b/src/services/exec/bad-script-permission.error.js similarity index 100% rename from src/services/file/bad-script-permission.error.js rename to src/services/exec/bad-script-permission.error.js diff --git a/src/services/exec.service.js b/src/services/exec/exec.service.js similarity index 75% rename from src/services/exec.service.js rename to src/services/exec/exec.service.js index 561297aa..f44dc634 100644 --- a/src/services/exec.service.js +++ b/src/services/exec/exec.service.js @@ -1,6 +1,6 @@ -const { FsUtils, ProcessUtils, LogUtils } = require('../shared/utils') -const { ScriptNotExist } = require('./file/script-not-exist.error') -const { BadScriptPermission } = require('./file/bad-script-permission.error') +const { FsUtils, ProcessUtils, LogUtils } = require('../../shared/utils') +const { ScriptNotExist } = require('./script-not-exist.error') +const { BadScriptPermission } = require('./bad-script-permission.error') class ExecService { async runScript(script) { diff --git a/src/services/exec/index.js b/src/services/exec/index.js new file mode 100644 index 00000000..9bdf7e52 --- /dev/null +++ b/src/services/exec/index.js @@ -0,0 +1,9 @@ +const { ExecService } = require('./exec.service') +const { BadScriptPermission } = require('./bad-script-permission.error') +const { ScriptNotExist } = require('./script-not-exist.error') + +module.exports = exports = { + ExecService, + BadScriptPermission, + ScriptNotExist +} diff --git a/src/services/file/script-not-exist.error.js b/src/services/exec/script-not-exist.error.js similarity index 100% rename from src/services/file/script-not-exist.error.js rename to src/services/exec/script-not-exist.error.js diff --git a/src/services/file/index.js b/src/services/file/index.js index f77f8306..a23facf2 100644 --- a/src/services/file/index.js +++ b/src/services/file/index.js @@ -1,11 +1,7 @@ const { FileService } = require('./file.service') -const { BadScriptPermission } = require('./bad-script-permission.error') -const { ScriptNotExist } = require('./script-not-exist.error') const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') module.exports = exports = { FileService, - BadScriptPermission, - ScriptNotExist, TargetFileAlreadyExist } diff --git a/src/services/index.js b/src/services/index.js index 6140922a..075686d5 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,7 +1,7 @@ const alteration = require('./ateration-logger') const config = require('./config') const file = require('./file') -const exec = require('./exec.service') +const exec = require('./exec') module.exports = exports = { ...alteration, From cf7836f5ff2d9b93e23312876ac4aca83bcdebcd Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 1 Mar 2018 22:03:27 +0100 Subject: [PATCH 015/341] Create deploy service --- src/services/deploy/deploy.service.js | 84 +++++++++++++++++++ src/services/deploy/index.js | 7 ++ .../target-file-already-exist.error.js | 0 src/services/file/file.service.js | 81 ------------------ src/services/file/index.js | 4 +- 5 files changed, 92 insertions(+), 84 deletions(-) create mode 100644 src/services/deploy/deploy.service.js create mode 100644 src/services/deploy/index.js rename src/services/{file => deploy}/target-file-already-exist.error.js (100%) diff --git a/src/services/deploy/deploy.service.js b/src/services/deploy/deploy.service.js new file mode 100644 index 00000000..229e9128 --- /dev/null +++ b/src/services/deploy/deploy.service.js @@ -0,0 +1,84 @@ +const path = require('path') + +const { FsUtils, LogUtils } = require('../../shared/utils') +const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') + +class DeployService { + async deployLocalFile({ source, target, global: isGlobalFile }, force = false) { + if (isGlobalFile) { + throw new TypeError('Unable to deploy global file as a local one.') + } + + const dirname = path.dirname(target) + if (!FsUtils.fileExist(dirname)) { + await FsUtils.mkdirp(dirname) + } + + let fileStats + try { + fileStats = await FsUtils.lstat(target) + } catch (error) { + if (error.code !== 'ENOENT') { + throw error + } + + fileStats = null // No file exist at target. No stats data to provide + } + + if (fileStats != null && force === false) { + throw new TargetFileAlreadyExist(target) + } + + try { + return await FsUtils.copyFile(source, target) + } catch (error) { + if (error.code !== 'EEXIST') { + throw error + } + + LogUtils.log({ type: 'warn', message: `Unable to make a local copy ("${source}" => "${target}").` }) + } + } + + async deployGlobalFile({ source, target, global: isGlobalFile }) { + if (!isGlobalFile) { + throw new TypeError('Unable to deploy local file as a global one.') + } + + const dirname = path.dirname(target) + if (!FsUtils.fileExist(dirname)) { + await FsUtils.mkdirp(dirname) + } + + try { + const targetStat = await FsUtils.lstat(target) + if (targetStat.isSymbolicLink()) { + const linkSource = await FsUtils.readlink(target) + + if (linkSource === source) { + await FsUtils.unlink(target) + } + } + + if (targetStat.isFile() || targetStat.isDirectory()) { + await FsUtils.rename(target, `${target}.old`) + } + } catch (error) { + if (error.code !== 'ENOENT') { // No file exist at file.target + throw error + } + } + + try { + await FsUtils.symlink(source, target) + } catch (error) { + if (error.code !== 'EEXIST') { + throw error + } + + LogUtils.log({ type: 'warn', message: `Unable to link "${source}" => "${target}".` }) + } + } +} + +module.exports = exports = { DeployService } diff --git a/src/services/deploy/index.js b/src/services/deploy/index.js new file mode 100644 index 00000000..bf21d62e --- /dev/null +++ b/src/services/deploy/index.js @@ -0,0 +1,7 @@ +const { DeployService } = require('./deploy.service') +const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') + +module.exports = exports = { + DeployService, + TargetFileAlreadyExist +} diff --git a/src/services/file/target-file-already-exist.error.js b/src/services/deploy/target-file-already-exist.error.js similarity index 100% rename from src/services/file/target-file-already-exist.error.js rename to src/services/deploy/target-file-already-exist.error.js diff --git a/src/services/file/file.service.js b/src/services/file/file.service.js index f4512ed1..60ab7d31 100644 --- a/src/services/file/file.service.js +++ b/src/services/file/file.service.js @@ -2,7 +2,6 @@ const fs = require('fs') const path = require('path') const { FsUtils, LogUtils } = require('../../shared/utils') -const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') class FileService { get scripts() { @@ -88,86 +87,6 @@ class FileService { .filter(({ script: name }) => name === scriptName) .shift() } - - deployLocalFile({ source, target, global: isGlobalFile }, force = false) { - const deployPrommise = Promise.resolve() - - if (isGlobalFile) { - deployPrommise.then(_ => { throw new TypeError('Unable to deploy global file as a local one.') }) - } - - const dirname = path.dirname(target) - if (!FsUtils.fileExist(dirname)) { - deployPrommise.then(_ => FsUtils.mkdirp(dirname)) - } - - return deployPrommise - .then(_ => FsUtils.lstat(target)) - .catch(error => { - if (error.code !== 'ENOENT') { - throw error - } - - return null // No file exist at target. No stats data to provide - }) - .then(fileStats => { - if (fileStats != null && force === false) { - throw new TargetFileAlreadyExist(target) - } - - return FsUtils.copyFile(source, target) - }) - .catch(error => { - if (error.code !== 'EEXIST') { - throw error - } - - LogUtils.log({ type: 'warn', message: `Unable to make a local copy ("${source}" => "${target}").` }) - }) - } - - deployGlobalFile({ source, target, global: isGlobalFile }) { - const deployPrommise = Promise.resolve() - - if (!isGlobalFile) { - deployPrommise.then(_ => { throw new TypeError('Unable to deploy local file as a global one.') }) - } - - const dirname = path.dirname(target) - if (!FsUtils.fileExist(dirname)) { - deployPrommise.then(_ => FsUtils.mkdirp(dirname)) - } - - return deployPrommise - .then(_ => FsUtils.lstat(target)) - .then(targetStat => { - if (targetStat.isSymbolicLink()) { - return FsUtils.readlink(target) - .then(linkSource => { - if (linkSource === source) { - return FsUtils.unlink(target) - } - }) - } - - if (targetStat.isFile() || targetStat.isDirectory()) { - return FsUtils.rename(target, `${target}.old`) - } - }) - .catch(error => { - if (error.code !== 'ENOENT') { // No file exist at file.target - throw error - } - }) - .then(_ => FsUtils.symlink(source, target)) - .catch(error => { - if (error.code !== 'EEXIST') { - throw error - } - - LogUtils.log({ type: 'warn', message: `Unable to link "${source}" => "${target}".` }) - }) - } } module.exports = exports = { FileService } diff --git a/src/services/file/index.js b/src/services/file/index.js index a23facf2..e8e37171 100644 --- a/src/services/file/index.js +++ b/src/services/file/index.js @@ -1,7 +1,5 @@ const { FileService } = require('./file.service') -const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') module.exports = exports = { - FileService, - TargetFileAlreadyExist + FileService } From 28fdf58533e1a49d4e4488a74f0fd0b8f3527cbf Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 1 Mar 2018 22:07:59 +0100 Subject: [PATCH 016/341] Use DeployService --- bin/configfile-modules.js | 5 +++-- src/commands/deploy/deploy.command.js | 6 +++--- src/services/index.js | 4 +++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index 98b8f683..a6c2dfa3 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -5,13 +5,14 @@ const fs = require('fs') const path = require('path') const { deployCommand, modulesCommand } = require('../src/commands') -const { ConfigService, FileService } = require('../src/services/config') +const { ConfigService, FileService, DeployService } = require('../src/services') const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) const configService = new ConfigService(optionsFilePath) const fileService = new FileService(configService) +const deployService = new DeployService() program .version(packageData.version) @@ -28,6 +29,6 @@ program .alias('d') .description('deploy configuration files.') .option('-l, --local', 'deploy only local files of the module(s) in the current folder') - .action(deployCommand(fileService)) + .action(deployCommand(fileService, deployService)) program.parse(process.argv) diff --git a/src/commands/deploy/deploy.command.js b/src/commands/deploy/deploy.command.js index c108a0b8..500b5ca8 100644 --- a/src/commands/deploy/deploy.command.js +++ b/src/commands/deploy/deploy.command.js @@ -6,7 +6,7 @@ const { ConfigurationFileNotExist } = require('../../services/config') const { TargetFileAlreadyExist } = require('../../services/file') const { DeployStopedByUser } = require('./deploy-stop-by-user.error') -module.exports = exports = fileService => (modules, options) => { +module.exports = exports = (fileService, deployService) => (modules, options) => { const localDeployment = options.local || false let modulesToDeploy = modules @@ -44,10 +44,10 @@ module.exports = exports = fileService => (modules, options) => { const failedFiles = [] const deployPromises = files.map(file => { if (file.global) { - return fileService.deployGlobalFile(file) + return deployService.deployGlobalFile(file) } - return fileService.deployLocalFile(file) + return deployService.deployLocalFile(file) .catch(error => { if (error instanceof TargetFileAlreadyExist) { failedFiles.push(file) diff --git a/src/services/index.js b/src/services/index.js index 075686d5..bc1f1046 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -2,10 +2,12 @@ const alteration = require('./ateration-logger') const config = require('./config') const file = require('./file') const exec = require('./exec') +const deploy = require('./deploy') module.exports = exports = { ...alteration, ...config, ...file, - ...exec + ...exec, + ...deploy } From 8535d92257a6114b0e1dcd3fe7380db4053b0a42 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 2 Mar 2018 07:22:41 +0100 Subject: [PATCH 017/341] Create InjectorService --- bin/configfile-modules.js | 19 ++++----- bin/configfile-scripts.js | 19 ++++----- bin/configfile.js | 14 +++---- src/configuration.js | 18 ++++++++ src/services/index.js | 4 +- src/services/injector.service.js | 71 ++++++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 34 deletions(-) create mode 100644 src/configuration.js create mode 100644 src/services/injector.service.js diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index a6c2dfa3..938c252a 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -1,34 +1,29 @@ #!/usr/bin/env node const program = require('commander') -const fs = require('fs') -const path = require('path') -const { deployCommand, modulesCommand } = require('../src/commands') -const { ConfigService, FileService, DeployService } = require('../src/services') +const config = require('../src/configuration') -const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) -const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) +const { deployCommand, modulesCommand } = require('../src/commands') +const { FileService, DeployService, InjectorService } = require('../src/services') -const configService = new ConfigService(optionsFilePath) -const fileService = new FileService(configService) -const deployService = new DeployService() +const injector = InjectorService.getMainInstance() program - .version(packageData.version) + .version(config.package.version) .description('Configuration modules manager.') program .command('list') .alias('l') .description('list all modules available.') - .action(modulesCommand(fileService)) + .action(modulesCommand(injector.get(FileService))) program .command('deploy [modules...]') .alias('d') .description('deploy configuration files.') .option('-l, --local', 'deploy only local files of the module(s) in the current folder') - .action(deployCommand(fileService, deployService)) + .action(deployCommand(injector.get(FileService), injector.get(DeployService))) program.parse(process.argv) diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 6c33a532..006a937e 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -1,33 +1,28 @@ #!/usr/bin/env node const program = require('commander') -const fs = require('fs') -const path = require('path') -const { runCommand, scriptsCommand } = require('../src/commands') -const { ExecService, FileService, ConfigService } = require('../src/services') +const config = require('../src/configuration') -const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) -const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) +const { runCommand, scriptsCommand } = require('../src/commands') +const { ExecService, FileService, InjectorService } = require('../src/services') -const configService = new ConfigService(optionsFilePath) -const fileService = new FileService(configService) -const execService = new ExecService() +const injector = InjectorService.getMainInstance() program - .version(packageData.version) + .version(config.package.version) .description('Custom scripts manager.') program .command('list') .alias('l') .description('list all custom configuration scripts available.') - .action(scriptsCommand(fileService)) + .action(scriptsCommand(injector.get(FileService))) program .command('run ') .alias('r') .description('run custom configuration scripts.') - .action(runCommand(execService, fileService)) + .action(runCommand(injector.get(ExecService), injector.get(FileService))) program.parse(process.argv) diff --git a/bin/configfile.js b/bin/configfile.js index bf8627ba..e7f93bea 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -1,20 +1,16 @@ #!/usr/bin/env node const program = require('commander') -const fs = require('fs') -const path = require('path') -const { ConfigService } = require('../src/services') +const config = require('../src/configuration') +const { ConfigService, InjectorService } = require('../src/services') const { initCommand } = require('../src/commands') -const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) -const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) - -const configService = new ConfigService(optionsFilePath) +const injector = InjectorService.getMainInstance() program - .version(packageData.version) + .version(config.package.version) .description('Configuration files manager.') program @@ -22,7 +18,7 @@ program .alias('i') .description('activate configfiles on user session.') .option('-f, --force', 'force parameters file overwrite.') - .action(initCommand(configService)) + .action(initCommand(injector.get(ConfigService))) program .command('scripts', 'work with custom scripts available.') diff --git a/src/configuration.js b/src/configuration.js new file mode 100644 index 00000000..efa4c793 --- /dev/null +++ b/src/configuration.js @@ -0,0 +1,18 @@ +const fs = require('fs') +const path = require('path') + +const { InjectorService, DeployService, ExecService, FileService, ConfigService } = require('./services') + +const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) +const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) + +const injector = InjectorService.getMainInstance() + +injector.provide(DeployService) +injector.provide(ExecService) +injector.provide(FileService, [ConfigService]) +injector.provide(ConfigService, [{ useValue: optionsFilePath }]) + +module.exports = exports = { + package: packageData +} diff --git a/src/services/index.js b/src/services/index.js index bc1f1046..5b4ba5e2 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -3,11 +3,13 @@ const config = require('./config') const file = require('./file') const exec = require('./exec') const deploy = require('./deploy') +const injector = require('./injector.service') module.exports = exports = { ...alteration, ...config, ...file, ...exec, - ...deploy + ...deploy, + ...injector } diff --git a/src/services/injector.service.js b/src/services/injector.service.js new file mode 100644 index 00000000..4a8f7ce6 --- /dev/null +++ b/src/services/injector.service.js @@ -0,0 +1,71 @@ +class InjectorService { + constructor() { + this.data = [] + } + + provide(useClass, params = []) { + const alreadyExist = this.data + .filter(service => service.useClass === useClass) + .length > 0 + + if (alreadyExist) { + return + } + + this.data.push({ + useClass, + params: params.map(param => { + if (param.useValue != null) { + return param + } + + return { + useClass: param + } + }) + }) + } + + get(useClass) { + const previousInstance = InjectorService.instances.find(instance => instance instanceof useClass) + + if (previousInstance != null) { + return previousInstance + } + + const data = this.data.find(data => data.useClass === useClass) + + if (data != null) { + const Class = data.useClass + const instance = new Class(...data.params.map(param => { + if (param.useClass != null) { + return this.get(param.useClass) + } + + return param.useValue + })) + + InjectorService.instances.push(instance) + + return instance + } + + return null + } + + static getMainInstance() { + const previousInstance = InjectorService.instances.find(instance => instance instanceof InjectorService) + + if (previousInstance != null) { + return previousInstance + } + + InjectorService.instances.push(new InjectorService()) + + return InjectorService.getMainInstance() + } +} + +InjectorService.instances = [] + +module.exports = exports = { InjectorService } From ec2acafe48979130852c6f843b42b8823968446f Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 2 Mar 2018 07:24:19 +0100 Subject: [PATCH 018/341] Allow injection via useClass --- src/services/injector.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/injector.service.js b/src/services/injector.service.js index 4a8f7ce6..00c1ef79 100644 --- a/src/services/injector.service.js +++ b/src/services/injector.service.js @@ -15,7 +15,7 @@ class InjectorService { this.data.push({ useClass, params: params.map(param => { - if (param.useValue != null) { + if (param.useValue != null || param.useClass != null) { return param } From 2f0ff212fbcaa6611fece60a002810cd15556a27 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 2 Mar 2018 07:26:25 +0100 Subject: [PATCH 019/341] Reorganize injector class --- src/services/injector.service.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/services/injector.service.js b/src/services/injector.service.js index 00c1ef79..f1df5634 100644 --- a/src/services/injector.service.js +++ b/src/services/injector.service.js @@ -3,6 +3,18 @@ class InjectorService { this.data = [] } + static getMainInstance() { + const previousInstance = InjectorService.instances.find(instance => instance instanceof InjectorService) + + if (previousInstance != null) { + return previousInstance + } + + InjectorService.instances.push(new InjectorService()) + + return InjectorService.getMainInstance() + } + provide(useClass, params = []) { const alreadyExist = this.data .filter(service => service.useClass === useClass) @@ -52,18 +64,6 @@ class InjectorService { return null } - - static getMainInstance() { - const previousInstance = InjectorService.instances.find(instance => instance instanceof InjectorService) - - if (previousInstance != null) { - return previousInstance - } - - InjectorService.instances.push(new InjectorService()) - - return InjectorService.getMainInstance() - } } InjectorService.instances = [] From 890552ebb0f6ebf34236a991b0f5cd25b37a82be Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 2 Mar 2018 07:27:58 +0100 Subject: [PATCH 020/341] Move alone file service --- .../{ateration-logger => }/alteration-logger.service.js | 0 src/services/ateration-logger/index.js | 5 ----- src/services/{file => }/file.service.js | 0 src/services/file/index.js | 5 ----- src/services/index.js | 4 ++-- 5 files changed, 2 insertions(+), 12 deletions(-) rename src/services/{ateration-logger => }/alteration-logger.service.js (100%) delete mode 100644 src/services/ateration-logger/index.js rename src/services/{file => }/file.service.js (100%) delete mode 100644 src/services/file/index.js diff --git a/src/services/ateration-logger/alteration-logger.service.js b/src/services/alteration-logger.service.js similarity index 100% rename from src/services/ateration-logger/alteration-logger.service.js rename to src/services/alteration-logger.service.js diff --git a/src/services/ateration-logger/index.js b/src/services/ateration-logger/index.js deleted file mode 100644 index 3f2f120b..00000000 --- a/src/services/ateration-logger/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const { AlterationLoggerService } = require('./alteration-logger.service') - -module.exports = exports = { - AlterationLoggerService -} diff --git a/src/services/file/file.service.js b/src/services/file.service.js similarity index 100% rename from src/services/file/file.service.js rename to src/services/file.service.js diff --git a/src/services/file/index.js b/src/services/file/index.js deleted file mode 100644 index e8e37171..00000000 --- a/src/services/file/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const { FileService } = require('./file.service') - -module.exports = exports = { - FileService -} diff --git a/src/services/index.js b/src/services/index.js index 5b4ba5e2..98d49c10 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,6 +1,6 @@ -const alteration = require('./ateration-logger') +const alteration = require('./alteration-logger.service') const config = require('./config') -const file = require('./file') +const file = require('./file.service') const exec = require('./exec') const deploy = require('./deploy') const injector = require('./injector.service') From d1d920a65188448754898fb3bda738e37985a48e Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 2 Mar 2018 07:51:16 +0100 Subject: [PATCH 021/341] Create EventManager --- src/configuration.js | 3 +- .../event-manager/event-manager.service.js | 31 +++++++++++++++++++ src/services/event-manager/index.js | 5 +++ .../event-manager/method-not-exist.error.js | 9 ++++++ src/services/index.js | 4 ++- 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/services/event-manager/event-manager.service.js create mode 100644 src/services/event-manager/index.js create mode 100644 src/services/event-manager/method-not-exist.error.js diff --git a/src/configuration.js b/src/configuration.js index efa4c793..2f2647c1 100644 --- a/src/configuration.js +++ b/src/configuration.js @@ -1,7 +1,7 @@ const fs = require('fs') const path = require('path') -const { InjectorService, DeployService, ExecService, FileService, ConfigService } = require('./services') +const { InjectorService, DeployService, ExecService, FileService, ConfigService, EventManagerService } = require('./services') const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) @@ -12,6 +12,7 @@ injector.provide(DeployService) injector.provide(ExecService) injector.provide(FileService, [ConfigService]) injector.provide(ConfigService, [{ useValue: optionsFilePath }]) +injector.provide(EventManagerService) module.exports = exports = { package: packageData diff --git a/src/services/event-manager/event-manager.service.js b/src/services/event-manager/event-manager.service.js new file mode 100644 index 00000000..30f27315 --- /dev/null +++ b/src/services/event-manager/event-manager.service.js @@ -0,0 +1,31 @@ +const { MethodDoesNotExist } = require('./method-not-exist.error') + +class EventManagerService { + constructor() { + this.observers = [] + } + + register(eventName, instance, methodName = 'subcribe') { + if (instance[methodName] == null) { + throw new MethodDoesNotExist(instance.constructor.name, methodName) + } + + this.observers.push({ + eventName, + instance, + methodName + }) + } + + emit(eventName, data) { + this.observers + .filter(observer => observer.eventName === eventName) + .forEach(({ instance, methodName }) => { + instance[methodName](data) + }) + } +} + +module.exports = exports = { + EventManagerService +} diff --git a/src/services/event-manager/index.js b/src/services/event-manager/index.js new file mode 100644 index 00000000..e0246472 --- /dev/null +++ b/src/services/event-manager/index.js @@ -0,0 +1,5 @@ +const { EventManagerService } = require('./event-manager.service') + +module.exports = exports = { + EventManagerService +} diff --git a/src/services/event-manager/method-not-exist.error.js b/src/services/event-manager/method-not-exist.error.js new file mode 100644 index 00000000..190b91a0 --- /dev/null +++ b/src/services/event-manager/method-not-exist.error.js @@ -0,0 +1,9 @@ +class MethodDoesNotExist extends Error { + constructor(useClass, methodName) { + super(`${methodName} does not exist in class ${useClass}`) + } +} + +module.exports = exports = { + MethodDoesNotExist +} diff --git a/src/services/index.js b/src/services/index.js index 98d49c10..4017d541 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -4,6 +4,7 @@ const file = require('./file.service') const exec = require('./exec') const deploy = require('./deploy') const injector = require('./injector.service') +const eventManager = require('./event-manager') module.exports = exports = { ...alteration, @@ -11,5 +12,6 @@ module.exports = exports = { ...file, ...exec, ...deploy, - ...injector + ...injector, + ...eventManager } From 7759330e186211351587ad3606b12be5e97b9f73 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 3 Mar 2018 00:19:19 +0100 Subject: [PATCH 022/341] Fix documentation --- docs/home.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/home.md b/docs/home.md index 2c0dbc11..78e37ff0 100644 --- a/docs/home.md +++ b/docs/home.md @@ -1,13 +1,13 @@ -# Configfiles +# Configfile -Configfiles is a command line interface application to help developer manages their development setup. +Configfile is a command line interface application to help developer manages their development setup. ## Getting Started -To install Configfiles: +To install Configfile: ```bash -npm install -g configfiles@latest +npm install -g configfile@latest ``` Generating first configuration: @@ -28,10 +28,10 @@ npm test ### Additional commands -- [configfiles modules list]() -- [configfiles modules deploy]() -- [configfiles scripts list]() -- [configfiles scripts run]() +- [configfile modules list]() +- [configfile modules deploy]() +- [configfile scripts list]() +- [configfile scripts run]() ## Configfiles Configuration From 09ffc622abb95203d675e4d1d107b1f0e79458e6 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Tue, 6 Mar 2018 23:49:22 +0100 Subject: [PATCH 023/341] Add event on the global deployment process --- src/commands/deploy/deploy.command.js | 2 +- src/commands/run.command.js | 2 +- src/configuration.js | 7 +++++-- ...ogger.service.js => alteration.service.js} | 21 +++++++++++++++---- src/services/deploy/deploy.service.js | 8 +++++++ .../event-manager/event-manager.service.js | 2 +- src/services/file.service.js | 2 +- src/services/index.js | 2 +- 8 files changed, 35 insertions(+), 11 deletions(-) rename src/services/{alteration-logger.service.js => alteration.service.js} (68%) diff --git a/src/commands/deploy/deploy.command.js b/src/commands/deploy/deploy.command.js index 500b5ca8..a007b29b 100644 --- a/src/commands/deploy/deploy.command.js +++ b/src/commands/deploy/deploy.command.js @@ -3,7 +3,7 @@ const inquirer = require('inquirer') const { LogUtils } = require('../../shared/utils') const { ConfigurationFileNotExist } = require('../../services/config') -const { TargetFileAlreadyExist } = require('../../services/file') +const { TargetFileAlreadyExist } = require('../../services') const { DeployStopedByUser } = require('./deploy-stop-by-user.error') module.exports = exports = (fileService, deployService) => (modules, options) => { diff --git a/src/commands/run.command.js b/src/commands/run.command.js index 88781997..f9a4ed54 100644 --- a/src/commands/run.command.js +++ b/src/commands/run.command.js @@ -1,7 +1,7 @@ const { LogUtils } = require('../shared/utils') const { ConfigurationFileNotExist } = require('../services/config') -const { ScriptNotExist, BadScriptPermission } = require('../services/file') +const { ScriptNotExist, BadScriptPermission } = require('../services') module.exports = exports = (execService, fileService) => async (scriptName, options) => { LogUtils.log({ type: 'info', message: `Running "${scriptName}" script.` }) diff --git a/src/configuration.js b/src/configuration.js index 2f2647c1..64203503 100644 --- a/src/configuration.js +++ b/src/configuration.js @@ -1,18 +1,21 @@ const fs = require('fs') const path = require('path') -const { InjectorService, DeployService, ExecService, FileService, ConfigService, EventManagerService } = require('./services') +const { InjectorService, DeployService, ExecService, FileService, ConfigService, EventManagerService, AlterationService } = require('./services') const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) const injector = InjectorService.getMainInstance() -injector.provide(DeployService) +injector.provide(DeployService, [EventManagerService]) injector.provide(ExecService) injector.provide(FileService, [ConfigService]) injector.provide(ConfigService, [{ useValue: optionsFilePath }]) injector.provide(EventManagerService) +injector.provide(AlterationService, [ConfigService, EventManagerService]) + +injector.get(AlterationService) module.exports = exports = { package: packageData diff --git a/src/services/alteration-logger.service.js b/src/services/alteration.service.js similarity index 68% rename from src/services/alteration-logger.service.js rename to src/services/alteration.service.js index bb6e1391..96cd2fbb 100644 --- a/src/services/alteration-logger.service.js +++ b/src/services/alteration.service.js @@ -1,18 +1,21 @@ const fs = require('fs') -const { FsUtils } = require('../../shared/utils') +const { FsUtils } = require('../shared/utils') -class AlterationLoggerService { +class AlterationService { get dataPath() { return `${this.configService.configFolderPath}/alterations` } - constructor(configService) { + constructor(configService, eventManager) { this.configService = configService + this.eventManager = eventManager if (!FsUtils.fileExist(this.dataPath)) { fs.mkdirSync(this.dataPath) } + + this._registerEvent() } alterationFilePath(moduleName) { @@ -60,6 +63,16 @@ class AlterationLoggerService { return FsUtils.writeFile(this.alterationFilePath(moduleName), JSON.stringify(alterations, null, 4)) }) } + + _registerEvent() { + this.eventManager.register('deploy.created', this, '_onCreate') + this.eventManager.register('deploy.renamed', this, '_onRename') + this.eventManager.register('deploy.removed', this, '_onRemove') + } + + _onCreate(path) { console.log(`deploy.created : ${path}`) } + _onRename(infos) { console.log(`deploy.renamed : ${infos.new}`) } + _onRemove(infos) { console.log(`deploy.removed : ${infos}`) } } -module.exports = exports = { AlterationLoggerService } +module.exports = exports = { AlterationService } diff --git a/src/services/deploy/deploy.service.js b/src/services/deploy/deploy.service.js index 229e9128..17b9465b 100644 --- a/src/services/deploy/deploy.service.js +++ b/src/services/deploy/deploy.service.js @@ -4,6 +4,10 @@ const { FsUtils, LogUtils } = require('../../shared/utils') const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') class DeployService { + constructor(eventManager) { + this.eventManager = eventManager + } + async deployLocalFile({ source, target, global: isGlobalFile }, force = false) { if (isGlobalFile) { throw new TypeError('Unable to deploy global file as a local one.') @@ -48,6 +52,7 @@ class DeployService { const dirname = path.dirname(target) if (!FsUtils.fileExist(dirname)) { await FsUtils.mkdirp(dirname) + this.eventManager.emit('deploy.created', dirname) } try { @@ -57,11 +62,13 @@ class DeployService { if (linkSource === source) { await FsUtils.unlink(target) + this.eventManager.emit('deploy.removed', target) } } if (targetStat.isFile() || targetStat.isDirectory()) { await FsUtils.rename(target, `${target}.old`) + this.eventManager.emit('deploy.renamed', { old: target, new: `${target}.old` }) } } catch (error) { if (error.code !== 'ENOENT') { // No file exist at file.target @@ -71,6 +78,7 @@ class DeployService { try { await FsUtils.symlink(source, target) + this.eventManager.emit('deploy.created', target) } catch (error) { if (error.code !== 'EEXIST') { throw error diff --git a/src/services/event-manager/event-manager.service.js b/src/services/event-manager/event-manager.service.js index 30f27315..f5a62269 100644 --- a/src/services/event-manager/event-manager.service.js +++ b/src/services/event-manager/event-manager.service.js @@ -5,7 +5,7 @@ class EventManagerService { this.observers = [] } - register(eventName, instance, methodName = 'subcribe') { + register(eventName, instance, methodName = 'subscribe') { if (instance[methodName] == null) { throw new MethodDoesNotExist(instance.constructor.name, methodName) } diff --git a/src/services/file.service.js b/src/services/file.service.js index 60ab7d31..ef6b9923 100644 --- a/src/services/file.service.js +++ b/src/services/file.service.js @@ -1,7 +1,7 @@ const fs = require('fs') const path = require('path') -const { FsUtils, LogUtils } = require('../../shared/utils') +const { FsUtils, LogUtils } = require('../shared/utils') class FileService { get scripts() { diff --git a/src/services/index.js b/src/services/index.js index 4017d541..4a1efd4f 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,4 +1,4 @@ -const alteration = require('./alteration-logger.service') +const alteration = require('./alteration.service') const config = require('./config') const file = require('./file.service') const exec = require('./exec') From ed29426b5cfc910189dc01418b1ea67807d3078f Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 8 Sep 2018 18:04:35 +0200 Subject: [PATCH 024/341] Update git url regex Fix #48 --- src/commands/init/init.command.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js index 00b56df5..1f419623 100644 --- a/src/commands/init/init.command.js +++ b/src/commands/init/init.command.js @@ -7,7 +7,7 @@ const { FolderNotEmpty, FileNotDirectory } = require('../../shared/errors') const { InitStopedByUser } = require('./init-stop-by-user.error') -const URL_REGEX = /^((?:(https?):\/\/)?((?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9][0-9]|[0-9])\.(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9][0-9]|[0-9])\.)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9][0-9]|[0-9])\.)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9][0-9]|[0-9]))|(?:(?:(?:\w+\.){1,2}[\w]{2,3})))(?::(\d+))?((?:\/[\w]+)*)(?:\/|(\/[\w]+\.[\w]{3,4})|(\?(?:([\w]+=[\w]+)&)*([\w]+=[\w]+))?|\?(?:(wsdl|wadl))))$/ +const URL_REGEX = /(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|#[-\d\w._]+?)$/ const PATH_REGEX = /^(?:(?:~|\.{1,2})?\/)+(?:[a-zA-Z.\-_]+\/?)*$/ module.exports = exports = configService => options => { From 156eea3a063fa3906a07807c60a1cafce67c1232 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 8 Sep 2018 18:10:48 +0200 Subject: [PATCH 025/341] =?UTF-8?q?=F0=9F=91=B7=F0=9F=8F=BD=E2=80=8D?= =?UTF-8?q?=E2=99=82=EF=B8=8F=20Hide=20git=20url=20static=20logic=20into?= =?UTF-8?q?=20static=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/init/init.command.js | 7 ++----- src/shared/utils/fs.utils.js | 6 ++++++ src/shared/utils/git.utils.js | 6 ++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js index 1f419623..5a559114 100644 --- a/src/commands/init/init.command.js +++ b/src/commands/init/init.command.js @@ -7,9 +7,6 @@ const { FolderNotEmpty, FileNotDirectory } = require('../../shared/errors') const { InitStopedByUser } = require('./init-stop-by-user.error') -const URL_REGEX = /(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|#[-\d\w._]+?)$/ -const PATH_REGEX = /^(?:(?:~|\.{1,2})?\/)+(?:[a-zA-Z.\-_]+\/?)*$/ - module.exports = exports = configService => options => { const userForceOverwrite = options.force || false const questions = [ @@ -23,7 +20,7 @@ module.exports = exports = configService => options => { name: 'repo_url', message: 'Repository url:', type: 'input', - validate: url => URL_REGEX.test(url), + validate: url => GitUtils.isGitUrl(url), default: () => { if (configService.configFileExist()) { return configService.repoUrl @@ -35,7 +32,7 @@ module.exports = exports = configService => options => { name: 'folder_path', message: 'Folder path:', type: 'input', - validate: path => PATH_REGEX.test(path), + validate: path => FsUtils.isFilePath(path), default: () => { if (configService.configFileExist()) { return configService.folderPath diff --git a/src/shared/utils/fs.utils.js b/src/shared/utils/fs.utils.js index 2f130dcc..a9ebca0b 100644 --- a/src/shared/utils/fs.utils.js +++ b/src/shared/utils/fs.utils.js @@ -2,7 +2,13 @@ const fs = require('fs') const util = require('util') const path = require('path') +const PATH_REGEX = /^(?:(?:~|\.{1,2})?\/)+(?:[a-zA-Z.\-_]+\/?)*$/ + class FsUtils { + static isFilePath(text) { + return PATH_REGEX.test(text) + } + static get chmod() { return util.promisify(fs.chmod) } diff --git a/src/shared/utils/git.utils.js b/src/shared/utils/git.utils.js index e0d72359..2f1af6b1 100644 --- a/src/shared/utils/git.utils.js +++ b/src/shared/utils/git.utils.js @@ -1,5 +1,7 @@ const git = require('gift') +const URL_REGEX = /(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|#[-\d\w._]+?)$/ + class GitUtils { static clone(repoUrl, repoPath) { return new Promise((resolve, reject) => { @@ -13,6 +15,10 @@ class GitUtils { }) }) } + + static isGitUrl(text) { + return URL_REGEX.test(text) + } } module.exports = exports = { From 57b1032caddc2f09c7bf480cb02cb786a18500ab Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 8 Sep 2018 18:16:03 +0200 Subject: [PATCH 026/341] Update CHANGELOG --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1a8aedf..29a143c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,15 +5,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Fix Git url verification in `init` command. ## [0.3.1] - 2018-08-05 ### Fixed -- Fix module data collection +- Fix module data collection. ## [0.3.0] - 2017-11-15 ### Added - A contribution guide (CONTRIBUTING.md) to help new contributors. -- The local deployment of configuration file. (`-l` on `modules deploy`) +- The local deployment of configuration file. (`-l` on `modules deploy`). ### Changed - Adopte a git like command style: `configfile run` => `configfile scritps run`. From 25b4c5d016dece584896a0e6a72baaf3f00f049a Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 8 Sep 2018 21:24:02 +0200 Subject: [PATCH 027/341] Add Steve Andriani in the sponsors page --- SPONSORS.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/SPONSORS.md b/SPONSORS.md index 24503255..02871e27 100644 --- a/SPONSORS.md +++ b/SPONSORS.md @@ -10,8 +10,8 @@ This file is an extension of the **Support** section in `README.md`. You can fin [Who are the people behind this project?](#who-are-the-people-behind-this-project) - +* [Sponsors](#sponsors) +* [Supporters](#supporters) ## How can I support this project? @@ -25,8 +25,12 @@ Be sure your effort to support this project will be greatly appreciated. ## Who are the people behind this project? -No one support this project for now. Be the first! Read the **How can I support this project** section above. +### Sponsors - +### Supporters + +The best supporters are listed below: + +- Steve Andriani ([LinkedIn](https://www.linkedin.com/in/steve-andriani-648661136/?originalSubdomain=fr)) From 4edf20d946cfa430f4005fe64aef776d904ab96e Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 8 Sep 2018 22:42:08 +0200 Subject: [PATCH 028/341] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1a8aedf..7406e5a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Add new contrubitor to SPONSORS.md ## [0.3.1] - 2018-08-05 ### Fixed From 3e352d55fed62b6908030befaf97459b3a7e64d4 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 12 Sep 2018 23:08:50 +0200 Subject: [PATCH 029/341] Remove alteration service as WIP --- src/configuration.js | 5 +- src/services/alteration.service.js | 78 ------------------------------ 2 files changed, 1 insertion(+), 82 deletions(-) delete mode 100644 src/services/alteration.service.js diff --git a/src/configuration.js b/src/configuration.js index 64203503..70479f0d 100644 --- a/src/configuration.js +++ b/src/configuration.js @@ -1,7 +1,7 @@ const fs = require('fs') const path = require('path') -const { InjectorService, DeployService, ExecService, FileService, ConfigService, EventManagerService, AlterationService } = require('./services') +const { InjectorService, DeployService, ExecService, FileService, ConfigService, EventManagerService } = require('./services') const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) @@ -13,9 +13,6 @@ injector.provide(ExecService) injector.provide(FileService, [ConfigService]) injector.provide(ConfigService, [{ useValue: optionsFilePath }]) injector.provide(EventManagerService) -injector.provide(AlterationService, [ConfigService, EventManagerService]) - -injector.get(AlterationService) module.exports = exports = { package: packageData diff --git a/src/services/alteration.service.js b/src/services/alteration.service.js deleted file mode 100644 index 96cd2fbb..00000000 --- a/src/services/alteration.service.js +++ /dev/null @@ -1,78 +0,0 @@ -const fs = require('fs') - -const { FsUtils } = require('../shared/utils') - -class AlterationService { - get dataPath() { - return `${this.configService.configFolderPath}/alterations` - } - - constructor(configService, eventManager) { - this.configService = configService - this.eventManager = eventManager - - if (!FsUtils.fileExist(this.dataPath)) { - fs.mkdirSync(this.dataPath) - } - - this._registerEvent() - } - - alterationFilePath(moduleName) { - return `${this.dataPath}/${moduleName}.json` - } - - alterationFile(moduleName) { - return FsUtils - .readFile(this.alterationFilePath(moduleName)) - .then(data => JSON.parse(data)) - } - - resetAlterations(moduleName) { - if (!FsUtils.fileExist(this.alterationFilePath(moduleName))) { - return - } - - fs.unlinkSync(this.alterationFilePath(moduleName)) - } - - addAlteration(moduleName, path, type = 'created') { - if (!['created', 'renamed'].includes(type)) { - return Promise.reject(new Error('Bad type')) - } - - return this - .alterationFile(moduleName) - .catch(error => { - if (error.code !== 'ENOENT') { - throw error - } - - return FsUtils - .writeFile(this.alterationFilePath(moduleName), JSON.stringify([])) - .then(_ => []) - }) - .then(alterations => { - if (alterations.filter(alteration => alteration.path === path).length < 1) { - alterations.push({ - path, - type - }) - } - - return FsUtils.writeFile(this.alterationFilePath(moduleName), JSON.stringify(alterations, null, 4)) - }) - } - - _registerEvent() { - this.eventManager.register('deploy.created', this, '_onCreate') - this.eventManager.register('deploy.renamed', this, '_onRename') - this.eventManager.register('deploy.removed', this, '_onRemove') - } - - _onCreate(path) { console.log(`deploy.created : ${path}`) } - _onRename(infos) { console.log(`deploy.renamed : ${infos.new}`) } - _onRemove(infos) { console.log(`deploy.removed : ${infos}`) } -} - -module.exports = exports = { AlterationService } From c52bd8acdb077eefba6dead5eeaa7da425b5689d Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 12 Sep 2018 23:12:58 +0200 Subject: [PATCH 030/341] Remove event-manager --- src/configuration.js | 5 ++- src/services/deploy/deploy.service.js | 8 ----- .../event-manager/event-manager.service.js | 31 ------------------- src/services/event-manager/index.js | 5 --- .../event-manager/method-not-exist.error.js | 9 ------ src/services/index.js | 6 +--- 6 files changed, 3 insertions(+), 61 deletions(-) delete mode 100644 src/services/event-manager/event-manager.service.js delete mode 100644 src/services/event-manager/index.js delete mode 100644 src/services/event-manager/method-not-exist.error.js diff --git a/src/configuration.js b/src/configuration.js index 70479f0d..efa4c793 100644 --- a/src/configuration.js +++ b/src/configuration.js @@ -1,18 +1,17 @@ const fs = require('fs') const path = require('path') -const { InjectorService, DeployService, ExecService, FileService, ConfigService, EventManagerService } = require('./services') +const { InjectorService, DeployService, ExecService, FileService, ConfigService } = require('./services') const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) const injector = InjectorService.getMainInstance() -injector.provide(DeployService, [EventManagerService]) +injector.provide(DeployService) injector.provide(ExecService) injector.provide(FileService, [ConfigService]) injector.provide(ConfigService, [{ useValue: optionsFilePath }]) -injector.provide(EventManagerService) module.exports = exports = { package: packageData diff --git a/src/services/deploy/deploy.service.js b/src/services/deploy/deploy.service.js index 17b9465b..229e9128 100644 --- a/src/services/deploy/deploy.service.js +++ b/src/services/deploy/deploy.service.js @@ -4,10 +4,6 @@ const { FsUtils, LogUtils } = require('../../shared/utils') const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') class DeployService { - constructor(eventManager) { - this.eventManager = eventManager - } - async deployLocalFile({ source, target, global: isGlobalFile }, force = false) { if (isGlobalFile) { throw new TypeError('Unable to deploy global file as a local one.') @@ -52,7 +48,6 @@ class DeployService { const dirname = path.dirname(target) if (!FsUtils.fileExist(dirname)) { await FsUtils.mkdirp(dirname) - this.eventManager.emit('deploy.created', dirname) } try { @@ -62,13 +57,11 @@ class DeployService { if (linkSource === source) { await FsUtils.unlink(target) - this.eventManager.emit('deploy.removed', target) } } if (targetStat.isFile() || targetStat.isDirectory()) { await FsUtils.rename(target, `${target}.old`) - this.eventManager.emit('deploy.renamed', { old: target, new: `${target}.old` }) } } catch (error) { if (error.code !== 'ENOENT') { // No file exist at file.target @@ -78,7 +71,6 @@ class DeployService { try { await FsUtils.symlink(source, target) - this.eventManager.emit('deploy.created', target) } catch (error) { if (error.code !== 'EEXIST') { throw error diff --git a/src/services/event-manager/event-manager.service.js b/src/services/event-manager/event-manager.service.js deleted file mode 100644 index f5a62269..00000000 --- a/src/services/event-manager/event-manager.service.js +++ /dev/null @@ -1,31 +0,0 @@ -const { MethodDoesNotExist } = require('./method-not-exist.error') - -class EventManagerService { - constructor() { - this.observers = [] - } - - register(eventName, instance, methodName = 'subscribe') { - if (instance[methodName] == null) { - throw new MethodDoesNotExist(instance.constructor.name, methodName) - } - - this.observers.push({ - eventName, - instance, - methodName - }) - } - - emit(eventName, data) { - this.observers - .filter(observer => observer.eventName === eventName) - .forEach(({ instance, methodName }) => { - instance[methodName](data) - }) - } -} - -module.exports = exports = { - EventManagerService -} diff --git a/src/services/event-manager/index.js b/src/services/event-manager/index.js deleted file mode 100644 index e0246472..00000000 --- a/src/services/event-manager/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const { EventManagerService } = require('./event-manager.service') - -module.exports = exports = { - EventManagerService -} diff --git a/src/services/event-manager/method-not-exist.error.js b/src/services/event-manager/method-not-exist.error.js deleted file mode 100644 index 190b91a0..00000000 --- a/src/services/event-manager/method-not-exist.error.js +++ /dev/null @@ -1,9 +0,0 @@ -class MethodDoesNotExist extends Error { - constructor(useClass, methodName) { - super(`${methodName} does not exist in class ${useClass}`) - } -} - -module.exports = exports = { - MethodDoesNotExist -} diff --git a/src/services/index.js b/src/services/index.js index 4a1efd4f..9cb539ba 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,17 +1,13 @@ -const alteration = require('./alteration.service') const config = require('./config') const file = require('./file.service') const exec = require('./exec') const deploy = require('./deploy') const injector = require('./injector.service') -const eventManager = require('./event-manager') module.exports = exports = { - ...alteration, ...config, ...file, ...exec, ...deploy, - ...injector, - ...eventManager + ...injector } From 7a6c81487d25840ed2c9b8a2033af83259363c41 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 12 Sep 2018 23:17:11 +0200 Subject: [PATCH 031/341] Fix tests imports --- tests/services/{file => exec}/bad-script-permission.error.js | 2 +- tests/services/{file => exec}/script-not-exist.error.js | 2 +- tests/services/{file => }/file.service.js | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) rename tests/services/{file => exec}/bad-script-permission.error.js (83%) rename tests/services/{file => exec}/script-not-exist.error.js (88%) rename tests/services/{file => }/file.service.js (95%) diff --git a/tests/services/file/bad-script-permission.error.js b/tests/services/exec/bad-script-permission.error.js similarity index 83% rename from tests/services/file/bad-script-permission.error.js rename to tests/services/exec/bad-script-permission.error.js index 0ff3f5fd..d2936b3c 100644 --- a/tests/services/file/bad-script-permission.error.js +++ b/tests/services/exec/bad-script-permission.error.js @@ -1,6 +1,6 @@ import test from 'ava' -import { BadScriptPermission } from '../../../src/services/file' +import { BadScriptPermission } from '../../../src/services/exec/bad-script-permission.error' test('should have Error as parent.', t => { const error = new BadScriptPermission() diff --git a/tests/services/file/script-not-exist.error.js b/tests/services/exec/script-not-exist.error.js similarity index 88% rename from tests/services/file/script-not-exist.error.js rename to tests/services/exec/script-not-exist.error.js index 491f7fda..ed936f51 100644 --- a/tests/services/file/script-not-exist.error.js +++ b/tests/services/exec/script-not-exist.error.js @@ -1,6 +1,6 @@ import test from 'ava' -import { ScriptNotExist } from '../../../src/services/file' +import { ScriptNotExist } from '../../../src/services/exec' test('should have Error as parent.', t => { const error = new ScriptNotExist() diff --git a/tests/services/file/file.service.js b/tests/services/file.service.js similarity index 95% rename from tests/services/file/file.service.js rename to tests/services/file.service.js index 8b68825c..fa39d26d 100644 --- a/tests/services/file/file.service.js +++ b/tests/services/file.service.js @@ -3,7 +3,8 @@ import fs from 'fs' import path from 'path' import rimraf from 'rimraf' -import { FileService, ScriptNotExist } from '../../../src/services/file' +import { FileService } from '../../src/services/file.service' +import { ScriptNotExist } from '../../src/services/exec' const tmpData = path.join(__dirname, './env-file') From 7f97a23cd72ec67e1b41dba3877001a62be0569b Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 12 Sep 2018 23:24:48 +0200 Subject: [PATCH 032/341] Fix tests --- tests/services/exec/exec.service.js | 53 +++++++++++++++++++++++++++++ tests/services/file.service.js | 13 ------- 2 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 tests/services/exec/exec.service.js diff --git a/tests/services/exec/exec.service.js b/tests/services/exec/exec.service.js new file mode 100644 index 00000000..3e358764 --- /dev/null +++ b/tests/services/exec/exec.service.js @@ -0,0 +1,53 @@ +import test, { beforeEach, afterEach } from 'ava' +import fs from 'fs' +import path from 'path' +import rimraf from 'rimraf' + +import { ExecService } from '../../src/services/exec.service' +import { ScriptNotExist } from '../../src/services/exec' + +const tmpData = path.join(__dirname, './env-file') + +let execService +let configService + +beforeEach('init temp files for tests', t => { + fs.mkdirSync(tmpData) + fs.mkdirSync(path.join(tmpData, 'scripts')) + fs.mkdirSync(path.join(tmpData, 'files')) + + fs.writeFileSync(path.join(tmpData, 'scripts/test1.sh'), '') + fs.writeFileSync(path.join(tmpData, 'scripts/test2.js'), '') + fs.writeFileSync(path.join(tmpData, 'scripts/test3'), '') + fs.writeFileSync(path.join(tmpData, 'scripts/"tEsts 28.js"'), '') + + fs.mkdirSync(path.join(tmpData, 'files/module1')) + fs.mkdirSync(path.join(tmpData, 'files/"module 2"')) + fs.mkdirSync(path.join(tmpData, 'files/badmodule')) + fs.writeFileSync(path.join(tmpData, 'files/"moDule 2"/settings.json'), '{"files":[{"source_path":"","target_path":""}]}') + fs.writeFileSync(path.join(tmpData, 'files/module1/settings.json'), '{"files":[]}') +}) + +beforeEach('init service', t => { + configService = { + folderPath: tmpData, + scriptExtension: ['.sh'] + } + execService = new ExecService(configService) +}) + +afterEach.always('clean temp files', t => { + rimraf.sync(tmpData) +}) + +test(`.runScript should throw ScriptNotExist when script name is invalid`, t => { + t.plan(1) + + return execService.runScript('zdjkqh') + .then(() => { + t.fail('Execution must failed when script name is invalid.') + }) + .catch(e => { + t.true(e instanceof ScriptNotExist) + }) +}) diff --git a/tests/services/file.service.js b/tests/services/file.service.js index fa39d26d..72cff187 100644 --- a/tests/services/file.service.js +++ b/tests/services/file.service.js @@ -4,7 +4,6 @@ import path from 'path' import rimraf from 'rimraf' import { FileService } from '../../src/services/file.service' -import { ScriptNotExist } from '../../src/services/exec' const tmpData = path.join(__dirname, './env-file') @@ -65,15 +64,3 @@ test('.modules should return target and source of each file in modules', t => { } } }) - -test(`.runScript should throw ScriptNotExist when script name is invalid`, t => { - t.plan(1) - - return fileService.runScript('zdjkqh') - .then(() => { - t.fail('Execution must failed when script name is invalid.') - }) - .catch(e => { - t.true(e instanceof ScriptNotExist) - }) -}) From 074f022160be3222555a519d5d9486fdf32cefed Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 13 Sep 2018 07:42:07 +0200 Subject: [PATCH 033/341] Use caching in FileService --- src/services/file.service.js | 41 ++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/services/file.service.js b/src/services/file.service.js index ef6b9923..d7228c45 100644 --- a/src/services/file.service.js +++ b/src/services/file.service.js @@ -5,6 +5,35 @@ const { FsUtils, LogUtils } = require('../shared/utils') class FileService { get scripts() { + if (this._scripts.length < 1) { + this._scripts = this.getScripts() + } + + return this._scripts + } + + get modules() { + if (this._modules.length < 1) { + this._modules = this.getModules() + } + + return this._modules + } + + constructor(configService) { + this.configService = configService + + this._modules = [] + this._scripts = [] + } + + scriptByName(scriptName) { + return this.scripts + .filter(({ script: name }) => name === scriptName) + .shift() + } + + getScripts() { const folderContent = fs.readdirSync(path.join(this.configService.folderPath, 'scripts')) const authorizedExtensions = this.configService.scriptExtension @@ -32,7 +61,7 @@ class FileService { }) } - get modules() { + getModules() { const folderContent = fs.readdirSync(path.join(this.configService.folderPath, 'files')) return folderContent @@ -77,16 +106,6 @@ class FileService { return element }) } - - constructor(configService) { - this.configService = configService - } - - scriptByName(scriptName) { - return this.scripts - .filter(({ script: name }) => name === scriptName) - .shift() - } } module.exports = exports = { FileService } From 07d4943e325d76dcb202b50a283730e47238cee2 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 25 Oct 2018 03:29:09 +0200 Subject: [PATCH 034/341] Update all packages --- package.json | 28 +- yarn.lock | 3204 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 2139 insertions(+), 1093 deletions(-) diff --git a/package.json b/package.json index 67f971a7..ba646601 100644 --- a/package.json +++ b/package.json @@ -19,22 +19,22 @@ "test": "yarn test:lint && yarn test:unit:coverage" }, "dependencies": { - "chalk": "^2.1.0", - "commander": "^2.11.0", - "gift": "^0.10.0", - "inquirer": "^3.2.3" + "chalk": "^2.4.1", + "commander": "^2.19.0", + "gift": "^0.10.2", + "inquirer": "^6.2.0" }, "devDependencies": { - "@types/node": "^8.0.51", - "ava": "^0.22.0", - "eslint": "^4.9.0", - "eslint-config-standard": "^10.2.1", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-node": "^5.2.0", - "eslint-plugin-promise": "^3.6.0", - "eslint-plugin-standard": "^3.0.1", - "nyc": "^11.2.1", + "@types/node": "^10.12.0", + "ava": "^0.25.0", + "eslint": "^5.7.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-node": "^7.0.1", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-standard": "^4.0.0", + "nyc": "^13.1.0", "rimraf": "^2.6.2", - "sinon": "^4.0.1" + "sinon": "^7.0.0" } } diff --git a/yarn.lock b/yarn.lock index 7b61e626..d1a4d3fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,10 +5,12 @@ "@ava/babel-plugin-throws-helper@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz#2fc1fe3c211a71071a4eca7b8f7af5842cd1ae7c" + integrity sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw= "@ava/babel-preset-stage-4@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz#ae60be881a0babf7d35f52aba770d1f6194f76bd" + integrity sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg== dependencies: babel-plugin-check-es2015-constants "^6.8.0" babel-plugin-syntax-trailing-function-commas "^6.20.0" @@ -26,6 +28,7 @@ "@ava/babel-preset-transform-test-files@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz#cded1196a8d8d9381a509240ab92e91a5ec069f7" + integrity sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc= dependencies: "@ava/babel-plugin-throws-helper" "^2.0.0" babel-plugin-espower "^2.3.2" @@ -33,212 +36,352 @@ "@ava/write-file-atomic@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz#d625046f3495f1f5e372135f473909684b429247" + integrity sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" slide "^1.1.5" -"@concordance/react@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@concordance/react/-/react-1.0.0.tgz#fcf3cad020e5121bfd1c61d05bc3516aac25f734" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: - arrify "^1.0.1" + "@babel/highlight" "^7.0.0" -"@types/node@^8.0.51": - version "8.0.51" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" +"@babel/generator@^7.0.0", "@babel/generator@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" + integrity sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ== + dependencies: + "@babel/types" "^7.1.3" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +"@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== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" +"@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== dependencies: - acorn "^3.0.4" + "@babel/types" "^7.0.0" -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" -acorn@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" -ajv-keywords@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" +"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" + integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" +"@babel/template@^7.0.0", "@babel/template@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + +"@babel/traverse@^7.0.0": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4" + integrity sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.3" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.3" + "@babel/types" "^7.1.3" + debug "^3.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" + integrity sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" -ajv@^5.2.0, ajv@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" +"@concordance/react@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@concordance/react/-/react-1.0.0.tgz#fcf3cad020e5121bfd1c61d05bc3516aac25f734" + integrity sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ== dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" + arrify "^1.0.1" -align-text@^0.1.1, align-text@^0.1.3: +"@ladjs/time-require@^0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + resolved "https://registry.yarnpkg.com/@ladjs/time-require/-/time-require-0.1.4.tgz#5c615d75fd647ddd5de9cf6922649558856b21a1" + integrity sha512-weIbJqTMfQ4r1YX85u54DKfjLZs2jwn1XZ6tIOP/pFgMwhIN5BAtaCp/1wn9DzyLsDR9tW0R2NIePcVJ45ivQQ== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" + chalk "^0.4.0" + date-time "^0.1.1" + pretty-ms "^0.2.1" + text-table "^0.2.0" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +"@sinonjs/commons@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.0.2.tgz#3e0ac737781627b8844257fadc3d803997d0526e" + integrity sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@3.0.0", "@sinonjs/formatio@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.0.0.tgz#9d282d81030a03a03fa0c5ce31fd8786a4da311a" + integrity sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w== + dependencies: + "@sinonjs/samsam" "2.1.0" + +"@sinonjs/samsam@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.0.tgz#b8b8f5b819605bd63601a6ede459156880f38ea3" + integrity sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw== + dependencies: + array-from "^2.1.1" + +"@sinonjs/samsam@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.2.tgz#16947fce5f57258d01f1688fdc32723093c55d3f" + integrity sha512-ZwTHAlC9akprWDinwEPD4kOuwaYZlyMwVJIANsKNC3QVp0AHB04m7RnB4eqeWfgmxw8MGTzS9uMaw93Z3QcZbw== + +"@types/node@^10.12.0": + version "10.12.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" + integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.0.tgz#958584ddb60990c02c97c1bd9d521fce433bb101" + integrity sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg== + +acorn@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.2.tgz#6a459041c320ab17592c6317abbfdf4bbaa98ca4" + integrity sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg== + +ajv@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" + integrity sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= dependencies: string-width "^2.0.0" -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" - ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" +ansi-styles@^3.1.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== dependencies: - default-require-extensions "^1.0.0" + default-require-extensions "^2.0.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" +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-exclude@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/arr-exclude/-/arr-exclude-1.0.0.tgz#dfc7c2e552a270723ccda04cf3128c8cbfe5c631" + integrity sha1-38fC5VKicHI8zaBM8xKMjL/lxjE= -arr-flatten@^1.0.1: +arr-flatten@^1.0.1, 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-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1, array-uniq@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +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= arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: +assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== + dependencies: + lodash "^4.17.10" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.1.1: + 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@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.1.0.tgz#93b864dc7ee01a326281775d5c75ca0a751e5961" + version "1.2.1" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.1.tgz#807f7910b0210db9eefe133f3492c28e89698b96" + integrity sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA== ava-init@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/ava-init/-/ava-init-0.2.1.tgz#75ac4c8553326290d2866e63b62fa7035684bd58" + integrity sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg== dependencies: arr-exclude "^1.0.0" execa "^0.7.0" @@ -246,15 +389,17 @@ ava-init@^0.2.0: read-pkg-up "^2.0.0" write-pkg "^3.1.0" -ava@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-0.22.0.tgz#4c28a1fdef7e749ba0c8131ac18a7ca489eef049" +ava@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-0.25.0.tgz#8ac87780514f96a6fd42e1306eaa0752ce3a407f" + integrity sha512-4lGNJCf6xL8SvsKVEKxEE46se7JAUIAZoKHw9itTQuwcsydhpAMkBs5gOOiWiwt0JKNIuXWc2/r4r8ZdcNrBEw== dependencies: "@ava/babel-preset-stage-4" "^1.1.0" "@ava/babel-preset-transform-test-files" "^3.0.0" "@ava/write-file-atomic" "^2.2.0" "@concordance/react" "^1.0.0" - ansi-escapes "^2.0.0" + "@ladjs/time-require" "^0.1.4" + ansi-escapes "^3.0.0" ansi-styles "^3.1.0" arr-flatten "^1.0.1" array-union "^1.0.1" @@ -263,6 +408,8 @@ ava@^0.22.0: auto-bind "^1.1.0" ava-init "^0.2.0" babel-core "^6.17.0" + babel-generator "^6.26.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" bluebird "^3.0.0" caching-transform "^1.0.0" chalk "^2.0.1" @@ -273,13 +420,13 @@ ava@^0.22.0: cli-spinners "^1.0.0" cli-truncate "^1.0.0" co-with-promise "^4.6.0" - code-excerpt "^2.1.0" + code-excerpt "^2.1.1" common-path-prefix "^1.0.0" concordance "^3.0.0" - convert-source-map "^1.2.0" + convert-source-map "^1.5.1" core-assert "^0.2.0" currently-unhandled "^0.4.1" - debug "^2.2.0" + debug "^3.0.1" dot-prop "^4.1.0" empower-core "^0.6.1" equal-length "^1.0.0" @@ -296,9 +443,8 @@ ava@^0.22.0: is-ci "^1.0.7" is-generator-fn "^1.0.0" is-obj "^1.0.0" - is-observable "^0.2.0" + is-observable "^1.0.0" is-promise "^2.1.0" - js-yaml "^3.8.2" last-line-stream "^1.0.0" lodash.clonedeepwith "^4.5.0" lodash.debounce "^4.0.3" @@ -316,40 +462,35 @@ ava@^0.22.0: package-hash "^2.0.0" pkg-conf "^2.0.0" plur "^2.0.0" - pretty-ms "^2.0.0" + pretty-ms "^3.0.0" require-precompiled "^0.1.0" resolve-cwd "^2.0.0" safe-buffer "^5.1.1" + semver "^5.4.1" slash "^1.0.0" - source-map-support "^0.4.0" - stack-utils "^1.0.0" + source-map-support "^0.5.0" + stack-utils "^1.0.1" strip-ansi "^4.0.0" strip-bom-buf "^1.0.0" - supports-color "^4.0.0" - time-require "^0.1.2" + supertap "^1.0.0" + supports-color "^5.0.0" trim-off-newlines "^1.0.1" unique-temp-dir "^1.0.0" - update-notifier "^2.1.0" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + update-notifier "^2.3.0" -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" babel-core@^6.17.0, babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -361,19 +502,20 @@ babel-core@^6.17.0, babel-core@^6.26.0: babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" + convert-source-map "^1.5.1" + debug "^2.6.9" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" - private "^0.1.7" + private "^0.1.8" slash "^1.0.0" - source-map "^0.5.6" + source-map "^0.5.7" -babel-generator@^6.1.0, babel-generator@^6.18.0, babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" +babel-generator@^6.1.0, babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -381,12 +523,13 @@ babel-generator@^6.1.0, babel-generator@^6.18.0, babel-generator@^6.26.0: detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.17.4" - source-map "^0.5.6" + source-map "^0.5.7" trim-right "^1.0.1" babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -395,6 +538,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -404,6 +548,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -412,6 +557,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -422,6 +568,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -429,6 +576,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -436,6 +584,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -444,6 +593,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -454,6 +604,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -461,18 +612,21 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.8.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-espower@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-2.3.2.tgz#5516b8fcdb26c9f0e1d8160749f6e4c65e71271e" + version "2.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-2.4.0.tgz#9f92c080e9adfe73f69baed7ab3e24f649009373" + integrity sha512-/+SRpy7pKgTI28oEHfn1wkuM5QFAdRq8WNsOOih1dVrdV6A/WbNbRZyl0eX5eyDgtb0lOE27PeDFuCX2j8OxVg== dependencies: babel-generator "^6.1.0" babylon "^6.1.0" @@ -485,18 +639,27 @@ babel-plugin-espower@^2.3.2: babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-object-rest-spread@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-syntax-trailing-function-commas@^6.20.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.16.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -505,20 +668,23 @@ babel-plugin-transform-async-to-generator@^6.16.0: babel-plugin-transform-es2015-destructuring@^6.19.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.9.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" babel-types "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.18.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -528,6 +694,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.18.0: babel-plugin-transform-es2015-parameters@^6.21.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -539,12 +706,14 @@ babel-plugin-transform-es2015-parameters@^6.21.0: babel-plugin-transform-es2015-spread@^6.8.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -553,6 +722,7 @@ babel-plugin-transform-es2015-sticky-regex@^6.8.0: babel-plugin-transform-es2015-unicode-regex@^6.11.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -561,6 +731,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.11.0: babel-plugin-transform-exponentiation-operator@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -569,6 +740,7 @@ babel-plugin-transform-exponentiation-operator@^6.8.0: babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -576,6 +748,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -588,13 +761,15 @@ babel-register@^6.26.0: babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: +babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -602,9 +777,10 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -616,9 +792,10 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -628,40 +805,40 @@ babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: babylon@^6.1.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== 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= -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" +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: - tweetnacl "^0.14.3" + 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" binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== bluebird@^3.0.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== boxen@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" @@ -669,11 +846,12 @@ boxen@^1.2.1: cli-boxes "^1.0.0" string-width "^2.0.0" term-size "^1.2.0" - widest-line "^1.0.0" + widest-line "^2.0.0" brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -681,30 +859,81 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" +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" + buf-compare@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" + integrity sha1-/vKNqLgROgoNtEMLC2Rntpcws0o= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -builtin-modules@^1.0.0, builtin-modules@^1.1.1: +builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +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" caching-transform@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= dependencies: md5-hex "^1.2.0" mkdirp "^0.5.1" write-file-atomic "^1.1.4" +caching-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-2.0.0.tgz#e1292bd92d35b6e8b1ed7075726724b3bd64eea0" + integrity sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw== + dependencies: + make-dir "^1.0.0" + md5-hex "^2.0.0" + package-hash "^2.0.0" + write-file-atomic "^2.0.0" + call-matcher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.0.1.tgz#5134d077984f712a54dad3cbf62de28dce416ca8" + version "1.1.0" + resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.1.0.tgz#23b2c1bc7a8394c8be28609d77ddbd5786680432" + integrity sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw== dependencies: core-js "^2.0.0" deep-equal "^1.0.0" @@ -714,58 +943,47 @@ call-matcher@^1.0.0: call-signature@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" + integrity sha1-qEq8glpV70yysCi9dOIFpluaSZY= caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^4.0.0, 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= capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" + 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== chalk@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= dependencies: ansi-styles "~1.0.0" has-color "~0.1.0" @@ -774,6 +992,7 @@ chalk@^0.4.0: chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -781,17 +1000,24 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: - ansi-styles "^3.1.0" + ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" - supports-color "^4.0.0" + supports-color "^5.3.0" + +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== chokidar@^1.4.2: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -804,39 +1030,62 @@ chokidar@^1.4.2: optionalDependencies: fsevents "^1.0.0" -ci-info@^1.0.0: +chownr@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + +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" clean-stack@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= clean-yaml-object@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" + integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= 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-spinners@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== cli-truncate@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" + integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== dependencies: slice-ansi "^1.0.0" string-width "^2.0.0" @@ -844,86 +1093,90 @@ cli-truncate@^1.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@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" +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 "^1.0.1" - strip-ansi "^3.0.1" + string-width "^2.1.1" + strip-ansi "^4.0.0" wrap-ansi "^2.0.0" co-with-promise@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co-with-promise/-/co-with-promise-4.6.0.tgz#413e7db6f5893a60b942cf492c4bec93db415ab7" + integrity sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc= dependencies: pinkie-promise "^1.0.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-excerpt@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.0.tgz#5dcc081e88f4a7e3b554e9e35d7ef232d47f8147" +code-excerpt@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.1.tgz#5fe3057bfbb71a5f300f659ef2cc0a47651ba77c" + integrity sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw== dependencies: convert-to-spaces "^1.0.1" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +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.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" -color-name@^1.1.1: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" +commander@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commander@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== common-path-prefix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" + integrity sha1-zVL28HEuC6q5fW+XModPIvR3UsA= commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concordance@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/concordance/-/concordance-3.0.0.tgz#b2286af54405fc995fc7345b0b106d8dd073cb29" + integrity sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ== dependencies: date-time "^2.1.0" esutils "^2.0.2" @@ -938,8 +1191,9 @@ concordance@^3.0.0: well-known-symbols "^1.0.0" configstore@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -951,128 +1205,191 @@ configstore@^3.0.0: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -convert-source-map@^1.2.0, convert-source-map@^1.3.0, convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@^1.5.1, convert-source-map@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" convert-to-spaces@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" + integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= + +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= core-assert@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f" + integrity sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8= dependencies: buf-compare "^1.0.0" is-error "^2.2.0" core-js@^2.0.0, core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 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-spawn@^4: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= dependencies: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" +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== dependencies: - boom "2.x.x" + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - date-time@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/date-time/-/date-time-0.1.1.tgz#ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07" + integrity sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc= date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" + integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== dependencies: time-zone "^1.0.0" debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= -debug@^2.2.0, debug@^2.6.3, debug@^2.6.8: +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, 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.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" +debug@^3.0.1, 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.0.0" + ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +debug@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +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" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-extend@^0.6.0: + version "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= + +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + dependencies: + strip-bom "^3.0.0" + +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" -default-require-extensions@^1.0.0: +define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: - strip-bom "^2.0.0" + 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@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -1082,61 +1399,64 @@ del@^2.0.2: pinkie-promise "^2.0.0" rimraf "^2.2.8" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -diff@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" +diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= dependencies: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" - isarray "^1.0.0" dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= empower-core@^0.6.1: version "0.6.2" resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.2.tgz#5adef566088e31fba80ba0a36df47d7094169144" + integrity sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ= dependencies: call-signature "0.0.2" core-js "^2.0.0" @@ -1144,170 +1464,213 @@ empower-core@^0.6.1: equal-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" + integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w= -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es6-error@^4.0.1, es6-error@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.0.2.tgz#eec5c726eacef51b7f6b73c20db6e1b13b069c98" + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, 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= -eslint-config-standard@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" +eslint-config-standard@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" + integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== eslint-import-resolver-node@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc" + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== dependencies: - debug "^2.6.8" - resolve "^1.2.0" + debug "^2.6.9" + resolve "^1.5.0" -eslint-module-utils@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= dependencies: debug "^2.6.8" pkg-dir "^1.0.0" -eslint-plugin-import@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f" +eslint-plugin-es@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz#5acb2565db4434803d1d46a9b4cbc94b345bd028" + integrity sha512-9XcVyZiQRVeFjqHw8qHNDAZcQLqaHlOGGpeYqzYh8S4JYCWTCO3yzyen8yVmA5PratfzTRWDwCOFphtDEG+w/w== + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.0" + +eslint-plugin-import@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== dependencies: - builtin-modules "^1.1.1" contains-path "^0.1.0" debug "^2.6.8" doctrine "1.5.0" eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.1.1" + eslint-module-utils "^2.2.0" has "^1.0.1" - lodash.cond "^4.3.0" + lodash "^4.17.4" minimatch "^3.0.3" read-pkg-up "^2.0.0" + resolve "^1.6.0" -eslint-plugin-node@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.0.tgz#e1efca04a385516cff3f2f04027ce8c5ae6db749" +eslint-plugin-node@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" + integrity sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw== dependencies: - ignore "^3.3.3" + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^4.0.2" minimatch "^3.0.4" - resolve "^1.3.3" - semver "5.3.0" + resolve "^1.8.1" + semver "^5.5.0" -eslint-plugin-promise@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz#54b7658c8f454813dc2a870aff8152ec4969ba75" +eslint-plugin-promise@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2" + integrity sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg== -eslint-plugin-standard@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" +eslint-plugin-standard@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" + integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.9.0.tgz#76879d274068261b191fe0f2f56c74c2f4208e8b" +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.7.0.tgz#55c326d6fb2ad45fcbd0ce17c3846f025d1d819c" + integrity sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A== dependencies: - ajv "^5.2.0" - babel-code-frame "^6.22.0" + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.0.1" - doctrine "^2.0.0" - eslint-scope "^3.7.1" - espree "^3.5.1" - esquery "^1.0.0" - estraverse "^4.2.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^2.0.0" functional-red-black-tree "^1.0.1" glob "^7.1.2" - globals "^9.17.0" - ignore "^3.3.3" + globals "^11.7.0" + ignore "^4.0.6" imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify "^1.0.1" + inquirer "^6.1.0" + is-resolvable "^1.1.0" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" + lodash "^4.17.5" + minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" + regexpp "^2.0.1" require-uncached "^1.0.3" - semver "^5.3.0" + semver "^5.5.1" strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" + strip-json-comments "^2.0.1" + table "^5.0.2" + text-table "^0.2.0" espower-location-detector@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" + integrity sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU= dependencies: is-url "^1.2.1" path-is-absolute "^1.0.0" source-map "^0.5.0" xtend "^4.0.0" -espree@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" +espree@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" + integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== dependencies: - acorn "^5.1.1" - acorn-jsx "^3.0.0" + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== espurify@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.7.0.tgz#1c5cf6cbccc32e6f639380bd4f991fab9ba9d226" + version "1.8.1" + resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.8.1.tgz#5746c6c1ab42d302de10bd1d5bf7f0e8c0515056" + integrity sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg== dependencies: core-js "^2.0.0" -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" +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== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" - object-assign "^4.0.1" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -1320,58 +1683,106 @@ execa@^0.7.0: expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" +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-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" -extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +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" -external-editor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" +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" + +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== dependencies: - iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.31" + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" +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" + +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-diff@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +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= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 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@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -1379,36 +1790,51 @@ file-entry-cache@^2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" +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: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= dependencies: commondir "^1.0.1" make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -1416,100 +1842,103 @@ find-up@^1.0.0: find-up@^2.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@^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" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" del "^2.0.2" graceful-fs "^4.1.2" write "^0.2.1" +flex-exec@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/flex-exec/-/flex-exec-1.0.0.tgz#06974b68532839d2a12c32debcdb12378200fdf0" + integrity sha1-BpdLaFMoOdKhLDLevNsSN4IA/fA= + fn-name@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" + integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= -for-in@^1.0.1: +for-in@^1.0.1, 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= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" -foreground-child@^1.5.3, foreground-child@^1.5.6: +foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= dependencies: cross-spawn "^4" signal-exit "^3.0.0" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" +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: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + map-cache "^0.2.2" -formatio@1.2.0, formatio@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: - samsam "1.x" + minipass "^2.2.1" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.36" + nan "^2.9.2" + node-pre-gyp "^0.10.0" -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2: +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function-name-support@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/function-name-support/-/function-name-support-0.2.0.tgz#55d3bfaa6eafd505a50f9bc81fdf57564a0bb071" + integrity sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE= functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1521,36 +1950,42 @@ gauge@~2.7.3: wide-align "^1.1.0" get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + 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== get-port@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 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= -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" +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= -gift@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/gift/-/gift-0.10.0.tgz#4235e3edd9d375abb517a41e692d605100849d56" +gift@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/gift/-/gift-0.10.2.tgz#4600efe8f284b51fcb01c3527b321e22b494e156" + integrity sha512-wC9aKnQpjfOTWX+JG4DPJkS89ux6sl8EN4hXhv/2vBoXCDTEz1JiTeGTSeuKYlCqIgUFM1JwPVym34Sys3hvzw== dependencies: - underscore "1.x.x" + flex-exec "^1.0.0" + underscore "^1.8.3" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -1558,12 +1993,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1573,18 +2010,26 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2: path-is-absolute "^1.0.0" global-dirs@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= dependencies: ini "^1.3.4" -globals@^9.17.0, globals@^9.18.0: +globals@^11.1.0, globals@^11.7.0: + version "11.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" + integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== + +globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -1596,6 +2041,7 @@ globby@^5.0.0: globby@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -1606,6 +2052,7 @@ globby@^6.0.0: got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" @@ -1622,95 +2069,106 @@ got@^6.7.1: graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -handlebars@^4.0.3: - version "4.0.10" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" +handlebars@^4.0.11: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== dependencies: - async "^1.4.0" + async "^2.5.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" + uglify-js "^3.1.4" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-color@~0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 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@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7" + integrity sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac= has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + function-bind "^1.1.1" home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== hullabaloo-config-manager@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz#1d9117813129ad035fd9e8477eaf066911269fe3" + integrity sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A== dependencies: dot-prop "^4.1.0" es6-error "^4.0.2" @@ -1727,25 +2185,39 @@ hullabaloo-config-manager@^1.1.0: resolve-from "^3.0.0" safe-buffer "^5.0.1" -iconv-lite@^0.4.17: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" +iconv-lite@^0.4.24, iconv-lite@^0.4.4: + 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" ignore-by-default@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" -ignore@^3.3.3: - version "3.3.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" +ignore@^4.0.2, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= import-local@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8" + integrity sha1-sReVcqrNwRxqkQCftDDbyrX2aKg= dependencies: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" @@ -1753,161 +2225,220 @@ import-local@^0.1.1: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" -indent-string@^3.0.0, indent-string@^3.1.0: +indent-string@^3.0.0, indent-string@^3.1.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" +inquirer@^6.1.0, inquirer@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -inquirer@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" - dependencies: - ansi-escapes "^2.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" + external-editor "^3.0.0" figures "^2.0.0" - lodash "^4.3.0" + lodash "^4.17.10" mute-stream "0.0.7" run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" + rxjs "^6.1.0" string-width "^2.1.0" strip-ansi "^4.0.0" through "^2.3.6" invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= irregular-plurals@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" + integrity sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y= + +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-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" -is-ci@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" +is-ci@^1.0.10, is-ci@^1.0.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.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== + dependencies: + kind-of "^6.0.0" + +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: - ci-info "^1.0.0" + 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-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-error@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" + integrity sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= -is-extendable@^0.1.1: +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@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= -is-finite@^1.0.0, is-finite@^1.0.1: +is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-generator-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= dependencies: global-dirs "^0.1.0" is-path-inside "^1.0.0" @@ -1915,267 +2446,318 @@ is-installed-globally@^0.1.0: is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" 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= dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" + integrity sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI= dependencies: symbol-observable "^0.2.2" +is-observable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" is-plain-obj@^1.0.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.1, 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-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^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= -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -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-EtSj3U5o4Lec6428hBc66A2RykQ= is-url@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.2.tgz#498905a593bf47cc2d9e7f738372bbf7696c7f26" + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +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== isarray@0.0.1: version "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= isexe@^2.0.0: version "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" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +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= -istanbul-lib-coverage@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" +istanbul-lib-coverage@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" + integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA== -istanbul-lib-hook@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" +istanbul-lib-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" + integrity sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w== dependencies: - append-transform "^0.4.0" + append-transform "^1.0.0" -istanbul-lib-instrument@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz#66f6c9421cc9ec4704f76f2db084ba9078a2b532" +istanbul-lib-instrument@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" + integrity sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ== + dependencies: + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.1" + semver "^5.5.0" + +istanbul-lib-report@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" + integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q== dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.1.1" - semver "^5.3.0" + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + supports-color "^5.4.0" -istanbul-lib-report@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" - dependencies: - istanbul-lib-coverage "^1.1.1" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" - -istanbul-lib-source-maps@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" +istanbul-lib-source-maps@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" + integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A== dependencies: - debug "^2.6.3" - istanbul-lib-coverage "^1.1.1" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" + debug "^3.1.0" + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + rimraf "^2.6.2" + source-map "^0.6.1" -istanbul-reports@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.2.tgz#0fb2e3f6aa9922bd3ce45d05d8ab4d5e8e07bd4f" +istanbul-reports@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" + integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw== dependencies: - handlebars "^4.0.3" + handlebars "^4.0.11" js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -js-tokens@^3.0.0, js-tokens@^3.0.2: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.8.2, js-yaml@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" +js-yaml@^3.10.0, js-yaml@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== dependencies: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jschardet@^1.4.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= 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-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +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-stable-stringify@^1.0.1: +json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -just-extend@^1.1.22: - version "1.1.22" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.22.tgz#3330af756cab6a542700c64b2e4e4aa062d52fff" +just-extend@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-3.0.0.tgz#cee004031eaabf6406da03a7b84e4fe9d78ef288" + integrity sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ== -kind-of@^3.0.2: +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= 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== + +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== + last-line-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/last-line-stream/-/last-line-stream-1.0.0.tgz#d1b64d69f86ff24af2d04883a2ceee14520a5600" + integrity sha1-0bZNafhv8kry0EiDos7uFFIKVgA= dependencies: through2 "^2.0.0" latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= dependencies: package-json "^4.0.0" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" levn@^0.3.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= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -2183,6 +2765,7 @@ levn@^0.3.0, levn@~0.3.0: load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -2193,140 +2776,193 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + 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" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.clonedeepwith@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4" - -lodash.cond@^4.3.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + integrity sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ= lodash.debounce@^4.0.3: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.difference@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= 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" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= lodash.merge@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== -lodash@^4.17.4, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -lolex@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" +lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lolex@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.1.3.tgz#53f893bbe88c80378156240e127126b905c83087" +lolex@^2.3.2: + version "2.7.5" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +lolex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.0.0.tgz#f04ee1a8aa13f60f1abd7b0e8f4213ec72ec193e" + integrity sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ== loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - js-tokens "^3.0.0" + js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0, loud-rejection@^1.2.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.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" + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" -make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" +make-dir@^1.0.0, make-dir@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: - pify "^2.3.0" + pify "^3.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-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -matcher@^1.0.0: +map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.0.0.tgz#aaf0c4816eb69b92094674175625f3466b0e3e19" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +matcher@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" + integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== dependencies: escape-string-regexp "^1.0.4" +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= + md5-hex@^1.2.0, md5-hex@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= dependencies: md5-o-matic "^0.1.1" md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" + integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -2339,15 +2975,17 @@ meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -merge-source-map@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== dependencies: - source-map "^0.5.6" + source-map "^0.6.1" -micromatch@^2.1.5, micromatch@^2.3.11: +micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -2363,51 +3001,96 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" +micromatch@^3.1.10: + 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" mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 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.2.1, minipass@^2.3.3: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1: 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" -ms@2.0.0, ms@^2.0.0: +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.0.0, 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== multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= dependencies: array-differ "^1.0.0" array-union "^1.0.1" @@ -2417,47 +3100,80 @@ multimatch@^2.1.0: mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -nan@^2.3.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" - -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-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.9.2: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== + +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" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -nise@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.1.1.tgz#1faa07147f3bf2465d4dbedc0e4a84048f081041" +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: - formatio "^1.2.0" - just-extend "^1.1.22" - lolex "^1.6.0" + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +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== + +nise@^1.4.5: + version "1.4.6" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.6.tgz#76cc3915925056ae6c405dd8ad5d12bde570c19f" + integrity sha512-1GedetLKzmqmgwabuMSqPsT7oumdR77SBpDfNNJhADRIeA3LN/2RVqR4fFqwvzhAqcTef6PPCzQwITE/YQ8S8A== + dependencies: + "@sinonjs/formatio" "3.0.0" + just-extend "^3.0.0" + lolex "^2.3.2" path-to-regexp "^1.7.0" text-encoding "^0.6.4" -node-pre-gyp@^0.6.36: - version "0.6.38" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: - hawk "3.1.3" + detect-libc "^1.0.2" mkdirp "^0.5.1" + needle "^2.2.1" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" + tar "^4" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -2465,6 +3181,7 @@ nopt@^4.0.1: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -2474,18 +3191,34 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + +npm-packlist@^1.1.6: + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + 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@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -2495,76 +3228,101 @@ npmlog@^4.0.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nyc@^11.2.1: - version "11.2.1" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.2.1.tgz#ad850afe9dbad7f4970728b4b2e47fed1c38721c" +nyc@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-13.1.0.tgz#463665c7ff6b5798e322624a5eb449a678db90e3" + integrity sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg== dependencies: archy "^1.0.0" arrify "^1.0.1" - caching-transform "^1.0.0" - convert-source-map "^1.3.0" + caching-transform "^2.0.0" + convert-source-map "^1.6.0" debug-log "^1.0.1" - default-require-extensions "^1.0.0" - find-cache-dir "^0.1.1" - find-up "^2.1.0" - foreground-child "^1.5.3" - glob "^7.0.6" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-hook "^1.0.7" - istanbul-lib-instrument "^1.8.0" - istanbul-lib-report "^1.1.1" - istanbul-lib-source-maps "^1.2.1" - istanbul-reports "^1.1.1" - md5-hex "^1.2.0" - merge-source-map "^1.0.2" - micromatch "^2.3.11" - mkdirp "^0.5.0" - resolve-from "^2.0.0" - rimraf "^2.5.4" - signal-exit "^3.0.1" - spawn-wrap "^1.3.8" - test-exclude "^4.1.1" - yargs "^8.0.1" - yargs-parser "^5.0.0" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + find-cache-dir "^2.0.0" + find-up "^3.0.0" + foreground-child "^1.5.6" + glob "^7.1.3" + istanbul-lib-coverage "^2.0.1" + istanbul-lib-hook "^2.0.1" + istanbul-lib-instrument "^3.0.0" + istanbul-lib-report "^2.0.2" + istanbul-lib-source-maps "^2.0.1" + istanbul-reports "^2.0.1" + make-dir "^1.3.0" + merge-source-map "^1.1.0" + resolve-from "^4.0.0" + rimraf "^2.6.2" + signal-exit "^3.0.2" + spawn-wrap "^1.4.2" + test-exclude "^5.0.0" + uuid "^3.3.2" + yargs "11.1.0" + yargs-parser "^9.0.2" object-assign@^4.0.1, object-assign@^4.1.0: version "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-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.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.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= + dependencies: + isobject "^3.0.1" + observable-to-promise@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.5.0.tgz#c828f0f0dc47e9f86af8a4977c5d55076ce7a91f" + integrity sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8= dependencies: is-observable "^0.2.0" symbol-observable "^1.0.4" -once@^1.3.0, once@^1.3.3: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 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" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -2572,10 +3330,12 @@ optimist@^0.6.1: option-chain@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/option-chain/-/option-chain-1.0.0.tgz#938d73bd4e1783f948d34023644ada23669e30f2" + integrity sha1-k41zvU4Xg/lI00AjZEraI2aeMPI= optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -2587,22 +3347,26 @@ optionator@^0.8.2: os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, 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= osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -2610,26 +3374,57 @@ osenv@^0.1.4: 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-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + 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.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== + 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= dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.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.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + package-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-1.2.0.tgz#003e56cd57b736a6ed6114cc2b81542672770e44" + integrity sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ= dependencies: md5-hex "^1.3.0" package-hash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-2.0.0.tgz#78ae326c89e05a4d813b68601977af05c00d2a0d" + integrity sha1-eK4ybIngWk2BO2hgGXevBcANKg0= dependencies: graceful-fs "^4.1.11" lodash.flattendeep "^4.4.0" @@ -2639,6 +3434,7 @@ package-hash@^2.0.0: package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= dependencies: got "^6.7.1" registry-auth-token "^3.0.1" @@ -2648,6 +3444,7 @@ package-json@^4.0.0: parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -2657,52 +3454,76 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-ms@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-0.1.2.tgz#dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e" + integrity sha1-3T+iXtbC78e93hKtm0bBY6opIk4= parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" 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.1, 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.0, 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-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + 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-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= dependencies: isarray "0.0.1" path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -2711,136 +3532,166 @@ path-type@^1.0.0: path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" + integrity sha1-0dpn9UglY7t89X8oauKCLs+/NnA= dependencies: pinkie "^1.0.0" pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4" + integrity sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q= pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-conf@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279" + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= dependencies: find-up "^2.0.0" - load-json-file "^2.0.0" + load-json-file "^4.0.0" pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= dependencies: find-up "^1.0.0" pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" -plur@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" plur@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" + integrity sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo= dependencies: irregular-plurals "^1.0.0" pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +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= 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= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= pretty-ms@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6" + integrity sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY= dependencies: parse-ms "^0.1.0" -pretty-ms@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" +pretty-ms@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" + integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== dependencies: - is-finite "^1.0.1" parse-ms "^1.0.0" - plur "^1.0.0" -private@^0.1.7: +private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + version "2.0.1" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" + integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" -rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" @@ -2848,6 +3699,7 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -2855,13 +3707,23 @@ read-pkg-up@^1.0.1: read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -2870,64 +3732,94 @@ read-pkg@^1.0.0: read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~1.0.6" + process-nextick-args "~2.0.0" safe-buffer "~5.1.1" - string_decoder "~1.0.3" + string_decoder "~1.1.1" util-deprecate "~1.0.1" readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" +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== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.0, 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== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" regjsparser "^0.1.4" registry-auth-token@^3.0.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== dependencies: rc "^1.1.6" safe-buffer "^5.0.1" @@ -2935,85 +3827,70 @@ registry-auth-token@^3.0.1: registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= dependencies: rc "^1.0.1" regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= dependencies: es6-error "^4.0.1" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - 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-precompiled@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" + integrity sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo= require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -3021,364 +3898,491 @@ require-uncached@^1.0.3: resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= -resolve@^1.2.0, resolve@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" +resolve-from@^4.0.0: + version "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.5.0, resolve@^1.6.0, resolve@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" restore-cursor@^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= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" +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== -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.2.8, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" 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" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" +rxjs@^6.1.0: + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== dependencies: - rx-lite "*" + tslib "^1.9.0" -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +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" -samsam@1.x, samsam@^1.1.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.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= -signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.0.1.tgz#e46146a8a8420f837bdba32e2965bd1fe43d5b05" +sinon@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.0.0.tgz#99f2e5198d90a01ccbcebd4dc181a24827cb90dd" + integrity sha512-8OrSYFPZ9xaECfi1ayVMd0ihYCW2OZYgX3rBczrB990gHZMM+aftvhNTJazGz/luS0Us9NWgD5P3KGQ7kYZvGg== dependencies: - diff "^3.1.0" - formatio "1.2.0" + "@sinonjs/commons" "^1.0.2" + "@sinonjs/formatio" "^3.0.0" + "@sinonjs/samsam" "^2.1.2" + diff "^3.5.0" lodash.get "^4.4.2" - lolex "^2.1.3" - native-promise-only "^0.8.1" - nise "^1.1.1" - path-to-regexp "^1.7.0" - samsam "^1.1.3" - text-encoding "0.6.4" - type-detect "^4.0.0" + lolex "^3.0.0" + nise "^1.4.5" + supports-color "^5.5.0" + type-detect "^4.0.8" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slice-ansi@1.0.0, slice-ansi@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +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" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" +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: - hoek "2.x.x" + 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" 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-support@^0.4.0, source-map-support@^0.4.15: +source-map-resolve@^0.5.0: + 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== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" +source-map-support@^0.5.0: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: - amdefine ">=0.0.4" + 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.3, source-map@^0.5.6, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: 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: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spawn-wrap@^1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.3.8.tgz#fa2a79b990cbb0bb0018dca6748d88367b19ec31" +spawn-wrap@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" + integrity sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg== dependencies: foreground-child "^1.5.6" mkdirp "^0.5.0" os-homedir "^1.0.1" - rimraf "^2.3.3" + rimraf "^2.6.2" signal-exit "^3.0.2" - which "^1.2.4" + which "^1.3.0" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +spdx-correct@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" + integrity sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w== -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +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" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -stack-utils@^1.0.0: +stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA= + +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" -string-width@^1.0.1, string-width@^1.0.2: +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= strip-bom-buf@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" + integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= dependencies: is-utf8 "^0.2.1" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" 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-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.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= + +supertap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supertap/-/supertap-1.0.0.tgz#bd9751c7fafd68c68cf8222a29892206a119fa9e" + integrity sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA== + dependencies: + arrify "^1.0.1" + indent-string "^3.2.0" + js-yaml "^3.10.0" + serialize-error "^2.1.0" + strip-ansi "^4.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - has-flag "^1.0.0" - -supports-color@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - dependencies: - has-flag "^2.0.0" + has-flag "^3.0.0" symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" + integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= -symbol-observable@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" +symbol-observable@^1.0.4, symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -table@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" +table@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/table/-/table-5.1.0.tgz#69a54644f6f01ad1628f8178715b408dc6bf11f7" + integrity sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg== dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" + ajv "^6.5.3" + lodash "^4.17.10" slice-ansi "1.0.0" string-width "^2.1.1" -tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" +tar@^4: + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + integrity sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg== dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= dependencies: execa "^0.7.0" -test-exclude@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" +test-exclude@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.0.0.tgz#cdce7cece785e0e829cd5c2b27baf18bc583cfb7" + integrity sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw== dependencies: arrify "^1.0.1" - micromatch "^2.3.11" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" require-main-filename "^1.0.1" -text-encoding@0.6.4, text-encoding@^0.6.4: +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, text-table@~0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= through2@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= dependencies: readable-stream "^2.1.5" xtend "~4.0.1" @@ -3386,211 +4390,252 @@ through2@^2.0.0: through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -time-require@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/time-require/-/time-require-0.1.2.tgz#f9e12cb370fc2605e11404582ba54ef5ca2b2d98" - dependencies: - chalk "^0.4.0" - date-time "^0.1.1" - pretty-ms "^0.2.1" - text-table "^0.2.0" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= time-zone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= timed-out@^4.0.0: 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.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" +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.1" + os-tmpdir "~1.0.2" to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +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= -tough-cookie@~2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" +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: - punycode "^1.4.1" + kind-of "^3.0.2" + +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-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" trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-off-newlines@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +type-detect@4.0.8, 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== -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + commander "~2.17.1" + source-map "~0.6.1" uid2@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" + integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= -underscore@1.x.x: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" +underscore@^1.8.3: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" unique-temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" + integrity sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U= dependencies: mkdirp "^0.5.1" os-tmpdir "^1.0.1" uid2 "0.0.3" +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" + 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= -update-notifier@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" +update-notifier@^2.3.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== dependencies: boxen "^1.2.1" chalk "^2.0.1" configstore "^3.0.0" import-lazy "^2.1.0" + is-ci "^1.0.10" is-installed-globally "^0.1.0" is-npm "^1.0.0" latest-version "^3.0.0" semver-diff "^2.0.0" xdg-basedir "^3.0.0" +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== + 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" +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== + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" well-known-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-1.0.0.tgz#73c78ae81a7726a8fa598e2880801c8b16225518" + integrity sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg= which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.4, which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: - string-width "^1.0.1" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + string-width "^2.1.1" wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= 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" @@ -3598,10 +4643,12 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^1.1.4: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -3610,6 +4657,7 @@ write-file-atomic@^1.1.4: write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -3618,6 +4666,7 @@ write-file-atomic@^2.0.0: write-json-file@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= dependencies: detect-indent "^5.0.0" graceful-fs "^4.1.2" @@ -3627,8 +4676,9 @@ write-json-file@^2.2.0: write-file-atomic "^2.0.0" write-pkg@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.1.0.tgz#030a9994cc9993d25b4e75a9f1a1923607291ce9" + version "3.2.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21" + integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== dependencies: sort-keys "^2.0.0" write-json-file "^2.2.0" @@ -3636,60 +4686,56 @@ write-pkg@^3.1.0: write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - dependencies: - camelcase "^3.0.0" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" +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@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" +yargs@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" + cliui "^4.0.0" decamelize "^1.1.1" + find-up "^2.1.0" get-caller-file "^1.0.1" os-locale "^2.0.0" - read-pkg-up "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^7.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + yargs-parser "^9.0.2" From 66e02991885bef5703c91509c28f6572bdde209a Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 25 Oct 2018 03:30:08 +0200 Subject: [PATCH 035/341] Install yabf@2.0.0 --- package.json | 3 ++- yarn.lock | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ba646601..f6181a7f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "chalk": "^2.4.1", "commander": "^2.19.0", "gift": "^0.10.2", - "inquirer": "^6.2.0" + "inquirer": "^6.2.0", + "yabf": "^2.0.0" }, "devDependencies": { "@types/node": "^10.12.0", diff --git a/yarn.lock b/yarn.lock index d1a4d3fb..cf190401 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4705,6 +4705,11 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +yabf@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.0.0.tgz#0cede59d65eec44813841ce2ee5b417e7b06f3cd" + integrity sha512-TmgWe+ay+H1Y/3vY2f16SKZM3mQC22U64+Bw6UpK+pUveJBLN0RAzNUwt75kVJ/8YE7QD3Z0ClEEhDWg3n0E1Q== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From c5054653288356952d1b7bc716213ce38e0d4ada Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 25 Oct 2018 03:32:21 +0200 Subject: [PATCH 036/341] Install esm@3.0.84 --- package.json | 1 + yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/package.json b/package.json index f6181a7f..2a189e68 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "dependencies": { "chalk": "^2.4.1", "commander": "^2.19.0", + "esm": "^3.0.84", "gift": "^0.10.2", "inquirer": "^6.2.0", "yabf": "^2.0.0" diff --git a/yarn.lock b/yarn.lock index cf190401..f14c007a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1612,6 +1612,11 @@ eslint@^5.7.0: table "^5.0.2" text-table "^0.2.0" +esm@^3.0.84: + version "3.0.84" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.0.84.tgz#bb108989f4673b32d4f62406869c28eed3815a63" + integrity sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw== + espower-location-detector@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" From da55884ccaf151e9e54e13ac0125da8d662e5365 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 7 Nov 2018 10:52:17 +0100 Subject: [PATCH 037/341] Create a new class to add an abstraction on top of configfile command --- src/core/command.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/core/command.js diff --git a/src/core/command.js b/src/core/command.js new file mode 100644 index 00000000..263057f6 --- /dev/null +++ b/src/core/command.js @@ -0,0 +1,17 @@ +export class Command { + get alias() { + return null + } + + get commandName() { + return null + } + + get description() { + return '' + } + + get options() { + return [] + } +} From bdcbecd52d5a2578e206533e7db5863d7fbdd3e6 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 7 Nov 2018 10:53:00 +0100 Subject: [PATCH 038/341] Create a yabf application specific to configfile --- src/core/term-application.js | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/core/term-application.js diff --git a/src/core/term-application.js b/src/core/term-application.js new file mode 100644 index 00000000..dbcce6ba --- /dev/null +++ b/src/core/term-application.js @@ -0,0 +1,56 @@ +import { AbstractApplication } from 'yabf' +import program from 'commander' + +import { Command } from './command' +import { LogUtils } from '../shared/utils' + +export class TermApplication extends AbstractApplication { + buildInstructions() { + return [ + { provide: TermApplication, dependencies: [] } + ] + } + + register(command, deps = []) { + if (!(command.prototype instanceof Command)) { + return null + } + + this.commands = [command, ...(this.commands || [])] + this.injectorService.provide(command, deps, false) + } + + start() { + if (!Array.isArray(this.commands) || this.commands.length < 1) { + LogUtils.log({ message: `No command found in Term Application` }) + LogUtils.log({ type: 'error', message: `Application failed to initialize` }) + return + } + + for (const commandClass of this.commands) { + const controller = this.injectorService.get(commandClass) + + let command = program.command(controller.commandName) + + if (controller.alias != null) { + command = command.alias(controller.alias) + } + + if (controller.alias != null && controller.description.length > 0) { + command = command.description(controller.description) + } + + if (Array.isArray(controller.options)) { + for (const [option, optionDesc] of controller.options) { + command = command.option(option, optionDesc) + } + } + + if ('run' in controller && typeof controller.run === 'function') { + command.action(controller.run.bind(controller)) + } + } + + program.parse(process.argv) + } +} From f968aa27ca2b3652b63f33b453cefbf34e192c3e Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 7 Nov 2018 10:53:32 +0100 Subject: [PATCH 039/341] Temp import keyword handler --- src/index.js | 5 +++++ src/main.js | 13 +++++++++++++ 2 files changed, 18 insertions(+) create mode 100755 src/index.js create mode 100644 src/main.js diff --git a/src/index.js b/src/index.js new file mode 100755 index 00000000..486920ca --- /dev/null +++ b/src/index.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node +'use strict' + +require = require('esm')(module) // eslint-disable-line no-global-assign +module.exports = require('./main.js') diff --git a/src/main.js b/src/main.js new file mode 100644 index 00000000..d38affd8 --- /dev/null +++ b/src/main.js @@ -0,0 +1,13 @@ +import { TermApplication } from './core/term-application' +import { ScriptsListCommand } from './commands/scripts-list.command' +import { FileService } from './services/file.service' + +(() => { + const app = TermApplication.createInstance() + + app.register(ScriptsListCommand, [FileService]) + + app.provide(FileService) + + app.start() +})() From 5a12983f9315c4e8d9e20fd29dc1650bc8c806d9 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 7 Nov 2018 10:54:07 +0100 Subject: [PATCH 040/341] Yabf version of `configfile scripts list` command --- src/commands/scripts-list.command.js | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/commands/scripts-list.command.js diff --git a/src/commands/scripts-list.command.js b/src/commands/scripts-list.command.js new file mode 100644 index 00000000..f9275749 --- /dev/null +++ b/src/commands/scripts-list.command.js @@ -0,0 +1,48 @@ +import { Command } from '../core/command' +import { ConfigurationFileNotExist } from '../services/config' +import { LogUtils } from '../shared/utils' + +export class ScriptsListCommand extends Command { + get commandName() { + return 'list' + } + + get alias() { + return 'l' + } + + get description() { + return 'list all custom configuration scripts available.' + } + + constructor(fileService) { + super() + + this.fileService = fileService + } + + run() { + let scripts = [] + + try { + scripts = this.fileService.scripts + } catch (e) { + if (e instanceof ConfigurationFileNotExist) { + LogUtils.log({ message: 'Unable to load scripts without knowing where are stored the data.' }) + LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + return + } + } + + if (scripts.length < 1) { + LogUtils.log({ type: 'info', message: `No scripts found.` }) + return + } + + LogUtils.log({ message: `${scripts.length} script(s) found.` }) + + for (const { script } of scripts) { + LogUtils.log({ message: `- ${script}` }) + } + } +} From b91c86d120587fbbd3fe35cdb777ca756be16d27 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 8 Nov 2018 16:07:10 +0100 Subject: [PATCH 041/341] Create the yabf version for `configfile scripts run` command --- src/commands/scripts-run.command.js | 55 +++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/commands/scripts-run.command.js diff --git a/src/commands/scripts-run.command.js b/src/commands/scripts-run.command.js new file mode 100644 index 00000000..e8edf880 --- /dev/null +++ b/src/commands/scripts-run.command.js @@ -0,0 +1,55 @@ +import { Command } from '../core/command' +import { ConfigurationFileNotExist } from '../services/config' +import { LogUtils } from '../shared/utils' +import { BadScriptPermission } from '../services/exec/bad-script-permission.error' +import { ScriptNotExist } from '../services/exec/script-not-exist.error' + +export class ScriptsRunCommand extends Command { + get commandName() { + return 'run ' + } + + get alias() { + return 'r' + } + + get description() { + return 'run custom configuration scripts.' + } + + constructor(execService, fileService) { + super() + + this.fileService = fileService + this.execService = execService + } + + async run(scriptName) { + LogUtils.log({ type: 'info', message: `Running "${scriptName}" script.` }) + + const script = this.fileService.scriptByName(scriptName) + + try { + await this.execService.runScript(script) + + LogUtils.log({ type: 'success', message: `"${scriptName}" script execution is finished.` }) + } catch (error) { + if (error instanceof ConfigurationFileNotExist) { + LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + return + } + + if (error instanceof ScriptNotExist) { + LogUtils.log({ type: 'error', message: error.message }) + return + } + + if (error instanceof BadScriptPermission) { + LogUtils.log({ type: 'error', message: error.message, prefix: ' Fail ' }) + return + } + + LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) + } + } +} From 4460d0d100bf91d7e61e8e2c3ea83c81877ab029 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 8 Nov 2018 16:08:10 +0100 Subject: [PATCH 042/341] Export service and yabf version of commands to be available for binaries --- src/main.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main.js b/src/main.js index d38affd8..f94fe73d 100644 --- a/src/main.js +++ b/src/main.js @@ -1,13 +1,7 @@ -import { TermApplication } from './core/term-application' -import { ScriptsListCommand } from './commands/scripts-list.command' -import { FileService } from './services/file.service' +export * from './core/term-application' -(() => { - const app = TermApplication.createInstance() +export * from './commands/scripts-list.command' +export * from './commands/scripts-run.command' - app.register(ScriptsListCommand, [FileService]) - - app.provide(FileService) - - app.start() -})() +export * from './services/file.service' +export * from './services/exec' From 9a93c8984810b542c276a23fa943af47ee108d58 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 8 Nov 2018 16:09:58 +0100 Subject: [PATCH 043/341] Remove old version of commands --- src/commands/run.command.js | 33 --------------------------------- src/commands/scripts.command.js | 28 ---------------------------- 2 files changed, 61 deletions(-) delete mode 100644 src/commands/run.command.js delete mode 100644 src/commands/scripts.command.js diff --git a/src/commands/run.command.js b/src/commands/run.command.js deleted file mode 100644 index f9a4ed54..00000000 --- a/src/commands/run.command.js +++ /dev/null @@ -1,33 +0,0 @@ -const { LogUtils } = require('../shared/utils') - -const { ConfigurationFileNotExist } = require('../services/config') -const { ScriptNotExist, BadScriptPermission } = require('../services') - -module.exports = exports = (execService, fileService) => async (scriptName, options) => { - LogUtils.log({ type: 'info', message: `Running "${scriptName}" script.` }) - - const script = fileService.scriptByName(scriptName) - - try { - await execService.runScript(script) - - LogUtils.log({ type: 'success', message: `"${scriptName}" script execution is finished.` }) - } catch (error) { - if (error instanceof ConfigurationFileNotExist) { - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) - return - } - - if (error instanceof ScriptNotExist) { - LogUtils.log({ type: 'error', message: error.message }) - return - } - - if (error instanceof BadScriptPermission) { - LogUtils.log({ type: 'error', message: error.message, prefix: ' Fail ' }) - return - } - - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) - } -} diff --git a/src/commands/scripts.command.js b/src/commands/scripts.command.js deleted file mode 100644 index 80f6fda8..00000000 --- a/src/commands/scripts.command.js +++ /dev/null @@ -1,28 +0,0 @@ -const { LogUtils } = require('../shared/utils') - -const { ConfigurationFileNotExist } = require('../services/config') - -module.exports = exports = fileService => () => { - let scripts = [] - - try { - scripts = fileService.scripts - } catch (e) { - if (e instanceof ConfigurationFileNotExist) { - LogUtils.log({ message: 'Unable to load scripts without knowing where are stored the data.' }) - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) - return - } - } - - if (scripts.length < 1) { - LogUtils.log({ type: 'info', message: `No scripts found.` }) - return - } - - LogUtils.log({ message: `${scripts.length} script(s) found.` }) - - for (const { script } of scripts) { - LogUtils.log({ message: `- ${script}` }) - } -} From 8519bd4abd323c6494d95966bcf97d91182a3782 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 8 Nov 2018 17:13:06 +0100 Subject: [PATCH 044/341] Create the yabf version of configfile modules list --- src/commands/modules-list.command.js | 48 ++++++++++++++++++++++++++++ src/commands/modules.command.js | 28 ---------------- src/main.js | 1 + 3 files changed, 49 insertions(+), 28 deletions(-) create mode 100644 src/commands/modules-list.command.js delete mode 100644 src/commands/modules.command.js diff --git a/src/commands/modules-list.command.js b/src/commands/modules-list.command.js new file mode 100644 index 00000000..ddf27ea6 --- /dev/null +++ b/src/commands/modules-list.command.js @@ -0,0 +1,48 @@ +import { Command } from '../core/command' +import { ConfigurationFileNotExist } from '../services/config' +import { LogUtils } from '../shared/utils' + +export class ModulesListCommand extends Command { + get commandName() { + return 'list' + } + + get alias() { + return 'l' + } + + get description() { + return 'list all modules available.' + } + + constructor(fileService) { + super() + + this.fileService = fileService + } + + run() { + let modules = [] + + try { + modules = this.fileService.modules + } catch (e) { + if (e instanceof ConfigurationFileNotExist) { + LogUtils.log({ message: 'Unable to load modules without knowing where are stored the data.' }) + LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + return + } + } + + if (modules.length < 1) { + LogUtils.log({ type: 'info', message: `No module found.` }) + return + } + + LogUtils.log({ message: `${modules.length} module(s) found.` }) + + for (const { module: name } of modules) { + LogUtils.log({ message: `- ${name}` }) + } + } +} diff --git a/src/commands/modules.command.js b/src/commands/modules.command.js deleted file mode 100644 index c0538641..00000000 --- a/src/commands/modules.command.js +++ /dev/null @@ -1,28 +0,0 @@ -const { LogUtils } = require('../shared/utils') - -const { ConfigurationFileNotExist } = require('../services/config') - -module.exports = exports = fileService => () => { - let modules = [] - - try { - modules = fileService.modules - } catch (e) { - if (e instanceof ConfigurationFileNotExist) { - LogUtils.log({ message: 'Unable to load modules without knowing where are stored the data.' }) - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) - return - } - } - - if (modules.length < 1) { - LogUtils.log({ type: 'info', message: `No module found.` }) - return - } - - LogUtils.log({ message: `${modules.length} module(s) found.` }) - - for (const { module: name } of modules) { - LogUtils.log({ message: `- ${name}` }) - } -} diff --git a/src/main.js b/src/main.js index f94fe73d..bfe9a873 100644 --- a/src/main.js +++ b/src/main.js @@ -2,6 +2,7 @@ export * from './core/term-application' export * from './commands/scripts-list.command' export * from './commands/scripts-run.command' +export * from './commands/modules-list.command' export * from './services/file.service' export * from './services/exec' From 1ccef3316caa4893769de5d36bca84e98fb89e1f Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 8 Nov 2018 17:37:45 +0100 Subject: [PATCH 045/341] Create a yabf version of configfile modules deploy --- src/commands/deploy/deploy.command.js | 92 ------------------- src/commands/modules-deploy.command.js | 119 +++++++++++++++++++++++++ src/main.js | 4 +- 3 files changed, 122 insertions(+), 93 deletions(-) delete mode 100644 src/commands/deploy/deploy.command.js create mode 100644 src/commands/modules-deploy.command.js diff --git a/src/commands/deploy/deploy.command.js b/src/commands/deploy/deploy.command.js deleted file mode 100644 index a007b29b..00000000 --- a/src/commands/deploy/deploy.command.js +++ /dev/null @@ -1,92 +0,0 @@ -const inquirer = require('inquirer') - -const { LogUtils } = require('../../shared/utils') - -const { ConfigurationFileNotExist } = require('../../services/config') -const { TargetFileAlreadyExist } = require('../../services') -const { DeployStopedByUser } = require('./deploy-stop-by-user.error') - -module.exports = exports = (fileService, deployService) => (modules, options) => { - const localDeployment = options.local || false - let modulesToDeploy = modules - - Promise.resolve() - .then(_ => { - if (modules.length <= 0) { - return inquirer.prompt([{ - type: 'confirm', - message: 'No modules was passed in parameter. Do you want to deploy all available modules ?', - name: 'all_module', - default: false - }]) - .then(({ all_module: deployAllModule }) => { - if (!deployAllModule) { - throw new DeployStopedByUser() - } - - modulesToDeploy = fileService.modules.map(el => el.module) - }) - } - }) - .then(_ => LogUtils.log({ type: 'info', message: `Deployment (${modulesToDeploy.join(', ')}) start.` })) - .then(_ => { - const files = fileService.modules - .filter(element => modulesToDeploy.includes(element.module)) - .reduce((files, element) => { - for (const file of element.files) { - files.push(file) - } - - return files - }, []) - .filter(element => element.global === !localDeployment) - - const failedFiles = [] - const deployPromises = files.map(file => { - if (file.global) { - return deployService.deployGlobalFile(file) - } - - return deployService.deployLocalFile(file) - .catch(error => { - if (error instanceof TargetFileAlreadyExist) { - failedFiles.push(file) - return - } - - throw error - }) - }) - - return Promise.all(deployPromises) - .then(_ => { // User choices to relaunch deployment - if (failedFiles.length <= 0) { - return - } - - return failedFiles - .reduce((queue, file) => queue - .then(_ => inquirer - .prompt([{ name: 'overwrite_file', message: `File ${file.target} already exist. Do you want to overwrite it ?`, type: 'confirm', default: false }]) - .then(({ overwrite_file: overwriteFile }) => { - if (overwriteFile) { - return fileService.deployLocalFile(file, true) - } - })), Promise.resolve()) - }) - }) - .then(_ => LogUtils.log({ type: 'success', message: `Deployment task is finished.` })) - .catch(error => { - if (error instanceof ConfigurationFileNotExist) { - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) - return - } - - if (error instanceof DeployStopedByUser) { - LogUtils.log({ message: `${error.message} No modules to deploy.` }) - return - } - - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) - }) -} diff --git a/src/commands/modules-deploy.command.js b/src/commands/modules-deploy.command.js new file mode 100644 index 00000000..c50c0ff5 --- /dev/null +++ b/src/commands/modules-deploy.command.js @@ -0,0 +1,119 @@ +import inquirer from 'inquirer' + +import { Command } from '../core/command' +import { ConfigurationFileNotExist } from '../services/config' +import { LogUtils } from '../shared/utils' +import { DeployStopedByUser } from '../commands/deploy/deploy-stop-by-user.error' +import { TargetFileAlreadyExist } from '../services' + +export class ModulesDeployCommand extends Command { + get commandName() { + return 'deploy [modules...]' + } + + get alias() { + return 'd' + } + + get description() { + return 'deploy configuration files.' + } + + get options() { + return [ + ['-l, --local', 'deploy only local files of the module(s) in the current folder'] + ] + } + + constructor(fileService, deployService) { + super() + + this.fileService = fileService + this.deployService = deployService + } + + run(modules, options) { + const localDeployment = options.local || false + let modulesToDeploy = modules + + Promise.resolve() + .then(_ => { + if (modules.length <= 0) { + return inquirer.prompt([{ + type: 'confirm', + message: 'No modules was passed in parameter. Do you want to deploy all available modules ?', + name: 'all_module', + default: false + }]) + .then(({ all_module: deployAllModule }) => { + if (!deployAllModule) { + throw new DeployStopedByUser() + } + + modulesToDeploy = this.fileService.modules.map(el => el.module) + }) + } + }) + .then(_ => LogUtils.log({ type: 'info', message: `Deployment (${modulesToDeploy.join(', ')}) start.` })) + .then(_ => { + const files = this.fileService.modules + .filter(element => modulesToDeploy.includes(element.module)) + .reduce((files, element) => { + for (const file of element.files) { + files.push(file) + } + + return files + }, []) + .filter(element => element.global === !localDeployment) + + const failedFiles = [] + const deployPromises = files.map(file => { + if (file.global) { + return this.deployService.deployGlobalFile(file) + } + + return this.deployService.deployLocalFile(file) + .catch(error => { + if (error instanceof TargetFileAlreadyExist) { + failedFiles.push(file) + return + } + + throw error + }) + }) + + return Promise.all(deployPromises) + .then(_ => { // User choices to relaunch deployment + if (failedFiles.length <= 0) { + return + } + + return failedFiles + .reduce((queue, file) => queue + .then(_ => inquirer + .prompt([{ name: 'overwrite_file', message: `File ${file.target} already exist. Do you want to overwrite it ?`, type: 'confirm', default: false }]) + .then(({ overwrite_file: overwriteFile }) => { + if (overwriteFile) { + return this.fileService.deployLocalFile(file, true) + } + })), Promise.resolve()) + }) + }) + .then(_ => LogUtils.log({ type: 'success', message: `Deployment task is finished.` })) + .catch(error => { + if (error instanceof ConfigurationFileNotExist) { + LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + return + } + + if (error instanceof DeployStopedByUser) { + LogUtils.log({ message: `${error.message} No modules to deploy.` }) + return + } + + LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) + }) + } +} diff --git a/src/main.js b/src/main.js index bfe9a873..cf4c16b3 100644 --- a/src/main.js +++ b/src/main.js @@ -3,6 +3,8 @@ export * from './core/term-application' export * from './commands/scripts-list.command' export * from './commands/scripts-run.command' export * from './commands/modules-list.command' +export * from './commands/modules-deploy.command' export * from './services/file.service' -export * from './services/exec' +export * from './services/exec/exec.service' +export * from './services/deploy/deploy.service' From ebf26f6b55a323dde2f43b306bde9f7c527bcf7b Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 8 Nov 2018 17:55:03 +0100 Subject: [PATCH 046/341] Create yabf version of `configfile init` command --- src/commands/index.js | 18 ++--- src/commands/init.command.js | 129 ++++++++++++++++++++++++++++++ src/commands/init/init.command.js | 103 ------------------------ src/main.js | 7 +- 4 files changed, 137 insertions(+), 120 deletions(-) create mode 100644 src/commands/init.command.js delete mode 100644 src/commands/init/init.command.js diff --git a/src/commands/index.js b/src/commands/index.js index d262ff8b..b98501af 100644 --- a/src/commands/index.js +++ b/src/commands/index.js @@ -1,13 +1,5 @@ -const initCommand = require('./init/init.command') -const runCommand = require('./run.command') -const deployCommand = require('./deploy/deploy.command') -const scriptsCommand = require('./scripts.command') -const modulesCommand = require('./modules.command') - -module.exports = exports = { - initCommand, - runCommand, - deployCommand, - scriptsCommand, - modulesCommand -} +export * from './init.command' +export * from './modules-deploy.command' +export * from './modules-list.command' +export * from './scripts-list.command' +export * from './scripts-run.command' diff --git a/src/commands/init.command.js b/src/commands/init.command.js new file mode 100644 index 00000000..8478828f --- /dev/null +++ b/src/commands/init.command.js @@ -0,0 +1,129 @@ +import inquirer from 'inquirer' +import fs from 'fs' +import path from 'path' + +import { Command } from '../core/command' +import { LogUtils, FsUtils, GitUtils } from '../shared/utils' +import { InitStopedByUser } from '../commands/init/init-stop-by-user.error' +import { FileNotDirectory, FolderNotEmpty } from '../shared/errors' + +export class InitCommand extends Command { + get commandName() { + return 'init' + } + + get alias() { + return 'i' + } + + get description() { + return 'activate configfiles on user session.' + } + + get options() { + return [ + ['-f, --force', 'force parameters file overwrite.'] + ] + } + + constructor(configService) { + super() + + this.configService = configService + } + + run(options) { + const userForceOverwrite = options.force || false + const questions = [ + { + name: 'overwrite_file', + message: 'A configuration file already exist. Do you want to continue ?', + type: 'confirm', + when: () => this.configService.configFileExist() && !userForceOverwrite + }, + { + name: 'repo_url', + message: 'Repository url:', + type: 'input', + validate: url => GitUtils.isGitUrl(url), + default: () => { + if (this.configService.configFileExist()) { + return this.configService.repoUrl + } + }, + when: data => !this.configService.configFileExist() || data.overwrite_file || userForceOverwrite + }, + { + name: 'folder_path', + message: 'Folder path:', + type: 'input', + validate: path => FsUtils.isFilePath(path), + default: () => { + if (this.configService.configFileExist()) { + return this.configService.folderPath + } + }, + when: data => !this.configService.configFileExist() || data.overwrite_file || userForceOverwrite + } + ] + + inquirer.prompt(questions) + .then(({ repo_url: repoUrl = null, folder_path: folderPath, overwrite_file: overwriteFile = true }) => { + if (!overwriteFile) { + throw new InitStopedByUser('You stopped the command. Nothing has be made.') + } + + folderPath = folderPath.replace('~', process.env.HOME) + folderPath = path.resolve(folderPath) + + this.configService.repoUrl = repoUrl + this.configService.folderPath = folderPath + }) + .then(() => { + const folderPath = this.configService.folderPath + if (!FsUtils.fileExist(folderPath)) { + LogUtils.log({ type: 'info', message: 'Folder does not exist. It will be created.' }) + fs.mkdirSync(folderPath) + } + + const isDirectory = fs.statSync(folderPath).isDirectory() + if (!isDirectory) { + throw new FileNotDirectory() + } + + const folderIsEmpty = fs.readdirSync(folderPath).length < 1 + if (!folderIsEmpty) { + throw new FolderNotEmpty() + } + }) + .then(() => { + if (this.configService.repoUrl == null) { + LogUtils.log({ type: 'warn', message: 'Unable to cloned git repository. Need repository URL.' }) + return + } + + return GitUtils.clone(this.configService.repoUrl, this.configService.folderPath) + .then(repo => { + LogUtils.log({ type: 'info', message: 'Git repository cloned successuly.' }) + }) + }) + .catch(error => { + if (error instanceof InitStopedByUser) { + LogUtils.log({ message: error.message }) + return + } + + if (error instanceof FolderNotEmpty) { + LogUtils.log({ type: 'error', message: error.message }) + return + } + + if (error instanceof FileNotDirectory) { + LogUtils.log({ type: 'error', message: error.message }) + return + } + + LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) + }) + } +} diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js deleted file mode 100644 index 5a559114..00000000 --- a/src/commands/init/init.command.js +++ /dev/null @@ -1,103 +0,0 @@ -const fs = require('fs') -const path = require('path') -const inquirer = require('inquirer') - -const { FsUtils, LogUtils, GitUtils } = require('../../shared/utils') -const { FolderNotEmpty, FileNotDirectory } = require('../../shared/errors') - -const { InitStopedByUser } = require('./init-stop-by-user.error') - -module.exports = exports = configService => options => { - const userForceOverwrite = options.force || false - const questions = [ - { - name: 'overwrite_file', - message: 'A configuration file already exist. Do you want to continue ?', - type: 'confirm', - when: () => configService.configFileExist() && !userForceOverwrite - }, - { - name: 'repo_url', - message: 'Repository url:', - type: 'input', - validate: url => GitUtils.isGitUrl(url), - default: () => { - if (configService.configFileExist()) { - return configService.repoUrl - } - }, - when: data => !configService.configFileExist() || data.overwrite_file || userForceOverwrite - }, - { - name: 'folder_path', - message: 'Folder path:', - type: 'input', - validate: path => FsUtils.isFilePath(path), - default: () => { - if (configService.configFileExist()) { - return configService.folderPath - } - }, - when: data => !configService.configFileExist() || data.overwrite_file || userForceOverwrite - } - ] - - inquirer.prompt(questions) - .then(({ repo_url: repoUrl = null, folder_path: folderPath, overwrite_file: overwriteFile = true }) => { - if (!overwriteFile) { - throw new InitStopedByUser('You stopped the command. Nothing has be made.') - } - - folderPath = folderPath.replace('~', process.env.HOME) - folderPath = path.resolve(folderPath) - - configService.repoUrl = repoUrl - configService.folderPath = folderPath - }) - .then(() => { - const folderPath = configService.folderPath - if (!FsUtils.fileExist(folderPath)) { - LogUtils.log({ type: 'info', message: 'Folder does not exist. It will be created.' }) - fs.mkdirSync(folderPath) - } - - const isDirectory = fs.statSync(folderPath).isDirectory() - if (!isDirectory) { - throw new FileNotDirectory() - } - - const folderIsEmpty = fs.readdirSync(folderPath).length < 1 - if (!folderIsEmpty) { - throw new FolderNotEmpty() - } - }) - .then(() => { - if (configService.repoUrl == null) { - LogUtils.log({ type: 'warn', message: 'Unable to cloned git repository. Need repository URL.' }) - return - } - - return GitUtils.clone(configService.repoUrl, configService.folderPath) - .then(repo => { - LogUtils.log({ type: 'info', message: 'Git repository cloned successuly.' }) - }) - }) - .catch(error => { - if (error instanceof InitStopedByUser) { - LogUtils.log({ message: error.message }) - return - } - - if (error instanceof FolderNotEmpty) { - LogUtils.log({ type: 'error', message: error.message }) - return - } - - if (error instanceof FileNotDirectory) { - LogUtils.log({ type: 'error', message: error.message }) - return - } - - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) - }) -} diff --git a/src/main.js b/src/main.js index cf4c16b3..46f99398 100644 --- a/src/main.js +++ b/src/main.js @@ -1,10 +1,9 @@ export * from './core/term-application' +export * from './core/command' -export * from './commands/scripts-list.command' -export * from './commands/scripts-run.command' -export * from './commands/modules-list.command' -export * from './commands/modules-deploy.command' +export * from './commands' export * from './services/file.service' export * from './services/exec/exec.service' export * from './services/deploy/deploy.service' +export * from './services/config/config.service' From 9ddaacb6fb84adce750b05e5f1868ab676d75881 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 8 Nov 2018 23:51:52 +0100 Subject: [PATCH 047/341] Update binary endpoint to use the new yabf configuration --- bin/configfile-modules.js | 34 +++++++++--------------- bin/configfile-scripts.js | 33 +++++++++-------------- bin/configfile.js | 55 ++++++++++++++++++++++++--------------- 3 files changed, 59 insertions(+), 63 deletions(-) diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index 938c252a..66a30388 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -1,29 +1,19 @@ #!/usr/bin/env node -const program = require('commander') +// program +// .version(config.package.version) +// .description('Configuration modules manager.') -const config = require('../src/configuration') +const { FileService, TermApplication, ModulesListCommand, ModulesDeployCommand, DeployService } = require('../src') -const { deployCommand, modulesCommand } = require('../src/commands') -const { FileService, DeployService, InjectorService } = require('../src/services') +;(() => { + const cli = TermApplication.createInstance() -const injector = InjectorService.getMainInstance() + cli.register(ModulesListCommand, [FileService]) + cli.register(ModulesDeployCommand, [FileService, DeployService]) -program - .version(config.package.version) - .description('Configuration modules manager.') + cli.provide(FileService) + cli.provide(DeployService) -program - .command('list') - .alias('l') - .description('list all modules available.') - .action(modulesCommand(injector.get(FileService))) - -program - .command('deploy [modules...]') - .alias('d') - .description('deploy configuration files.') - .option('-l, --local', 'deploy only local files of the module(s) in the current folder') - .action(deployCommand(injector.get(FileService), injector.get(DeployService))) - -program.parse(process.argv) + cli.start() +})() diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 006a937e..0002564c 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -1,28 +1,21 @@ #!/usr/bin/env node -const program = require('commander') +// const config = require('../src/configuration') -const config = require('../src/configuration') +// program +// .version(config.package.version) +// .description('Custom scripts manager.') -const { runCommand, scriptsCommand } = require('../src/commands') -const { ExecService, FileService, InjectorService } = require('../src/services') +const { FileService, ExecService, TermApplication, ScriptsListCommand, ScriptsRunCommand } = require('../src') -const injector = InjectorService.getMainInstance() +;(() => { + const cli = TermApplication.createInstance() -program - .version(config.package.version) - .description('Custom scripts manager.') + cli.register(ScriptsRunCommand, [ExecService, FileService]) + cli.register(ScriptsListCommand, [FileService]) -program - .command('list') - .alias('l') - .description('list all custom configuration scripts available.') - .action(scriptsCommand(injector.get(FileService))) + cli.provide(FileService) + cli.provide(ExecService) -program - .command('run ') - .alias('r') - .description('run custom configuration scripts.') - .action(runCommand(injector.get(ExecService), injector.get(FileService))) - -program.parse(process.argv) + cli.start() +})() diff --git a/bin/configfile.js b/bin/configfile.js index e7f93bea..512eee98 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -1,31 +1,44 @@ #!/usr/bin/env node -const program = require('commander') +// program +// .version(config.package.version) +// .description('Configuration files manager.') -const config = require('../src/configuration') +const { TermApplication, Command, InitCommand, ConfigService } = require('../src') -const { ConfigService, InjectorService } = require('../src/services') -const { initCommand } = require('../src/commands') +;(() => { + const cli = TermApplication.createInstance() -const injector = InjectorService.getMainInstance() + cli.provide(ConfigService) -program - .version(config.package.version) - .description('Configuration files manager.') + cli.register(InitCommand, [ConfigService]) + cli.register(class extends Command { // modules namespace + get commandName() { + return 'modules' + } -program - .command('init') - .alias('i') - .description('activate configfiles on user session.') - .option('-f, --force', 'force parameters file overwrite.') - .action(initCommand(injector.get(ConfigService))) + get alias() { + return 'm' + } -program - .command('scripts', 'work with custom scripts available.') - .alias('s') + get description() { + return 'work with modules available.' + } + }) -program - .command('modules', 'work with modules available.') - .alias('m') + cli.register(class extends Command { // scripts namespace + get commandName() { + return 'scripts' + } -program.parse(process.argv) + get alias() { + return 's' + } + + get description() { + return 'work with custom scripts available.' + } + }) + + cli.start() +})() From e569b220f0de1c29bbe5a6e6aaa1fad86487ecd9 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 9 Nov 2018 00:08:02 +0100 Subject: [PATCH 048/341] Show command version --- bin/configfile-modules.js | 9 +++++++-- bin/configfile-scripts.js | 9 +++++++-- bin/configfile.js | 6 +++++- src/configuration.js | 18 ------------------ src/core/term-application.js | 8 ++++++++ src/shared/errors.js | 7 ------- src/shared/errors/index.js | 2 ++ src/shared/utils.js | 11 ----------- src/shared/utils/index.js | 5 +++++ src/shared/utils/pakage.utils.js | 15 +++++++++++++++ 10 files changed, 49 insertions(+), 41 deletions(-) delete mode 100644 src/configuration.js delete mode 100644 src/shared/errors.js create mode 100644 src/shared/errors/index.js delete mode 100644 src/shared/utils.js create mode 100644 src/shared/utils/index.js create mode 100644 src/shared/utils/pakage.utils.js diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index 66a30388..a0bfd95a 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -4,16 +4,21 @@ // .version(config.package.version) // .description('Configuration modules manager.') -const { FileService, TermApplication, ModulesListCommand, ModulesDeployCommand, DeployService } = require('../src') +const { FileService, TermApplication, ModulesListCommand, ModulesDeployCommand, DeployService, ConfigService } = require('../src') +const { getOptionsFilePath, getPackageData } = require('../src/shared/utils') ;(() => { const cli = TermApplication.createInstance() + const pkg = getPackageData() + + cli.version = pkg.version cli.register(ModulesListCommand, [FileService]) cli.register(ModulesDeployCommand, [FileService, DeployService]) - cli.provide(FileService) + cli.provide(FileService, [ConfigService]) cli.provide(DeployService) + cli.provide(ConfigService, [{ useValue: getOptionsFilePath() }]) cli.start() })() diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 0002564c..ab42ca75 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -6,16 +6,21 @@ // .version(config.package.version) // .description('Custom scripts manager.') -const { FileService, ExecService, TermApplication, ScriptsListCommand, ScriptsRunCommand } = require('../src') +const { FileService, ExecService, TermApplication, ScriptsListCommand, ScriptsRunCommand, ConfigService } = require('../src') +const { getOptionsFilePath, getPackageData } = require('../src/shared/utils') ;(() => { const cli = TermApplication.createInstance() + const pkg = getPackageData() + + cli.version = pkg.version cli.register(ScriptsRunCommand, [ExecService, FileService]) cli.register(ScriptsListCommand, [FileService]) - cli.provide(FileService) + cli.provide(FileService, [ConfigService]) cli.provide(ExecService) + cli.provide(ConfigService, [{ useValue: getOptionsFilePath() }]) cli.start() })() diff --git a/bin/configfile.js b/bin/configfile.js index 512eee98..f249e912 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -5,11 +5,15 @@ // .description('Configuration files manager.') const { TermApplication, Command, InitCommand, ConfigService } = require('../src') +const { getOptionsFilePath, getPackageData } = require('../src/shared/utils') ;(() => { const cli = TermApplication.createInstance() + const pkg = getPackageData() - cli.provide(ConfigService) + cli.version = pkg.version + + cli.provide(ConfigService, [{ useValue: getOptionsFilePath() }]) cli.register(InitCommand, [ConfigService]) cli.register(class extends Command { // modules namespace diff --git a/src/configuration.js b/src/configuration.js deleted file mode 100644 index efa4c793..00000000 --- a/src/configuration.js +++ /dev/null @@ -1,18 +0,0 @@ -const fs = require('fs') -const path = require('path') - -const { InjectorService, DeployService, ExecService, FileService, ConfigService } = require('./services') - -const packageData = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'))) -const optionsFilePath = packageData.config.optionsFilePath.replace('~', process.env.HOME) - -const injector = InjectorService.getMainInstance() - -injector.provide(DeployService) -injector.provide(ExecService) -injector.provide(FileService, [ConfigService]) -injector.provide(ConfigService, [{ useValue: optionsFilePath }]) - -module.exports = exports = { - package: packageData -} diff --git a/src/core/term-application.js b/src/core/term-application.js index dbcce6ba..9bc7637f 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -5,6 +5,14 @@ import { Command } from './command' import { LogUtils } from '../shared/utils' export class TermApplication extends AbstractApplication { + get version() { + return this._version || '0.0.0' + } + + set version(semanticVersion) { + this._version = semanticVersion + } + buildInstructions() { return [ { provide: TermApplication, dependencies: [] } diff --git a/src/shared/errors.js b/src/shared/errors.js deleted file mode 100644 index a20204f3..00000000 --- a/src/shared/errors.js +++ /dev/null @@ -1,7 +0,0 @@ -const { FileNotDirectory } = require('./errors/file-not-directory.error') -const { FolderNotEmpty } = require('./errors/folder-not-empty.error') - -module.exports = exports = { - FileNotDirectory, - FolderNotEmpty -} diff --git a/src/shared/errors/index.js b/src/shared/errors/index.js new file mode 100644 index 00000000..a7ab9ae3 --- /dev/null +++ b/src/shared/errors/index.js @@ -0,0 +1,2 @@ +export * from './file-not-directory.error' +export * from './folder-not-empty.error' diff --git a/src/shared/utils.js b/src/shared/utils.js deleted file mode 100644 index 9c199717..00000000 --- a/src/shared/utils.js +++ /dev/null @@ -1,11 +0,0 @@ -const { FsUtils } = require('./utils/fs.utils') -const { GitUtils } = require('./utils/git.utils') -const { LogUtils } = require('./utils/log.utils') -const { ProcessUtils } = require('./utils/process.utils') - -module.exports = exports = { - FsUtils, - GitUtils, - LogUtils, - ProcessUtils -} diff --git a/src/shared/utils/index.js b/src/shared/utils/index.js new file mode 100644 index 00000000..db9beb38 --- /dev/null +++ b/src/shared/utils/index.js @@ -0,0 +1,5 @@ +export * from './pakage.utils' +export * from './fs.utils' +export * from './git.utils' +export * from './log.utils' +export * from './process.utils' diff --git a/src/shared/utils/pakage.utils.js b/src/shared/utils/pakage.utils.js new file mode 100644 index 00000000..16f4e710 --- /dev/null +++ b/src/shared/utils/pakage.utils.js @@ -0,0 +1,15 @@ +const fs = require('fs') +const path = require('path') + +export function getPackageData() { + const filePath = path.join(__dirname, '../../../package.json') + const file = fs.readFileSync(filePath) + + return JSON.parse(file) +} + +export function getOptionsFilePath() { + const pkg = getPackageData() + + return pkg.config.optionsFilePath.replace('~', process.env.HOME) +} From 562ae140b67860bfac1e141a4394341974dd2ff8 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 05:39:44 +0100 Subject: [PATCH 049/341] Add description for program --- bin/configfile-modules.js | 21 ++++++++++++++------- bin/configfile-scripts.js | 23 ++++++++++++++--------- bin/configfile.js | 23 ++++++++++++++--------- src/core/term-application.js | 12 ++++++++++++ src/main.js | 3 +++ src/shared/config.js | 3 +++ 6 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 src/shared/config.js diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index a0bfd95a..37a4cbca 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -1,24 +1,31 @@ #!/usr/bin/env node -// program -// .version(config.package.version) -// .description('Configuration modules manager.') - -const { FileService, TermApplication, ModulesListCommand, ModulesDeployCommand, DeployService, ConfigService } = require('../src') -const { getOptionsFilePath, getPackageData } = require('../src/shared/utils') +const { + FileService, + TermApplication, + ModulesListCommand, + ModulesDeployCommand, + DeployService, + ConfigService, + OPTION_PATH_FILE_TOKEN, + getOptionsFilePath, + getPackageData +} = require('../src') ;(() => { const cli = TermApplication.createInstance() const pkg = getPackageData() cli.version = pkg.version + cli.description = 'Configuration modules manager.' cli.register(ModulesListCommand, [FileService]) cli.register(ModulesDeployCommand, [FileService, DeployService]) + cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) cli.provide(FileService, [ConfigService]) cli.provide(DeployService) - cli.provide(ConfigService, [{ useValue: getOptionsFilePath() }]) + cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) cli.start() })() diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index ab42ca75..1293c74e 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -1,26 +1,31 @@ #!/usr/bin/env node -// const config = require('../src/configuration') - -// program -// .version(config.package.version) -// .description('Custom scripts manager.') - -const { FileService, ExecService, TermApplication, ScriptsListCommand, ScriptsRunCommand, ConfigService } = require('../src') -const { getOptionsFilePath, getPackageData } = require('../src/shared/utils') +const { + FileService, + ExecService, + TermApplication, + ScriptsListCommand, + ScriptsRunCommand, + ConfigService, + OPTION_PATH_FILE_TOKEN, + getOptionsFilePath, + getPackageData +} = require('../src') ;(() => { const cli = TermApplication.createInstance() const pkg = getPackageData() cli.version = pkg.version + cli.description = 'Custom scripts manager.' cli.register(ScriptsRunCommand, [ExecService, FileService]) cli.register(ScriptsListCommand, [FileService]) + cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) cli.provide(FileService, [ConfigService]) cli.provide(ExecService) - cli.provide(ConfigService, [{ useValue: getOptionsFilePath() }]) + cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) cli.start() })() diff --git a/bin/configfile.js b/bin/configfile.js index f249e912..8bb0a82d 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -1,19 +1,24 @@ #!/usr/bin/env node -// program -// .version(config.package.version) -// .description('Configuration files manager.') - -const { TermApplication, Command, InitCommand, ConfigService } = require('../src') -const { getOptionsFilePath, getPackageData } = require('../src/shared/utils') - -;(() => { +const { + TermApplication, + Command, + InitCommand, + ConfigService, + OPTION_PATH_FILE_TOKEN, + getOptionsFilePath, + getPackageData +} = require('../src'); + +(() => { const cli = TermApplication.createInstance() const pkg = getPackageData() cli.version = pkg.version + cli.description = 'Configuration files manager.' - cli.provide(ConfigService, [{ useValue: getOptionsFilePath() }]) + cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) + cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) cli.register(InitCommand, [ConfigService]) cli.register(class extends Command { // modules namespace diff --git a/src/core/term-application.js b/src/core/term-application.js index 9bc7637f..d008ad87 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -13,6 +13,14 @@ export class TermApplication extends AbstractApplication { this._version = semanticVersion } + get description() { + return this._desc + } + + set description(text) { + this._desc = text + } + buildInstructions() { return [ { provide: TermApplication, dependencies: [] } @@ -35,6 +43,10 @@ export class TermApplication extends AbstractApplication { return } + program + .version(this.version) + .description(this.description) + for (const commandClass of this.commands) { const controller = this.injectorService.get(commandClass) diff --git a/src/main.js b/src/main.js index 46f99398..e7bf9189 100644 --- a/src/main.js +++ b/src/main.js @@ -7,3 +7,6 @@ export * from './services/file.service' export * from './services/exec/exec.service' export * from './services/deploy/deploy.service' export * from './services/config/config.service' + +export * from './shared/utils' +export * from './shared/config' diff --git a/src/shared/config.js b/src/shared/config.js new file mode 100644 index 00000000..8149f86f --- /dev/null +++ b/src/shared/config.js @@ -0,0 +1,3 @@ +import { InjectionToken } from 'yabf' + +export const OPTION_PATH_FILE_TOKEN = new InjectionToken() From c17fde46645ec0ef7ea61052fcf058e3a367ddf6 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 05:45:43 +0100 Subject: [PATCH 050/341] Use ES6 import syntax in utils --- src/shared/utils/fs.utils.js | 10 ++++------ src/shared/utils/git.utils.js | 8 ++------ src/shared/utils/log.utils.js | 8 ++------ src/shared/utils/process.utils.js | 6 ++---- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/shared/utils/fs.utils.js b/src/shared/utils/fs.utils.js index a9ebca0b..99222803 100644 --- a/src/shared/utils/fs.utils.js +++ b/src/shared/utils/fs.utils.js @@ -1,10 +1,10 @@ -const fs = require('fs') -const util = require('util') -const path = require('path') +import fs from 'fs' +import util from 'util' +import path from 'path' const PATH_REGEX = /^(?:(?:~|\.{1,2})?\/)+(?:[a-zA-Z.\-_]+\/?)*$/ -class FsUtils { +export class FsUtils { static isFilePath(text) { return PATH_REGEX.test(text) } @@ -84,5 +84,3 @@ class FsUtils { }), Promise.resolve(pathname[0] === '/' ? '/' : '')) } } - -module.exports = exports = { FsUtils } diff --git a/src/shared/utils/git.utils.js b/src/shared/utils/git.utils.js index 2f1af6b1..604bdaa5 100644 --- a/src/shared/utils/git.utils.js +++ b/src/shared/utils/git.utils.js @@ -1,8 +1,8 @@ -const git = require('gift') +import git from 'gift' const URL_REGEX = /(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|#[-\d\w._]+?)$/ -class GitUtils { +export class GitUtils { static clone(repoUrl, repoPath) { return new Promise((resolve, reject) => { git.clone(repoUrl, repoPath, (error, repo) => { @@ -20,7 +20,3 @@ class GitUtils { return URL_REGEX.test(text) } } - -module.exports = exports = { - GitUtils -} diff --git a/src/shared/utils/log.utils.js b/src/shared/utils/log.utils.js index 276e724d..5318521c 100644 --- a/src/shared/utils/log.utils.js +++ b/src/shared/utils/log.utils.js @@ -1,6 +1,6 @@ -const color = require('chalk') +import color from 'chalk' -class LogUtils { +export class LogUtils { static get loggerOptions() { return { error: { @@ -61,7 +61,3 @@ class LogUtils { console.log('') } } - -module.exports = exports = { - LogUtils -} diff --git a/src/shared/utils/process.utils.js b/src/shared/utils/process.utils.js index 7154e344..0b1a70e6 100644 --- a/src/shared/utils/process.utils.js +++ b/src/shared/utils/process.utils.js @@ -1,6 +1,6 @@ -const childProcess = require('child_process') +import childProcess from 'child_process' -class ProcessUtils { +export class ProcessUtils { static execFile(filename) { const child = childProcess.execFile(filename) @@ -14,5 +14,3 @@ class ProcessUtils { } } } - -module.exports = exports = { ProcessUtils } From 5c1e66df8b1aefb413682aeaf9f552703dec7f1c Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 05:46:29 +0100 Subject: [PATCH 051/341] Use ES6 import syntax in errors --- src/shared/errors/file-not-directory.error.js | 4 +--- src/shared/errors/folder-not-empty.error.js | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/shared/errors/file-not-directory.error.js b/src/shared/errors/file-not-directory.error.js index b2c27501..d457e11a 100644 --- a/src/shared/errors/file-not-directory.error.js +++ b/src/shared/errors/file-not-directory.error.js @@ -1,7 +1,5 @@ -class FileNotDirectory extends Error { +export class FileNotDirectory extends Error { constructor(message = `Path doesn't corresponding to a folder.`) { super(message) } } - -module.exports = exports = { FileNotDirectory } diff --git a/src/shared/errors/folder-not-empty.error.js b/src/shared/errors/folder-not-empty.error.js index bcb184f5..555954d3 100644 --- a/src/shared/errors/folder-not-empty.error.js +++ b/src/shared/errors/folder-not-empty.error.js @@ -1,7 +1,5 @@ -class FolderNotEmpty extends Error { +export class FolderNotEmpty extends Error { constructor(message = 'Folder is not empty.') { super(message) } } - -module.exports = exports = { FolderNotEmpty } From 32f5571c87963a1b98ead3a701a052565c9ea23b Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 05:53:13 +0100 Subject: [PATCH 052/341] Use ES6 import syntax in services --- .../config/config-file-not-exist.error.js | 4 +- src/services/config/config.service.js | 10 ++- src/services/config/index.js | 9 +-- src/services/deploy/deploy.service.js | 10 ++- src/services/deploy/index.js | 9 +-- .../deploy/target-file-already-exist.error.js | 4 +- .../exec/bad-script-permission.error.js | 4 +- src/services/exec/exec.service.js | 10 ++- src/services/exec/index.js | 12 +--- src/services/exec/script-not-exist.error.js | 4 +- src/services/file.service.js | 10 ++- src/services/index.js | 17 ++--- src/services/injector.service.js | 71 ------------------- 13 files changed, 31 insertions(+), 143 deletions(-) delete mode 100644 src/services/injector.service.js diff --git a/src/services/config/config-file-not-exist.error.js b/src/services/config/config-file-not-exist.error.js index 03da13aa..a7347400 100644 --- a/src/services/config/config-file-not-exist.error.js +++ b/src/services/config/config-file-not-exist.error.js @@ -1,7 +1,5 @@ -class ConfigurationFileNotExist extends Error { +export class ConfigurationFileNotExist extends Error { constructor(message = 'No configuration file found. You need to run the init command to create it.') { super(message) } } - -module.exports = exports = { ConfigurationFileNotExist } diff --git a/src/services/config/config.service.js b/src/services/config/config.service.js index 408f104c..aa9d39ca 100644 --- a/src/services/config/config.service.js +++ b/src/services/config/config.service.js @@ -1,9 +1,9 @@ -const fs = require('fs') +import fs from 'fs' -const { ConfigurationFileNotExist } = require('./config-file-not-exist.error') -const { FsUtils } = require('../../shared/utils') +import { ConfigurationFileNotExist } from './config-file-not-exist.error' +import { FsUtils } from '../../shared/utils' -class ConfigService { +export class ConfigService { get repoUrl() { return this.getConfig('repo_url') } @@ -85,5 +85,3 @@ class ConfigService { fs.writeFileSync(this.configPath, JSON.stringify(configData, null, 4)) } } - -module.exports = exports = { ConfigService } diff --git a/src/services/config/index.js b/src/services/config/index.js index 0c28a720..a4dd481c 100644 --- a/src/services/config/index.js +++ b/src/services/config/index.js @@ -1,7 +1,2 @@ -const { ConfigService } = require('./config.service') -const { ConfigurationFileNotExist } = require('./config-file-not-exist.error') - -module.exports = exports = { - ConfigService, - ConfigurationFileNotExist -} +export * from './config.service' +export * from './config-file-not-exist.error' diff --git a/src/services/deploy/deploy.service.js b/src/services/deploy/deploy.service.js index 229e9128..08eabae8 100644 --- a/src/services/deploy/deploy.service.js +++ b/src/services/deploy/deploy.service.js @@ -1,9 +1,9 @@ -const path = require('path') +import path from 'path' -const { FsUtils, LogUtils } = require('../../shared/utils') -const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') +import { FsUtils, LogUtils } from '../../shared/utils' +import { TargetFileAlreadyExist } from './target-file-already-exist.error' -class DeployService { +export class DeployService { async deployLocalFile({ source, target, global: isGlobalFile }, force = false) { if (isGlobalFile) { throw new TypeError('Unable to deploy global file as a local one.') @@ -80,5 +80,3 @@ class DeployService { } } } - -module.exports = exports = { DeployService } diff --git a/src/services/deploy/index.js b/src/services/deploy/index.js index bf21d62e..8db56819 100644 --- a/src/services/deploy/index.js +++ b/src/services/deploy/index.js @@ -1,7 +1,2 @@ -const { DeployService } = require('./deploy.service') -const { TargetFileAlreadyExist } = require('./target-file-already-exist.error') - -module.exports = exports = { - DeployService, - TargetFileAlreadyExist -} +export * from './deploy.service' +export * from './target-file-already-exist.error' diff --git a/src/services/deploy/target-file-already-exist.error.js b/src/services/deploy/target-file-already-exist.error.js index fa1dcd5e..ecbb0bbd 100644 --- a/src/services/deploy/target-file-already-exist.error.js +++ b/src/services/deploy/target-file-already-exist.error.js @@ -1,9 +1,7 @@ -class TargetFileAlreadyExist extends Error { +export class TargetFileAlreadyExist extends Error { constructor(filename, message = `Target file "${filename}" already exist.`) { super(message) this.filename = filename } } - -module.exports = exports = { TargetFileAlreadyExist } diff --git a/src/services/exec/bad-script-permission.error.js b/src/services/exec/bad-script-permission.error.js index 0a3f616b..6d2982d6 100644 --- a/src/services/exec/bad-script-permission.error.js +++ b/src/services/exec/bad-script-permission.error.js @@ -1,9 +1,7 @@ -class BadScriptPermission extends Error { +export class BadScriptPermission extends Error { constructor(scriptName, message = `Bad permission on "${scriptName}" script.`) { super(message) this.scriptName = scriptName } } - -module.exports = exports = { BadScriptPermission } diff --git a/src/services/exec/exec.service.js b/src/services/exec/exec.service.js index f44dc634..066b5e3f 100644 --- a/src/services/exec/exec.service.js +++ b/src/services/exec/exec.service.js @@ -1,8 +1,8 @@ -const { FsUtils, ProcessUtils, LogUtils } = require('../../shared/utils') -const { ScriptNotExist } = require('./script-not-exist.error') -const { BadScriptPermission } = require('./bad-script-permission.error') +import { FsUtils, ProcessUtils, LogUtils } from '../../shared/utils' +import { ScriptNotExist } from './script-not-exist.error' +import { BadScriptPermission } from './bad-script-permission.error' -class ExecService { +export class ExecService { async runScript(script) { if (script == null) { throw new ScriptNotExist(script.script) @@ -30,5 +30,3 @@ class ExecService { } } } - -module.exports = exports = { ExecService } diff --git a/src/services/exec/index.js b/src/services/exec/index.js index 9bdf7e52..8071a615 100644 --- a/src/services/exec/index.js +++ b/src/services/exec/index.js @@ -1,9 +1,3 @@ -const { ExecService } = require('./exec.service') -const { BadScriptPermission } = require('./bad-script-permission.error') -const { ScriptNotExist } = require('./script-not-exist.error') - -module.exports = exports = { - ExecService, - BadScriptPermission, - ScriptNotExist -} +export * from './exec.service' +export * from './bad-script-permission.error' +export * from './script-not-exist.error' diff --git a/src/services/exec/script-not-exist.error.js b/src/services/exec/script-not-exist.error.js index a2349cf2..ba091100 100644 --- a/src/services/exec/script-not-exist.error.js +++ b/src/services/exec/script-not-exist.error.js @@ -1,9 +1,7 @@ -class ScriptNotExist extends Error { +export class ScriptNotExist extends Error { constructor(scriptName, message = `Script "${scriptName}" doesn't exist.`) { super(message) this.scriptName = scriptName } } - -module.exports = exports = { ScriptNotExist } diff --git a/src/services/file.service.js b/src/services/file.service.js index ef6b9923..b0caa7e9 100644 --- a/src/services/file.service.js +++ b/src/services/file.service.js @@ -1,9 +1,9 @@ -const fs = require('fs') -const path = require('path') +import fs from 'fs' +import path from 'path' -const { FsUtils, LogUtils } = require('../shared/utils') +import { FsUtils, LogUtils } from '../shared/utils' -class FileService { +export class FileService { get scripts() { const folderContent = fs.readdirSync(path.join(this.configService.folderPath, 'scripts')) const authorizedExtensions = this.configService.scriptExtension @@ -88,5 +88,3 @@ class FileService { .shift() } } - -module.exports = exports = { FileService } diff --git a/src/services/index.js b/src/services/index.js index 9cb539ba..3dbc9e75 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,13 +1,4 @@ -const config = require('./config') -const file = require('./file.service') -const exec = require('./exec') -const deploy = require('./deploy') -const injector = require('./injector.service') - -module.exports = exports = { - ...config, - ...file, - ...exec, - ...deploy, - ...injector -} +export * from './config' +export * from './deploy' +export * from './exec' +export * from './file.service' diff --git a/src/services/injector.service.js b/src/services/injector.service.js deleted file mode 100644 index f1df5634..00000000 --- a/src/services/injector.service.js +++ /dev/null @@ -1,71 +0,0 @@ -class InjectorService { - constructor() { - this.data = [] - } - - static getMainInstance() { - const previousInstance = InjectorService.instances.find(instance => instance instanceof InjectorService) - - if (previousInstance != null) { - return previousInstance - } - - InjectorService.instances.push(new InjectorService()) - - return InjectorService.getMainInstance() - } - - provide(useClass, params = []) { - const alreadyExist = this.data - .filter(service => service.useClass === useClass) - .length > 0 - - if (alreadyExist) { - return - } - - this.data.push({ - useClass, - params: params.map(param => { - if (param.useValue != null || param.useClass != null) { - return param - } - - return { - useClass: param - } - }) - }) - } - - get(useClass) { - const previousInstance = InjectorService.instances.find(instance => instance instanceof useClass) - - if (previousInstance != null) { - return previousInstance - } - - const data = this.data.find(data => data.useClass === useClass) - - if (data != null) { - const Class = data.useClass - const instance = new Class(...data.params.map(param => { - if (param.useClass != null) { - return this.get(param.useClass) - } - - return param.useValue - })) - - InjectorService.instances.push(instance) - - return instance - } - - return null - } -} - -InjectorService.instances = [] - -module.exports = exports = { InjectorService } From dded158f81ed2bb1c235c0914ca5b36475f50f04 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 05:56:17 +0100 Subject: [PATCH 053/341] Use ES6 import syntax in commands --- src/commands/deploy/deploy-stop-by-user.error.js | 4 +--- src/commands/init/init-stop-by-user.error.js | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/commands/deploy/deploy-stop-by-user.error.js b/src/commands/deploy/deploy-stop-by-user.error.js index 82da70dc..9cb987dc 100644 --- a/src/commands/deploy/deploy-stop-by-user.error.js +++ b/src/commands/deploy/deploy-stop-by-user.error.js @@ -1,7 +1,5 @@ -class DeployStopedByUser extends Error { +export class DeployStopedByUser extends Error { constructor(message = 'User stop the deployment phase.') { super(message) } } - -module.exports = exports = { DeployStopedByUser } diff --git a/src/commands/init/init-stop-by-user.error.js b/src/commands/init/init-stop-by-user.error.js index 23333e4f..29438c94 100644 --- a/src/commands/init/init-stop-by-user.error.js +++ b/src/commands/init/init-stop-by-user.error.js @@ -1,7 +1,5 @@ -class InitStopedByUser extends Error { +export class InitStopedByUser extends Error { constructor(message = 'User stop the init phase.') { super(message) } } - -module.exports = exports = { InitStopedByUser } From 47da52802b4f5926291909960dafd749359dd164 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 06:07:34 +0100 Subject: [PATCH 054/341] Reorganize commands folder --- bin/configfile-modules.js | 8 ++++---- bin/configfile-scripts.js | 8 ++++---- src/commands/index.js | 8 +++----- src/commands/init/index.js | 2 ++ src/commands/{ => init}/init.command.js | 8 ++++---- .../{deploy => modules}/deploy-stop-by-user.error.js | 0 .../deploy.command.js} | 12 ++++++------ src/commands/modules/index.js | 3 +++ .../list.command.js} | 8 ++++---- src/commands/scripts/index.js | 2 ++ .../list.command.js} | 8 ++++---- .../run.command.js} | 12 ++++++------ 12 files changed, 42 insertions(+), 37 deletions(-) create mode 100644 src/commands/init/index.js rename src/commands/{ => init}/init.command.js (93%) rename src/commands/{deploy => modules}/deploy-stop-by-user.error.js (100%) rename src/commands/{modules-deploy.command.js => modules/deploy.command.js} (91%) create mode 100644 src/commands/modules/index.js rename src/commands/{modules-list.command.js => modules/list.command.js} (81%) create mode 100644 src/commands/scripts/index.js rename src/commands/{scripts-list.command.js => scripts/list.command.js} (81%) rename src/commands/{scripts-run.command.js => scripts/run.command.js} (76%) diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index 37a4cbca..34e740e9 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -3,8 +3,8 @@ const { FileService, TermApplication, - ModulesListCommand, - ModulesDeployCommand, + ListModulesCommand, + DeployModuleCommand, DeployService, ConfigService, OPTION_PATH_FILE_TOKEN, @@ -19,8 +19,8 @@ const { cli.version = pkg.version cli.description = 'Configuration modules manager.' - cli.register(ModulesListCommand, [FileService]) - cli.register(ModulesDeployCommand, [FileService, DeployService]) + cli.register(ListModulesCommand, [FileService]) + cli.register(DeployModuleCommand, [FileService, DeployService]) cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) cli.provide(FileService, [ConfigService]) diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 1293c74e..778888e6 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -4,8 +4,8 @@ const { FileService, ExecService, TermApplication, - ScriptsListCommand, - ScriptsRunCommand, + ListScriptsCommand, + RunScriptCommand, ConfigService, OPTION_PATH_FILE_TOKEN, getOptionsFilePath, @@ -19,8 +19,8 @@ const { cli.version = pkg.version cli.description = 'Custom scripts manager.' - cli.register(ScriptsRunCommand, [ExecService, FileService]) - cli.register(ScriptsListCommand, [FileService]) + cli.register(RunScriptCommand, [ExecService, FileService]) + cli.register(ListScriptsCommand, [FileService]) cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) cli.provide(FileService, [ConfigService]) diff --git a/src/commands/index.js b/src/commands/index.js index b98501af..55d93390 100644 --- a/src/commands/index.js +++ b/src/commands/index.js @@ -1,5 +1,3 @@ -export * from './init.command' -export * from './modules-deploy.command' -export * from './modules-list.command' -export * from './scripts-list.command' -export * from './scripts-run.command' +export * from './init' +export * from './modules' +export * from './scripts' diff --git a/src/commands/init/index.js b/src/commands/init/index.js new file mode 100644 index 00000000..90c7b87a --- /dev/null +++ b/src/commands/init/index.js @@ -0,0 +1,2 @@ +export * from './init.command' +export * from './init-stop-by-user.error' diff --git a/src/commands/init.command.js b/src/commands/init/init.command.js similarity index 93% rename from src/commands/init.command.js rename to src/commands/init/init.command.js index 8478828f..d543a8ac 100644 --- a/src/commands/init.command.js +++ b/src/commands/init/init.command.js @@ -2,10 +2,10 @@ import inquirer from 'inquirer' import fs from 'fs' import path from 'path' -import { Command } from '../core/command' -import { LogUtils, FsUtils, GitUtils } from '../shared/utils' -import { InitStopedByUser } from '../commands/init/init-stop-by-user.error' -import { FileNotDirectory, FolderNotEmpty } from '../shared/errors' +import { Command } from '../../core/command' +import { LogUtils, FsUtils, GitUtils } from '../../shared/utils' +import { InitStopedByUser } from './init-stop-by-user.error' +import { FileNotDirectory, FolderNotEmpty } from '../../shared/errors' export class InitCommand extends Command { get commandName() { diff --git a/src/commands/deploy/deploy-stop-by-user.error.js b/src/commands/modules/deploy-stop-by-user.error.js similarity index 100% rename from src/commands/deploy/deploy-stop-by-user.error.js rename to src/commands/modules/deploy-stop-by-user.error.js diff --git a/src/commands/modules-deploy.command.js b/src/commands/modules/deploy.command.js similarity index 91% rename from src/commands/modules-deploy.command.js rename to src/commands/modules/deploy.command.js index c50c0ff5..3954f493 100644 --- a/src/commands/modules-deploy.command.js +++ b/src/commands/modules/deploy.command.js @@ -1,12 +1,12 @@ import inquirer from 'inquirer' -import { Command } from '../core/command' -import { ConfigurationFileNotExist } from '../services/config' -import { LogUtils } from '../shared/utils' -import { DeployStopedByUser } from '../commands/deploy/deploy-stop-by-user.error' -import { TargetFileAlreadyExist } from '../services' +import { Command } from '../../core/command' +import { ConfigurationFileNotExist } from '../../services/config' +import { LogUtils } from '../../shared/utils' +import { DeployStopedByUser } from './deploy-stop-by-user.error' +import { TargetFileAlreadyExist } from '../../services' -export class ModulesDeployCommand extends Command { +export class DeployModuleCommand extends Command { get commandName() { return 'deploy [modules...]' } diff --git a/src/commands/modules/index.js b/src/commands/modules/index.js new file mode 100644 index 00000000..c02e88e1 --- /dev/null +++ b/src/commands/modules/index.js @@ -0,0 +1,3 @@ +export * from './deploy-stop-by-user.error' +export * from './deploy.command' +export * from './list.command' diff --git a/src/commands/modules-list.command.js b/src/commands/modules/list.command.js similarity index 81% rename from src/commands/modules-list.command.js rename to src/commands/modules/list.command.js index ddf27ea6..1b4e2d82 100644 --- a/src/commands/modules-list.command.js +++ b/src/commands/modules/list.command.js @@ -1,8 +1,8 @@ -import { Command } from '../core/command' -import { ConfigurationFileNotExist } from '../services/config' -import { LogUtils } from '../shared/utils' +import { Command } from '../../core/command' +import { ConfigurationFileNotExist } from '../../services/config' +import { LogUtils } from '../../shared/utils' -export class ModulesListCommand extends Command { +export class ListModulesCommand extends Command { get commandName() { return 'list' } diff --git a/src/commands/scripts/index.js b/src/commands/scripts/index.js new file mode 100644 index 00000000..37a7786e --- /dev/null +++ b/src/commands/scripts/index.js @@ -0,0 +1,2 @@ +export * from './list.command' +export * from './run.command' diff --git a/src/commands/scripts-list.command.js b/src/commands/scripts/list.command.js similarity index 81% rename from src/commands/scripts-list.command.js rename to src/commands/scripts/list.command.js index f9275749..2b63c92e 100644 --- a/src/commands/scripts-list.command.js +++ b/src/commands/scripts/list.command.js @@ -1,8 +1,8 @@ -import { Command } from '../core/command' -import { ConfigurationFileNotExist } from '../services/config' -import { LogUtils } from '../shared/utils' +import { Command } from '../../core/command' +import { ConfigurationFileNotExist } from '../../services/config' +import { LogUtils } from '../../shared/utils' -export class ScriptsListCommand extends Command { +export class ListScriptsCommand extends Command { get commandName() { return 'list' } diff --git a/src/commands/scripts-run.command.js b/src/commands/scripts/run.command.js similarity index 76% rename from src/commands/scripts-run.command.js rename to src/commands/scripts/run.command.js index e8edf880..6bfed2d8 100644 --- a/src/commands/scripts-run.command.js +++ b/src/commands/scripts/run.command.js @@ -1,10 +1,10 @@ -import { Command } from '../core/command' -import { ConfigurationFileNotExist } from '../services/config' -import { LogUtils } from '../shared/utils' -import { BadScriptPermission } from '../services/exec/bad-script-permission.error' -import { ScriptNotExist } from '../services/exec/script-not-exist.error' +import { Command } from '../../core/command' +import { ConfigurationFileNotExist } from '../../services/config' +import { LogUtils } from '../../shared/utils' +import { BadScriptPermission } from '../../services/exec/bad-script-permission.error' +import { ScriptNotExist } from '../../services/exec/script-not-exist.error' -export class ScriptsRunCommand extends Command { +export class RunScriptCommand extends Command { get commandName() { return 'run ' } From f43a155497b3a989398c0e4093e2012f3801899a Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 06:10:01 +0100 Subject: [PATCH 055/341] Update the CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 657ce135..0b85132a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - Add new contrubitor to SPONSORS.md +### Changed +- Use [Yabf](https://github.com/Mindsers/yabf) as base to build the next configfile. + ### Fixed - Git URL verification in `init` command is less strict. ([#48](https://github.com/Mindsers/configfile/issues/48)) From f60d31779fd2855531dc990802a726e64a610522 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 09:36:20 +0100 Subject: [PATCH 056/341] src/index.js is not an executable --- src/index.js | 1 - 1 file changed, 1 deletion(-) mode change 100755 => 100644 src/index.js diff --git a/src/index.js b/src/index.js old mode 100755 new mode 100644 index 486920ca..eeeb7bb4 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,3 @@ -#!/usr/bin/env node 'use strict' require = require('esm')(module) // eslint-disable-line no-global-assign From 8efe32212bb46e1a60ab85e79973bdb35263d9fb Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 17:08:39 +0100 Subject: [PATCH 057/341] Fix unit tets --- tests/services/exec/exec.service.js | 4 ++-- tests/services/file.service.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/services/exec/exec.service.js b/tests/services/exec/exec.service.js index 3e358764..2587178d 100644 --- a/tests/services/exec/exec.service.js +++ b/tests/services/exec/exec.service.js @@ -3,8 +3,8 @@ import fs from 'fs' import path from 'path' import rimraf from 'rimraf' -import { ExecService } from '../../src/services/exec.service' -import { ScriptNotExist } from '../../src/services/exec' +import { ExecService } from '../../../src/services/exec.service' +import { ScriptNotExist } from '../../../src/services/exec' const tmpData = path.join(__dirname, './env-file') diff --git a/tests/services/file.service.js b/tests/services/file.service.js index 72cff187..d98d86e3 100644 --- a/tests/services/file.service.js +++ b/tests/services/file.service.js @@ -3,7 +3,7 @@ import fs from 'fs' import path from 'path' import rimraf from 'rimraf' -import { FileService } from '../../src/services/file.service' +import { FileService } from '../../src' const tmpData = path.join(__dirname, './env-file') From 8586279406ab75aeb66ce369b3d231389bd4a801 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 17:20:37 +0100 Subject: [PATCH 058/341] Move shared errors to shared/errors/ folder --- src/commands/init/init.command.js | 3 ++- src/commands/modules/deploy.command.js | 6 +++--- src/commands/modules/list.command.js | 2 +- src/commands/scripts/list.command.js | 4 ++-- src/commands/scripts/run.command.js | 6 ++---- src/core/index.js | 2 ++ src/main.js | 11 +++-------- src/services/{config => }/config.service.js | 4 ++-- src/services/config/index.js | 2 -- src/services/{deploy => }/deploy.service.js | 4 ++-- src/services/deploy/index.js | 2 -- src/services/{exec => }/exec.service.js | 5 ++--- src/services/exec/index.js | 3 --- src/services/index.js | 6 +++--- .../errors}/bad-script-permission.error.js | 0 .../errors}/config-file-not-exist.error.js | 0 src/shared/errors/index.js | 4 ++++ .../exec => shared/errors}/script-not-exist.error.js | 0 .../errors}/target-file-already-exist.error.js | 0 19 files changed, 28 insertions(+), 36 deletions(-) create mode 100644 src/core/index.js rename src/services/{config => }/config.service.js (93%) delete mode 100644 src/services/config/index.js rename src/services/{deploy => }/deploy.service.js (93%) delete mode 100644 src/services/deploy/index.js rename src/services/{exec => }/exec.service.js (76%) delete mode 100644 src/services/exec/index.js rename src/{services/exec => shared/errors}/bad-script-permission.error.js (100%) rename src/{services/config => shared/errors}/config-file-not-exist.error.js (100%) rename src/{services/exec => shared/errors}/script-not-exist.error.js (100%) rename src/{services/deploy => shared/errors}/target-file-already-exist.error.js (100%) diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js index d543a8ac..a7544a82 100644 --- a/src/commands/init/init.command.js +++ b/src/commands/init/init.command.js @@ -4,9 +4,10 @@ import path from 'path' import { Command } from '../../core/command' import { LogUtils, FsUtils, GitUtils } from '../../shared/utils' -import { InitStopedByUser } from './init-stop-by-user.error' import { FileNotDirectory, FolderNotEmpty } from '../../shared/errors' +import { InitStopedByUser } from './init-stop-by-user.error' + export class InitCommand extends Command { get commandName() { return 'init' diff --git a/src/commands/modules/deploy.command.js b/src/commands/modules/deploy.command.js index 3954f493..7c69a3f4 100644 --- a/src/commands/modules/deploy.command.js +++ b/src/commands/modules/deploy.command.js @@ -1,10 +1,10 @@ import inquirer from 'inquirer' -import { Command } from '../../core/command' -import { ConfigurationFileNotExist } from '../../services/config' +import { Command } from '../../core' +import { ConfigurationFileNotExist, TargetFileAlreadyExist } from '../../shared/errors' import { LogUtils } from '../../shared/utils' + import { DeployStopedByUser } from './deploy-stop-by-user.error' -import { TargetFileAlreadyExist } from '../../services' export class DeployModuleCommand extends Command { get commandName() { diff --git a/src/commands/modules/list.command.js b/src/commands/modules/list.command.js index 1b4e2d82..61d80b57 100644 --- a/src/commands/modules/list.command.js +++ b/src/commands/modules/list.command.js @@ -1,5 +1,5 @@ import { Command } from '../../core/command' -import { ConfigurationFileNotExist } from '../../services/config' +import { ConfigurationFileNotExist } from '../../shared/errors' import { LogUtils } from '../../shared/utils' export class ListModulesCommand extends Command { diff --git a/src/commands/scripts/list.command.js b/src/commands/scripts/list.command.js index 2b63c92e..f86d43c2 100644 --- a/src/commands/scripts/list.command.js +++ b/src/commands/scripts/list.command.js @@ -1,5 +1,5 @@ -import { Command } from '../../core/command' -import { ConfigurationFileNotExist } from '../../services/config' +import { Command } from '../../core' +import { ConfigurationFileNotExist } from '../../shared/errors' import { LogUtils } from '../../shared/utils' export class ListScriptsCommand extends Command { diff --git a/src/commands/scripts/run.command.js b/src/commands/scripts/run.command.js index 6bfed2d8..831c5465 100644 --- a/src/commands/scripts/run.command.js +++ b/src/commands/scripts/run.command.js @@ -1,8 +1,6 @@ -import { Command } from '../../core/command' -import { ConfigurationFileNotExist } from '../../services/config' +import { Command } from '../../core' +import { ConfigurationFileNotExist, BadScriptPermission, ScriptNotExist } from '../../shared/errors' import { LogUtils } from '../../shared/utils' -import { BadScriptPermission } from '../../services/exec/bad-script-permission.error' -import { ScriptNotExist } from '../../services/exec/script-not-exist.error' export class RunScriptCommand extends Command { get commandName() { diff --git a/src/core/index.js b/src/core/index.js new file mode 100644 index 00000000..29c35ffc --- /dev/null +++ b/src/core/index.js @@ -0,0 +1,2 @@ +export * from './term-application' +export * from './command' diff --git a/src/main.js b/src/main.js index e7bf9189..a06bccbe 100644 --- a/src/main.js +++ b/src/main.js @@ -1,12 +1,7 @@ -export * from './core/term-application' -export * from './core/command' - +export * from './core' export * from './commands' - -export * from './services/file.service' -export * from './services/exec/exec.service' -export * from './services/deploy/deploy.service' -export * from './services/config/config.service' +export * from './services' export * from './shared/utils' export * from './shared/config' +export * from './shared/errors' diff --git a/src/services/config/config.service.js b/src/services/config.service.js similarity index 93% rename from src/services/config/config.service.js rename to src/services/config.service.js index aa9d39ca..ec34e427 100644 --- a/src/services/config/config.service.js +++ b/src/services/config.service.js @@ -1,7 +1,7 @@ import fs from 'fs' -import { ConfigurationFileNotExist } from './config-file-not-exist.error' -import { FsUtils } from '../../shared/utils' +import { ConfigurationFileNotExist } from '../shared/errors' +import { FsUtils } from '../shared/utils' export class ConfigService { get repoUrl() { diff --git a/src/services/config/index.js b/src/services/config/index.js deleted file mode 100644 index a4dd481c..00000000 --- a/src/services/config/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './config.service' -export * from './config-file-not-exist.error' diff --git a/src/services/deploy/deploy.service.js b/src/services/deploy.service.js similarity index 93% rename from src/services/deploy/deploy.service.js rename to src/services/deploy.service.js index 08eabae8..881782ba 100644 --- a/src/services/deploy/deploy.service.js +++ b/src/services/deploy.service.js @@ -1,7 +1,7 @@ import path from 'path' -import { FsUtils, LogUtils } from '../../shared/utils' -import { TargetFileAlreadyExist } from './target-file-already-exist.error' +import { FsUtils, LogUtils } from '../shared/utils' +import { TargetFileAlreadyExist } from '../shared/errors' export class DeployService { async deployLocalFile({ source, target, global: isGlobalFile }, force = false) { diff --git a/src/services/deploy/index.js b/src/services/deploy/index.js deleted file mode 100644 index 8db56819..00000000 --- a/src/services/deploy/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './deploy.service' -export * from './target-file-already-exist.error' diff --git a/src/services/exec/exec.service.js b/src/services/exec.service.js similarity index 76% rename from src/services/exec/exec.service.js rename to src/services/exec.service.js index 066b5e3f..bf7b211b 100644 --- a/src/services/exec/exec.service.js +++ b/src/services/exec.service.js @@ -1,6 +1,5 @@ -import { FsUtils, ProcessUtils, LogUtils } from '../../shared/utils' -import { ScriptNotExist } from './script-not-exist.error' -import { BadScriptPermission } from './bad-script-permission.error' +import { FsUtils, ProcessUtils, LogUtils } from '../shared/utils' +import { ScriptNotExist, BadScriptPermission } from '../shared/errors' export class ExecService { async runScript(script) { diff --git a/src/services/exec/index.js b/src/services/exec/index.js deleted file mode 100644 index 8071a615..00000000 --- a/src/services/exec/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from './exec.service' -export * from './bad-script-permission.error' -export * from './script-not-exist.error' diff --git a/src/services/index.js b/src/services/index.js index 3dbc9e75..97c24954 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,4 +1,4 @@ -export * from './config' -export * from './deploy' -export * from './exec' +export * from './config.service' +export * from './deploy.service' +export * from './exec.service' export * from './file.service' diff --git a/src/services/exec/bad-script-permission.error.js b/src/shared/errors/bad-script-permission.error.js similarity index 100% rename from src/services/exec/bad-script-permission.error.js rename to src/shared/errors/bad-script-permission.error.js diff --git a/src/services/config/config-file-not-exist.error.js b/src/shared/errors/config-file-not-exist.error.js similarity index 100% rename from src/services/config/config-file-not-exist.error.js rename to src/shared/errors/config-file-not-exist.error.js diff --git a/src/shared/errors/index.js b/src/shared/errors/index.js index a7ab9ae3..50af9ecb 100644 --- a/src/shared/errors/index.js +++ b/src/shared/errors/index.js @@ -1,2 +1,6 @@ export * from './file-not-directory.error' export * from './folder-not-empty.error' +export * from './bad-script-permission.error' +export * from './config-file-not-exist.error' +export * from './script-not-exist.error' +export * from './target-file-already-exist.error' diff --git a/src/services/exec/script-not-exist.error.js b/src/shared/errors/script-not-exist.error.js similarity index 100% rename from src/services/exec/script-not-exist.error.js rename to src/shared/errors/script-not-exist.error.js diff --git a/src/services/deploy/target-file-already-exist.error.js b/src/shared/errors/target-file-already-exist.error.js similarity index 100% rename from src/services/deploy/target-file-already-exist.error.js rename to src/shared/errors/target-file-already-exist.error.js From 58a1e477625a741f5089c1a3c7e0419f1df9e24d Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 17:23:37 +0100 Subject: [PATCH 059/341] Export only commands --- src/commands/init/index.js | 1 - src/commands/modules/index.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/commands/init/index.js b/src/commands/init/index.js index 90c7b87a..88f77fce 100644 --- a/src/commands/init/index.js +++ b/src/commands/init/index.js @@ -1,2 +1 @@ export * from './init.command' -export * from './init-stop-by-user.error' diff --git a/src/commands/modules/index.js b/src/commands/modules/index.js index c02e88e1..b0db02f0 100644 --- a/src/commands/modules/index.js +++ b/src/commands/modules/index.js @@ -1,3 +1,2 @@ -export * from './deploy-stop-by-user.error' export * from './deploy.command' export * from './list.command' From c5502fcb4bde4bb7e9c5754484d1500bd0185200 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 17:38:46 +0100 Subject: [PATCH 060/341] Fix documentation --- docs/home.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/home.md b/docs/home.md index 78e37ff0..0a708454 100644 --- a/docs/home.md +++ b/docs/home.md @@ -8,12 +8,14 @@ To install Configfile: ```bash npm install -g configfile@latest +# or +yarn global add configfile@latest ``` Generating first configuration: ```bash -configfiles init +configfile init ``` It is an interactive command. Answer questions. @@ -23,7 +25,7 @@ It is an interactive command. Answer questions. Unit test will be available via: ```bash -npm test +yarn test ``` ### Additional commands From 7f7e25342b043ab394e47d13a2f417f4b6ed645d Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 17:39:02 +0100 Subject: [PATCH 061/341] Add missing options in documentation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 753fd13f..a990b062 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ yarn global add configfile@latest ## Usage - `configfile init` or `configfile i`: Initialize *configfile* on the current user session. + - `-f, --force` force current configuration to be overwritten. - `configfile modules list` or `configfile m l`: Display a list of all modules available via *Configfile*. - `configfile modules deploy [moduleName...]` or `configfile m d [moduleName...]`: Deploy the configuration files for the given module name. - `-l, --local` deploy authorized file to the current directory. From 0e4665135986ade8e56c30c7c0d001e955fa4d67 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 18:24:05 +0100 Subject: [PATCH 062/341] Wrap actions for error handling --- src/core/term-application.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/core/term-application.js b/src/core/term-application.js index d008ad87..346d378b 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -67,10 +67,21 @@ export class TermApplication extends AbstractApplication { } if ('run' in controller && typeof controller.run === 'function') { - command.action(controller.run.bind(controller)) + const action = controller.run.bind(controller) + command.action(this._wrapActions(action)) } } program.parse(process.argv) } + + _wrapActions(action) { + return (...args) => { + try { + return action(...args) + } catch (error) { + LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) + } + } + } } From 8373dd8d59ac55d6587660b5e18ba75a9eabe33f Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 18:24:15 +0100 Subject: [PATCH 063/341] Refactor init command --- src/commands/init/init.command.js | 133 ++++++++++++++++-------------- 1 file changed, 73 insertions(+), 60 deletions(-) diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js index a7544a82..33dd4f92 100644 --- a/src/commands/init/init.command.js +++ b/src/commands/init/init.command.js @@ -33,8 +33,36 @@ export class InitCommand extends Command { this.configService = configService } - run(options) { - const userForceOverwrite = options.force || false + async run(options) { + try { + await this._getUserData(options) + } catch (error) { + if (error instanceof InitStopedByUser) { + LogUtils.log({ message: error.message }) + return + } + } + + try { + this._checkFileSystem() + } catch (error) { + if (error instanceof FolderNotEmpty) { + LogUtils.log({ type: 'error', message: error.message }) + return + } + + if (error instanceof FileNotDirectory) { + LogUtils.log({ type: 'error', message: error.message }) + return + } + } + + this._cloneGitRepo() + } + + async _getUserData(commandOptions) { + const userForceOverwrite = commandOptions.force || false + const questions = [ { name: 'overwrite_file', @@ -68,63 +96,48 @@ export class InitCommand extends Command { } ] - inquirer.prompt(questions) - .then(({ repo_url: repoUrl = null, folder_path: folderPath, overwrite_file: overwriteFile = true }) => { - if (!overwriteFile) { - throw new InitStopedByUser('You stopped the command. Nothing has be made.') - } - - folderPath = folderPath.replace('~', process.env.HOME) - folderPath = path.resolve(folderPath) - - this.configService.repoUrl = repoUrl - this.configService.folderPath = folderPath - }) - .then(() => { - const folderPath = this.configService.folderPath - if (!FsUtils.fileExist(folderPath)) { - LogUtils.log({ type: 'info', message: 'Folder does not exist. It will be created.' }) - fs.mkdirSync(folderPath) - } - - const isDirectory = fs.statSync(folderPath).isDirectory() - if (!isDirectory) { - throw new FileNotDirectory() - } - - const folderIsEmpty = fs.readdirSync(folderPath).length < 1 - if (!folderIsEmpty) { - throw new FolderNotEmpty() - } - }) - .then(() => { - if (this.configService.repoUrl == null) { - LogUtils.log({ type: 'warn', message: 'Unable to cloned git repository. Need repository URL.' }) - return - } - - return GitUtils.clone(this.configService.repoUrl, this.configService.folderPath) - .then(repo => { - LogUtils.log({ type: 'info', message: 'Git repository cloned successuly.' }) - }) - }) - .catch(error => { - if (error instanceof InitStopedByUser) { - LogUtils.log({ message: error.message }) - return - } - - if (error instanceof FolderNotEmpty) { - LogUtils.log({ type: 'error', message: error.message }) - return - } - - if (error instanceof FileNotDirectory) { - LogUtils.log({ type: 'error', message: error.message }) - return - } - - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) - }) + const { repo_url: REPO_URL = null, folder_path: FOLDER_PATH, overwrite_file: OVERWRITE_FILE = true } = await inquirer.prompt(questions) + + if (!OVERWRITE_FILE) { + throw new InitStopedByUser('You stopped the command. Nothing has be made.') + } + + let folderPath = FOLDER_PATH.replace('~', process.env.HOME) + folderPath = path.resolve(folderPath) + + this.configService.repoUrl = REPO_URL + this.configService.folderPath = folderPath + } + + _checkFileSystem() { + const folderPath = this.configService.folderPath + if (!FsUtils.fileExist(folderPath)) { + LogUtils.log({ type: 'info', message: 'Folder does not exist. It will be created.' }) + fs.mkdirSync(folderPath) + } + + const isDirectory = fs.statSync(folderPath).isDirectory() + if (!isDirectory) { + throw new FileNotDirectory() + } + + const folderIsEmpty = fs.readdirSync(folderPath).length < 1 + if (!folderIsEmpty) { + throw new FolderNotEmpty() + } + } + + async _cloneGitRepo() { + if (this.configService.repoUrl == null) { + LogUtils.log({ type: 'warn', message: 'Unable to cloned git repository. Need repository URL.' }) + return + } + + try { + await GitUtils.clone(this.configService.repoUrl, this.configService.folderPath) + LogUtils.log({ type: 'info', message: 'Git repository cloned successuly.' }) + } catch (error) { + throw error + } } } From b87e0274bedf45555846eee0f6adc22c1b0960ff Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 10 Nov 2018 18:39:56 +0100 Subject: [PATCH 064/341] Refactor action wrapping --- src/core/term-application.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/term-application.js b/src/core/term-application.js index 346d378b..7e2cfa3d 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -68,7 +68,9 @@ export class TermApplication extends AbstractApplication { if ('run' in controller && typeof controller.run === 'function') { const action = controller.run.bind(controller) - command.action(this._wrapActions(action)) + const wrappedAction = this._wrapActions(action) + + command.action(wrappedAction) } } From ba484259ccb5c75913da23b4f3ac9245f28337a5 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 11 Nov 2018 15:06:42 +0100 Subject: [PATCH 065/341] Refactor deploy command --- src/commands/modules/deploy.command.js | 149 +++++++++++++------------ 1 file changed, 75 insertions(+), 74 deletions(-) diff --git a/src/commands/modules/deploy.command.js b/src/commands/modules/deploy.command.js index 7c69a3f4..55cebf56 100644 --- a/src/commands/modules/deploy.command.js +++ b/src/commands/modules/deploy.command.js @@ -32,88 +32,89 @@ export class DeployModuleCommand extends Command { this.deployService = deployService } - run(modules, options) { + async run(modules, options) { const localDeployment = options.local || false let modulesToDeploy = modules - Promise.resolve() - .then(_ => { - if (modules.length <= 0) { - return inquirer.prompt([{ - type: 'confirm', - message: 'No modules was passed in parameter. Do you want to deploy all available modules ?', - name: 'all_module', - default: false - }]) - .then(({ all_module: deployAllModule }) => { - if (!deployAllModule) { - throw new DeployStopedByUser() - } - - modulesToDeploy = this.fileService.modules.map(el => el.module) - }) + try { + modulesToDeploy = await this._getModuleListToDeploy(modules) + } catch (error) { + if (error instanceof ConfigurationFileNotExist) { + LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + return + } + + if (error instanceof DeployStopedByUser) { + LogUtils.log({ message: `${error.message} No modules to deploy.` }) + return + } + } + + LogUtils.log({ type: 'info', message: `Deployment (${modulesToDeploy.join(', ')}) start.` }) + await this._deployModules(modulesToDeploy, localDeployment) + LogUtils.log({ type: 'success', message: `Deployment task is finished.` }) + } + + async _deployModules(modulesToDeploy, localDeployment) { + const files = this.fileService.modules + .filter(element => modulesToDeploy.includes(element.module)) + .reduce((files, element) => { + for (const file of element.files) { + files.push(file) } - }) - .then(_ => LogUtils.log({ type: 'info', message: `Deployment (${modulesToDeploy.join(', ')}) start.` })) - .then(_ => { - const files = this.fileService.modules - .filter(element => modulesToDeploy.includes(element.module)) - .reduce((files, element) => { - for (const file of element.files) { - files.push(file) - } - - return files - }, []) - .filter(element => element.global === !localDeployment) - - const failedFiles = [] - const deployPromises = files.map(file => { - if (file.global) { - return this.deployService.deployGlobalFile(file) - } - - return this.deployService.deployLocalFile(file) - .catch(error => { - if (error instanceof TargetFileAlreadyExist) { - failedFiles.push(file) - return - } - - throw error - }) - }) - - return Promise.all(deployPromises) - .then(_ => { // User choices to relaunch deployment - if (failedFiles.length <= 0) { - return - } - - return failedFiles - .reduce((queue, file) => queue - .then(_ => inquirer - .prompt([{ name: 'overwrite_file', message: `File ${file.target} already exist. Do you want to overwrite it ?`, type: 'confirm', default: false }]) - .then(({ overwrite_file: overwriteFile }) => { - if (overwriteFile) { - return this.fileService.deployLocalFile(file, true) - } - })), Promise.resolve()) - }) - }) - .then(_ => LogUtils.log({ type: 'success', message: `Deployment task is finished.` })) - .catch(error => { - if (error instanceof ConfigurationFileNotExist) { - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) - return + return files + }, []) + .filter(element => element.global === !localDeployment) + + const failedFiles = [] + for (const file of files) { + try { + if (file.global) { + await this.deployService.deployGlobalFile(file) + continue } - if (error instanceof DeployStopedByUser) { - LogUtils.log({ message: `${error.message} No modules to deploy.` }) + await this.deployService.deployLocalFile(file) + } catch (error) { + if (error instanceof TargetFileAlreadyExist) { + failedFiles.push(file) return } - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) - }) + throw error + } + } + + for (const file of failedFiles) { + const { overwrite_file: overwriteFile } = await inquirer.prompt([{ + name: 'overwrite_file', + message: `File ${file.target} already exist. Do you want to overwrite it ?`, + type: 'confirm', + default: false + }]) + + if (overwriteFile) { + await this.fileService.deployLocalFile(file, true) + } + } + } + + async _getModuleListToDeploy(modules = []) { + if (modules.length <= 0) { + const { all_module: deployAllModule } = await inquirer.prompt([{ + type: 'confirm', + message: 'No modules was passed in parameter. Do you want to deploy all available modules ?', + name: 'all_module', + default: false + }]) + + if (!deployAllModule) { + throw new DeployStopedByUser() + } + + return this.fileService.modules.map(el => el.module) + } + + return modules } } From 20613ee9b74df975f74cf61a68580b3c7e17e980 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 11 Nov 2018 15:11:26 +0100 Subject: [PATCH 066/341] Rethrow errors --- src/commands/scripts/run.command.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/scripts/run.command.js b/src/commands/scripts/run.command.js index 831c5465..02379392 100644 --- a/src/commands/scripts/run.command.js +++ b/src/commands/scripts/run.command.js @@ -47,7 +47,7 @@ export class RunScriptCommand extends Command { return } - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) + throw error } } } From 4323ab70e0b16ed21afff77f07bcb111203e6d56 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sun, 11 Nov 2018 15:12:44 +0100 Subject: [PATCH 067/341] Add documentation --- src/core/command.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/command.js b/src/core/command.js index 263057f6..57b2fa5f 100644 --- a/src/core/command.js +++ b/src/core/command.js @@ -14,4 +14,6 @@ export class Command { get options() { return [] } + + // optional run() method which contains the action logic } From 11fba21e5c4e3f9187fd24a8e7e25fc09f3cdc5d Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 14 Nov 2018 00:32:13 +0100 Subject: [PATCH 068/341] Create a new logger service --- src/services/index.js | 1 + src/services/logger.service.js | 103 +++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/services/logger.service.js diff --git a/src/services/index.js b/src/services/index.js index 97c24954..f5aa4109 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -2,3 +2,4 @@ export * from './config.service' export * from './deploy.service' export * from './exec.service' export * from './file.service' +export * from './logger.service' diff --git a/src/services/logger.service.js b/src/services/logger.service.js new file mode 100644 index 00000000..cc02f29e --- /dev/null +++ b/src/services/logger.service.js @@ -0,0 +1,103 @@ +export class LoggerService { + constructor(logLevel = LOG_LEVEL.INFO) { + this._logLevel = logLevel + } + + log(text, level = LOG_LEVEL.ALL) { + if (this._logLevel > level) { + return + } + + const logLine = this._makeLogLine(`${this._getPrefixDate()} - `, text, ` (${getLogLevelName(level)})`) + + for (const line of logLine) { + this._getOutputStream(level).write(line) + } + } + + error(text) { + return this.log(text, LOG_LEVEL.ERROR) + } + + warn(text) { + return this.log(text, LOG_LEVEL.WARN) + } + + info(text) { + return this.log(text, LOG_LEVEL.INFO) + } + + debug(text) { + return this.log(text, LOG_LEVEL.DEBUG) + } + + _getPrefixDate() { + const date = new Date() + const addPrefix = (num, zero) => `${(new Array(zero).fill(0).join())}${num}`.slice(-1 * zero) + + const year = addPrefix(date.getFullYear(), 4) + const month = addPrefix(date.getMonth() + 1, 2) + const day = addPrefix(date.getDate(), 2) + const hours = addPrefix(date.getHours(), 2) + const seconds = addPrefix(date.getSeconds(), 2) + const milliseconds = addPrefix(date.getMilliseconds(), 4) + + const dateText = [year, month, day].join(':') + const timeText = [hours, seconds].join(':') + + return `${dateText} ${timeText} +${milliseconds}` + } + + _getOutputStream(level) { + if (level >= LOG_LEVEL.ERROR) { + return process.stderr + } + + return process.stdout + } + + _makeLogLine(left, center, right) { + const dataMaxLength = process.stdout.columns - right.length - left.length + const getLinesFromLine = line => line + .split('') + .reduce((lines, char) => { + let last = lines.pop() + if (last.length < dataMaxLength) { + last = last + char + return [...lines, last] + } + + return [...lines, last, char] + }, ['']) + + return center + .split('\n') + .reduce((aggr, line) => [...aggr, ...getLinesFromLine(line)], []) + .map(line => `${line}${(new Array(dataMaxLength).fill('\u00A0').join(''))}`.slice(0, dataMaxLength)) + .map((line, index) => { + if (index === 0) { + return `${left}${line}${right}` + } + + return `${(new Array(left.length).fill('\u00A0').join(''))}${line}${(new Array(right.length).fill('\u00A0').join(''))}` + }) + } +} + +export const LOG_LEVEL = Object.freeze({ + ERROR: 4, + WARN: 3, + INFO: 2, + DEBUG: 1, + ALL: 0 +}) + +function getLogLevelName(level) { + for (const key of Object.keys(LOG_LEVEL)) { + if (LOG_LEVEL[key] === level) { + return key + } + } + + return null +} From fee98e185af0ac476dcf7472bbdd408db8d81065 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 14 Nov 2018 00:33:03 +0100 Subject: [PATCH 069/341] Use logger for configfile.js --- bin/configfile.js | 10 ++++++++-- src/shared/config.js | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/bin/configfile.js b/bin/configfile.js index 8bb0a82d..c915d6d8 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -7,7 +7,10 @@ const { ConfigService, OPTION_PATH_FILE_TOKEN, getOptionsFilePath, - getPackageData + getPackageData, + LoggerService, + APP_LOG_LEVEL, + APP_LOG_LEVEL_TOKEN } = require('../src'); (() => { @@ -18,9 +21,12 @@ const { cli.description = 'Configuration files manager.' cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) + cli.provide({ identity: APP_LOG_LEVEL_TOKEN, useValue: APP_LOG_LEVEL }) + cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) + cli.provide(LoggerService, [APP_LOG_LEVEL_TOKEN]) - cli.register(InitCommand, [ConfigService]) + cli.register(InitCommand, [ConfigService, LoggerService]) cli.register(class extends Command { // modules namespace get commandName() { return 'modules' diff --git a/src/shared/config.js b/src/shared/config.js index 8149f86f..49b3bc47 100644 --- a/src/shared/config.js +++ b/src/shared/config.js @@ -1,3 +1,8 @@ import { InjectionToken } from 'yabf' +import { LOG_LEVEL } from '../services' + export const OPTION_PATH_FILE_TOKEN = new InjectionToken() + +export const APP_LOG_LEVEL_TOKEN = new InjectionToken() +export const APP_LOG_LEVEL = LOG_LEVEL.ALL From f0cf185d659362116149f990b479c82d894a48fb Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 14 Nov 2018 22:16:08 +0100 Subject: [PATCH 070/341] Use the logger service --- src/commands/init/init.command.js | 25 ++++++++++++++++++++++++- src/services/logger.service.js | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js index 33dd4f92..0d22ce02 100644 --- a/src/commands/init/init.command.js +++ b/src/commands/init/init.command.js @@ -27,17 +27,25 @@ export class InitCommand extends Command { ] } - constructor(configService) { + constructor(configService, loggerService) { super() this.configService = configService + this.logger = loggerService } async run(options) { + this.logger.log('Init command started') + try { await this._getUserData(options) } catch (error) { + this.logger.debug('Error in _getUserData') + if (error instanceof InitStopedByUser) { + this.logger.debug('Error is an instance of InitStopedByUser') + this.logger.error(error.message) + LogUtils.log({ message: error.message }) return } @@ -46,12 +54,16 @@ export class InitCommand extends Command { try { this._checkFileSystem() } catch (error) { + this.logger.debug('Error in _checkFileSystem') + if (error instanceof FolderNotEmpty) { + this.logger.debug('Error is an instance of FolderNotEmpty') LogUtils.log({ type: 'error', message: error.message }) return } if (error instanceof FileNotDirectory) { + this.logger.debug('Error is an instance of FileNotDirectory') LogUtils.log({ type: 'error', message: error.message }) return } @@ -61,6 +73,7 @@ export class InitCommand extends Command { } async _getUserData(commandOptions) { + this.logger.log('Start asking people informations for installing configuration file') const userForceOverwrite = commandOptions.force || false const questions = [ @@ -99,36 +112,45 @@ export class InitCommand extends Command { const { repo_url: REPO_URL = null, folder_path: FOLDER_PATH, overwrite_file: OVERWRITE_FILE = true } = await inquirer.prompt(questions) if (!OVERWRITE_FILE) { + this.logger.debug('User stop the command execution. A file already exist. No override allowed.') throw new InitStopedByUser('You stopped the command. Nothing has be made.') } let folderPath = FOLDER_PATH.replace('~', process.env.HOME) folderPath = path.resolve(folderPath) + this.logger.log('Save validated user answers in config service') this.configService.repoUrl = REPO_URL this.configService.folderPath = folderPath } _checkFileSystem() { + this.logger.log('Check file system - Start') + const folderPath = this.configService.folderPath if (!FsUtils.fileExist(folderPath)) { + this.logger.debug(`Folder ${folderPath} doesn't exist.`) LogUtils.log({ type: 'info', message: 'Folder does not exist. It will be created.' }) fs.mkdirSync(folderPath) } const isDirectory = fs.statSync(folderPath).isDirectory() if (!isDirectory) { + this.logger.debug(`Folder ${folderPath} is not a folder.`) throw new FileNotDirectory() } const folderIsEmpty = fs.readdirSync(folderPath).length < 1 if (!folderIsEmpty) { + this.logger.debug(`Folder ${folderPath} isn't empty.`) throw new FolderNotEmpty() } } async _cloneGitRepo() { + this.logger.log(`Clone git repo - Start`) if (this.configService.repoUrl == null) { + this.logger.debug(`No URL provided to allow to clone the repo`) LogUtils.log({ type: 'warn', message: 'Unable to cloned git repository. Need repository URL.' }) return } @@ -137,6 +159,7 @@ export class InitCommand extends Command { await GitUtils.clone(this.configService.repoUrl, this.configService.folderPath) LogUtils.log({ type: 'info', message: 'Git repository cloned successuly.' }) } catch (error) { + this.logger.debug(error.message) throw error } } diff --git a/src/services/logger.service.js b/src/services/logger.service.js index cc02f29e..929ec521 100644 --- a/src/services/logger.service.js +++ b/src/services/logger.service.js @@ -71,6 +71,7 @@ export class LoggerService { }, ['']) return center + .toString() .split('\n') .reduce((aggr, line) => [...aggr, ...getLinesFromLine(line)], []) .map(line => `${line}${(new Array(dataMaxLength).fill('\u00A0').join(''))}`.slice(0, dataMaxLength)) From 74ee17efc9362eab19ad965f1f0ff9aa79548910 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 21:52:11 +0100 Subject: [PATCH 071/341] Create a new service responsible to show text --- src/services/index.js | 1 + src/services/message.service.js | 86 +++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/services/message.service.js diff --git a/src/services/index.js b/src/services/index.js index f5aa4109..0109de1c 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -3,3 +3,4 @@ export * from './deploy.service' export * from './exec.service' export * from './file.service' export * from './logger.service' +export * from './message.service' diff --git a/src/services/message.service.js b/src/services/message.service.js new file mode 100644 index 00000000..ecc31620 --- /dev/null +++ b/src/services/message.service.js @@ -0,0 +1,86 @@ +import color from 'chalk' + +export class MessageService { + constructor() { + this.stdout = process.stdout + this.stderr = process.stderr + } + + printError(...args) { + const buildText = this._useBuilder( + t => color.bgRed(color.black(t)), + t => color.red(t), + 'Abort' + ) + + this.stdout.write(buildText(...args)) + } + + printWarning(...args) { + const buildText = this._useBuilder( + t => color.bgYellow(color.black(t)), + t => color.yellow(t), + 'Warn' + ) + + this.stdout.write(buildText(...args)) + } + + printInfo(...args) { + const buildText = this._useBuilder( + t => color.bgCyan(color.black(t)), + t => color.cyan(t), + 'Info' + ) + + this.stdout.write(buildText(...args)) + } + + printSuccess(...args) { + const buildText = this._useBuilder( + t => color.bgGreen(color.black(t)), + t => color.green(t), + 'Done' + ) + + this.stdout.write(buildText(...args)) + } + + print(...args) { + const buildText = this._useBuilder( + t => color.bgWhite(color.black(t)), + t => color.gray(t) + ) + + this.stdout.write(buildText(...args)) + } + + printEmptyLine() { + this.print('') + } + + printRawText(text) { + this.stdout.write(text) + } + + printRawError(text) { + this.stderr.write(text) + } + + _useBuilder(stylePrefix, styleText, defaultPrefix) { + return (prefix, ...texts) => { + let fullText = styleText(prefix) + + if (defaultPrefix != null) { + fullText = `${stylePrefix(` ${defaultPrefix} `)} ${fullText}\n` + } + + if (texts.length > 0) { + const styledPrefix = stylePrefix(` ${prefix} `) + fullText = `${styledPrefix} ${styleText(texts.join(' '))}\n` + } + + return fullText + } + } +} From ff21fae92277845281d5ab205573d37f2d387d1c Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 21:52:52 +0100 Subject: [PATCH 072/341] Use MessageService in init command --- bin/configfile.js | 6 ++++-- src/commands/init/init.command.js | 19 +++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/bin/configfile.js b/bin/configfile.js index c915d6d8..64dac59d 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -10,7 +10,8 @@ const { getPackageData, LoggerService, APP_LOG_LEVEL, - APP_LOG_LEVEL_TOKEN + APP_LOG_LEVEL_TOKEN, + MessageService } = require('../src'); (() => { @@ -25,8 +26,9 @@ const { cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) cli.provide(LoggerService, [APP_LOG_LEVEL_TOKEN]) + cli.provide(MessageService) - cli.register(InitCommand, [ConfigService, LoggerService]) + cli.register(InitCommand, [ConfigService, LoggerService, MessageService]) cli.register(class extends Command { // modules namespace get commandName() { return 'modules' diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js index 0d22ce02..df9d521b 100644 --- a/src/commands/init/init.command.js +++ b/src/commands/init/init.command.js @@ -3,7 +3,7 @@ import fs from 'fs' import path from 'path' import { Command } from '../../core/command' -import { LogUtils, FsUtils, GitUtils } from '../../shared/utils' +import { FsUtils, GitUtils } from '../../shared/utils' import { FileNotDirectory, FolderNotEmpty } from '../../shared/errors' import { InitStopedByUser } from './init-stop-by-user.error' @@ -27,11 +27,12 @@ export class InitCommand extends Command { ] } - constructor(configService, loggerService) { + constructor(configService, loggerService, messageService) { super() this.configService = configService this.logger = loggerService + this.messageService = messageService } async run(options) { @@ -44,9 +45,7 @@ export class InitCommand extends Command { if (error instanceof InitStopedByUser) { this.logger.debug('Error is an instance of InitStopedByUser') - this.logger.error(error.message) - - LogUtils.log({ message: error.message }) + this.messageService.printError(error.message) return } } @@ -58,13 +57,13 @@ export class InitCommand extends Command { if (error instanceof FolderNotEmpty) { this.logger.debug('Error is an instance of FolderNotEmpty') - LogUtils.log({ type: 'error', message: error.message }) + this.messageService.printError(error.message) return } if (error instanceof FileNotDirectory) { this.logger.debug('Error is an instance of FileNotDirectory') - LogUtils.log({ type: 'error', message: error.message }) + this.messageService.printError(error.message) return } } @@ -130,7 +129,7 @@ export class InitCommand extends Command { const folderPath = this.configService.folderPath if (!FsUtils.fileExist(folderPath)) { this.logger.debug(`Folder ${folderPath} doesn't exist.`) - LogUtils.log({ type: 'info', message: 'Folder does not exist. It will be created.' }) + this.messageService.printInfo('Folder does not exist. It will be created.') fs.mkdirSync(folderPath) } @@ -151,13 +150,13 @@ export class InitCommand extends Command { this.logger.log(`Clone git repo - Start`) if (this.configService.repoUrl == null) { this.logger.debug(`No URL provided to allow to clone the repo`) - LogUtils.log({ type: 'warn', message: 'Unable to cloned git repository. Need repository URL.' }) + this.messageService.printWarn('Unable to cloned git repository. Need repository URL.') return } try { await GitUtils.clone(this.configService.repoUrl, this.configService.folderPath) - LogUtils.log({ type: 'info', message: 'Git repository cloned successuly.' }) + this.messageService.printInfo('Git repository cloned successuly.') } catch (error) { this.logger.debug(error.message) throw error From 6e300139587370933e6badbdea782fdb692570c7 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 21:53:12 +0100 Subject: [PATCH 073/341] Use messageService in TermApp --- src/core/term-application.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/core/term-application.js b/src/core/term-application.js index 7e2cfa3d..bd914352 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -1,8 +1,10 @@ import { AbstractApplication } from 'yabf' import program from 'commander' -import { Command } from './command' import { LogUtils } from '../shared/utils' +import { MessageService } from '../services' + +import { Command } from './command' export class TermApplication extends AbstractApplication { get version() { @@ -21,9 +23,16 @@ export class TermApplication extends AbstractApplication { this._desc = text } + constructor(injector, messageService) { + super(injector) + + this.messageService = messageService + } + buildInstructions() { return [ - { provide: TermApplication, dependencies: [] } + { provide: TermApplication, dependencies: [MessageService] }, + { provide: MessageService, dependencies: [] } ] } @@ -39,7 +48,8 @@ export class TermApplication extends AbstractApplication { start() { if (!Array.isArray(this.commands) || this.commands.length < 1) { LogUtils.log({ message: `No command found in Term Application` }) - LogUtils.log({ type: 'error', message: `Application failed to initialize` }) + + this.messageService.printError('Application failed to initialize') return } @@ -80,9 +90,9 @@ export class TermApplication extends AbstractApplication { _wrapActions(action) { return (...args) => { try { - return action(...args) + action(...args) } catch (error) { - LogUtils.log({ type: 'error', message: 'An error occured.', prefix: ' Fail ' }) + this.messageService.printError('Fail', 'An error occured.') } } } From 4a55b5ae74a1c38776a64dedd41a63192b50ea88 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 21:59:40 +0100 Subject: [PATCH 074/341] Fix new line character --- src/services/message.service.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/message.service.js b/src/services/message.service.js index ecc31620..3d120957 100644 --- a/src/services/message.service.js +++ b/src/services/message.service.js @@ -69,10 +69,10 @@ export class MessageService { _useBuilder(stylePrefix, styleText, defaultPrefix) { return (prefix, ...texts) => { - let fullText = styleText(prefix) + let fullText = `${styleText(prefix)}\n` if (defaultPrefix != null) { - fullText = `${stylePrefix(` ${defaultPrefix} `)} ${fullText}\n` + fullText = `${stylePrefix(` ${defaultPrefix} `)} ${fullText}` } if (texts.length > 0) { From ca0c346912493c99e98327c4f66f29cdc6ce5051 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 22:02:40 +0100 Subject: [PATCH 075/341] Use MessageService in ListScriptsCommand --- bin/configfile-scripts.js | 5 +++-- src/commands/scripts/list.command.js | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 778888e6..ac3d652a 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -9,7 +9,8 @@ const { ConfigService, OPTION_PATH_FILE_TOKEN, getOptionsFilePath, - getPackageData + getPackageData, + MessageService } = require('../src') ;(() => { @@ -20,7 +21,7 @@ const { cli.description = 'Custom scripts manager.' cli.register(RunScriptCommand, [ExecService, FileService]) - cli.register(ListScriptsCommand, [FileService]) + cli.register(ListScriptsCommand, [FileService, MessageService]) cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) cli.provide(FileService, [ConfigService]) diff --git a/src/commands/scripts/list.command.js b/src/commands/scripts/list.command.js index f86d43c2..3f0c8620 100644 --- a/src/commands/scripts/list.command.js +++ b/src/commands/scripts/list.command.js @@ -1,6 +1,5 @@ import { Command } from '../../core' import { ConfigurationFileNotExist } from '../../shared/errors' -import { LogUtils } from '../../shared/utils' export class ListScriptsCommand extends Command { get commandName() { @@ -15,10 +14,11 @@ export class ListScriptsCommand extends Command { return 'list all custom configuration scripts available.' } - constructor(fileService) { + constructor(fileService, messageService) { super() this.fileService = fileService + this.messageService = messageService } run() { @@ -28,21 +28,21 @@ export class ListScriptsCommand extends Command { scripts = this.fileService.scripts } catch (e) { if (e instanceof ConfigurationFileNotExist) { - LogUtils.log({ message: 'Unable to load scripts without knowing where are stored the data.' }) - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + this.messageService.print('Unable to load scripts without knowing where are stored the data.') + this.messageService.printError('No configuration file. You need to run the init command before.') return } } if (scripts.length < 1) { - LogUtils.log({ type: 'info', message: `No scripts found.` }) + this.messageService.printInfo('No scripts found.') return } - LogUtils.log({ message: `${scripts.length} script(s) found.` }) + this.messageService.print(`${scripts.length} script(s) found.`) for (const { script } of scripts) { - LogUtils.log({ message: `- ${script}` }) + this.messageService.print(`- ${script}`) } } } From f6a15f98066c57739fdecfb507a997fb12644304 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 22:06:12 +0100 Subject: [PATCH 076/341] Use MessageService in RunScriptCommand --- bin/configfile-scripts.js | 2 +- src/commands/scripts/run.command.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index ac3d652a..0014bd7a 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -20,7 +20,7 @@ const { cli.version = pkg.version cli.description = 'Custom scripts manager.' - cli.register(RunScriptCommand, [ExecService, FileService]) + cli.register(RunScriptCommand, [ExecService, FileService, MessageService]) cli.register(ListScriptsCommand, [FileService, MessageService]) cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) diff --git a/src/commands/scripts/run.command.js b/src/commands/scripts/run.command.js index 02379392..c44b7252 100644 --- a/src/commands/scripts/run.command.js +++ b/src/commands/scripts/run.command.js @@ -1,6 +1,5 @@ import { Command } from '../../core' import { ConfigurationFileNotExist, BadScriptPermission, ScriptNotExist } from '../../shared/errors' -import { LogUtils } from '../../shared/utils' export class RunScriptCommand extends Command { get commandName() { @@ -15,35 +14,36 @@ export class RunScriptCommand extends Command { return 'run custom configuration scripts.' } - constructor(execService, fileService) { + constructor(execService, fileService, messageService) { super() this.fileService = fileService this.execService = execService + this.messageService = messageService } async run(scriptName) { - LogUtils.log({ type: 'info', message: `Running "${scriptName}" script.` }) + this.messageService.printInfo(`Running "${scriptName}" script.`) const script = this.fileService.scriptByName(scriptName) try { await this.execService.runScript(script) - LogUtils.log({ type: 'success', message: `"${scriptName}" script execution is finished.` }) + this.messageService.printSuccess(`"${scriptName}" script execution is finished.`) } catch (error) { if (error instanceof ConfigurationFileNotExist) { - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + this.messageService.printError('No configuration file. You need to run the init command before.') return } if (error instanceof ScriptNotExist) { - LogUtils.log({ type: 'error', message: error.message }) + this.messageService.printError(error.message) return } if (error instanceof BadScriptPermission) { - LogUtils.log({ type: 'error', message: error.message, prefix: ' Fail ' }) + this.messageService.printError('Fail', error.message) return } From dbe05968b55d07cc13121259f7bc72860cfa02fe Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 22:21:56 +0100 Subject: [PATCH 077/341] Use MessageService into Modules --- bin/configfile-modules.js | 7 ++++--- src/commands/modules/deploy.command.js | 12 ++++++------ src/commands/modules/list.command.js | 14 +++++++------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index 34e740e9..4e40bf33 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -9,7 +9,8 @@ const { ConfigService, OPTION_PATH_FILE_TOKEN, getOptionsFilePath, - getPackageData + getPackageData, + MessageService } = require('../src') ;(() => { @@ -19,8 +20,8 @@ const { cli.version = pkg.version cli.description = 'Configuration modules manager.' - cli.register(ListModulesCommand, [FileService]) - cli.register(DeployModuleCommand, [FileService, DeployService]) + cli.register(ListModulesCommand, [FileService, MessageService]) + cli.register(DeployModuleCommand, [FileService, DeployService, MessageService]) cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) cli.provide(FileService, [ConfigService]) diff --git a/src/commands/modules/deploy.command.js b/src/commands/modules/deploy.command.js index 55cebf56..ee276b5e 100644 --- a/src/commands/modules/deploy.command.js +++ b/src/commands/modules/deploy.command.js @@ -2,7 +2,6 @@ import inquirer from 'inquirer' import { Command } from '../../core' import { ConfigurationFileNotExist, TargetFileAlreadyExist } from '../../shared/errors' -import { LogUtils } from '../../shared/utils' import { DeployStopedByUser } from './deploy-stop-by-user.error' @@ -25,11 +24,12 @@ export class DeployModuleCommand extends Command { ] } - constructor(fileService, deployService) { + constructor(fileService, deployService, messageService) { super() this.fileService = fileService this.deployService = deployService + this.messageService = messageService } async run(modules, options) { @@ -40,19 +40,19 @@ export class DeployModuleCommand extends Command { modulesToDeploy = await this._getModuleListToDeploy(modules) } catch (error) { if (error instanceof ConfigurationFileNotExist) { - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + this.messageService.printError('No configuration file. You need to run the init command before.') return } if (error instanceof DeployStopedByUser) { - LogUtils.log({ message: `${error.message} No modules to deploy.` }) + this.messageService.print(`${error.message} No modules to deploy.`) return } } - LogUtils.log({ type: 'info', message: `Deployment (${modulesToDeploy.join(', ')}) start.` }) + this.messageService.printInfo(`Deployment (${modulesToDeploy.join(', ')}) start.`) await this._deployModules(modulesToDeploy, localDeployment) - LogUtils.log({ type: 'success', message: `Deployment task is finished.` }) + this.messageService.printSuccess(`Deployment task is finished.`) } async _deployModules(modulesToDeploy, localDeployment) { diff --git a/src/commands/modules/list.command.js b/src/commands/modules/list.command.js index 61d80b57..3314141e 100644 --- a/src/commands/modules/list.command.js +++ b/src/commands/modules/list.command.js @@ -1,6 +1,5 @@ import { Command } from '../../core/command' import { ConfigurationFileNotExist } from '../../shared/errors' -import { LogUtils } from '../../shared/utils' export class ListModulesCommand extends Command { get commandName() { @@ -15,10 +14,11 @@ export class ListModulesCommand extends Command { return 'list all modules available.' } - constructor(fileService) { + constructor(fileService, messageService) { super() this.fileService = fileService + this.messageService = messageService } run() { @@ -28,21 +28,21 @@ export class ListModulesCommand extends Command { modules = this.fileService.modules } catch (e) { if (e instanceof ConfigurationFileNotExist) { - LogUtils.log({ message: 'Unable to load modules without knowing where are stored the data.' }) - LogUtils.log({ type: 'error', message: 'No configuration file. You need to run the init command before.' }) + this.messageService.print('Unable to load modules without knowing where are stored the data.') + this.messageService.printError('No configuration file. You need to run the init command before.') return } } if (modules.length < 1) { - LogUtils.log({ type: 'info', message: `No module found.` }) + this.messageService.printInfo('No module found.') return } - LogUtils.log({ message: `${modules.length} module(s) found.` }) + this.messageService.print(`${modules.length} module(s) found.`) for (const { module: name } of modules) { - LogUtils.log({ message: `- ${name}` }) + this.messageService.print(`- ${name}`) } } } From bc6d2c688a615cc5b09736494c8ce3e5882ba51a Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 22:41:13 +0100 Subject: [PATCH 078/341] Use MessageService in other services --- bin/configfile-modules.js | 4 ++-- bin/configfile-scripts.js | 4 ++-- src/services/deploy.service.js | 10 +++++++--- src/services/exec.service.js | 10 +++++++--- src/services/file.service.js | 7 ++++--- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js index 4e40bf33..52ea5bac 100644 --- a/bin/configfile-modules.js +++ b/bin/configfile-modules.js @@ -24,8 +24,8 @@ const { cli.register(DeployModuleCommand, [FileService, DeployService, MessageService]) cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) - cli.provide(FileService, [ConfigService]) - cli.provide(DeployService) + cli.provide(FileService, [ConfigService, MessageService]) + cli.provide(DeployService, [MessageService]) cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) cli.start() diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 0014bd7a..37c2f0c4 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -24,8 +24,8 @@ const { cli.register(ListScriptsCommand, [FileService, MessageService]) cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) - cli.provide(FileService, [ConfigService]) - cli.provide(ExecService) + cli.provide(FileService, [ConfigService, MessageService]) + cli.provide(ExecService, [MessageService]) cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) cli.start() diff --git a/src/services/deploy.service.js b/src/services/deploy.service.js index 881782ba..b9981116 100644 --- a/src/services/deploy.service.js +++ b/src/services/deploy.service.js @@ -1,9 +1,13 @@ import path from 'path' -import { FsUtils, LogUtils } from '../shared/utils' +import { FsUtils } from '../shared/utils' import { TargetFileAlreadyExist } from '../shared/errors' export class DeployService { + constructor(messageService) { + this.messageService = messageService + } + async deployLocalFile({ source, target, global: isGlobalFile }, force = false) { if (isGlobalFile) { throw new TypeError('Unable to deploy global file as a local one.') @@ -36,7 +40,7 @@ export class DeployService { throw error } - LogUtils.log({ type: 'warn', message: `Unable to make a local copy ("${source}" => "${target}").` }) + this.messageService.printWarning(`Unable to make a local copy ("${source}" => "${target}").`) } } @@ -76,7 +80,7 @@ export class DeployService { throw error } - LogUtils.log({ type: 'warn', message: `Unable to link "${source}" => "${target}".` }) + this.messageService.printWarning(`Unable to link "${source}" => "${target}".`) } } } diff --git a/src/services/exec.service.js b/src/services/exec.service.js index bf7b211b..a264c549 100644 --- a/src/services/exec.service.js +++ b/src/services/exec.service.js @@ -1,7 +1,11 @@ -import { FsUtils, ProcessUtils, LogUtils } from '../shared/utils' +import { FsUtils, ProcessUtils } from '../shared/utils' import { ScriptNotExist, BadScriptPermission } from '../shared/errors' export class ExecService { + constructor(messageService) { + this.messageService = messageService + } + async runScript(script) { if (script == null) { throw new ScriptNotExist(script.script) @@ -12,10 +16,10 @@ export class ExecService { const child = ProcessUtils.execFile(script.path) child.stdout.on('data', data => { - LogUtils.log({ message: data.trim() }) + this.messageService.printRawText(data.trim()) }) child.stderr.on('data', data => { - LogUtils.log({ type: 'error', message: data.trim(), prefix: '' }) + this.messageService.printRawError(data.trim()) }) try { diff --git a/src/services/file.service.js b/src/services/file.service.js index b0caa7e9..b21bf5be 100644 --- a/src/services/file.service.js +++ b/src/services/file.service.js @@ -1,7 +1,7 @@ import fs from 'fs' import path from 'path' -import { FsUtils, LogUtils } from '../shared/utils' +import { FsUtils } from '../shared/utils' export class FileService { get scripts() { @@ -60,7 +60,7 @@ export class FileService { element.files = data.files } catch (e) { - LogUtils.log({ type: 'warn', message: `Unable to load settings file for "${name}" module.` }) + this.messageService.printWarning(`Unable to load settings file for "${name}" module.`) element.files = [] } @@ -78,8 +78,9 @@ export class FileService { }) } - constructor(configService) { + constructor(configService, messageService) { this.configService = configService + this.messageService = messageService } scriptByName(scriptName) { From 15c1a8d179e0ea6ba8621008ee24fd6ce00a4f73 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 22:47:14 +0100 Subject: [PATCH 079/341] Use MessageService in TermApplication --- src/core/term-application.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/core/term-application.js b/src/core/term-application.js index bd914352..14be3c3d 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -1,7 +1,6 @@ import { AbstractApplication } from 'yabf' import program from 'commander' -import { LogUtils } from '../shared/utils' import { MessageService } from '../services' import { Command } from './command' @@ -47,8 +46,7 @@ export class TermApplication extends AbstractApplication { start() { if (!Array.isArray(this.commands) || this.commands.length < 1) { - LogUtils.log({ message: `No command found in Term Application` }) - + this.messageService.print(`No command found in Term Application`) this.messageService.printError('Application failed to initialize') return } From 074425ecd288a9abac2eedc38cb97877434a19a1 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 22:47:24 +0100 Subject: [PATCH 080/341] Remove LogUtils --- src/shared/utils/index.js | 1 - src/shared/utils/log.utils.js | 63 ----------------------------------- 2 files changed, 64 deletions(-) delete mode 100644 src/shared/utils/log.utils.js diff --git a/src/shared/utils/index.js b/src/shared/utils/index.js index db9beb38..491360fd 100644 --- a/src/shared/utils/index.js +++ b/src/shared/utils/index.js @@ -1,5 +1,4 @@ export * from './pakage.utils' export * from './fs.utils' export * from './git.utils' -export * from './log.utils' export * from './process.utils' diff --git a/src/shared/utils/log.utils.js b/src/shared/utils/log.utils.js deleted file mode 100644 index 5318521c..00000000 --- a/src/shared/utils/log.utils.js +++ /dev/null @@ -1,63 +0,0 @@ -import color from 'chalk' - -export class LogUtils { - static get loggerOptions() { - return { - error: { - loggerFunction: (...x) => console.error(...x), - prefixDefault: ' Abort ', - prefixColor: x => color.bgRed(color.black(x)), - messageColor: x => color.red(x) - }, - info: { - loggerFunction: (...x) => console.info(...x), - prefixDefault: ' Info ', - prefixColor: x => color.bgCyan(color.black(x)), - messageColor: x => color.cyan(x) - }, - warn: { - loggerFunction: (...x) => console.warn(...x), - prefixDefault: ' Warn ', - prefixColor: x => color.bgYellow(color.black(x)), - messageColor: x => color.yellow(x) - }, - log: { - loggerFunction: (...x) => console.log(...x), - prefixDefault: '', - prefixColor: x => color.bgWhite(color.black(x)), - messageColor: x => color.gray(x) - }, - success: { - loggerFunction: (...x) => console.info(...x), - prefixDefault: ' Done ', - prefixColor: x => color.bgGreen(color.black(x)), - messageColor: x => color.green(x) - } - } - } - - static log({ type = 'log', message, prefix } = {}) { - if (type in LogUtils.loggerOptions) { - const args = [] - - if (prefix == null) { - prefix = LogUtils.loggerOptions[type].prefixDefault - } - - if (prefix.length > 0) { - args.push(LogUtils.loggerOptions[type].prefixColor(prefix)) - } - args.push(LogUtils.loggerOptions[type].messageColor(message)) - - LogUtils.loggerOptions[type].loggerFunction(...args) - - return - } - - console.log(message) - } - - static addBlanckLine() { - console.log('') - } -} From b7d27d8181df3af9b7712c1970d0b7f85f16134c Mon Sep 17 00:00:00 2001 From: Mindsers Date: Fri, 16 Nov 2018 23:04:17 +0100 Subject: [PATCH 081/341] Add logs on TermApplication --- bin/configfile.js | 5 ----- src/core/term-application.js | 20 +++++++++++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/bin/configfile.js b/bin/configfile.js index 64dac59d..e2e6c0f0 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -9,8 +9,6 @@ const { getOptionsFilePath, getPackageData, LoggerService, - APP_LOG_LEVEL, - APP_LOG_LEVEL_TOKEN, MessageService } = require('../src'); @@ -22,11 +20,8 @@ const { cli.description = 'Configuration files manager.' cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) - cli.provide({ identity: APP_LOG_LEVEL_TOKEN, useValue: APP_LOG_LEVEL }) cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) - cli.provide(LoggerService, [APP_LOG_LEVEL_TOKEN]) - cli.provide(MessageService) cli.register(InitCommand, [ConfigService, LoggerService, MessageService]) cli.register(class extends Command { // modules namespace diff --git a/src/core/term-application.js b/src/core/term-application.js index 14be3c3d..2253593c 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -1,7 +1,8 @@ import { AbstractApplication } from 'yabf' import program from 'commander' -import { MessageService } from '../services' +import { MessageService, LoggerService } from '../services' +import { APP_LOG_LEVEL, APP_LOG_LEVEL_TOKEN } from '../shared/config' import { Command } from './command' @@ -22,21 +23,27 @@ export class TermApplication extends AbstractApplication { this._desc = text } - constructor(injector, messageService) { + constructor(injector, messageService, loggerService) { super(injector) this.messageService = messageService + this.loggerService = loggerService } buildInstructions() { return [ - { provide: TermApplication, dependencies: [MessageService] }, - { provide: MessageService, dependencies: [] } + { provide: TermApplication, dependencies: [MessageService, LoggerService] }, + { provide: MessageService, dependencies: [] }, + { provide: { identity: APP_LOG_LEVEL_TOKEN, useValue: APP_LOG_LEVEL } }, + { provide: LoggerService, dependencies: [APP_LOG_LEVEL_TOKEN] } ] } register(command, deps = []) { + this.loggerService.log(`Register new command ${command.prototype.constructor.name}`) + if (!(command.prototype instanceof Command)) { + this.loggerService.debug(`${command} is not a valid command`) return null } @@ -46,7 +53,7 @@ export class TermApplication extends AbstractApplication { start() { if (!Array.isArray(this.commands) || this.commands.length < 1) { - this.messageService.print(`No command found in Term Application`) + this.loggerService.debug(`No command found in Term Application`) this.messageService.printError('Application failed to initialize') return } @@ -82,6 +89,8 @@ export class TermApplication extends AbstractApplication { } } + this.loggerService.log(`Program start`) + this.loggerService.debug(`Program launched with ${JSON.stringify(process.argv)}`) program.parse(process.argv) } @@ -90,6 +99,7 @@ export class TermApplication extends AbstractApplication { try { action(...args) } catch (error) { + this.loggerService.debug(`Program failed by error : ${error.message}`) this.messageService.printError('Fail', 'An error occured.') } } From 415ddcbf02b35d79a1972539604b79438291136d Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 15:26:30 +0100 Subject: [PATCH 082/341] Fix space generator in log --- src/services/logger.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/logger.service.js b/src/services/logger.service.js index 929ec521..002db63f 100644 --- a/src/services/logger.service.js +++ b/src/services/logger.service.js @@ -33,7 +33,7 @@ export class LoggerService { _getPrefixDate() { const date = new Date() - const addPrefix = (num, zero) => `${(new Array(zero).fill(0).join())}${num}`.slice(-1 * zero) + const addPrefix = (num, zero) => `${(new Array(zero).fill(0).join(''))}${num}`.slice(-1 * zero) const year = addPrefix(date.getFullYear(), 4) const month = addPrefix(date.getMonth() + 1, 2) From 2af6a80603f3b17106fb11a15b02636d18540fc3 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 15:26:44 +0100 Subject: [PATCH 083/341] Set log level to ERROR --- src/shared/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/config.js b/src/shared/config.js index 49b3bc47..992a5597 100644 --- a/src/shared/config.js +++ b/src/shared/config.js @@ -5,4 +5,4 @@ import { LOG_LEVEL } from '../services' export const OPTION_PATH_FILE_TOKEN = new InjectionToken() export const APP_LOG_LEVEL_TOKEN = new InjectionToken() -export const APP_LOG_LEVEL = LOG_LEVEL.ALL +export const APP_LOG_LEVEL = LOG_LEVEL.ERROR From 8df5d8fb59ebb5503c2834b3f96ac1d8c4b7c587 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 15:36:42 +0100 Subject: [PATCH 084/341] Update CHANGELOG for logs --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b85132a..5a8113d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Added - Add new contrubitor to SPONSORS.md +- Configfile will emit log to make debug easier ([!57](https://github.com/Mindsers/configfile/pull/57)) ### Changed - Use [Yabf](https://github.com/Mindsers/yabf) as base to build the next configfile. From 311193b3e30ce19cbf65f7dc5a815d9bfbd6efcc Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 16:49:24 +0100 Subject: [PATCH 085/341] Link script's stdois to configfile's stdios Don't use process.stdout.write anymore Fix #13 --- src/shared/utils/process.utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/utils/process.utils.js b/src/shared/utils/process.utils.js index 0b1a70e6..8d0adcb6 100644 --- a/src/shared/utils/process.utils.js +++ b/src/shared/utils/process.utils.js @@ -2,7 +2,7 @@ import childProcess from 'child_process' export class ProcessUtils { static execFile(filename) { - const child = childProcess.execFile(filename) + const child = childProcess.spawn(filename, [], { stdio: 'inherit' }) return { stdout: child.stdout, From 7dfb5d637828ba63d27891dafb9cd9cd6b3c75b9 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 16:53:59 +0100 Subject: [PATCH 086/341] Refactor ExecService --- src/services/exec.service.js | 15 +-------------- src/shared/utils/process.utils.js | 18 +++++++----------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/src/services/exec.service.js b/src/services/exec.service.js index a264c549..0c870aeb 100644 --- a/src/services/exec.service.js +++ b/src/services/exec.service.js @@ -2,10 +2,6 @@ import { FsUtils, ProcessUtils } from '../shared/utils' import { ScriptNotExist, BadScriptPermission } from '../shared/errors' export class ExecService { - constructor(messageService) { - this.messageService = messageService - } - async runScript(script) { if (script == null) { throw new ScriptNotExist(script.script) @@ -13,17 +9,8 @@ export class ExecService { await FsUtils.chmod(script.path, '0700') - const child = ProcessUtils.execFile(script.path) - - child.stdout.on('data', data => { - this.messageService.printRawText(data.trim()) - }) - child.stderr.on('data', data => { - this.messageService.printRawError(data.trim()) - }) - try { - return await child.toPromise() + return await ProcessUtils.spawn(script.path) } catch (error) { if (error.code === 'EACCES') { throw new BadScriptPermission(script.script) diff --git a/src/shared/utils/process.utils.js b/src/shared/utils/process.utils.js index 8d0adcb6..2da1e261 100644 --- a/src/shared/utils/process.utils.js +++ b/src/shared/utils/process.utils.js @@ -1,16 +1,12 @@ -import childProcess from 'child_process' +import { spawn } from 'child_process' export class ProcessUtils { - static execFile(filename) { - const child = childProcess.spawn(filename, [], { stdio: 'inherit' }) + static spawn(filename) { + return new Promise((resolve, reject) => { + const child = spawn(filename, [], { stdio: 'inherit' }) - return { - stdout: child.stdout, - stderr: child.stderr, - toPromise: () => new Promise((resolve, reject) => { - child.addListener('error', reject) - child.addListener('exit', resolve) - }) - } + child.addListener('error', reject) + child.addListener('exit', resolve) + }) } } From f6af05ddd1e4b0e5b6fc8b81a1bfbddf2dc5ada9 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 16:55:02 +0100 Subject: [PATCH 087/341] Remove MessageScript injection for ExecService --- bin/configfile-scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js index 37c2f0c4..8ea4a319 100644 --- a/bin/configfile-scripts.js +++ b/bin/configfile-scripts.js @@ -25,7 +25,7 @@ const { cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) cli.provide(FileService, [ConfigService, MessageService]) - cli.provide(ExecService, [MessageService]) + cli.provide(ExecService) cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) cli.start() From 2b8bed31d8063f0752610055e37d19aa4aaa4c7b Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 16:56:27 +0100 Subject: [PATCH 088/341] Remove message fake pipe method from MessageService --- src/services/message.service.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/services/message.service.js b/src/services/message.service.js index 3d120957..e260d67d 100644 --- a/src/services/message.service.js +++ b/src/services/message.service.js @@ -59,14 +59,6 @@ export class MessageService { this.print('') } - printRawText(text) { - this.stdout.write(text) - } - - printRawError(text) { - this.stderr.write(text) - } - _useBuilder(stylePrefix, styleText, defaultPrefix) { return (prefix, ...texts) => { let fullText = `${styleText(prefix)}\n` From b7903a5e610554320f9c5beb026fab8f2919d3d4 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 17 Nov 2018 17:09:10 +0100 Subject: [PATCH 089/341] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a8113d7..c806a697 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed - Git URL verification in `init` command is less strict. ([#48](https://github.com/Mindsers/configfile/issues/48)) +- Script standard outputs are correctly displayed ([!57](https://github.com/Mindsers/configfile/pull/57), [#13](https://github.com/Mindsers/configfile/issues/13)) ## [0.3.1] - 2018-08-05 ### Fixed From 401499ff73c26c7009e347f1604dd8632ef6d7e4 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Wed, 21 Nov 2018 01:52:39 +0100 Subject: [PATCH 090/341] Detect folders which contain index script Fix #49 --- src/services/file.service.js | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/services/file.service.js b/src/services/file.service.js index 4776cdf5..f2d151f0 100644 --- a/src/services/file.service.js +++ b/src/services/file.service.js @@ -39,16 +39,30 @@ export class FileService { const authorizedExtensions = this.configService.scriptExtension return folderContent - .filter(element => { - const foundResults = [] - for (const extension of authorizedExtensions) { - foundResults.push(element.includes(extension)) + .map(element => { + const stats = fs.statSync(path.join(this.configService.folderPath, 'scripts', element)) + + if (!stats.isDirectory()) { + return element } - return foundResults.filter(element => element).length > 0 + for (const ext of authorizedExtensions) { + if (FsUtils.fileExist(path.join(this.configService.folderPath, 'scripts', element, `index${ext}`))) { + return `${element}/index${ext}` + } + } + }) + .filter(element => { + const hasAuthorizedExtension = item => authorizedExtensions + .map(ext => item.includes(ext)) + .filter(el => el === true) + .length > 0 + + return element != null && hasAuthorizedExtension(element) }) .map(element => { - const [scriptName] = element.split('.') + const [scriptPath] = element.split('.') + const [scriptName] = scriptPath.split('/') const scriptSlug = scriptName .toLowerCase() .replace(/ /g, '-') From de8a98339a30b41093297793c7b51fba30a3b452 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Thu, 22 Nov 2018 01:28:30 +0100 Subject: [PATCH 091/341] Refactor the path building --- src/services/file.service.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/services/file.service.js b/src/services/file.service.js index f2d151f0..528cad92 100644 --- a/src/services/file.service.js +++ b/src/services/file.service.js @@ -40,14 +40,16 @@ export class FileService { return folderContent .map(element => { - const stats = fs.statSync(path.join(this.configService.folderPath, 'scripts', element)) + const elementPath = path.join(this.configService.folderPath, 'scripts', element) + const stats = fs.statSync(elementPath) if (!stats.isDirectory()) { return element } for (const ext of authorizedExtensions) { - if (FsUtils.fileExist(path.join(this.configService.folderPath, 'scripts', element, `index${ext}`))) { + const filePath = path.join(elementPath, `index${ext}`) + if (FsUtils.fileExist(filePath)) { return `${element}/index${ext}` } } From 842918f802db4da041a0de862953315a46ffa4f8 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Tue, 5 Mar 2019 07:36:49 +0100 Subject: [PATCH 092/341] Update sponsorship --- SPONSORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPONSORS.md b/SPONSORS.md index 02871e27..3d0c9bdf 100644 --- a/SPONSORS.md +++ b/SPONSORS.md @@ -33,4 +33,4 @@ No one is in the **Sponsors** section for now. Be the first! Read the **How can The best supporters are listed below: -- Steve Andriani ([LinkedIn](https://www.linkedin.com/in/steve-andriani-648661136/?originalSubdomain=fr)) +- Aurore Jacquemont ([Patreon](https://www.patreon.com/user/creators?u=15255739)) From 3853df323414025c02bdcb8ef3b151a24c981efd Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Sat, 16 Mar 2019 08:59:05 +0100 Subject: [PATCH 093/341] Remove link for one supporter --- SPONSORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPONSORS.md b/SPONSORS.md index 3d0c9bdf..cec2e173 100644 --- a/SPONSORS.md +++ b/SPONSORS.md @@ -33,4 +33,4 @@ No one is in the **Sponsors** section for now. Be the first! Read the **How can The best supporters are listed below: -- Aurore Jacquemont ([Patreon](https://www.patreon.com/user/creators?u=15255739)) +- Aurore Jacquemont From ce1ec52da39a5940f7d2b3f9af5601f95886c49f Mon Sep 17 00:00:00 2001 From: Mindsers Date: Tue, 2 Apr 2019 22:32:42 +0200 Subject: [PATCH 094/341] Update package w/ bugfixes updates --- package.json | 8 +++--- yarn.lock | 75 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 2a189e68..fccaf931 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,12 @@ "test": "yarn test:lint && yarn test:unit:coverage" }, "dependencies": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "commander": "^2.19.0", "esm": "^3.0.84", "gift": "^0.10.2", - "inquirer": "^6.2.0", - "yabf": "^2.0.0" + "inquirer": "^6.2.2", + "yabf": "^2.0.2" }, "devDependencies": { "@types/node": "^10.12.0", @@ -36,7 +36,7 @@ "eslint-plugin-promise": "^4.0.1", "eslint-plugin-standard": "^4.0.0", "nyc": "^13.1.0", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "sinon": "^7.0.0" } } diff --git a/yarn.lock b/yarn.lock index f14c007a..1fda1408 100644 --- a/yarn.lock +++ b/yarn.lock @@ -215,6 +215,11 @@ ansi-escapes@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== +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" @@ -225,6 +230,11 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1000,7 +1010,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== @@ -1009,6 +1019,15 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.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== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -1727,7 +1746,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -external-editor@^3.0.0: +external-editor@^3.0.0, external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== @@ -2262,7 +2281,7 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.1.0, inquirer@^6.2.0: +inquirer@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== @@ -2281,6 +2300,25 @@ inquirer@^6.1.0, inquirer@^6.2.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + 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.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -2859,7 +2897,7 @@ lodash.merge@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== -lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -3954,6 +3992,13 @@ rimraf@^2.2.8, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + 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" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -3968,6 +4013,13 @@ rxjs@^6.1.0: dependencies: tslib "^1.9.0" +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== + dependencies: + tslib "^1.9.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -4260,6 +4312,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" @@ -4710,10 +4769,10 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= -yabf@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.0.0.tgz#0cede59d65eec44813841ce2ee5b417e7b06f3cd" - integrity sha512-TmgWe+ay+H1Y/3vY2f16SKZM3mQC22U64+Bw6UpK+pUveJBLN0RAzNUwt75kVJ/8YE7QD3Z0ClEEhDWg3n0E1Q== +yabf@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.0.2.tgz#90785a501d06ed8d6a3f7ce5c47837689ef510ba" + integrity sha512-p4ODVXSPCXc0DipbTJauXAPFiB+HOB9r99Oq1XQlS42FDMevygrK902yM9bfDgfTgaUA8RDEvpC1wsADq0hEJA== yallist@^2.1.2: version "2.1.2" From b7926103f5c371b22ae777a81d2f96d394974782 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Tue, 2 Apr 2019 22:33:58 +0200 Subject: [PATCH 095/341] Update packages w/ minor updates --- package.json | 10 +- yarn.lock | 786 ++++++++++++++++++++++++++++----------------------- 2 files changed, 434 insertions(+), 362 deletions(-) diff --git a/package.json b/package.json index fccaf931..d4080c7a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "chalk": "^2.4.2", "commander": "^2.19.0", - "esm": "^3.0.84", + "esm": "^3.2.22", "gift": "^0.10.2", "inquirer": "^6.2.2", "yabf": "^2.0.2" @@ -29,14 +29,14 @@ "devDependencies": { "@types/node": "^10.12.0", "ava": "^0.25.0", - "eslint": "^5.7.0", + "eslint": "^5.16.0", "eslint-config-standard": "^12.0.0", "eslint-plugin-import": "^2.14.0", "eslint-plugin-node": "^7.0.1", - "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-promise": "^4.1.1", "eslint-plugin-standard": "^4.0.0", - "nyc": "^13.1.0", + "nyc": "^13.3.0", "rimraf": "^2.6.3", - "sinon": "^7.0.0" + "sinon": "^7.3.1" } } diff --git a/yarn.lock b/yarn.lock index 1fda1408..5d6e58f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -147,6 +147,13 @@ pretty-ms "^0.2.1" text-table "^0.2.0" +"@sinonjs/commons@^1", "@sinonjs/commons@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" + integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw== + dependencies: + type-detect "4.0.8" + "@sinonjs/commons@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.0.2.tgz#3e0ac737781627b8844257fadc3d803997d0526e" @@ -154,24 +161,27 @@ dependencies: type-detect "4.0.8" -"@sinonjs/formatio@3.0.0", "@sinonjs/formatio@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.0.0.tgz#9d282d81030a03a03fa0c5ce31fd8786a4da311a" - integrity sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w== +"@sinonjs/formatio@^3.1.0", "@sinonjs/formatio@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" + integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== dependencies: - "@sinonjs/samsam" "2.1.0" + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" -"@sinonjs/samsam@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.0.tgz#b8b8f5b819605bd63601a6ede459156880f38ea3" - integrity sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw== +"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" + integrity sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw== dependencies: + "@sinonjs/commons" "^1.0.2" array-from "^2.1.1" + lodash "^4.17.11" -"@sinonjs/samsam@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.2.tgz#16947fce5f57258d01f1688fdc32723093c55d3f" - integrity sha512-ZwTHAlC9akprWDinwEPD4kOuwaYZlyMwVJIANsKNC3QVp0AHB04m7RnB4eqeWfgmxw8MGTzS9uMaw93Z3QcZbw== +"@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== "@types/node@^10.12.0": version "10.12.0" @@ -188,15 +198,15 @@ acorn-jsx@^5.0.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.0.tgz#958584ddb60990c02c97c1bd9d521fce433bb101" integrity sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg== -acorn@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.2.tgz#6a459041c320ab17592c6317abbfdf4bbaa98ca4" - integrity sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg== +acorn@^6.0.7: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== -ajv@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" - integrity sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg== +ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -240,7 +250,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.1.0, ansi-styles@^3.2.1: +ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -366,18 +376,16 @@ assign-symbols@^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== + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= -async@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== - dependencies: - lodash "^4.17.10" - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -930,15 +938,15 @@ caching-transform@^1.0.0: mkdirp "^0.5.1" write-file-atomic "^1.1.4" -caching-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-2.0.0.tgz#e1292bd92d35b6e8b1ed7075726724b3bd64eea0" - integrity sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw== +caching-transform@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" + integrity sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== dependencies: - make-dir "^1.0.0" - md5-hex "^2.0.0" - package-hash "^2.0.0" - write-file-atomic "^2.0.0" + hasha "^3.0.0" + make-dir "^2.0.0" + package-hash "^3.0.0" + write-file-atomic "^2.4.2" call-matcher@^1.0.0: version "1.1.0" @@ -955,17 +963,10 @@ call-signature@0.0.2: resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" integrity sha1-qEq8glpV70yysCi9dOIFpluaSZY= -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== camelcase-keys@^2.0.0: version "2.1.0" @@ -980,11 +981,16 @@ camelcase@^2.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= -camelcase@^4.0.0, camelcase@^4.1.0: +camelcase@^4.0.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: + version "5.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.0.tgz#0a110882cbeba41f72f99fcf918f4a0a92a13ebf" + integrity sha512-Y05ICatFYPAfykDIB7VdwSJ0LUl1yq/BwO2OpyGGLjiRe1fgzTwVypPiWnzkGFOVFHXrCXUNBl86bpjBhZWSJg== + 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" @@ -1059,11 +1065,6 @@ ci-info@^1.5.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1290,7 +1291,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, 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== @@ -1325,11 +1326,6 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug-log@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" - integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= - debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1351,7 +1347,14 @@ debug@^4.0.1: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.1.2: +debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -1405,19 +1408,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -1453,10 +1443,10 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" @@ -1472,6 +1462,11 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + empower-core@^0.6.1: version "0.6.2" resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.2.tgz#5adef566088e31fba80ba0a36df47d7094169144" @@ -1480,6 +1475,13 @@ empower-core@^0.6.1: call-signature "0.0.2" core-js "^2.0.0" +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + equal-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" @@ -1559,20 +1561,20 @@ eslint-plugin-node@^7.0.1: resolve "^1.8.1" semver "^5.5.0" -eslint-plugin-promise@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2" - integrity sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg== +eslint-plugin-promise@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz#1e08cb68b5b2cd8839f8d5864c796f56d82746db" + integrity sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ== eslint-plugin-standard@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== +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== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -1587,54 +1589,52 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.7.0.tgz#55c326d6fb2ad45fcbd0ce17c3846f025d1d819c" - integrity sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A== +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.5.3" + ajv "^6.9.1" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" - doctrine "^2.1.0" - eslint-scope "^4.0.0" + doctrine "^3.0.0" + eslint-scope "^4.0.3" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^4.0.0" + espree "^5.0.1" esquery "^1.0.1" esutils "^2.0.2" - file-entry-cache "^2.0.0" + file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" glob "^7.1.2" globals "^11.7.0" ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.1.0" - is-resolvable "^1.1.0" - js-yaml "^3.12.0" + inquirer "^6.2.2" + js-yaml "^3.13.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.5" + lodash "^4.17.11" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" path-is-inside "^1.0.2" - pluralize "^7.0.0" progress "^2.0.0" regexpp "^2.0.1" - require-uncached "^1.0.3" semver "^5.5.1" strip-ansi "^4.0.0" strip-json-comments "^2.0.1" - table "^5.0.2" + table "^5.2.3" text-table "^0.2.0" -esm@^3.0.84: - version "3.0.84" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.0.84.tgz#bb108989f4673b32d4f62406869c28eed3815a63" - integrity sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw== +esm@^3.2.22: + version "3.2.22" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.22.tgz#5062c2e22fee3ccfee4e8f20da768330da90d6e3" + integrity sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA== espower-location-detector@^1.0.0: version "1.0.0" @@ -1646,12 +1646,12 @@ espower-location-detector@^1.0.0: source-map "^0.5.0" xtend "^4.0.0" -espree@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" - integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== +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== dependencies: - acorn "^6.0.2" + acorn "^6.0.7" acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" @@ -1704,6 +1704,19 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +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" + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -1746,7 +1759,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -external-editor@^3.0.0, external-editor@^3.0.3: +external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== @@ -1803,13 +1816,12 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= +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== dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" + flat-cache "^2.0.1" filename-regex@^2.0.0: version "2.0.1" @@ -1877,15 +1889,19 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= +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: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== flex-exec@^1.0.0: version "1.0.0" @@ -1993,6 +2009,13 @@ get-stream@^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: + 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-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" @@ -2050,18 +2073,6 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - globby@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -2095,12 +2106,17 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -handlebars@^4.0.11: - version "4.0.12" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" - integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== +graceful-fs@^4.1.15: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +handlebars@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.1.tgz#6e4e41c18ebe7719ae4d38e5aca3d32fa3dd23d3" + integrity sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA== dependencies: - async "^2.5.0" + neo-async "^2.6.0" optimist "^0.6.1" source-map "^0.6.1" optionalDependencies: @@ -2176,6 +2192,13 @@ has@^1.0.1: dependencies: function-bind "^1.1.1" +hasha@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" + integrity sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk= + dependencies: + is-stream "^1.0.1" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -2233,6 +2256,14 @@ ignore@^4.0.2, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -2281,25 +2312,6 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" - integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.17.10" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - inquirer@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" @@ -2326,10 +2338,10 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +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== irregular-plurals@^1.0.0: version "1.4.0" @@ -2529,18 +2541,6 @@ is-observable@^1.0.0: dependencies: symbol-observable "^1.1.0" -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== - dependencies: - is-path-inside "^1.0.0" - is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -2580,17 +2580,12 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-resolvable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= -is-stream@^1.0.0, is-stream@^1.1.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= @@ -2637,57 +2632,57 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -istanbul-lib-coverage@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" - integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA== +istanbul-lib-coverage@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" + integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== -istanbul-lib-hook@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" - integrity sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w== +istanbul-lib-hook@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" + integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== dependencies: append-transform "^1.0.0" -istanbul-lib-instrument@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" - integrity sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ== +istanbul-lib-instrument@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" + integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== dependencies: "@babel/generator" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/template" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.1" + istanbul-lib-coverage "^2.0.3" semver "^5.5.0" -istanbul-lib-report@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" - integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q== +istanbul-lib-report@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" + integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== dependencies: - istanbul-lib-coverage "^2.0.1" + istanbul-lib-coverage "^2.0.3" make-dir "^1.3.0" - supports-color "^5.4.0" + supports-color "^6.0.0" -istanbul-lib-source-maps@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" - integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A== +istanbul-lib-source-maps@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" + integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^2.0.1" + debug "^4.1.1" + istanbul-lib-coverage "^2.0.3" make-dir "^1.3.0" rimraf "^2.6.2" source-map "^0.6.1" -istanbul-reports@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" - integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw== +istanbul-reports@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" + integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== dependencies: - handlebars "^4.0.11" + handlebars "^4.1.0" js-string-escape@^1.0.1: version "1.0.1" @@ -2704,7 +2699,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.10.0, js-yaml@^3.12.0: +js-yaml@^3.10.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== @@ -2712,6 +2707,14 @@ js-yaml@^3.10.0, js-yaml@^3.12.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" + integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -2747,10 +2750,10 @@ json5@^0.5.1: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= -just-extend@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-3.0.0.tgz#cee004031eaabf6406da03a7b84e4fe9d78ef288" - integrity sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ== +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -2790,12 +2793,12 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= +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 "^1.0.0" + invert-kv "^2.0.0" levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -2882,11 +2885,6 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -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" @@ -2897,7 +2895,7 @@ lodash.merge@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -2907,10 +2905,10 @@ lolex@^2.3.2: resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== -lolex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.0.0.tgz#f04ee1a8aa13f60f1abd7b0e8f4213ec72ec193e" - integrity sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ== +lolex@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.1.0.tgz#1a7feb2fefd75b3e3a7f79f0e110d9476e294434" + integrity sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw== loose-envify@^1.0.0: version "1.4.0" @@ -2947,6 +2945,21 @@ make-dir@^1.0.0, make-dir@^1.3.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +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" @@ -2995,12 +3008,14 @@ md5-o-matic@^0.1.1: resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= +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== dependencies: - mimic-fn "^1.0.0" + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" meow@^3.7.0: version "3.7.0" @@ -3068,6 +3083,11 @@ mimic-fn@^1.0.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== + minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -3181,21 +3201,26 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" +neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + 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== -nise@^1.4.5: - version "1.4.6" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.6.tgz#76cc3915925056ae6c405dd8ad5d12bde570c19f" - integrity sha512-1GedetLKzmqmgwabuMSqPsT7oumdR77SBpDfNNJhADRIeA3LN/2RVqR4fFqwvzhAqcTef6PPCzQwITE/YQ8S8A== +nise@^1.4.10: + version "1.4.10" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" + integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== dependencies: - "@sinonjs/formatio" "3.0.0" - just-extend "^3.0.0" + "@sinonjs/formatio" "^3.1.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" lolex "^2.3.2" path-to-regexp "^1.7.0" - text-encoding "^0.6.4" node-pre-gyp@^0.10.0: version "0.10.3" @@ -3273,36 +3298,35 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nyc@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-13.1.0.tgz#463665c7ff6b5798e322624a5eb449a678db90e3" - integrity sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg== +nyc@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-13.3.0.tgz#da4dbe91a9c8b9ead3f4f3344c76f353e3c78c75" + integrity sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w== dependencies: archy "^1.0.0" arrify "^1.0.1" - caching-transform "^2.0.0" + caching-transform "^3.0.1" convert-source-map "^1.6.0" - debug-log "^1.0.1" find-cache-dir "^2.0.0" find-up "^3.0.0" foreground-child "^1.5.6" glob "^7.1.3" - istanbul-lib-coverage "^2.0.1" - istanbul-lib-hook "^2.0.1" - istanbul-lib-instrument "^3.0.0" - istanbul-lib-report "^2.0.2" - istanbul-lib-source-maps "^2.0.1" - istanbul-reports "^2.0.1" + istanbul-lib-coverage "^2.0.3" + istanbul-lib-hook "^2.0.3" + istanbul-lib-instrument "^3.1.0" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.2" + istanbul-reports "^2.1.1" make-dir "^1.3.0" merge-source-map "^1.1.0" resolve-from "^4.0.0" - rimraf "^2.6.2" + rimraf "^2.6.3" signal-exit "^3.0.2" spawn-wrap "^1.4.2" - test-exclude "^5.0.0" + test-exclude "^5.1.0" uuid "^3.3.2" - yargs "11.1.0" - yargs-parser "^9.0.2" + yargs "^12.0.5" + yargs-parser "^11.1.1" object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" @@ -3348,7 +3372,7 @@ observable-to-promise@^0.5.0: is-observable "^0.2.0" symbol-observable "^1.0.4" -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -3392,14 +3416,14 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== +os-locale@^3.0.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 "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" @@ -3414,11 +3438,21 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +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-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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" + integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -3474,6 +3508,16 @@ package-hash@^2.0.0: md5-hex "^2.0.0" release-zalgo "^1.0.0" +package-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e" + integrity sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA== + dependencies: + graceful-fs "^4.1.15" + hasha "^3.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -3484,6 +3528,13 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -3596,6 +3647,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" @@ -3656,11 +3712,6 @@ plur@^2.0.0: dependencies: irregular-plurals "^1.0.0" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - 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" @@ -3715,6 +3766,14 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -3930,14 +3989,6 @@ require-precompiled@^0.1.0: resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" integrity sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo= -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -3945,11 +3996,6 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -3985,20 +4031,20 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.2.8, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -rimraf@^2.6.3: +rimraf@2.6.3, rimraf@^2.6.3: 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@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -4006,13 +4052,6 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" -rxjs@^6.1.0: - version "6.3.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== - dependencies: - tslib "^1.9.0" - rxjs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" @@ -4054,6 +4093,11 @@ semver-diff@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" @@ -4101,33 +4145,40 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.0.0.tgz#99f2e5198d90a01ccbcebd4dc181a24827cb90dd" - integrity sha512-8OrSYFPZ9xaECfi1ayVMd0ihYCW2OZYgX3rBczrB990gHZMM+aftvhNTJazGz/luS0Us9NWgD5P3KGQ7kYZvGg== +sinon@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.1.tgz#e8276522104e6c08d1cb52a907270b0e316655c4" + integrity sha512-eQKMaeWovtOtYe2xThEvaHmmxf870Di+bim10c3ZPrL5bZhLGtu8cz+rOBTFz0CwBV4Q/7dYwZiqZbGVLZ+vjQ== dependencies: - "@sinonjs/commons" "^1.0.2" - "@sinonjs/formatio" "^3.0.0" - "@sinonjs/samsam" "^2.1.2" + "@sinonjs/commons" "^1.4.0" + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/samsam" "^3.3.1" diff "^3.5.0" - lodash.get "^4.4.2" - lolex "^3.0.0" - nise "^1.4.5" + lolex "^3.1.0" + nise "^1.4.10" supports-color "^5.5.0" - type-detect "^4.0.8" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slice-ansi@1.0.0, slice-ansi@^1.0.0: +slice-ansi@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" +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== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -4291,6 +4342,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4312,7 +4372,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -4376,13 +4436,20 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +supports-color@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" @@ -4393,15 +4460,15 @@ symbol-observable@^1.0.4, symbol-observable@^1.1.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -table@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/table/-/table-5.1.0.tgz#69a54644f6f01ad1628f8178715b408dc6bf11f7" - integrity sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg== +table@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" + integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== dependencies: - ajv "^6.5.3" - lodash "^4.17.10" - slice-ansi "1.0.0" - string-width "^2.1.1" + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" tar@^4: version "4.4.6" @@ -4423,21 +4490,16 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -test-exclude@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.0.0.tgz#cdce7cece785e0e829cd5c2b27baf18bc583cfb7" - integrity sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw== +test-exclude@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" + integrity sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA== dependencies: arrify "^1.0.1" minimatch "^3.0.4" read-pkg-up "^4.0.0" require-main-filename "^1.0.1" -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" @@ -4535,7 +4597,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.8: +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== @@ -4727,6 +4789,15 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write-json-file@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" @@ -4747,10 +4818,10 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= +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" @@ -4764,10 +4835,10 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -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@^3.2.1 || ^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== yabf@^2.0.2: version "2.0.2" @@ -4784,27 +4855,28 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= -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= +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 "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== +yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" + decamelize "^1.2.0" + find-up "^3.0.0" get-caller-file "^1.0.1" - os-locale "^2.0.0" + os-locale "^3.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" From 17c4c0d9aef00f006da26979b14e21041d4e3321 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Tue, 2 Apr 2019 22:34:43 +0200 Subject: [PATCH 096/341] Update packages w/ breaking changes --- package.json | 8 +- yarn.lock | 2135 ++++++++++++++++++++------------------------------ 2 files changed, 853 insertions(+), 1290 deletions(-) diff --git a/package.json b/package.json index d4080c7a..33161a01 100644 --- a/package.json +++ b/package.json @@ -27,12 +27,12 @@ "yabf": "^2.0.2" }, "devDependencies": { - "@types/node": "^10.12.0", - "ava": "^0.25.0", + "@types/node": "^11.13.0", + "ava": "^1.4.1", "eslint": "^5.16.0", "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.14.0", - "eslint-plugin-node": "^7.0.1", + "eslint-plugin-import": "^2.16.0", + "eslint-plugin-node": "^8.0.1", "eslint-plugin-promise": "^4.1.1", "eslint-plugin-standard": "^4.0.0", "nyc": "^13.3.0", diff --git a/yarn.lock b/yarn.lock index 5d6e58f7..7080a5a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,36 +2,31 @@ # yarn lockfile v1 -"@ava/babel-plugin-throws-helper@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz#2fc1fe3c211a71071a4eca7b8f7af5842cd1ae7c" - integrity sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw= - -"@ava/babel-preset-stage-4@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz#ae60be881a0babf7d35f52aba770d1f6194f76bd" - integrity sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg== - dependencies: - babel-plugin-check-es2015-constants "^6.8.0" - babel-plugin-syntax-trailing-function-commas "^6.20.0" - babel-plugin-transform-async-to-generator "^6.16.0" - babel-plugin-transform-es2015-destructuring "^6.19.0" - babel-plugin-transform-es2015-function-name "^6.9.0" - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-plugin-transform-es2015-parameters "^6.21.0" - babel-plugin-transform-es2015-spread "^6.8.0" - babel-plugin-transform-es2015-sticky-regex "^6.8.0" - babel-plugin-transform-es2015-unicode-regex "^6.11.0" - babel-plugin-transform-exponentiation-operator "^6.8.0" - package-hash "^1.2.0" - -"@ava/babel-preset-transform-test-files@^3.0.0": +"@ava/babel-plugin-throws-helper@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz#cded1196a8d8d9381a509240ab92e91a5ec069f7" - integrity sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc= + resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-3.0.0.tgz#2c933ec22da0c4ce1fc5369f2b95452c70420586" + integrity sha512-mN9UolOs4WX09QkheU1ELkVy2WPnwonlO3XMdN8JF8fQqRVgVTR21xDbvEOUsbwz6Zwjq7ji9yzyjuXqDPalxg== + +"@ava/babel-preset-stage-4@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-2.0.0.tgz#2cd072ff818e4432b87fd4c5fd5c5d1a405a4343" + integrity sha512-OWqMYeTSZ16AfLx0Vn0Uj7tcu+uMRlbKmks+DVCFlln7vomVsOtst+Oz+HCussDSFGpE+30VtHAUHLy6pLDpHQ== + dependencies: + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + +"@ava/babel-preset-transform-test-files@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-5.0.0.tgz#e06fc762069511e597531cc1120e22216aac6981" + integrity sha512-rqgyQwkT0+j2JzYP51dOv80u33rzAvjBtXRzUON+7+6u26mjoudRXci2+1s18rat8r4uOlZfbzm114YS6pwmYw== dependencies: - "@ava/babel-plugin-throws-helper" "^2.0.0" - babel-plugin-espower "^2.3.2" + "@ava/babel-plugin-throws-helper" "^3.0.0" + babel-plugin-espower "^3.0.1" "@ava/write-file-atomic@^2.2.0": version "2.2.0" @@ -49,6 +44,26 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/core@^7.4.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" + integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.3" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.0.0", "@babel/generator@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" @@ -60,6 +75,40 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.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" @@ -76,6 +125,56 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz#b1e357a1c49e58a47211a6853abb8e2aaefeb064" + integrity sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.11" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.3.tgz#9d6e5428bfd638ab53b37ae4ec8caf0477495147" + integrity sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" @@ -83,6 +182,32 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== + dependencies: + "@babel/types" "^7.4.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" + integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== + dependencies: + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -97,6 +222,92 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== +"@babel/parser@^7.4.0", "@babel/parser@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== + +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" + integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" + integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz#fceff1c16d00c53d32d980448606f812cd6d02bf" + integrity sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.3" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz#3917f260463ac08f8896aa5bd54403f6e1fed165" + integrity sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA== + dependencies: + "@babel/helper-module-transforms" "^7.4.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/template@^7.0.0", "@babel/template@^7.1.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" @@ -106,6 +317,15 @@ "@babel/parser" "^7.1.2" "@babel/types" "^7.1.2" +"@babel/template@^7.2.2", "@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + "@babel/traverse@^7.0.0": version "7.1.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4" @@ -121,6 +341,21 @@ globals "^11.1.0" lodash "^4.17.10" +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" + integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" @@ -130,22 +365,21 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@concordance/react@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@concordance/react/-/react-1.0.0.tgz#fcf3cad020e5121bfd1c61d05bc3516aac25f734" - integrity sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ== +"@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== dependencies: - arrify "^1.0.1" + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" -"@ladjs/time-require@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@ladjs/time-require/-/time-require-0.1.4.tgz#5c615d75fd647ddd5de9cf6922649558856b21a1" - integrity sha512-weIbJqTMfQ4r1YX85u54DKfjLZs2jwn1XZ6tIOP/pFgMwhIN5BAtaCp/1wn9DzyLsDR9tW0R2NIePcVJ45ivQQ== +"@concordance/react@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" + integrity sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA== dependencies: - chalk "^0.4.0" - date-time "^0.1.1" - pretty-ms "^0.2.1" - text-table "^0.2.0" + arrify "^1.0.1" "@sinonjs/commons@^1", "@sinonjs/commons@^1.4.0": version "1.4.0" @@ -183,10 +417,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/node@^10.12.0": - version "10.12.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" - integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ== +"@types/node@^11.13.0": + version "11.13.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.0.tgz#b0df8d6ef9b5001b2be3a94d909ce3c29a80f9e1" + integrity sha512-rx29MMkRdVmzunmiA4lzBYJNnXsW/PhG4kMBy2ATsYaDjGGR75dCFEVVROKpNwlVdcUX3xxlghKQOeDPBJobng== abbrev@1: version "1.1.1" @@ -220,11 +454,6 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== - ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -245,30 +474,20 @@ 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-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" - integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" append-transform@^1.0.0: version "1.0.0" @@ -302,24 +521,12 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - 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-exclude@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/arr-exclude/-/arr-exclude-1.0.0.tgz#dfc7c2e552a270723ccda04cf3128c8cbfe5c631" - integrity sha1-38fC5VKicHI8zaBM8xKMjL/lxjE= - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +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== @@ -329,10 +536,10 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= +array-differ@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" + integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== array-find-index@^1.0.1: version "1.0.2" @@ -344,22 +551,22 @@ array-from@^2.1.1: resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= -array-union@^1.0.1: +array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" -array-uniq@^1.0.1, array-uniq@^1.0.2: +array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= +array-uniq@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.0.0.tgz#0009e30306e37a6dd2e2e2480db5316fdade1583" + integrity sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg== array-unique@^0.3.2: version "0.3.2" @@ -381,450 +588,116 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= +async-each@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" + integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== atob@^2.1.1: 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@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.1.tgz#807f7910b0210db9eefe133f3492c28e89698b96" - integrity sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA== - -ava-init@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ava-init/-/ava-init-0.2.1.tgz#75ac4c8553326290d2866e63b62fa7035684bd58" - integrity sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg== - dependencies: - arr-exclude "^1.0.0" - execa "^0.7.0" - has-yarn "^1.0.0" - read-pkg-up "^2.0.0" - write-pkg "^3.1.0" - -ava@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-0.25.0.tgz#8ac87780514f96a6fd42e1306eaa0752ce3a407f" - integrity sha512-4lGNJCf6xL8SvsKVEKxEE46se7JAUIAZoKHw9itTQuwcsydhpAMkBs5gOOiWiwt0JKNIuXWc2/r4r8ZdcNrBEw== +ava@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/ava/-/ava-1.4.1.tgz#4a59289e0c9728e492ec3a5be21d1072636be172" + integrity sha512-wKpgOPTL7hJSBWpfbU4SA8rlsTZrph9g9g7qYDV7M6uK1rKeW8oCUJWRwCd8B24S4N0Y5myf6cTEnA66WIk0sA== dependencies: - "@ava/babel-preset-stage-4" "^1.1.0" - "@ava/babel-preset-transform-test-files" "^3.0.0" + "@ava/babel-preset-stage-4" "^2.0.0" + "@ava/babel-preset-transform-test-files" "^5.0.0" "@ava/write-file-atomic" "^2.2.0" - "@concordance/react" "^1.0.0" - "@ladjs/time-require" "^0.1.4" - ansi-escapes "^3.0.0" - ansi-styles "^3.1.0" - arr-flatten "^1.0.1" + "@babel/core" "^7.4.0" + "@babel/generator" "^7.4.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@concordance/react" "^2.0.0" + ansi-escapes "^3.2.0" + ansi-styles "^3.2.1" + arr-flatten "^1.1.0" array-union "^1.0.1" - array-uniq "^1.0.2" + array-uniq "^2.0.0" arrify "^1.0.0" - auto-bind "^1.1.0" - ava-init "^0.2.0" - babel-core "^6.17.0" - babel-generator "^6.26.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" - bluebird "^3.0.0" - caching-transform "^1.0.0" - chalk "^2.0.1" - chokidar "^1.4.2" - clean-stack "^1.1.1" + bluebird "^3.5.3" + chalk "^2.4.2" + chokidar "^2.1.5" + chunkd "^1.0.0" + ci-parallel-vars "^1.0.0" + clean-stack "^2.0.0" clean-yaml-object "^0.1.0" cli-cursor "^2.1.0" - cli-spinners "^1.0.0" - cli-truncate "^1.0.0" - co-with-promise "^4.6.0" + cli-truncate "^1.1.0" code-excerpt "^2.1.1" common-path-prefix "^1.0.0" - concordance "^3.0.0" - convert-source-map "^1.5.1" - core-assert "^0.2.0" + concordance "^4.0.0" + convert-source-map "^1.6.0" currently-unhandled "^0.4.1" - debug "^3.0.1" - dot-prop "^4.1.0" - empower-core "^0.6.1" + debug "^4.1.1" + del "^4.0.0" + dot-prop "^4.2.0" + emittery "^0.4.1" + empower-core "^1.2.0" equal-length "^1.0.0" + escape-string-regexp "^1.0.5" + esm "^3.2.20" figures "^2.0.0" - find-cache-dir "^1.0.0" - fn-name "^2.0.0" - get-port "^3.0.0" - globby "^6.0.0" - has-flag "^2.0.0" - hullabaloo-config-manager "^1.1.0" + find-up "^3.0.0" + get-port "^4.2.0" + globby "^7.1.1" ignore-by-default "^1.0.0" - import-local "^0.1.1" - indent-string "^3.0.0" - is-ci "^1.0.7" - is-generator-fn "^1.0.0" - is-obj "^1.0.0" - is-observable "^1.0.0" + import-local "^2.0.0" + indent-string "^3.2.0" + is-ci "^2.0.0" + is-error "^2.2.1" + is-observable "^1.1.0" + is-plain-object "^2.0.4" is-promise "^2.1.0" - last-line-stream "^1.0.0" + lodash.clone "^4.5.0" + lodash.clonedeep "^4.5.0" lodash.clonedeepwith "^4.5.0" lodash.debounce "^4.0.3" lodash.difference "^4.3.0" lodash.flatten "^4.2.0" loud-rejection "^1.2.0" - make-dir "^1.0.0" - matcher "^1.0.0" + make-dir "^2.1.0" + matcher "^1.1.1" md5-hex "^2.0.0" - meow "^3.7.0" - ms "^2.0.0" - multimatch "^2.1.0" + meow "^5.0.0" + ms "^2.1.1" + multimatch "^3.0.0" observable-to-promise "^0.5.0" - option-chain "^1.0.0" - package-hash "^2.0.0" - pkg-conf "^2.0.0" - plur "^2.0.0" - pretty-ms "^3.0.0" + ora "^3.2.0" + package-hash "^3.0.0" + pkg-conf "^3.0.0" + plur "^3.0.1" + pretty-ms "^4.0.0" require-precompiled "^0.1.0" resolve-cwd "^2.0.0" - safe-buffer "^5.1.1" - semver "^5.4.1" - slash "^1.0.0" - source-map-support "^0.5.0" - stack-utils "^1.0.1" - strip-ansi "^4.0.0" + slash "^2.0.0" + source-map-support "^0.5.11" + stack-utils "^1.0.2" + strip-ansi "^5.2.0" strip-bom-buf "^1.0.0" supertap "^1.0.0" - supports-color "^5.0.0" + supports-color "^6.1.0" trim-off-newlines "^1.0.1" - unique-temp-dir "^1.0.0" - update-notifier "^2.3.0" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.17.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.1.0, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" trim-right "^1.0.1" + unique-temp-dir "^1.0.0" + update-notifier "^2.5.0" -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-espower@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-2.4.0.tgz#9f92c080e9adfe73f69baed7ab3e24f649009373" - integrity sha512-/+SRpy7pKgTI28oEHfn1wkuM5QFAdRq8WNsOOih1dVrdV6A/WbNbRZyl0eX5eyDgtb0lOE27PeDFuCX2j8OxVg== +babel-plugin-espower@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-3.0.1.tgz#180db17126f88e754105b8b5216d21e520a6bd4e" + integrity sha512-Ms49U7VIAtQ/TtcqRbD6UBmJBUCSxiC3+zPc+eGqxKUIFO1lTshyEDRUjhoAbd2rWfwYf3cZ62oXozrd8W6J0A== dependencies: - babel-generator "^6.1.0" - babylon "^6.1.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" call-matcher "^1.0.0" core-js "^2.0.0" espower-location-detector "^1.0.0" espurify "^1.6.0" estraverse "^4.1.1" -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-object-rest-spread@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-syntax-trailing-function-commas@^6.20.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.16.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-destructuring@^6.19.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.9.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.18.0: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-parameters@^6.21.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-unicode-regex@^6.11.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.1.0, babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -848,10 +721,10 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== -bluebird@^3.0.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" - integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== +bluebird@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== boxen@^1.2.1: version "1.3.0" @@ -874,16 +747,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -899,11 +763,6 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -buf-compare@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" - integrity sha1-/vKNqLgROgoNtEMLC2Rntpcws0o= - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -929,15 +788,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caching-transform@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" - integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= - dependencies: - md5-hex "^1.2.0" - mkdirp "^0.5.1" - write-file-atomic "^1.1.4" - caching-transform@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" @@ -968,20 +818,16 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" -camelcase@^4.0.0: +camelcase@^4.0.0, 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= @@ -996,26 +842,6 @@ capture-stack-trace@^1.0.0: resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== -chalk@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" - integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= - dependencies: - ansi-styles "~1.0.0" - has-color "~0.1.0" - strip-ansi "~0.1.0" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" @@ -1039,32 +865,50 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^1.4.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= +chokidar@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" chownr@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== +chunkd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-1.0.0.tgz#4ead4a3704bcce510c4bb4d4a8be30c557836dd1" + integrity sha512-xx3Pb5VF9QaqCotolyZ1ywFBgyuJmu6+9dLiqBxgelEse9Xsr3yUlpoX3O4Oh11M00GT2kYMsRByTKIMJW2Lkg== + ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-parallel-vars@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" + integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1075,10 +919,10 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" - integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= +clean-stack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.0.0.tgz#301bfa9e8dd2d3d984c0e542f7aa67b996f63e0a" + integrity sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A== clean-yaml-object@^0.1.0: version "0.1.0" @@ -1097,12 +941,12 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" - integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.0.0.tgz#4b078756fc17a8f72043fdc9f1f14bf4fa87e2df" + integrity sha512-yiEBmhaKPPeBj7wWm4GEdtPZK940p9pl3EANIrnJ3JnvWyrPjcFcsEq6qRUuQ7fzB0+Y82ld3p6B34xo95foWw== -cli-truncate@^1.0.0: +cli-truncate@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== @@ -1124,12 +968,10 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -co-with-promise@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co-with-promise/-/co-with-promise-4.6.0.tgz#413e7db6f5893a60b942cf492c4bec93db415ab7" - integrity sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc= - dependencies: - pinkie-promise "^1.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= code-excerpt@^2.1.1: version "2.1.1" @@ -1193,22 +1035,22 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concordance@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-3.0.0.tgz#b2286af54405fc995fc7345b0b106d8dd073cb29" - integrity sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ== +concordance@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-4.0.0.tgz#5932fdee397d129bdbc3a1885fbe69839b1b7e15" + integrity sha512-l0RFuB8RLfCS0Pt2Id39/oCPykE01pyxgAFypWTlaGRgvLkZrtczZ8atEHpTeEIW+zYWXTBuA9cCSeEOScxReQ== dependencies: date-time "^2.1.0" esutils "^2.0.2" - fast-diff "^1.1.1" - function-name-support "^0.2.0" + fast-diff "^1.1.2" js-string-escape "^1.0.1" lodash.clonedeep "^4.5.0" lodash.flattendeep "^4.4.0" - lodash.merge "^4.6.0" + lodash.islength "^4.0.1" + lodash.merge "^4.6.1" md5-hex "^2.0.0" - semver "^5.3.0" - well-known-symbols "^1.0.0" + semver "^5.5.1" + well-known-symbols "^2.0.0" configstore@^3.0.0: version "3.1.2" @@ -1232,7 +1074,7 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -convert-source-map@^1.5.1, convert-source-map@^1.6.0: +convert-source-map@^1.1.0, convert-source-map@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -1249,15 +1091,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-assert@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f" - integrity sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8= - dependencies: - buf-compare "^1.0.0" - is-error "^2.2.0" - -core-js@^2.0.0, core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.0.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== @@ -1314,11 +1148,6 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -date-time@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-0.1.1.tgz#ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07" - integrity sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc= - date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" @@ -1333,7 +1162,7 @@ debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.0.1, debug@^3.1.0: +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -1347,14 +1176,22 @@ debug@^4.0.1: dependencies: ms "^2.1.1" -debug@^4.1.1: +debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -decamelize@^1.1.2, decamelize@^1.2.0: +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.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= @@ -1386,6 +1223,13 @@ default-require-extensions@^2.0.0: dependencies: strip-bom "^3.0.0" +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -1408,23 +1252,23 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +del@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.0.tgz#049543b8290e1a9293e2bd150ab3a06f637322b8" + integrity sha512-C4kvKNlYrwXhKxz97BuohF8YoGgQ23Xm9lvoHmgT7JaPGprSEjk3+XFled74Yt/x0ZABUHg2D67covzAPUKx5Q== + dependencies: + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -1435,6 +1279,13 @@ diff@^3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +dir-glob@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -1450,7 +1301,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^4.1.0: +dot-prop@^4.1.0, dot-prop@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== @@ -1462,15 +1313,20 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +emittery@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" + integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== -empower-core@^0.6.1: - version "0.6.2" - resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.2.tgz#5adef566088e31fba80ba0a36df47d7094169144" - integrity sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ= +empower-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-1.2.0.tgz#ce3fb2484d5187fa29c23fba8344b0b2fdf5601c" + integrity sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ== dependencies: call-signature "0.0.2" core-js "^2.0.0" @@ -1494,12 +1350,12 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es6-error@^4.0.1, es6-error@^4.0.2: +es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.4, 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= @@ -1509,7 +1365,7 @@ eslint-config-standard@^12.0.0: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== -eslint-import-resolver-node@^0.3.1: +eslint-import-resolver-node@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== @@ -1517,13 +1373,13 @@ eslint-import-resolver-node@^0.3.1: debug "^2.6.9" resolve "^1.5.0" -eslint-module-utils@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" - integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= +eslint-module-utils@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49" + integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w== dependencies: debug "^2.6.8" - pkg-dir "^1.0.0" + pkg-dir "^2.0.0" eslint-plugin-es@^1.3.1: version "1.3.1" @@ -1533,30 +1389,30 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.0" -eslint-plugin-import@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" - integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== +eslint-plugin-import@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f" + integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A== dependencies: contains-path "^0.1.0" - debug "^2.6.8" + debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.3.0" + has "^1.0.3" + lodash "^4.17.11" + minimatch "^3.0.4" read-pkg-up "^2.0.0" - resolve "^1.6.0" + resolve "^1.9.0" -eslint-plugin-node@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" - integrity sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw== +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== dependencies: eslint-plugin-es "^1.3.1" eslint-utils "^1.3.1" - ignore "^4.0.2" + ignore "^5.0.2" minimatch "^3.0.4" resolve "^1.8.1" semver "^5.5.0" @@ -1631,7 +1487,7 @@ eslint@^5.16.0: table "^5.2.3" text-table "^0.2.0" -esm@^3.2.22: +esm@^3.2.20, esm@^3.2.22: version "3.2.22" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.22.tgz#5062c2e22fee3ccfee4e8f20da768330da90d6e3" integrity sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA== @@ -1717,13 +1573,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -1737,13 +1586,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -1768,13 +1610,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -1794,7 +1629,7 @@ fast-deep-equal@^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-diff@^1.1.1: +fast-diff@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== @@ -1823,22 +1658,6 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -1849,15 +1668,6 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - find-cache-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" @@ -1867,14 +1677,6 @@ find-cache-dir@^2.0.0: make-dir "^1.0.0" pkg-dir "^3.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.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" @@ -1908,23 +1710,11 @@ flex-exec@^1.0.0: resolved "https://registry.yarnpkg.com/flex-exec/-/flex-exec-1.0.0.tgz#06974b68532839d2a12c32debcdb12378200fdf0" integrity sha1-BpdLaFMoOdKhLDLevNsSN4IA/fA= -fn-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" - integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= - -for-in@^1.0.1, for-in@^1.0.2: +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= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" @@ -1952,10 +1742,10 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== +fsevents@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" @@ -1965,11 +1755,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function-name-support@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/function-name-support/-/function-name-support-0.2.0.tgz#55d3bfaa6eafd505a50f9bc81fdf57564a0bb071" - integrity sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE= - functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -1994,15 +1779,10 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-port@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-port@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" + integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== get-stream@^3.0.0: version "3.0.0" @@ -2029,20 +1809,13 @@ gift@^0.10.2: flex-exec "^1.0.0" underscore "^1.8.3" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - is-glob "^2.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: version "7.1.3" @@ -2068,12 +1841,7 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globby@^6.0.0: +globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= @@ -2084,6 +1852,18 @@ globby@^6.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -2122,23 +1902,6 @@ handlebars@^4.1.0: optionalDependencies: uglify-js "^3.1.4" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-color@~0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" - integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2180,12 +1943,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has-yarn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7" - integrity sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac= - -has@^1.0.1: +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== @@ -2199,39 +1957,11 @@ hasha@^3.0.0: dependencies: is-stream "^1.0.1" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -hullabaloo-config-manager@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz#1d9117813129ad035fd9e8477eaf066911269fe3" - integrity sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A== - dependencies: - dot-prop "^4.1.0" - es6-error "^4.0.2" - graceful-fs "^4.1.11" - indent-string "^3.1.0" - json5 "^0.5.1" - lodash.clonedeep "^4.5.0" - lodash.clonedeepwith "^4.5.0" - lodash.isequal "^4.5.0" - lodash.merge "^4.6.0" - md5-hex "^2.0.0" - package-hash "^2.0.0" - pkg-dir "^2.0.0" - resolve-from "^3.0.0" - safe-buffer "^5.0.1" - iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -2251,11 +1981,21 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^4.0.2, ignore@^4.0.6: +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: version "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.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.6.tgz#562dacc7ec27d672dde433aa683c543b24c17694" + integrity sha512-/+hp3kUf/Csa32ktIaj0OlRqQxrgs30n62M90UBpNd9k+ENEch5S+hmbW3DtcJGz3sYFTh4F3A6fQ0q7KWsp4w== + import-fresh@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" @@ -2269,12 +2009,12 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -import-local@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8" - integrity sha1-sReVcqrNwRxqkQCftDDbyrX2aKg= +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: - pkg-dir "^2.0.0" + pkg-dir "^3.0.0" resolve-cwd "^2.0.0" imurmurhash@^0.1.4: @@ -2282,14 +2022,7 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0, indent-string@^3.1.0, indent-string@^3.2.0: +indent-string@^3.0.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -2302,7 +2035,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -2329,24 +2062,17 @@ inquirer@^6.2.2: rxjs "^6.4.0" string-width "^2.1.0" strip-ansi "^5.0.0" - through "^2.3.6" - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" + through "^2.3.6" 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== -irregular-plurals@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" - integrity sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y= +irregular-plurals@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" + integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -2386,13 +2112,20 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-ci@^1.0.10, is-ci@^1.0.7: +is-ci@^1.0.10: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: ci-info "^1.5.0" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + 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" @@ -2425,19 +2158,7 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-error@^2.2.0: +is-error@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" integrity sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= @@ -2454,17 +2175,10 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -2478,17 +2192,19 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: - is-extglob "^1.0.0" + is-extglob "^2.1.1" is-installed-globally@^0.1.0: version "0.1.0" @@ -2503,13 +2219,6 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2517,11 +2226,6 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -2534,13 +2238,25 @@ is-observable@^0.2.0: dependencies: symbol-observable "^0.2.2" -is-observable@^1.0.0: +is-observable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== dependencies: symbol-observable "^1.1.0" +is-path-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.0.0.tgz#d4777a8e227a00096a31f030db3770f84b116c02" + integrity sha512-m5dHHzpOXEiv18JEORttBO64UgTEypx99vCxQLjbBvGhOJxnTNglYoFXxwo6AbsQb79sqqycQEHv2hWkHZAijA== + +is-path-in-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.0.0.tgz#68e452a6eec260500cec21e029c0a44cc0dcd2ea" + integrity sha512-6Vz5Gc9s/sDA3JBVu0FzWufm8xaBsqy1zn8Q6gmvGP6nSDMw78aS4poBNeatWjaRpTpxxLn1WOndAiOlk+qY8A== + dependencies: + is-path-inside "^1.0.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -2548,7 +2264,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-obj@^1.0.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= @@ -2560,16 +2276,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -2595,7 +2301,7 @@ is-url@^1.2.1: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-utf8@^0.2.0, is-utf8@^0.2.1: +is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= @@ -2689,16 +2395,11 @@ js-string-escape@^1.0.1: resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - js-yaml@^3.10.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" @@ -2715,11 +2416,6 @@ js-yaml@^3.13.0: argparse "^1.0.7" esprima "^4.0.0" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -2745,10 +2441,12 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" just-extend@^4.0.2: version "4.0.2" @@ -2779,13 +2477,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -last-line-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/last-line-stream/-/last-line-stream-1.0.0.tgz#d1b64d69f86ff24af2d04883a2ceee14520a5600" - integrity sha1-0bZNafhv8kry0EiDos7uFFIKVgA= - dependencies: - through2 "^2.0.0" - latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -2808,17 +2499,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -2839,6 +2519,16 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +load-json-file@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.2.0.tgz#1553627a18bf7b08cd7ec232d63981239085a578" + integrity sha512-HvjIlM2Y/RDHk1X6i4sGgaMTrAsnNrgQCJtuf5PEhbOV6MCJuMVZLMdlJRE0JGLMkF7b6O5zs9LcDxKIUt9CbQ== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -2855,6 +2545,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash.clone@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -2885,21 +2580,28 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= +lodash.islength@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577" + integrity sha1-Tpho1FJXXXUK/9NYyXlUPcIO1Xc= -lodash.merge@^4.6.0: +lodash.merge@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4: +lodash@^4.17.10, lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +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" + lolex@^2.3.2: version "2.7.5" resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" @@ -2910,13 +2612,6 @@ lolex@^3.1.0: resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.1.0.tgz#1a7feb2fefd75b3e3a7f79f0e110d9476e294434" integrity sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw== -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - loud-rejection@^1.0.0, loud-rejection@^1.2.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -2945,7 +2640,7 @@ make-dir@^1.0.0, make-dir@^1.3.0: dependencies: pify "^3.0.0" -make-dir@^2.0.0: +make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -2965,11 +2660,16 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -2977,25 +2677,13 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -matcher@^1.0.0: +matcher@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== dependencies: escape-string-regexp "^1.0.4" -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= - -md5-hex@^1.2.0, md5-hex@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" - integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= - dependencies: - md5-o-matic "^0.1.1" - md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" @@ -3017,21 +2705,20 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" + minimist-options "^3.0.1" normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" merge-source-map@^1.1.0: version "1.1.0" @@ -3040,26 +2727,7 @@ merge-source-map@^1.1.0: dependencies: source-map "^0.6.1" -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -3088,19 +2756,27 @@ mimic-fn@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -3145,20 +2821,20 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.0.0, ms@^2.1.1: +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== -multimatch@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= +multimatch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" + integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" + array-differ "^2.0.3" + array-union "^1.0.2" + arrify "^1.0.1" + minimatch "^3.0.4" mute-stream@0.0.7: version "0.0.7" @@ -3256,13 +2932,18 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -3349,14 +3030,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -3394,11 +3067,6 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -option-chain@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/option-chain/-/option-chain-1.0.0.tgz#938d73bd4e1783f948d34023644ada23669e30f2" - integrity sha1-k41zvU4Xg/lI00AjZEraI2aeMPI= - optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -3411,6 +3079,18 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" +ora@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.3.1.tgz#b0da81069b99da75c4cadee2fc2c57d4564da531" + integrity sha512-k80K0Q6hYokgaJoFePrxJfQJeZKZ38GVEI/BLNxAJXtQZGcMc5jLIAO9ttoI8A52wvfHmdySy8F52gz/sfFFFA== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.0.0" + wcwidth "^1.0.1" + os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -3481,6 +3161,11 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" + integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -3491,23 +3176,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== -package-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-1.2.0.tgz#003e56cd57b736a6ed6114cc2b81542672770e44" - integrity sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ= - dependencies: - md5-hex "^1.3.0" - -package-hash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-2.0.0.tgz#78ae326c89e05a4d813b68601977af05c00d2a0d" - integrity sha1-eK4ybIngWk2BO2hgGXevBcANKg0= - dependencies: - graceful-fs "^4.1.11" - lodash.flattendeep "^4.4.0" - md5-hex "^2.0.0" - release-zalgo "^1.0.0" - package-hash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e" @@ -3535,16 +3203,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -3560,34 +3218,27 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-ms@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-0.1.2.tgz#dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e" - integrity sha1-3T+iXtbC78e93hKtm0bBY6opIk4= - -parse-ms@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" - integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= +parse-ms@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.0.0.tgz#7b3640295100caf3fa0100ccceb56635b62f9d62" + integrity sha512-AddiXFSLLCqj+tCRJ9MrUtHZB4DWojO3tk0NVZ+g5MaMQHF2+p2ktqxuoXyPFLljz/aUK0Nfhd/uGWnhXVXEyA== pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -3602,7 +3253,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: +path-parse@^1.0.5, 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== @@ -3614,15 +3265,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -3652,13 +3294,6 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" - integrity sha1-0dpn9UglY7t89X8oauKCLs+/NnA= - dependencies: - pinkie "^1.0.0" - pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -3666,30 +3301,18 @@ pinkie-promise@^2.0.0: dependencies: pinkie "^2.0.0" -pinkie@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4" - integrity sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q= - pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-conf@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= - dependencies: - find-up "^2.0.0" - load-json-file "^4.0.0" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= +pkg-conf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.0.0.tgz#41f836458fb83b080e08e62b2d63a68aa8c436df" + integrity sha512-YOvV9hWNY9+abaZdgaZs4eyTzfeO1bwEYCYRskER2aP5ZWZAdrb/8YeOo95mb6tr01MR9ZUGArl1sMy2At/YWQ== dependencies: - find-up "^1.0.0" + find-up "^3.0.0" + load-json-file "^5.2.0" pkg-dir@^2.0.0: version "2.0.0" @@ -3705,12 +3328,12 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -plur@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" - integrity sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo= +plur@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plur/-/plur-3.0.1.tgz#268652d605f816699b42b86248de73c9acd06a7c" + integrity sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA== dependencies: - irregular-plurals "^1.0.0" + irregular-plurals "^2.0.0" posix-character-classes@^0.1.0: version "0.1.1" @@ -3727,29 +3350,12 @@ prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -pretty-ms@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6" - integrity sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY= - dependencies: - parse-ms "^0.1.0" - -pretty-ms@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" - integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== +pretty-ms@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-4.0.0.tgz#31baf41b94fd02227098aaa03bd62608eb0d6e92" + integrity sha512-qG66ahoLCwpLXD09ZPHSCbUWYTqdosB7SMP4OffgTgL2PBKXMuUsrk5Bwg8q4qPkjTXsKBMr+YK3Ltd/6F9s/Q== dependencies: - parse-ms "^1.0.0" - -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + parse-ms "^2.0.0" process-nextick-args@~2.0.0: version "2.0.0" @@ -3779,14 +3385,10 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" @@ -3798,14 +3400,6 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -3814,6 +3408,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -3822,15 +3424,6 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -3849,7 +3442,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5: +readable-stream@^2.0.2, 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== @@ -3862,7 +3455,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -3871,31 +3464,26 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" + indent-string "^3.0.0" + strip-indent "^2.0.0" + +regenerate-unicode-properties@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" + integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== + dependencies: + regenerate "^1.4.0" -regenerate@^1.2.1: +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - 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" @@ -3909,14 +3497,17 @@ regexpp@^2.0.0, regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" registry-auth-token@^3.0.1: version "3.3.2" @@ -3933,15 +3524,15 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" @@ -3962,18 +3553,11 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4011,7 +3595,14 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: +resolve@^1.3.2, resolve@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + +resolve@^1.5.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== @@ -4059,7 +3650,7 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -4163,6 +3754,11 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slice-ansi@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -4214,13 +3810,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -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: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" @@ -4232,17 +3821,10 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.0: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== +source-map-support@^0.5.11: + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -4252,7 +3834,7 @@ source-map-url@^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.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -4312,10 +3894,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA= +stack-utils@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== static-extend@^0.1.1: version "0.1.2" @@ -4372,18 +3954,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-ansi@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" - integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= - strip-bom-buf@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" @@ -4391,13 +3968,6 @@ strip-bom-buf@^1.0.0: dependencies: is-utf8 "^0.2.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -4408,12 +3978,10 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" @@ -4431,19 +3999,14 @@ supertap@^1.0.0: serialize-error "^2.1.0" strip-ansi "^4.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^6.0.0: +supports-color@^6.0.0, supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== @@ -4505,14 +4068,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4535,11 +4090,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - 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" @@ -4570,10 +4120,10 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= trim-off-newlines@^1.0.1: version "1.0.1" @@ -4620,6 +4170,29 @@ underscore@^1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -4659,7 +4232,12 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -update-notifier@^2.3.0: +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== @@ -4717,10 +4295,17 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -well-known-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-1.0.0.tgz#73c78ae81a7726a8fa598e2880801c8b16225518" - integrity sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg= +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +well-known-symbols@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" + integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== which-module@^2.0.0: version "2.0.0" @@ -4771,15 +4356,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^1.1.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" @@ -4798,26 +4374,6 @@ write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-json-file@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" - integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= - dependencies: - detect-indent "^5.0.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - pify "^3.0.0" - sort-keys "^2.0.0" - write-file-atomic "^2.0.0" - -write-pkg@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21" - integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== - dependencies: - sort-keys "^2.0.0" - write-json-file "^2.2.0" - write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -4830,7 +4386,7 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= @@ -4855,6 +4411,13 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" From d6923d1f29fc1650060146de4fdb723760a42dc8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 12 Apr 2019 19:25:00 +0000 Subject: [PATCH 097/341] Add renovate.json --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..f45d8f11 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} From 495e8c260517cfceb6b1a329746fc5c25fe29218 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Fri, 12 Apr 2019 21:45:02 +0200 Subject: [PATCH 098/341] Update and rename renovate.json to .renovaterc.json --- .renovaterc.json | 7 +++++++ renovate.json | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 .renovaterc.json delete mode 100644 renovate.json diff --git a/.renovaterc.json b/.renovaterc.json new file mode 100644 index 00000000..c739c335 --- /dev/null +++ b/.renovaterc.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "config:base" + ], + "assignees": ["mindsers"], + "labels": ["state: need review", "type: enhancement"] +} diff --git a/renovate.json b/renovate.json deleted file mode 100644 index f45d8f11..00000000 --- a/renovate.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": [ - "config:base" - ] -} From 216906fbbcbe0e3b1e853469ff5d549202ea6681 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 12 Apr 2019 19:45:36 +0000 Subject: [PATCH 099/341] Pin dependencies --- package.json | 22 +++++++++++----------- yarn.lock | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 33161a01..cbfe2948 100644 --- a/package.json +++ b/package.json @@ -27,16 +27,16 @@ "yabf": "^2.0.2" }, "devDependencies": { - "@types/node": "^11.13.0", - "ava": "^1.4.1", - "eslint": "^5.16.0", - "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.16.0", - "eslint-plugin-node": "^8.0.1", - "eslint-plugin-promise": "^4.1.1", - "eslint-plugin-standard": "^4.0.0", - "nyc": "^13.3.0", - "rimraf": "^2.6.3", - "sinon": "^7.3.1" + "@types/node": "11.13.0", + "ava": "1.4.1", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "nyc": "13.3.0", + "rimraf": "2.6.3", + "sinon": "7.3.1" } } diff --git a/yarn.lock b/yarn.lock index 7080a5a5..77c4006e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,7 +417,7 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/node@^11.13.0": +"@types/node@11.13.0": version "11.13.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.0.tgz#b0df8d6ef9b5001b2be3a94d909ce3c29a80f9e1" integrity sha512-rx29MMkRdVmzunmiA4lzBYJNnXsW/PhG4kMBy2ATsYaDjGGR75dCFEVVROKpNwlVdcUX3xxlghKQOeDPBJobng== @@ -598,7 +598,7 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -ava@^1.4.1: +ava@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/ava/-/ava-1.4.1.tgz#4a59289e0c9728e492ec3a5be21d1072636be172" integrity sha512-wKpgOPTL7hJSBWpfbU4SA8rlsTZrph9g9g7qYDV7M6uK1rKeW8oCUJWRwCd8B24S4N0Y5myf6cTEnA66WIk0sA== @@ -1360,7 +1360,7 @@ escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-config-standard@^12.0.0: +eslint-config-standard@12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== @@ -1389,7 +1389,7 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.0" -eslint-plugin-import@^2.16.0: +eslint-plugin-import@2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f" integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A== @@ -1405,7 +1405,7 @@ eslint-plugin-import@^2.16.0: read-pkg-up "^2.0.0" resolve "^1.9.0" -eslint-plugin-node@^8.0.1: +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== @@ -1417,12 +1417,12 @@ eslint-plugin-node@^8.0.1: resolve "^1.8.1" semver "^5.5.0" -eslint-plugin-promise@^4.1.1: +eslint-plugin-promise@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz#1e08cb68b5b2cd8839f8d5864c796f56d82746db" integrity sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ== -eslint-plugin-standard@^4.0.0: +eslint-plugin-standard@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== @@ -1445,7 +1445,7 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^5.16.0: +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== @@ -2979,7 +2979,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nyc@^13.3.0: +nyc@13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-13.3.0.tgz#da4dbe91a9c8b9ead3f4f3344c76f353e3c78c75" integrity sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w== @@ -3736,7 +3736,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@^7.3.1: +sinon@7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.1.tgz#e8276522104e6c08d1cb52a907270b0e316655c4" integrity sha512-eQKMaeWovtOtYe2xThEvaHmmxf870Di+bim10c3ZPrL5bZhLGtu8cz+rOBTFz0CwBV4Q/7dYwZiqZbGVLZ+vjQ== From d3c7d1d9f58d70184f73e69fb13ff08cc47a2593 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 12 Apr 2019 19:48:50 +0000 Subject: [PATCH 100/341] Update dependency @types/node to v11.13.4 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cbfe2948..49de4bd5 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "^2.0.2" }, "devDependencies": { - "@types/node": "11.13.0", + "@types/node": "11.13.4", "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index 77c4006e..576f419a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,10 +417,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/node@11.13.0": - version "11.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.0.tgz#b0df8d6ef9b5001b2be3a94d909ce3c29a80f9e1" - integrity sha512-rx29MMkRdVmzunmiA4lzBYJNnXsW/PhG4kMBy2ATsYaDjGGR75dCFEVVROKpNwlVdcUX3xxlghKQOeDPBJobng== +"@types/node@11.13.4": + version "11.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.4.tgz#f83ec3c3e05b174b7241fadeb6688267fe5b22ca" + integrity sha512-+rabAZZ3Yn7tF/XPGHupKIL5EcAbrLxnTr/hgQICxbeuAfWtT0UZSfULE+ndusckBItcv4o6ZeOJplQikVcLvQ== abbrev@1: version "1.1.1" From 604c5bdbc10ed4611d561f0966c5b8a740a4b7b9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 13 Apr 2019 07:32:30 +0000 Subject: [PATCH 101/341] Update dependency eslint-plugin-import to v2.17.0 --- package.json | 2 +- yarn.lock | 85 +++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 49de4bd5..38d1e07c 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.16.0", + "eslint-plugin-import": "2.17.0", "eslint-plugin-node": "8.0.1", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 576f419a..d5ace927 100644 --- a/yarn.lock +++ b/yarn.lock @@ -551,6 +551,14 @@ array-from@^2.1.1: resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= +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= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1230,6 +1238,13 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + 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" @@ -1350,6 +1365,27 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +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== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" @@ -1389,11 +1425,12 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.0" -eslint-plugin-import@2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f" - integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A== +eslint-plugin-import@2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.0.tgz#bdf6598aded839a27454d824b0758fd46f80eb72" + integrity sha512-JCsOtNwPYUoeZPlSr8t0+uCU5OVlHh+dIBn8Rw7FiOPjCECG+QzDIKDqshbyJE6CYoj9wpcstEl8vUY7rXkqVA== dependencies: + array-includes "^3.0.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" @@ -1403,7 +1440,7 @@ eslint-plugin-import@2.16.0: lodash "^4.17.11" minimatch "^3.0.4" read-pkg-up "^2.0.0" - resolve "^1.9.0" + resolve "^1.10.0" eslint-plugin-node@8.0.1: version "8.0.1" @@ -1907,6 +1944,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +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-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -1943,7 +1985,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.3: +has@^1.0.1, 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== @@ -2112,6 +2154,11 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +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-ci@^1.0.10: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" @@ -2140,6 +2187,11 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +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= + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -2286,6 +2338,13 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= +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-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2296,6 +2355,13 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +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== + dependencies: + has-symbols "^1.0.0" + is-url@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" @@ -3023,6 +3089,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-keys@^1.0.12: + version "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" @@ -3595,7 +3666,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.3.2, resolve@^1.9.0: +resolve@^1.10.0, resolve@^1.3.2: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== From 5a90d3c508aea9bb3d886fba5f249d0711670a2d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 13 Apr 2019 15:40:01 +0000 Subject: [PATCH 102/341] Update dependency eslint-plugin-import to v2.17.1 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 38d1e07c..45fcd05f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.17.0", + "eslint-plugin-import": "2.17.1", "eslint-plugin-node": "8.0.1", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", diff --git a/yarn.lock b/yarn.lock index d5ace927..15d27800 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1409,10 +1409,10 @@ eslint-import-resolver-node@^0.3.2: debug "^2.6.9" resolve "^1.5.0" -eslint-module-utils@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49" - integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w== +eslint-module-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" + integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== dependencies: debug "^2.6.8" pkg-dir "^2.0.0" @@ -1425,17 +1425,17 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.0" -eslint-plugin-import@2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.0.tgz#bdf6598aded839a27454d824b0758fd46f80eb72" - integrity sha512-JCsOtNwPYUoeZPlSr8t0+uCU5OVlHh+dIBn8Rw7FiOPjCECG+QzDIKDqshbyJE6CYoj9wpcstEl8vUY7rXkqVA== +eslint-plugin-import@2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.1.tgz#b888feb4d9b3ee155113c8dccdd4bec5db33bdf4" + integrity sha512-lzD9uvRvW4MsHzIOMJEDSb5MOV9LzgxRPBaovvOhJqzgxRHYfGy9QOrMuwHIh5ehKFJ7Z3DcrcGKDQ0IbP0EdQ== dependencies: array-includes "^3.0.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.3.0" + eslint-module-utils "^2.4.0" has "^1.0.3" lodash "^4.17.11" minimatch "^3.0.4" From 413392c5ed6ed6c69a6dba4a5dec3d12dd5a2f0c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 16 Apr 2019 10:15:52 +0000 Subject: [PATCH 103/341] Update dependency nyc to v14 --- package.json | 2 +- yarn.lock | 190 ++++++++++++++++++++++++++++----------------------- 2 files changed, 106 insertions(+), 86 deletions(-) diff --git a/package.json b/package.json index 45fcd05f..7253c41a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "eslint-plugin-node": "8.0.1", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", - "nyc": "13.3.0", + "nyc": "14.0.0", "rimraf": "2.6.3", "sinon": "7.3.1" } diff --git a/yarn.lock b/yarn.lock index 15d27800..6f5c2fa4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -796,7 +796,7 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caching-transform@^3.0.1: +caching-transform@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" integrity sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== @@ -1109,6 +1109,17 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cp-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" + integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== + dependencies: + graceful-fs "^4.1.2" + make-dir "^2.0.0" + nested-error-stacks "^2.0.0" + pify "^4.0.1" + safe-buffer "^5.0.1" + 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" @@ -1705,13 +1716,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -find-cache-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" - integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" - make-dir "^1.0.0" + make-dir "^2.0.0" pkg-dir "^3.0.0" find-up@^2.0.0, find-up@^2.1.0: @@ -1811,10 +1822,10 @@ 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== +get-caller-file@^2.0.1: + 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== get-port@^4.2.0: version "4.2.0" @@ -2404,55 +2415,55 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -istanbul-lib-coverage@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" - integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== +istanbul-lib-coverage@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" + integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== -istanbul-lib-hook@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" - integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== +istanbul-lib-hook@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" + integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== dependencies: append-transform "^1.0.0" -istanbul-lib-instrument@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" - integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== +istanbul-lib-instrument@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" + integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== dependencies: "@babel/generator" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/template" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.3" - semver "^5.5.0" + istanbul-lib-coverage "^2.0.4" + semver "^6.0.0" -istanbul-lib-report@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" - integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== +istanbul-lib-report@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" + integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== dependencies: - istanbul-lib-coverage "^2.0.3" - make-dir "^1.3.0" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" supports-color "^6.0.0" -istanbul-lib-source-maps@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" - integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== +istanbul-lib-source-maps@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" + integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.3" - make-dir "^1.3.0" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" rimraf "^2.6.2" source-map "^0.6.1" -istanbul-reports@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" - integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== +istanbul-reports@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.2.tgz#b84303c46fc0541c3c3b69abae687c42a6907d44" + integrity sha512-ZFuTdBQ3PSaPnm02aEA4R6mzQ2AF9w03CYiXADzWbbE48v/EFOWF4MaX4FT0NRdqIk48I7o0RPi+S8TMswaCbQ== dependencies: handlebars "^4.1.0" @@ -2699,7 +2710,7 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -make-dir@^1.0.0, make-dir@^1.3.0: +make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== @@ -2948,6 +2959,11 @@ neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +nested-error-stacks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" + integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -3045,35 +3061,35 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nyc@13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-13.3.0.tgz#da4dbe91a9c8b9ead3f4f3344c76f353e3c78c75" - integrity sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w== +nyc@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.0.0.tgz#f9fc4b4d73afc976f76e72352e70f742bbfab829" + integrity sha512-R1zC6UZak6pzn5BZQorkSH5GdOGafrwyeja+eimS5Tu+KJ/hCgBc8qA1QWSzxQmT2FDl2lbpqPw7tBDbSvhAHg== dependencies: archy "^1.0.0" - arrify "^1.0.1" - caching-transform "^3.0.1" + caching-transform "^3.0.2" convert-source-map "^1.6.0" - find-cache-dir "^2.0.0" + cp-file "^6.2.0" + find-cache-dir "^2.1.0" find-up "^3.0.0" foreground-child "^1.5.6" glob "^7.1.3" - istanbul-lib-coverage "^2.0.3" - istanbul-lib-hook "^2.0.3" - istanbul-lib-instrument "^3.1.0" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.2" - istanbul-reports "^2.1.1" - make-dir "^1.3.0" + istanbul-lib-coverage "^2.0.4" + istanbul-lib-hook "^2.0.6" + istanbul-lib-instrument "^3.2.0" + istanbul-lib-report "^2.0.7" + istanbul-lib-source-maps "^3.0.5" + istanbul-reports "^2.2.2" + make-dir "^2.1.0" merge-source-map "^1.1.0" resolve-from "^4.0.0" rimraf "^2.6.3" signal-exit "^3.0.2" spawn-wrap "^1.4.2" - test-exclude "^5.1.0" + test-exclude "^5.2.2" uuid "^3.3.2" - yargs "^12.0.5" - yargs-parser "^11.1.1" + yargs "^13.2.2" + yargs-parser "^13.0.0" object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" @@ -3167,7 +3183,7 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -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== @@ -3634,10 +3650,10 @@ require-directory@^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-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== require-precompiled@^0.1.0: version "0.1.0" @@ -3760,6 +3776,11 @@ semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== + serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" @@ -4124,15 +4145,15 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -test-exclude@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" - integrity sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA== +test-exclude@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" + integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== dependencies: - arrify "^1.0.1" + glob "^7.1.3" minimatch "^3.0.4" read-pkg-up "^4.0.0" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" text-table@^0.2.0: version "0.2.0" @@ -4462,7 +4483,7 @@ xtend@^4.0.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -"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== @@ -4489,28 +4510,27 @@ yargs-parser@^10.0.0: dependencies: camelcase "^4.1.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== +yargs-parser@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" + integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== +yargs@^13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" + integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== 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" + get-caller-file "^2.0.1" + os-locale "^3.1.0" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^3.0.0" which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" + y18n "^4.0.0" + yargs-parser "^13.0.0" From 349e73a1a6f3673bfbba3eae5d296970dbad2151 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 17 Apr 2019 16:17:06 +0000 Subject: [PATCH 104/341] Update dependency sinon to v7.3.2 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 7253c41a..55a71c8e 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.0", "nyc": "14.0.0", "rimraf": "2.6.3", - "sinon": "7.3.1" + "sinon": "7.3.2" } } diff --git a/yarn.lock b/yarn.lock index 6f5c2fa4..9109706d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2684,10 +2684,10 @@ lolex@^2.3.2: resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== -lolex@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.1.0.tgz#1a7feb2fefd75b3e3a7f79f0e110d9476e294434" - integrity sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw== +lolex@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.0.1.tgz#4a99c2251579d693c6a083446dae0e5c3844d3fa" + integrity sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw== loud-rejection@^1.0.0, loud-rejection@^1.2.0: version "1.6.0" @@ -3828,16 +3828,16 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.1.tgz#e8276522104e6c08d1cb52a907270b0e316655c4" - integrity sha512-eQKMaeWovtOtYe2xThEvaHmmxf870Di+bim10c3ZPrL5bZhLGtu8cz+rOBTFz0CwBV4Q/7dYwZiqZbGVLZ+vjQ== +sinon@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.2.tgz#82dba3a6d85f6d2181e1eca2c10d8657c2161f28" + integrity sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA== dependencies: "@sinonjs/commons" "^1.4.0" "@sinonjs/formatio" "^3.2.1" "@sinonjs/samsam" "^3.3.1" diff "^3.5.0" - lolex "^3.1.0" + lolex "^4.0.1" nise "^1.4.10" supports-color "^5.5.0" From 941f907a3be8fba0a5b81e427e3117d647e8ea37 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 17 Apr 2019 20:55:00 +0000 Subject: [PATCH 105/341] Update dependency eslint-plugin-import to v2.17.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 55a71c8e..d0e03e00 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.17.1", + "eslint-plugin-import": "2.17.2", "eslint-plugin-node": "8.0.1", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 9109706d..da183630 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1436,10 +1436,10 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.0" -eslint-plugin-import@2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.1.tgz#b888feb4d9b3ee155113c8dccdd4bec5db33bdf4" - integrity sha512-lzD9uvRvW4MsHzIOMJEDSb5MOV9LzgxRPBaovvOhJqzgxRHYfGy9QOrMuwHIh5ehKFJ7Z3DcrcGKDQ0IbP0EdQ== +eslint-plugin-import@2.17.2: + version "2.17.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb" + integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g== dependencies: array-includes "^3.0.3" contains-path "^0.1.0" From 53dbe7acde6d97e145a42ef018090b9b75760307 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 17 Apr 2019 21:58:17 +0000 Subject: [PATCH 106/341] Update dependency @types/node to v11.13.5 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d0e03e00..48ec1f1e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "^2.0.2" }, "devDependencies": { - "@types/node": "11.13.4", + "@types/node": "11.13.5", "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index da183630..d6eee98d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,10 +417,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/node@11.13.4": - version "11.13.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.4.tgz#f83ec3c3e05b174b7241fadeb6688267fe5b22ca" - integrity sha512-+rabAZZ3Yn7tF/XPGHupKIL5EcAbrLxnTr/hgQICxbeuAfWtT0UZSfULE+ndusckBItcv4o6ZeOJplQikVcLvQ== +"@types/node@11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.5.tgz#266564afa8a6a09dc778dfacc703ed3f09c80516" + integrity sha512-/OMMBnjVtDuwX1tg2pkYVSqRIDSmNTnvVvmvP/2xiMAAWf4a5+JozrApCrO4WCAILmXVxfNoQ3E+0HJbNpFVGg== abbrev@1: version "1.1.1" From 091912c7c88209d427a422977b5e88b3432f3fdf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 19 Apr 2019 20:50:41 +0000 Subject: [PATCH 107/341] Update dependency @types/node to v11.13.6 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 48ec1f1e..5b7b09a6 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "^2.0.2" }, "devDependencies": { - "@types/node": "11.13.5", + "@types/node": "11.13.6", "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index d6eee98d..8b162669 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,10 +417,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/node@11.13.5": - version "11.13.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.5.tgz#266564afa8a6a09dc778dfacc703ed3f09c80516" - integrity sha512-/OMMBnjVtDuwX1tg2pkYVSqRIDSmNTnvVvmvP/2xiMAAWf4a5+JozrApCrO4WCAILmXVxfNoQ3E+0HJbNpFVGg== +"@types/node@11.13.6": + version "11.13.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" + integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== abbrev@1: version "1.1.1" From 95868956a76ee0a9979d7b226be66b2b9e6fa34c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 22 Apr 2019 22:34:24 +0000 Subject: [PATCH 108/341] Update dependency @types/node to v11.13.7 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5b7b09a6..d6555a24 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "^2.0.2" }, "devDependencies": { - "@types/node": "11.13.6", + "@types/node": "11.13.7", "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index 8b162669..a2458edd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,10 +417,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/node@11.13.6": - version "11.13.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" - integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== +"@types/node@11.13.7": + version "11.13.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.7.tgz#85dbb71c510442d00c0631f99dae957ce44fd104" + integrity sha512-suFHr6hcA9mp8vFrZTgrmqW2ZU3mbWsryQtQlY/QvwTISCw7nw/j+bCQPPohqmskhmqa5wLNuMHTTsc+xf1MQg== abbrev@1: version "1.1.1" From 32d3f5791f8ae99019b85f542b8d018434b9df8b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 26 Apr 2019 19:44:48 +0000 Subject: [PATCH 109/341] Update dependency @types/node to v11.13.8 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d6555a24..db7c9a21 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "^2.0.2" }, "devDependencies": { - "@types/node": "11.13.7", + "@types/node": "11.13.8", "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index a2458edd..0a2bbfa3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,10 +417,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/node@11.13.7": - version "11.13.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.7.tgz#85dbb71c510442d00c0631f99dae957ce44fd104" - integrity sha512-suFHr6hcA9mp8vFrZTgrmqW2ZU3mbWsryQtQlY/QvwTISCw7nw/j+bCQPPohqmskhmqa5wLNuMHTTsc+xf1MQg== +"@types/node@11.13.8": + version "11.13.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" + integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== abbrev@1: version "1.1.1" From 5bf536ee1ab06122519454cfac1edfc1c1899d96 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Fri, 26 Apr 2019 21:55:56 +0200 Subject: [PATCH 110/341] Update .renovaterc.json --- .renovaterc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.renovaterc.json b/.renovaterc.json index c739c335..c0095aa5 100644 --- a/.renovaterc.json +++ b/.renovaterc.json @@ -1,6 +1,6 @@ { "extends": [ - "config:base" + "config:js-app" ], "assignees": ["mindsers"], "labels": ["state: need review", "type: enhancement"] From fc6eb323155bc9fd941fe1ac0fcdd628b10d7208 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 26 Apr 2019 19:56:38 +0000 Subject: [PATCH 111/341] Pin dependencies --- package.json | 12 ++++++------ yarn.lock | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index db7c9a21..6543c1d5 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,12 @@ "test": "yarn test:lint && yarn test:unit:coverage" }, "dependencies": { - "chalk": "^2.4.2", - "commander": "^2.19.0", - "esm": "^3.2.22", - "gift": "^0.10.2", - "inquirer": "^6.2.2", - "yabf": "^2.0.2" + "chalk": "2.4.2", + "commander": "2.19.0", + "esm": "3.2.22", + "gift": "0.10.2", + "inquirer": "6.2.2", + "yabf": "2.0.2" }, "devDependencies": { "@types/node": "11.13.8", diff --git a/yarn.lock b/yarn.lock index 0a2bbfa3..bff1aa2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -850,19 +850,19 @@ capture-stack-trace@^1.0.0: resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== +chalk@2.4.2, 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== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.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== +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1013,7 +1013,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -commander@^2.19.0: +commander@2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -1535,7 +1535,7 @@ eslint@5.16.0: table "^5.2.3" text-table "^0.2.0" -esm@^3.2.20, esm@^3.2.22: +esm@3.2.22, esm@^3.2.20: version "3.2.22" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.22.tgz#5062c2e22fee3ccfee4e8f20da768330da90d6e3" integrity sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA== @@ -1849,7 +1849,7 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -gift@^0.10.2: +gift@0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/gift/-/gift-0.10.2.tgz#4600efe8f284b51fcb01c3527b321e22b494e156" integrity sha512-wC9aKnQpjfOTWX+JG4DPJkS89ux6sl8EN4hXhv/2vBoXCDTEz1JiTeGTSeuKYlCqIgUFM1JwPVym34Sys3hvzw== @@ -2098,7 +2098,7 @@ ini@^1.3.4, 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: +inquirer@6.2.2, inquirer@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== @@ -4488,7 +4488,7 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yabf@^2.0.2: +yabf@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.0.2.tgz#90785a501d06ed8d6a3f7ce5c47837689ef510ba" integrity sha512-p4ODVXSPCXc0DipbTJauXAPFiB+HOB9r99Oq1XQlS42FDMevygrK902yM9bfDgfTgaUA8RDEvpC1wsADq0hEJA== From bfbad0ab9347eebecad9fcfff5828bb728640df4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 26 Apr 2019 21:55:46 +0000 Subject: [PATCH 112/341] Update dependency yabf to v2.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6543c1d5..630003e7 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "esm": "3.2.22", "gift": "0.10.2", "inquirer": "6.2.2", - "yabf": "2.0.2" + "yabf": "2.1.0" }, "devDependencies": { "@types/node": "11.13.8", diff --git a/yarn.lock b/yarn.lock index bff1aa2b..f523ca4e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4488,10 +4488,10 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yabf@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.0.2.tgz#90785a501d06ed8d6a3f7ce5c47837689ef510ba" - integrity sha512-p4ODVXSPCXc0DipbTJauXAPFiB+HOB9r99Oq1XQlS42FDMevygrK902yM9bfDgfTgaUA8RDEvpC1wsADq0hEJA== +yabf@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.1.0.tgz#b67325eb9f16f14921cfe75985b9948b5b1429fe" + integrity sha512-LmqXbL6JX8JHq5e3M2BnvijLvNHZToZseg5jbhs1ylHxHggPHFYRaFogBRBP2beyzsn4yTTmVUDb71AlJYEc6g== yallist@^2.1.2: version "2.1.2" From 8f302741010784d37835117ab05a2b24a6f05382 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 26 Apr 2019 22:04:46 +0000 Subject: [PATCH 113/341] Update dependency commander to v2.20.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 630003e7..65958ff4 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "2.4.2", - "commander": "2.19.0", + "commander": "2.20.0", "esm": "3.2.22", "gift": "0.10.2", "inquirer": "6.2.2", diff --git a/yarn.lock b/yarn.lock index f523ca4e..d2c2a23a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1013,10 +1013,10 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -commander@2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +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== commander@~2.17.1: version "2.17.1" From bd12e97f3357381b78eead51d8d4613b29a4de1e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 26 Apr 2019 22:18:19 +0000 Subject: [PATCH 114/341] Update dependency inquirer to v6.3.1 --- package.json | 2 +- yarn.lock | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 65958ff4..e7084432 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "2.20.0", "esm": "3.2.22", "gift": "0.10.2", - "inquirer": "6.2.2", + "inquirer": "6.3.1", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index d2c2a23a..5f4d7ed6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2098,7 +2098,26 @@ ini@^1.3.4, 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, inquirer@^6.2.2: +inquirer@6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" + integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== + 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.11" + 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" + +inquirer@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== From 9a2132c2e14481d9e08ee8e2ee12770714034fdd Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 27 Apr 2019 00:52:07 +0200 Subject: [PATCH 115/341] Use yabf logger in term app --- src/core/term-application.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/core/term-application.js b/src/core/term-application.js index 2253593c..43ed9161 100644 --- a/src/core/term-application.js +++ b/src/core/term-application.js @@ -1,8 +1,7 @@ -import { AbstractApplication } from 'yabf' +import { AbstractApplication, LoggerService } from 'yabf' import program from 'commander' -import { MessageService, LoggerService } from '../services' -import { APP_LOG_LEVEL, APP_LOG_LEVEL_TOKEN } from '../shared/config' +import { MessageService } from '../services' import { Command } from './command' @@ -28,22 +27,22 @@ export class TermApplication extends AbstractApplication { this.messageService = messageService this.loggerService = loggerService + + this.log = this.loggerService.registerScope('configfile:app') } buildInstructions() { return [ { provide: TermApplication, dependencies: [MessageService, LoggerService] }, - { provide: MessageService, dependencies: [] }, - { provide: { identity: APP_LOG_LEVEL_TOKEN, useValue: APP_LOG_LEVEL } }, - { provide: LoggerService, dependencies: [APP_LOG_LEVEL_TOKEN] } + { provide: MessageService, dependencies: [] } ] } register(command, deps = []) { - this.loggerService.log(`Register new command ${command.prototype.constructor.name}`) + this.log(`Register new command ${command.prototype.constructor.name}`) if (!(command.prototype instanceof Command)) { - this.loggerService.debug(`${command} is not a valid command`) + this.log(`${command} is not a valid command`) return null } @@ -53,7 +52,7 @@ export class TermApplication extends AbstractApplication { start() { if (!Array.isArray(this.commands) || this.commands.length < 1) { - this.loggerService.debug(`No command found in Term Application`) + this.log(`No command found in Term Application`) this.messageService.printError('Application failed to initialize') return } @@ -89,8 +88,8 @@ export class TermApplication extends AbstractApplication { } } - this.loggerService.log(`Program start`) - this.loggerService.debug(`Program launched with ${JSON.stringify(process.argv)}`) + this.log(`Program start`) + this.log(`Program launched with ${JSON.stringify(process.argv)}`) program.parse(process.argv) } @@ -99,7 +98,7 @@ export class TermApplication extends AbstractApplication { try { action(...args) } catch (error) { - this.loggerService.debug(`Program failed by error : ${error.message}`) + this.log(`Program failed by error : ${error.message}`) this.messageService.printError('Fail', 'An error occured.') } } From 366fe06b42c7ebdab1a7a2585cc95b7bb2b34d37 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 27 Apr 2019 00:55:48 +0200 Subject: [PATCH 116/341] Use yabf logger in init command --- bin/configfile.js | 3 +-- src/commands/init/init.command.js | 36 ++++++++++++++++--------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/bin/configfile.js b/bin/configfile.js index e2e6c0f0..28d40b85 100755 --- a/bin/configfile.js +++ b/bin/configfile.js @@ -1,5 +1,5 @@ #!/usr/bin/env node - +const { LoggerService } = require('yabf') const { TermApplication, Command, @@ -8,7 +8,6 @@ const { OPTION_PATH_FILE_TOKEN, getOptionsFilePath, getPackageData, - LoggerService, MessageService } = require('../src'); diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js index df9d521b..a74f705e 100644 --- a/src/commands/init/init.command.js +++ b/src/commands/init/init.command.js @@ -31,20 +31,22 @@ export class InitCommand extends Command { super() this.configService = configService - this.logger = loggerService + this.loggerService = loggerService this.messageService = messageService + + this.log = this.loggerService.registerScope('configfile:cmd:init') } async run(options) { - this.logger.log('Init command started') + this.log('Init command started') try { await this._getUserData(options) } catch (error) { - this.logger.debug('Error in _getUserData') + this.log('Error in _getUserData') if (error instanceof InitStopedByUser) { - this.logger.debug('Error is an instance of InitStopedByUser') + this.log('Error is an instance of InitStopedByUser') this.messageService.printError(error.message) return } @@ -53,16 +55,16 @@ export class InitCommand extends Command { try { this._checkFileSystem() } catch (error) { - this.logger.debug('Error in _checkFileSystem') + this.log('Error in _checkFileSystem') if (error instanceof FolderNotEmpty) { - this.logger.debug('Error is an instance of FolderNotEmpty') + this.log('Error is an instance of FolderNotEmpty') this.messageService.printError(error.message) return } if (error instanceof FileNotDirectory) { - this.logger.debug('Error is an instance of FileNotDirectory') + this.log('Error is an instance of FileNotDirectory') this.messageService.printError(error.message) return } @@ -72,7 +74,7 @@ export class InitCommand extends Command { } async _getUserData(commandOptions) { - this.logger.log('Start asking people informations for installing configuration file') + this.log('Start asking people informations for installing configuration file') const userForceOverwrite = commandOptions.force || false const questions = [ @@ -111,45 +113,45 @@ export class InitCommand extends Command { const { repo_url: REPO_URL = null, folder_path: FOLDER_PATH, overwrite_file: OVERWRITE_FILE = true } = await inquirer.prompt(questions) if (!OVERWRITE_FILE) { - this.logger.debug('User stop the command execution. A file already exist. No override allowed.') + this.log('User stop the command execution. A file already exist. No override allowed.') throw new InitStopedByUser('You stopped the command. Nothing has be made.') } let folderPath = FOLDER_PATH.replace('~', process.env.HOME) folderPath = path.resolve(folderPath) - this.logger.log('Save validated user answers in config service') + this.log('Save validated user answers in config service') this.configService.repoUrl = REPO_URL this.configService.folderPath = folderPath } _checkFileSystem() { - this.logger.log('Check file system - Start') + this.log('Check file system - Start') const folderPath = this.configService.folderPath if (!FsUtils.fileExist(folderPath)) { - this.logger.debug(`Folder ${folderPath} doesn't exist.`) + this.log(`Folder ${folderPath} doesn't exist.`) this.messageService.printInfo('Folder does not exist. It will be created.') fs.mkdirSync(folderPath) } const isDirectory = fs.statSync(folderPath).isDirectory() if (!isDirectory) { - this.logger.debug(`Folder ${folderPath} is not a folder.`) + this.log(`Folder ${folderPath} is not a folder.`) throw new FileNotDirectory() } const folderIsEmpty = fs.readdirSync(folderPath).length < 1 if (!folderIsEmpty) { - this.logger.debug(`Folder ${folderPath} isn't empty.`) + this.log(`Folder ${folderPath} isn't empty.`) throw new FolderNotEmpty() } } async _cloneGitRepo() { - this.logger.log(`Clone git repo - Start`) + this.log(`Clone git repo - Start`) if (this.configService.repoUrl == null) { - this.logger.debug(`No URL provided to allow to clone the repo`) + this.log(`No URL provided to allow to clone the repo`) this.messageService.printWarn('Unable to cloned git repository. Need repository URL.') return } @@ -158,7 +160,7 @@ export class InitCommand extends Command { await GitUtils.clone(this.configService.repoUrl, this.configService.folderPath) this.messageService.printInfo('Git repository cloned successuly.') } catch (error) { - this.logger.debug(error.message) + this.log(error.message) throw error } } From 060b32f5ccc582e36122ab2ea3dfab655c815be9 Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 27 Apr 2019 01:00:12 +0200 Subject: [PATCH 117/341] Remove useless log code --- src/services/index.js | 1 - src/services/logger.service.js | 104 --------------------------------- src/shared/config.js | 5 -- 3 files changed, 110 deletions(-) delete mode 100644 src/services/logger.service.js diff --git a/src/services/index.js b/src/services/index.js index 0109de1c..4a29c5d1 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -2,5 +2,4 @@ export * from './config.service' export * from './deploy.service' export * from './exec.service' export * from './file.service' -export * from './logger.service' export * from './message.service' diff --git a/src/services/logger.service.js b/src/services/logger.service.js deleted file mode 100644 index 002db63f..00000000 --- a/src/services/logger.service.js +++ /dev/null @@ -1,104 +0,0 @@ -export class LoggerService { - constructor(logLevel = LOG_LEVEL.INFO) { - this._logLevel = logLevel - } - - log(text, level = LOG_LEVEL.ALL) { - if (this._logLevel > level) { - return - } - - const logLine = this._makeLogLine(`${this._getPrefixDate()} - `, text, ` (${getLogLevelName(level)})`) - - for (const line of logLine) { - this._getOutputStream(level).write(line) - } - } - - error(text) { - return this.log(text, LOG_LEVEL.ERROR) - } - - warn(text) { - return this.log(text, LOG_LEVEL.WARN) - } - - info(text) { - return this.log(text, LOG_LEVEL.INFO) - } - - debug(text) { - return this.log(text, LOG_LEVEL.DEBUG) - } - - _getPrefixDate() { - const date = new Date() - const addPrefix = (num, zero) => `${(new Array(zero).fill(0).join(''))}${num}`.slice(-1 * zero) - - const year = addPrefix(date.getFullYear(), 4) - const month = addPrefix(date.getMonth() + 1, 2) - const day = addPrefix(date.getDate(), 2) - const hours = addPrefix(date.getHours(), 2) - const seconds = addPrefix(date.getSeconds(), 2) - const milliseconds = addPrefix(date.getMilliseconds(), 4) - - const dateText = [year, month, day].join(':') - const timeText = [hours, seconds].join(':') - - return `${dateText} ${timeText} +${milliseconds}` - } - - _getOutputStream(level) { - if (level >= LOG_LEVEL.ERROR) { - return process.stderr - } - - return process.stdout - } - - _makeLogLine(left, center, right) { - const dataMaxLength = process.stdout.columns - right.length - left.length - const getLinesFromLine = line => line - .split('') - .reduce((lines, char) => { - let last = lines.pop() - if (last.length < dataMaxLength) { - last = last + char - return [...lines, last] - } - - return [...lines, last, char] - }, ['']) - - return center - .toString() - .split('\n') - .reduce((aggr, line) => [...aggr, ...getLinesFromLine(line)], []) - .map(line => `${line}${(new Array(dataMaxLength).fill('\u00A0').join(''))}`.slice(0, dataMaxLength)) - .map((line, index) => { - if (index === 0) { - return `${left}${line}${right}` - } - - return `${(new Array(left.length).fill('\u00A0').join(''))}${line}${(new Array(right.length).fill('\u00A0').join(''))}` - }) - } -} - -export const LOG_LEVEL = Object.freeze({ - ERROR: 4, - WARN: 3, - INFO: 2, - DEBUG: 1, - ALL: 0 -}) - -function getLogLevelName(level) { - for (const key of Object.keys(LOG_LEVEL)) { - if (LOG_LEVEL[key] === level) { - return key - } - } - - return null -} diff --git a/src/shared/config.js b/src/shared/config.js index 992a5597..8149f86f 100644 --- a/src/shared/config.js +++ b/src/shared/config.js @@ -1,8 +1,3 @@ import { InjectionToken } from 'yabf' -import { LOG_LEVEL } from '../services' - export const OPTION_PATH_FILE_TOKEN = new InjectionToken() - -export const APP_LOG_LEVEL_TOKEN = new InjectionToken() -export const APP_LOG_LEVEL = LOG_LEVEL.ERROR From 60f97f0d582bd73b7d60de1f6191e79c7bd4343d Mon Sep 17 00:00:00 2001 From: Mindsers Date: Sat, 27 Apr 2019 01:17:35 +0200 Subject: [PATCH 118/341] Update changelog about the logger --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c806a697..61bc049e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Added - Add new contrubitor to SPONSORS.md -- Configfile will emit log to make debug easier ([!57](https://github.com/Mindsers/configfile/pull/57)) +- Configfile will emit log making debug easier ([!57](https://github.com/Mindsers/configfile/pull/57), [!80](https://github.com/mindsers/configfile/pull/80)) ### Changed - Use [Yabf](https://github.com/Mindsers/yabf) as base to build the next configfile. From c4ada2be373b033955c65b2c266a378f1eaa921f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 2 May 2019 12:56:14 +0000 Subject: [PATCH 119/341] Update dependency nyc to v14.1.0 --- package.json | 2 +- yarn.lock | 147 +++++++++++++++++++++++---------------------------- 2 files changed, 68 insertions(+), 81 deletions(-) diff --git a/package.json b/package.json index e7084432..6917922a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "eslint-plugin-node": "8.0.1", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", - "nyc": "14.0.0", + "nyc": "14.1.0", "rimraf": "2.6.3", "sinon": "7.3.2" } diff --git a/yarn.lock b/yarn.lock index 5f4d7ed6..8ce11be5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -64,7 +64,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.1.3": +"@babel/generator@^7.0.0": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" integrity sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ== @@ -217,7 +217,7 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.3": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.2": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== @@ -308,7 +308,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/template@^7.0.0", "@babel/template@^7.1.0": +"@babel/template@^7.1.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== @@ -326,21 +326,6 @@ "@babel/parser" "^7.4.0" "@babel/types" "^7.4.0" -"@babel/traverse@^7.0.0": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4" - integrity sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.1.3" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.3" - "@babel/types" "^7.1.3" - debug "^3.1.0" - globals "^11.1.0" - lodash "^4.17.10" - "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" @@ -1181,13 +1166,6 @@ debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -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.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" @@ -1939,10 +1917,10 @@ graceful-fs@^4.1.15: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -handlebars@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.1.tgz#6e4e41c18ebe7719ae4d38e5aca3d32fa3dd23d3" - integrity sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA== +handlebars@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -2434,57 +2412,57 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -istanbul-lib-coverage@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" - integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== +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.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" - integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== +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== dependencies: append-transform "^1.0.0" -istanbul-lib-instrument@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" - integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== +istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== dependencies: - "@babel/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.4" + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" semver "^6.0.0" -istanbul-lib-report@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" - integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== +istanbul-lib-report@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== dependencies: - istanbul-lib-coverage "^2.0.4" + istanbul-lib-coverage "^2.0.5" make-dir "^2.1.0" - supports-color "^6.0.0" + supports-color "^6.1.0" -istanbul-lib-source-maps@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" - integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== +istanbul-lib-source-maps@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.4" + istanbul-lib-coverage "^2.0.5" make-dir "^2.1.0" - rimraf "^2.6.2" + rimraf "^2.6.3" source-map "^0.6.1" -istanbul-reports@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.2.tgz#b84303c46fc0541c3c3b69abae687c42a6907d44" - integrity sha512-ZFuTdBQ3PSaPnm02aEA4R6mzQ2AF9w03CYiXADzWbbE48v/EFOWF4MaX4FT0NRdqIk48I7o0RPi+S8TMswaCbQ== +istanbul-reports@^2.2.4: + version "2.2.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.5.tgz#7fd354847124b46861365ac41165a4dfe5f67ea5" + integrity sha512-ilCSjE6f7elNIRxnSnIhnOpXdf3ryUT7Zkl+TaADItM638SWXjfNW40cujZCIjex4g4DTkzIy9kzwkaLruB50Q== dependencies: - handlebars "^4.1.0" + handlebars "^4.1.2" js-string-escape@^1.0.1: version "1.0.1" @@ -2512,6 +2490,14 @@ js-yaml@^3.13.0: argparse "^1.0.7" esprima "^4.0.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== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -3080,10 +3066,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nyc@14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.0.0.tgz#f9fc4b4d73afc976f76e72352e70f742bbfab829" - integrity sha512-R1zC6UZak6pzn5BZQorkSH5GdOGafrwyeja+eimS5Tu+KJ/hCgBc8qA1QWSzxQmT2FDl2lbpqPw7tBDbSvhAHg== +nyc@14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.0.tgz#ae864913a4c5a947bfaebeb66a488bdb1868c9a3" + integrity sha512-iy9fEV8Emevz3z/AanIZsoGa8F4U2p0JKevZ/F0sk+/B2r9E6Qn+EPs0bpxEhnAt6UPlTL8mQZIaSJy8sK0ZFw== dependencies: archy "^1.0.0" caching-transform "^3.0.2" @@ -3093,19 +3079,20 @@ nyc@14.0.0: find-up "^3.0.0" foreground-child "^1.5.6" glob "^7.1.3" - istanbul-lib-coverage "^2.0.4" - istanbul-lib-hook "^2.0.6" - istanbul-lib-instrument "^3.2.0" - istanbul-lib-report "^2.0.7" - istanbul-lib-source-maps "^3.0.5" - istanbul-reports "^2.2.2" + istanbul-lib-coverage "^2.0.5" + istanbul-lib-hook "^2.0.7" + istanbul-lib-instrument "^3.3.0" + istanbul-lib-report "^2.0.8" + istanbul-lib-source-maps "^3.0.6" + istanbul-reports "^2.2.4" + js-yaml "^3.13.1" make-dir "^2.1.0" merge-source-map "^1.1.0" resolve-from "^4.0.0" rimraf "^2.6.3" signal-exit "^3.0.2" spawn-wrap "^1.4.2" - test-exclude "^5.2.2" + test-exclude "^5.2.3" uuid "^3.3.2" yargs "^13.2.2" yargs-parser "^13.0.0" @@ -4117,7 +4104,7 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^6.0.0, supports-color@^6.1.0: +supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== @@ -4164,10 +4151,10 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -test-exclude@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" - integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== dependencies: glob "^7.1.3" minimatch "^3.0.4" From 4a16a13316bb76a262313f7bf42aea763ecdbfb6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 3 May 2019 08:09:06 +0000 Subject: [PATCH 120/341] Update dependency eslint-plugin-node to v9 --- package.json | 2 +- yarn.lock | 45 ++++++++++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 6917922a..55e91b8e 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint": "5.16.0", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.17.2", - "eslint-plugin-node": "8.0.1", + "eslint-plugin-node": "9.0.0", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", "nyc": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 8ce11be5..439ee2b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1406,13 +1406,13 @@ eslint-module-utils@^2.4.0: debug "^2.6.8" pkg-dir "^2.0.0" -eslint-plugin-es@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz#5acb2565db4434803d1d46a9b4cbc94b345bd028" - integrity sha512-9XcVyZiQRVeFjqHw8qHNDAZcQLqaHlOGGpeYqzYh8S4JYCWTCO3yzyen8yVmA5PratfzTRWDwCOFphtDEG+w/w== +eslint-plugin-es@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== dependencies: eslint-utils "^1.3.0" - regexpp "^2.0.0" + regexpp "^2.0.1" eslint-plugin-import@2.17.2: version "2.17.2" @@ -1431,17 +1431,17 @@ eslint-plugin-import@2.17.2: read-pkg-up "^2.0.0" resolve "^1.10.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@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.0.0.tgz#a35f617b3f948622e992e901efbc3c9dcb34f42a" + integrity sha512-46VIO0apTu0b5Hh+lFsTGeRBG+3XksfVR3CrSrP+Bk+bYVuSQ3JxlCW3RLiJYtC0HxKbn4HFqepj+DT8HRUGGQ== dependencies: - eslint-plugin-es "^1.3.1" + eslint-plugin-es "^1.4.0" eslint-utils "^1.3.1" - ignore "^5.0.2" + ignore "^5.1.1" minimatch "^3.0.4" - resolve "^1.8.1" - semver "^5.5.0" + resolve "^1.10.1" + semver "^6.0.0" eslint-plugin-promise@4.1.1: version "4.1.1" @@ -2022,10 +2022,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.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.6.tgz#562dacc7ec27d672dde433aa683c543b24c17694" - integrity sha512-/+hp3kUf/Csa32ktIaj0OlRqQxrgs30n62M90UBpNd9k+ENEch5S+hmbW3DtcJGz3sYFTh4F3A6fQ0q7KWsp4w== +ignore@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" + integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== import-fresh@^3.0.0: version "3.0.0" @@ -3585,7 +3585,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^2.0.0, regexpp@^2.0.1: +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== @@ -3695,7 +3695,14 @@ resolve@^1.10.0, resolve@^1.3.2: dependencies: path-parse "^1.0.6" -resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" + integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== + dependencies: + path-parse "^1.0.6" + +resolve@^1.5.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== From 38c1d5ca1c8688156fba63e42deef683b46e99d9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 4 May 2019 01:28:50 +0000 Subject: [PATCH 121/341] Update dependency eslint-plugin-node to v9.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 55e91b8e..eb067f2e 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint": "5.16.0", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.17.2", - "eslint-plugin-node": "9.0.0", + "eslint-plugin-node": "9.0.1", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", "nyc": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 439ee2b3..1450d624 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1431,10 +1431,10 @@ eslint-plugin-import@2.17.2: read-pkg-up "^2.0.0" resolve "^1.10.0" -eslint-plugin-node@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.0.0.tgz#a35f617b3f948622e992e901efbc3c9dcb34f42a" - integrity sha512-46VIO0apTu0b5Hh+lFsTGeRBG+3XksfVR3CrSrP+Bk+bYVuSQ3JxlCW3RLiJYtC0HxKbn4HFqepj+DT8HRUGGQ== +eslint-plugin-node@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz#93e44626fa62bcb6efea528cee9687663dc03b62" + integrity sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw== dependencies: eslint-plugin-es "^1.4.0" eslint-utils "^1.3.1" From 2dd38967b13a7c7b67cef4717215801920bc8d96 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 10 May 2019 02:24:26 +0000 Subject: [PATCH 122/341] Update dependency nyc to v14.1.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index eb067f2e..185a23d5 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "eslint-plugin-node": "9.0.1", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", - "nyc": "14.1.0", + "nyc": "14.1.1", "rimraf": "2.6.3", "sinon": "7.3.2" } diff --git a/yarn.lock b/yarn.lock index 1450d624..6a4fcaae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3066,10 +3066,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nyc@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.0.tgz#ae864913a4c5a947bfaebeb66a488bdb1868c9a3" - integrity sha512-iy9fEV8Emevz3z/AanIZsoGa8F4U2p0JKevZ/F0sk+/B2r9E6Qn+EPs0bpxEhnAt6UPlTL8mQZIaSJy8sK0ZFw== +nyc@14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.1.tgz#151d64a6a9f9f5908a1b73233931e4a0a3075eeb" + integrity sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw== dependencies: archy "^1.0.0" caching-transform "^3.0.2" From 28b77458da0607c84d12e05de176986d3d32f135 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 May 2019 03:59:48 +0000 Subject: [PATCH 123/341] Update dependency esm to v3.2.23 --- package.json | 2 +- yarn.lock | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 185a23d5..937926c3 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "chalk": "2.4.2", "commander": "2.20.0", - "esm": "3.2.22", + "esm": "3.2.23", "gift": "0.10.2", "inquirer": "6.3.1", "yabf": "2.1.0" diff --git a/yarn.lock b/yarn.lock index 6a4fcaae..95fbe90e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1513,7 +1513,12 @@ eslint@5.16.0: table "^5.2.3" text-table "^0.2.0" -esm@3.2.22, esm@^3.2.20: +esm@3.2.23: + version "3.2.23" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.23.tgz#caa54cb844a5ea1b89f9aa6c39ef7afb940a78fd" + integrity sha512-p7iNpE0K3nLn1KE2O0Vz/2Gpg93U+JroVqAdHZwK7l3MmPKh4iu5CEvw1Gym9DT23BgNNvnY5wOf9vMjBFw7Ug== + +esm@^3.2.20: version "3.2.22" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.22.tgz#5062c2e22fee3ccfee4e8f20da768330da90d6e3" integrity sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA== From 9b3cc7e5fb52c48c4be07b32b55bd6fc209d2c6e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 May 2019 17:34:26 +0000 Subject: [PATCH 124/341] Update dependency esm to v3.2.24 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 937926c3..b3bed850 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "chalk": "2.4.2", "commander": "2.20.0", - "esm": "3.2.23", + "esm": "3.2.24", "gift": "0.10.2", "inquirer": "6.3.1", "yabf": "2.1.0" diff --git a/yarn.lock b/yarn.lock index 95fbe90e..1138e385 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1513,10 +1513,10 @@ eslint@5.16.0: table "^5.2.3" text-table "^0.2.0" -esm@3.2.23: - version "3.2.23" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.23.tgz#caa54cb844a5ea1b89f9aa6c39ef7afb940a78fd" - integrity sha512-p7iNpE0K3nLn1KE2O0Vz/2Gpg93U+JroVqAdHZwK7l3MmPKh4iu5CEvw1Gym9DT23BgNNvnY5wOf9vMjBFw7Ug== +esm@3.2.24: + version "3.2.24" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.24.tgz#b77c0d9ac16904e156f7ea515ea2c16f9493a7b2" + integrity sha512-FWKxmdrXqKLyBR5FxF76RY0Hg1WyBBsc+/WG5uteKjdb/66szoT5WmSCamLJTlv9HF8ajPVeUXdHyTnWPZjTzA== esm@^3.2.20: version "3.2.22" From c95c90e87495447453cc88dad31dd9030e5e0b0a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 17 May 2019 05:26:40 +0000 Subject: [PATCH 125/341] Update dependency esm to v3.2.25 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b3bed850..91f061f6 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "chalk": "2.4.2", "commander": "2.20.0", - "esm": "3.2.24", + "esm": "3.2.25", "gift": "0.10.2", "inquirer": "6.3.1", "yabf": "2.1.0" diff --git a/yarn.lock b/yarn.lock index 1138e385..c86864bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1513,10 +1513,10 @@ eslint@5.16.0: table "^5.2.3" text-table "^0.2.0" -esm@3.2.24: - version "3.2.24" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.24.tgz#b77c0d9ac16904e156f7ea515ea2c16f9493a7b2" - integrity sha512-FWKxmdrXqKLyBR5FxF76RY0Hg1WyBBsc+/WG5uteKjdb/66szoT5WmSCamLJTlv9HF8ajPVeUXdHyTnWPZjTzA== +esm@3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== esm@^3.2.20: version "3.2.22" From 380b852b4fa98c706a94f3a4357d549f38066d1d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 23 May 2019 10:23:14 +0000 Subject: [PATCH 126/341] Update dependency eslint-plugin-node to v9.1.0 --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 91f061f6..7f90ba13 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint": "5.16.0", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.17.2", - "eslint-plugin-node": "9.0.1", + "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", "nyc": "14.1.1", diff --git a/yarn.lock b/yarn.lock index c86864bb..39d9e025 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1431,17 +1431,17 @@ eslint-plugin-import@2.17.2: read-pkg-up "^2.0.0" resolve "^1.10.0" -eslint-plugin-node@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz#93e44626fa62bcb6efea528cee9687663dc03b62" - integrity sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw== +eslint-plugin-node@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a" + integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw== dependencies: eslint-plugin-es "^1.4.0" eslint-utils "^1.3.1" ignore "^5.1.1" minimatch "^3.0.4" resolve "^1.10.1" - semver "^6.0.0" + semver "^6.1.0" eslint-plugin-promise@4.1.1: version "4.1.1" @@ -3799,6 +3799,11 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== +semver@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" + integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== + serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" From 5d613bb91b7cc0219ae72ffec47297d8d73f3cff Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 24 May 2019 22:00:16 +0000 Subject: [PATCH 127/341] Update dependency eslint-plugin-import to v2.17.3 --- package.json | 2 +- yarn.lock | 31 +++++++++++++++++++------------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 7f90ba13..aa05c524 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "1.4.1", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.17.2", + "eslint-plugin-import": "2.17.3", "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 39d9e025..6c4e34b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1414,10 +1414,10 @@ eslint-plugin-es@^1.4.0: eslint-utils "^1.3.0" regexpp "^2.0.1" -eslint-plugin-import@2.17.2: - version "2.17.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb" - integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g== +eslint-plugin-import@2.17.3: + version "2.17.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz#00548b4434c18faebaba04b24ae6198f280de189" + integrity sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q== dependencies: array-includes "^3.0.3" contains-path "^0.1.0" @@ -1429,7 +1429,7 @@ eslint-plugin-import@2.17.2: lodash "^4.17.11" minimatch "^3.0.4" read-pkg-up "^2.0.0" - resolve "^1.10.0" + resolve "^1.11.0" eslint-plugin-node@9.1.0: version "9.1.0" @@ -3693,13 +3693,6 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.3.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" - integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== - dependencies: - path-parse "^1.0.6" - resolve@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" @@ -3707,6 +3700,20 @@ resolve@^1.10.1: dependencies: path-parse "^1.0.6" +resolve@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" + integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== + dependencies: + path-parse "^1.0.6" + +resolve@^1.3.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + resolve@^1.5.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" From 09f3f4168adecfa408d6a8c30976952225ae0eb1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 1 Jun 2019 11:59:49 +0000 Subject: [PATCH 128/341] Update dependency ava to v2 --- package.json | 2 +- yarn.lock | 1534 ++++++++++++++++++++++++++------------------------ 2 files changed, 788 insertions(+), 748 deletions(-) diff --git a/package.json b/package.json index aa05c524..366ba26e 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.13.8", - "ava": "1.4.1", + "ava": "2.0.0", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.17.3", diff --git a/yarn.lock b/yarn.lock index 6c4e34b5..8a60003f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,18 +7,15 @@ resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-3.0.0.tgz#2c933ec22da0c4ce1fc5369f2b95452c70420586" integrity sha512-mN9UolOs4WX09QkheU1ELkVy2WPnwonlO3XMdN8JF8fQqRVgVTR21xDbvEOUsbwz6Zwjq7ji9yzyjuXqDPalxg== -"@ava/babel-preset-stage-4@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-2.0.0.tgz#2cd072ff818e4432b87fd4c5fd5c5d1a405a4343" - integrity sha512-OWqMYeTSZ16AfLx0Vn0Uj7tcu+uMRlbKmks+DVCFlln7vomVsOtst+Oz+HCussDSFGpE+30VtHAUHLy6pLDpHQ== +"@ava/babel-preset-stage-4@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-3.0.0.tgz#32c46b22b640d1ba0c6e38ae4abd58efab965558" + integrity sha512-uI5UBx++UsckkfnbF0HH6jvTIvM4r/Kxt1ROO2YXKu5H15sScAtxUIAHiUVbPIw24zPqz/PlF3xxlIDuyFzlQw== dependencies: - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-dotall-regex" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.4.3" + "@babel/plugin-transform-modules-commonjs" "^7.4.3" "@ava/babel-preset-transform-test-files@^5.0.0": version "5.0.0" @@ -28,15 +25,6 @@ "@ava/babel-plugin-throws-helper" "^3.0.0" babel-plugin-espower "^3.0.1" -"@ava/write-file-atomic@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz#d625046f3495f1f5e372135f473909684b429247" - integrity sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -44,18 +32,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.4.0": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" - integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== +"@babel/core@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" + integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" - "@babel/helpers" "^7.4.3" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.5" + "@babel/types" "^7.4.4" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -86,6 +74,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -93,22 +92,6 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.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" @@ -132,16 +115,16 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-transforms@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz#b1e357a1c49e58a47211a6853abb8e2aaefeb064" - integrity sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA== +"@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.2.2" - "@babel/types" "^7.2.2" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" lodash "^4.17.11" "@babel/helper-plugin-utils@^7.0.0": @@ -149,10 +132,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.3.tgz#9d6e5428bfd638ab53b37ae4ec8caf0477495147" - integrity sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA== +"@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== dependencies: lodash "^4.17.11" @@ -175,13 +158,6 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== - dependencies: - "@babel/types" "^7.0.0" - "@babel/helper-split-export-declaration@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" @@ -189,6 +165,13 @@ dependencies: "@babel/types" "^7.4.0" +"@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== + dependencies: + "@babel/types" "^7.4.4" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -199,14 +182,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" - integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== +"@babel/helpers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" + integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== dependencies: - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" "@babel/highlight@^7.0.0": version "7.0.0" @@ -227,7 +210,12 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== -"@babel/plugin-proposal-async-generator-functions@^7.0.0": +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== @@ -236,15 +224,7 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" - integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== @@ -273,38 +253,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.0.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" - integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-dotall-regex@^7.0.0": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz#fceff1c16d00c53d32d980448606f812cd6d02bf" - integrity sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA== +"@babel/plugin-transform-dotall-regex@^7.4.3": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.3" + "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/plugin-transform-exponentiation-operator@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== +"@babel/plugin-transform-modules-commonjs@^7.4.3": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz#3917f260463ac08f8896aa5bd54403f6e1fed165" - integrity sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA== - dependencies: - "@babel/helper-module-transforms" "^7.4.3" + "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" @@ -317,7 +280,7 @@ "@babel/parser" "^7.1.2" "@babel/types" "^7.1.2" -"@babel/template@^7.2.2", "@babel/template@^7.4.0": +"@babel/template@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== @@ -326,6 +289,15 @@ "@babel/parser" "^7.4.0" "@babel/types" "^7.4.0" +"@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" @@ -341,6 +313,21 @@ globals "^11.1.0" lodash "^4.17.11" +"@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" @@ -350,7 +337,7 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.4.0": +"@babel/types@^7.2.0", "@babel/types@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== @@ -359,6 +346,15 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@concordance/react@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" @@ -366,6 +362,24 @@ dependencies: arrify "^1.0.1" +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "@sinonjs/commons@^1", "@sinonjs/commons@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" @@ -402,16 +416,42 @@ 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" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "12.0.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" + integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== + "@types/node@11.13.8": version "11.13.8" resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - acorn-jsx@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.0.tgz#958584ddb60990c02c97c1bd9d521fce433bb101" @@ -432,18 +472,25 @@ ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== dependencies: - string-width "^2.0.0" + string-width "^3.0.0" 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-escapes@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.1.0.tgz#62a9e5fa78e99c5bb588b1796855f5d729231b53" + integrity sha512-2VY/iCUZTDLD/qxptS3Zn3c6k2MeIbYqjRXqM8T5oC7N2mMjh3xIU3oYru6cHGbldFa9h5i8N0fP65UaUqrMWA== + dependencies: + type-fest "^0.3.0" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -466,13 +513,20 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== +ansi-styles@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.0.0.tgz#f6b84e8fc97ea7add7a53b7530ef28f3fde0e048" + integrity sha512-8zjUtFJ3db/QoPXuuEMloS2AUf79/yeyttJ7Abr3hteopJu9HK8vsgGviGUMq+zyA6cZZO6gAyZoMTF6TgaEjA== dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" + color-convert "^2.0.0" + +anymatch@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.0.2.tgz#ddb3a8495d44875423af7b919aace11e91732a41" + integrity sha512-rUe9SxpRQlVg4EM8It7JMNWWYHAirTPpbTuvaSKybb5IejNgWB3PGBBX9rrPKDx2pM/p3Wh+7+ASaWRyyAbxmQ== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" append-transform@^1.0.0: version "1.0.0" @@ -481,24 +535,11 @@ append-transform@^1.0.0: dependencies: default-require-extensions "^2.0.0" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -521,11 +562,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-differ@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" - integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -551,26 +587,36 @@ array-union@^1.0.1, array-union@^1.0.2: dependencies: array-uniq "^1.0.1" +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-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-uniq@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.0.0.tgz#0009e30306e37a6dd2e2e2480db5316fdade1583" - integrity sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg== +array-uniq@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" + integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== 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= -arrify@^1.0.0, arrify@^1.0.1: +arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -581,44 +627,43 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" - integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== +async-each@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -ava@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-1.4.1.tgz#4a59289e0c9728e492ec3a5be21d1072636be172" - integrity sha512-wKpgOPTL7hJSBWpfbU4SA8rlsTZrph9g9g7qYDV7M6uK1rKeW8oCUJWRwCd8B24S4N0Y5myf6cTEnA66WIk0sA== +ava@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-2.0.0.tgz#265f9a094f83d0a78c05654e37302645d59ca1fa" + integrity sha512-tOfO3yQhKiSECIjST8Xi99l7Bja9EG5hgZFKc92xNZh/6pnct97vWDKENyATBvZIXpdCClSMtGgOX2UaGq+OJA== dependencies: - "@ava/babel-preset-stage-4" "^2.0.0" + "@ava/babel-preset-stage-4" "^3.0.0" "@ava/babel-preset-transform-test-files" "^5.0.0" - "@ava/write-file-atomic" "^2.2.0" - "@babel/core" "^7.4.0" - "@babel/generator" "^7.4.0" + "@babel/core" "^7.4.5" + "@babel/generator" "^7.4.4" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@concordance/react" "^2.0.0" - ansi-escapes "^3.2.0" - ansi-styles "^3.2.1" + ansi-escapes "^4.1.0" + ansi-styles "^4.0.0" arr-flatten "^1.1.0" - array-union "^1.0.1" - array-uniq "^2.0.0" - arrify "^1.0.0" - bluebird "^3.5.3" + array-union "^2.1.0" + array-uniq "^2.1.0" + arrify "^2.0.1" + bluebird "^3.5.5" chalk "^2.4.2" - chokidar "^2.1.5" + chokidar "^3.0.0" chunkd "^1.0.0" ci-parallel-vars "^1.0.0" - clean-stack "^2.0.0" + clean-stack "^2.1.0" clean-yaml-object "^0.1.0" - cli-cursor "^2.1.0" + cli-cursor "^3.0.0" cli-truncate "^1.1.0" code-excerpt "^2.1.1" common-path-prefix "^1.0.0" @@ -626,57 +671,53 @@ ava@1.4.1: convert-source-map "^1.6.0" currently-unhandled "^0.4.1" debug "^4.1.1" - del "^4.0.0" - dot-prop "^4.2.0" + del "^4.1.1" + dot-prop "^5.0.0" emittery "^0.4.1" empower-core "^1.2.0" equal-length "^1.0.0" - escape-string-regexp "^1.0.5" - esm "^3.2.20" - figures "^2.0.0" - find-up "^3.0.0" - get-port "^4.2.0" - globby "^7.1.1" + escape-string-regexp "^2.0.0" + esm "^3.2.25" + figures "^3.0.0" + find-up "^4.0.0" + get-port "^5.0.0" + globby "^9.2.0" ignore-by-default "^1.0.0" import-local "^2.0.0" - indent-string "^3.2.0" + indent-string "^4.0.0" is-ci "^2.0.0" - is-error "^2.2.1" - is-observable "^1.1.0" - is-plain-object "^2.0.4" + is-error "^2.2.2" + is-observable "^2.0.0" + is-plain-object "^3.0.0" is-promise "^2.1.0" - lodash.clone "^4.5.0" - lodash.clonedeep "^4.5.0" - lodash.clonedeepwith "^4.5.0" - lodash.debounce "^4.0.3" - lodash.difference "^4.3.0" - lodash.flatten "^4.2.0" - loud-rejection "^1.2.0" - make-dir "^2.1.0" - matcher "^1.1.1" - md5-hex "^2.0.0" + lodash "^4.17.11" + loud-rejection "^2.1.0" + make-dir "^3.0.0" + matcher "^2.0.0" + md5-hex "^3.0.0" meow "^5.0.0" + micromatch "^4.0.2" ms "^2.1.1" - multimatch "^3.0.0" - observable-to-promise "^0.5.0" - ora "^3.2.0" - package-hash "^3.0.0" - pkg-conf "^3.0.0" - plur "^3.0.1" - pretty-ms "^4.0.0" + observable-to-promise "^1.0.0" + ora "^3.4.0" + package-hash "^4.0.0" + pkg-conf "^3.1.0" + plur "^3.1.1" + pretty-ms "^5.0.0" require-precompiled "^0.1.0" - resolve-cwd "^2.0.0" - slash "^2.0.0" - source-map-support "^0.5.11" + resolve-cwd "^3.0.0" + slash "^3.0.0" + source-map-support "^0.5.12" stack-utils "^1.0.2" strip-ansi "^5.2.0" - strip-bom-buf "^1.0.0" + strip-bom-buf "^2.0.0" supertap "^1.0.0" supports-color "^6.1.0" trim-off-newlines "^1.0.1" trim-right "^1.0.1" unique-temp-dir "^1.0.0" - update-notifier "^2.5.0" + update-notifier "^3.0.0" + write-file-atomic "^3.0.0" babel-plugin-espower@^3.0.1: version "3.0.1" @@ -709,27 +750,28 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== -bluebird@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== +bluebird@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== +boxen@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb" + integrity sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A== dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^2.4.2" + cli-boxes "^2.2.0" + string-width "^3.0.0" term-size "^1.2.0" + type-fest "^0.3.0" widest-line "^2.0.0" brace-expansion@^1.1.7: @@ -740,7 +782,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: +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== @@ -756,6 +798,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +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== + dependencies: + fill-range "^7.0.1" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -781,6 +830,19 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-request@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" + integrity sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q== + dependencies: + clone-response "^1.0.2" + get-stream "^4.0.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^1.0.1" + normalize-url "^3.1.0" + responselike "^1.0.2" + caching-transform@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" @@ -801,6 +863,11 @@ call-matcher@^1.0.0: espurify "^1.6.0" estraverse "^4.0.0" +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + call-signature@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" @@ -820,7 +887,7 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" -camelcase@^4.0.0, camelcase@^4.1.0: +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= @@ -830,10 +897,10 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.0.tgz#0a110882cbeba41f72f99fcf918f4a0a92a13ebf" integrity sha512-Y05ICatFYPAfykDIB7VdwSJ0LUl1yq/BwO2OpyGGLjiRe1fgzTwVypPiWnzkGFOVFHXrCXUNBl86bpjBhZWSJg== -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@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== chalk@2.4.2, chalk@^2.4.2: version "2.4.2" @@ -858,40 +925,27 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" - integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" +chokidar@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.0.tgz#6b538f0fd6d5d31d5dd2b59e05426bec0f49aa40" + integrity sha512-ebzWopcacB2J19Jsb5RPtMrzmjUZ5VAQnsL0Ztrix3lswozHbiDp+1Lg3AWSKHdwsps/W2vtshA/x3I827F78g== + dependencies: + anymatch "^3.0.1" + async-each "^1.0.3" + 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" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" + readdirp "^3.0.1" optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + fsevents "^2.0.6" chunkd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-1.0.0.tgz#4ead4a3704bcce510c4bb4d4a8be30c557836dd1" integrity sha512-xx3Pb5VF9QaqCotolyZ1ywFBgyuJmu6+9dLiqBxgelEse9Xsr3yUlpoX3O4Oh11M00GT2kYMsRByTKIMJW2Lkg== -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -912,20 +966,20 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.0.0.tgz#301bfa9e8dd2d3d984c0e542f7aa67b996f63e0a" - integrity sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A== +clean-stack@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" + integrity sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA== clean-yaml-object@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= +cli-boxes@^2.2.0: + version "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" @@ -934,6 +988,13 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.0.0.tgz#f6cc68b8ae372a18894e59fbf2ae3bd659731c15" + integrity sha512-m7avcYLWHHQVU+cFxu301q3kKZJlcZcKXQSL9kffYnIvRNtqX+a7gJKXqOKusHoKXr4oquSgiMlAo1R0dDkSZA== + dependencies: + restore-cursor "^2.0.0" + cli-spinners@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.0.0.tgz#4b078756fc17a8f72043fdc9f1f14bf4fa87e2df" @@ -961,6 +1022,13 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +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= + dependencies: + mimic-response "^1.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -993,11 +1061,23 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.0.tgz#9851ac61cc0d3898a8a3088650d5bf447bf69d97" + integrity sha512-hzTicsCJIHdxih9+2aLR1tNGZX5qSJGRHDPVwSY26tVrEf55XNajLOBWz2UuWSIergszA09/bqnOiHyqx9fxQg== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + commander@2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" @@ -1045,10 +1125,10 @@ concordance@^4.0.0: semver "^5.5.1" well-known-symbols "^2.0.0" -configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1057,11 +1137,6 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" @@ -1089,11 +1164,6 @@ core-js@^2.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - cp-file@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" @@ -1105,13 +1175,6 @@ cp-file@^6.2.0: pify "^4.0.1" safe-buffer "^5.0.1" -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-spawn@^4: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -1159,7 +1222,7 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.2.0, debug@^2.3.3, 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== @@ -1198,6 +1261,13 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + deep-equal@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -1227,6 +1297,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" + integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== + define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -1256,11 +1331,12 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.0.tgz#049543b8290e1a9293e2bd150ab3a06f637322b8" - integrity sha512-C4kvKNlYrwXhKxz97BuohF8YoGgQ23Xm9lvoHmgT7JaPGprSEjk3+XFled74Yt/x0ZABUHg2D67covzAPUKx5Q== +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== dependencies: + "@types/glob" "^7.1.1" globby "^6.1.0" is-path-cwd "^2.0.0" is-path-in-cwd "^2.0.0" @@ -1268,22 +1344,12 @@ del@^4.0.0: pify "^4.0.1" rimraf "^2.6.3" -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -dir-glob@^2.0.0: +dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== @@ -1305,13 +1371,20 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^4.1.0, dot-prop@^4.2.0: +dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" +dot-prop@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.0.0.tgz#64b7968af349c3a9f966aa12658dbd5829f6b953" + integrity sha512-RTmaF2jx3nOBO2GvtFqjnDLycjFUMqt+2pwRx7JVYa81lDauoj9aNkyrJI2ikR58FbBIchiIlRiGG+muLJ4oHQ== + dependencies: + is-obj "^1.0.0" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -1380,11 +1453,16 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +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@^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== + eslint-config-standard@12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" @@ -1513,16 +1591,11 @@ eslint@5.16.0: table "^5.2.3" text-table "^0.2.0" -esm@3.2.25: +esm@3.2.25, esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -esm@^3.2.20: - version "3.2.22" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.22.tgz#5062c2e22fee3ccfee4e8f20da768330da90d6e3" - integrity sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA== - espower-location-detector@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" @@ -1665,6 +1738,18 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + 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" @@ -1682,6 +1767,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" + integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== + 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" @@ -1699,6 +1791,13 @@ fill-range@^4.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" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -1722,6 +1821,13 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a" + integrity sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q== + dependencies: + locate-path "^5.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -1761,25 +1867,15 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== - dependencies: - minipass "^2.2.1" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" +fsevents@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a" + integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ== function-bind@^1.1.1: version "1.1.1" @@ -1791,36 +1887,24 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - get-caller-file@^2.0.1: 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== -get-port@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" - integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== +get-port@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.0.0.tgz#aa22b6b86fd926dd7884de3e23332c9f70c031a6" + integrity sha512-imzMU0FjsZqNa6BqOjbbW6w5BivHIuQKopjpPqcnx0AVHJQKCxK1O+Ab3OrVXhrekqfVMjwA9ZYu062R+KcIsQ== + dependencies: + type-fest "^0.3.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.0.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== @@ -1848,6 +1932,18 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" + integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -1883,34 +1979,36 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== dependencies: - create-error-class "^3.0.0" + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" @@ -1943,11 +2041,6 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= -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" @@ -1979,6 +2072,11 @@ has-values@^1.0.0: 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: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1993,12 +2091,25 @@ hasha@^3.0.0: dependencies: is-stream "^1.0.1" +hasha@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.0.0.tgz#fdc3785caea03df29535fc8adb512c3d3a709004" + integrity sha512-PqWdhnQhq6tqD32hZv+l1e5mJHNSudjnaAzgAHfkGiU0ABN6lmbZF8abJIulQHbZ7oiHhP8yL6O910ICMc+5pw== + dependencies: + is-stream "^1.1.0" + type-fest "^0.3.0" + hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -iconv-lite@^0.4.24, iconv-lite@^0.4.4: +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + +iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -2010,19 +2121,7 @@ ignore-by-default@^1.0.0: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^4.0.6: +ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -2063,6 +2162,11 @@ indent-string@^3.0.0, indent-string@^3.2.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2071,7 +2175,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@~2.0.3: +inherits@2: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -2148,12 +2252,12 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= +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 "^1.0.0" + binary-extensions "^2.0.0" is-buffer@^1.1.5: version "1.1.6" @@ -2172,13 +2276,6 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -2223,10 +2320,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-error@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" - integrity sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= +is-error@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" + integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -2264,7 +2361,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, 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== @@ -2279,10 +2376,10 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-npm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" + integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== is-number@^3.0.0: version "3.0.0" @@ -2291,24 +2388,20 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-observable@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" - integrity sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI= - dependencies: - symbol-observable "^0.2.2" - -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" +is-observable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-2.0.0.tgz#327af1e8cdea9cd717f95911b87c5d34301721a6" + integrity sha512-fhBZv3eFKUbyHXZ1oHujdo2tZ+CNbdpdzzlENgCGZUC8keoGxUew2jYFLYcUB4qo7LDD03o4KK11m/QYD7kEjg== is-path-cwd@^2.0.0: version "2.0.0" @@ -2341,16 +2434,18 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" + integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== + dependencies: + isobject "^4.0.0" + is-promise@^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= - is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -2358,12 +2453,7 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.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= @@ -2375,6 +2465,11 @@ is-symbol@^1.0.2: dependencies: has-symbols "^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-url@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" @@ -2390,12 +2485,17 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + isarray@0.0.1: version "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: +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= @@ -2417,6 +2517,11 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + 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" @@ -2513,6 +2618,11 @@ jsesc@~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-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -2540,6 +2650,13 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + 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" @@ -2564,12 +2681,12 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= +latest-version@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== dependencies: - package-json "^4.0.0" + package-json "^6.3.0" lcid@^2.0.0: version "2.0.0" @@ -2632,36 +2749,18 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.clone@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.clonedeepwith@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4" - integrity sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ= - -lodash.debounce@^4.0.3: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.difference@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -2699,7 +2798,7 @@ lolex@^4.0.1: resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.0.1.tgz#4a99c2251579d693c6a083446dae0e5c3844d3fa" integrity sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw== -loud-rejection@^1.0.0, loud-rejection@^1.2.0: +loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= @@ -2707,7 +2806,15 @@ loud-rejection@^1.0.0, loud-rejection@^1.2.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lowercase-keys@^1.0.0: +loud-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.1.0.tgz#4020547ddbc39ed711c8434326df9fc7d2395355" + integrity sha512-g/6MQxUXYHeVqZ4PGpPL1fS1fOvlXoi7bay0pizmjAd/3JhyXwxzwrnr74yzdmhuerlslbRJ3x7IOXzFz0cE5w== + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.2" + +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" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== @@ -2735,6 +2842,13 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.0" + 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" @@ -2764,12 +2878,12 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -matcher@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" - integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== +matcher@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.0.0.tgz#85fe38d97670dbd2a46590cf099401e2ffb4755c" + integrity sha512-nlmfSlgHBFx36j/Pl/KQPbIaqE8Zf0TqmSMjsuddHDg6PMSVgmyW9HpkLs0o0M1n2GIZ/S2BZBLIww/xjhiGng== dependencies: - escape-string-regexp "^1.0.4" + escape-string-regexp "^2.0.0" md5-hex@^2.0.0: version "2.0.0" @@ -2778,6 +2892,13 @@ md5-hex@^2.0.0: dependencies: md5-o-matic "^0.1.1" +md5-hex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.0.tgz#96cf5c62cedea41e04124b9473ef7481db6de5fb" + integrity sha512-uA+EX5IV1r5lKBJecwTSec3k6xl4ziBUZihRiOpOHCeHjKA0ai6+eImamXQy/cI3Qep5mQgFTeJld9tcwdBNFw== + dependencies: + md5-o-matic "^0.1.1" + md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" @@ -2814,7 +2935,12 @@ merge-source-map@^1.1.0: dependencies: source-map "^0.6.1" -micromatch@^3.1.10, micromatch@^3.1.4: +merge2@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + +micromatch@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -2833,6 +2959,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -2843,6 +2977,11 @@ mimic-fn@^2.0.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== + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2873,21 +3012,6 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" - integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== - dependencies: - minipass "^2.2.1" - mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -2913,26 +3037,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -multimatch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" - integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== - dependencies: - array-differ "^2.0.3" - array-union "^1.0.2" - arrify "^1.0.1" - minimatch "^3.0.4" - 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= -nan@^2.9.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" - integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -2955,15 +3064,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - neo-async@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" @@ -2990,30 +3090,6 @@ nise@^1.4.10: lolex "^2.3.2" path-to-regexp "^1.7.0" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -3024,30 +3100,15 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== - -npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" +normalize-url@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== npm-run-path@^2.0.0: version "2.0.2" @@ -3056,16 +3117,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -3102,7 +3153,7 @@ nyc@14.1.1: yargs "^13.2.2" yargs-parser "^13.0.0" -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -3135,12 +3186,12 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -observable-to-promise@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.5.0.tgz#c828f0f0dc47e9f86af8a4977c5d55076ce7a91f" - integrity sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8= +observable-to-promise@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-1.0.0.tgz#37e136f16a15385ac063411ada0e1202bfff58f4" + integrity sha512-cqnGUrNsE6vdVDTPAX9/WeVzwy/z37vdxupdQXU8vgTXRFH72KCZiZga8aca2ulRPIeem8W3vW9rQHBwfIl2WA== dependencies: - is-observable "^0.2.0" + is-observable "^2.0.0" symbol-observable "^1.0.4" once@^1.3.0, once@^1.3.1, once@^1.4.0: @@ -3177,19 +3228,19 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.3.1.tgz#b0da81069b99da75c4cadee2fc2c57d4564da531" - integrity sha512-k80K0Q6hYokgaJoFePrxJfQJeZKZ38GVEI/BLNxAJXtQZGcMc5jLIAO9ttoI8A52wvfHmdySy8F52gz/sfFFFA== +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== dependencies: chalk "^2.4.2" cli-cursor "^2.1.0" cli-spinners "^2.0.0" log-symbols "^2.2.0" - strip-ansi "^5.0.0" + strip-ansi "^5.2.0" wcwidth "^1.0.1" -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= @@ -3203,18 +3254,15 @@ os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.1, 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= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" +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" @@ -3245,6 +3293,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + 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" @@ -3259,6 +3314,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" @@ -3284,15 +3346,25 @@ package-hash@^3.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + +package-json@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.3.0.tgz#5ed793418b8322af7abfb985a19a20c2f40c2fb0" + integrity sha512-XO7WS3EEXd48vmW633Y97Mh9xuENFiOevI9G+ExfTG/k6xuY9cBd3fxkAoDMSEsNZXasaVJIJ1rD/n7GMf18bA== + dependencies: + got "^9.6.0" + registry-auth-token "^3.4.0" + registry-url "^5.0.0" + semver "^5.6.0" parent-module@^1.0.0: version "1.0.1" @@ -3316,10 +3388,10 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-ms@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.0.0.tgz#7b3640295100caf3fa0100ccceb56635b62f9d62" - integrity sha512-AddiXFSLLCqj+tCRJ9MrUtHZB4DWojO3tk0NVZ+g5MaMQHF2+p2ktqxuoXyPFLljz/aUK0Nfhd/uGWnhXVXEyA== +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== pascalcase@^0.1.1: version "0.1.1" @@ -3377,6 +3449,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +picomatch@^2.0.4, picomatch@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3404,10 +3481,10 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-conf@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.0.0.tgz#41f836458fb83b080e08e62b2d63a68aa8c436df" - integrity sha512-YOvV9hWNY9+abaZdgaZs4eyTzfeO1bwEYCYRskER2aP5ZWZAdrb/8YeOo95mb6tr01MR9ZUGArl1sMy2At/YWQ== +pkg-conf@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" + integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== dependencies: find-up "^3.0.0" load-json-file "^5.2.0" @@ -3426,10 +3503,10 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -plur@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/plur/-/plur-3.0.1.tgz#268652d605f816699b42b86248de73c9acd06a7c" - integrity sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA== +plur@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b" + integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w== dependencies: irregular-plurals "^2.0.0" @@ -3443,22 +3520,17 @@ prelude-ls@~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" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-ms@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-4.0.0.tgz#31baf41b94fd02227098aaa03bd62608eb0d6e92" - integrity sha512-qG66ahoLCwpLXD09ZPHSCbUWYTqdosB7SMP4OffgTgL2PBKXMuUsrk5Bwg8q4qPkjTXsKBMr+YK3Ltd/6F9s/Q== +pretty-ms@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.0.0.tgz#6133a8f55804b208e4728f6aa7bf01085e951e24" + integrity sha512-94VRYjL9k33RzfKiGokPBPpsmloBYSf5Ri+Pq19zlsEcUKFob+admeXr5eFDRuPjFmEOcjJvPGdillYOJyvZ7Q== dependencies: - parse-ms "^2.0.0" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + parse-ms "^2.1.0" progress@^2.0.0: version "2.0.1" @@ -3488,7 +3560,7 @@ quick-lru@^1.0.0: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -3540,27 +3612,12 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.2, 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== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== +readdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.0.1.tgz#14a8875883c5575c235579624a1e177cb0b1ec58" + integrity sha512-emMp13NEwWQQX1yeDgrzDNCSY7NHV6k9HTW0OhyQqOAzYacbqQhnmWiCYjxNPcqMTQ9k77oXQJp28jkytm3+jg== dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" + picomatch "^2.0.4" redent@^2.0.0: version "2.0.0" @@ -3607,20 +3664,20 @@ regexpu-core@^4.5.4: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" -registry-auth-token@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== +registry-auth-token@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== dependencies: rc "^1.1.6" safe-buffer "^5.0.1" -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== dependencies: - rc "^1.0.1" + rc "^1.2.8" regjsgen@^0.5.0: version "0.5.0" @@ -3641,11 +3698,6 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" @@ -3678,6 +3730,13 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -3688,6 +3747,11 @@ 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-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -3721,6 +3785,13 @@ resolve@^1.5.0: dependencies: path-parse "^1.0.5" +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: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -3741,7 +3812,7 @@ rimraf@2.6.3, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -3762,7 +3833,7 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -3779,11 +3850,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -3791,7 +3857,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -3816,7 +3882,7 @@ serialize-error@^2.1.0: resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -3871,16 +3937,16 @@ sinon@7.3.2: nise "^1.4.10" supports-color "^5.5.0" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +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@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -3897,11 +3963,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -3943,10 +4004,10 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.11: - version "0.5.11" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" - integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== +source-map-support@^0.5.12: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -4038,7 +4099,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@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -4055,13 +4116,6 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -4083,10 +4137,10 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-bom-buf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" - integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= +strip-bom-buf@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz#ff9c223937f8e7154b77e9de9bde094186885c15" + integrity sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ== dependencies: is-utf8 "^0.2.1" @@ -4135,12 +4189,7 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -symbol-observable@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" - integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= - -symbol-observable@^1.0.4, symbol-observable@^1.1.0: +symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -4155,19 +4204,6 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tar@^4: - version "4.4.6" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" - integrity sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg== - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -4200,11 +4236,6 @@ time-zone@^1.0.0: resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= -timed-out@^4.0.0: - 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" @@ -4224,6 +4255,11 @@ to-object-path@^0.3.0: 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" @@ -4232,6 +4268,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + 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" @@ -4274,6 +4317,18 @@ type-detect@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.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" @@ -4349,29 +4404,21 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -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= - -upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== - -update-notifier@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== +update-notifier@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.0.tgz#e9bbf8f0f5b7a2ce6666ca46334fdb29492e8fab" + integrity sha512-6Xe3oF2bvuoj4YECUc52yxVs94yWrxwqHbzyveDktTS1WhnlTRpNcQMxUshcB7nRVGi1jEXiqL5cW1S5WSyzKg== dependencies: - boxen "^1.2.1" + boxen "^3.0.0" chalk "^2.0.1" - configstore "^3.0.0" + configstore "^4.0.0" + has-yarn "^2.1.0" import-lazy "^2.1.0" - is-ci "^1.0.10" + is-ci "^2.0.0" is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" + is-npm "^3.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" semver-diff "^2.0.0" xdg-basedir "^3.0.0" @@ -4387,23 +4434,18 @@ urix@^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= +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" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= dependencies: - prepend-http "^1.0.1" + prepend-http "^2.0.0" 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== -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -4441,13 +4483,6 @@ which@^1.2.9, which@^1.3.0: 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== - dependencies: - string-width "^1.0.2 || 2" - widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -4496,6 +4531,16 @@ write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.0.tgz#1b64dbbf77cb58fd09056963d63e62667ab4fb21" + integrity sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -4528,11 +4573,6 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= - yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" From 0bf9b3592789a08901d4ca7a1f9722d4afc3d507 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Sun, 2 Jun 2019 01:55:02 +0200 Subject: [PATCH 129/341] Create FUNDING.yml --- .github/FUNDING.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..78daafbb --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,9 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: mindsers # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +custom: # Replace with a single custom sponsorship URL From 6eea06f73a9bca42dca6c1acb7b4a35238d69947 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Sun, 2 Jun 2019 02:40:31 +0200 Subject: [PATCH 130/341] Update FUNDING.yml --- .github/FUNDING.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 78daafbb..92b8cb45 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,9 +1,9 @@ # These are supported funding model platforms -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: [mindsers] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: mindsers # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username +ko_fi: mindsers # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry custom: # Replace with a single custom sponsorship URL From b0804e41397726568f3e4b44a784250134fe293d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 2 Jun 2019 03:41:38 +0000 Subject: [PATCH 131/341] Update dependency @types/node to v11.13.13 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 366ba26e..cbb1dd80 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.8", + "@types/node": "11.13.13", "ava": "2.0.0", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index 8a60003f..921d53f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -447,10 +447,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.8": - version "11.13.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" - integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== +"@types/node@11.13.13": + version "11.13.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.13.tgz#a3d2a8a908ce322f24f0f8c88160b44c7dd5c452" + integrity sha512-GFWH7e4Q/OGLAO545bupVju+nE1YtLSwYAdLfSzAXnTPqoqKoXCOEtB7Cluvg9B/h2nGLhyzCDyCInYvrOE2nw== acorn-jsx@^5.0.0: version "5.0.0" From c2f021999f92ae843f435baca341b2fea084c20a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 10 Jun 2019 15:31:11 +0000 Subject: [PATCH 132/341] Update dependency ava to v2.1.0 --- package.json | 2 +- yarn.lock | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index cbb1dd80..d955561c 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.13.13", - "ava": "2.0.0", + "ava": "2.1.0", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.17.3", diff --git a/yarn.lock b/yarn.lock index 921d53f6..242cd8ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -637,10 +637,10 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -ava@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-2.0.0.tgz#265f9a094f83d0a78c05654e37302645d59ca1fa" - integrity sha512-tOfO3yQhKiSECIjST8Xi99l7Bja9EG5hgZFKc92xNZh/6pnct97vWDKENyATBvZIXpdCClSMtGgOX2UaGq+OJA== +ava@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-2.1.0.tgz#158c5cdf48d1556caf0a9fdf96b61af9e566c153" + integrity sha512-IaS+l1KfYtFpJlDZXrNG0M6SGr/DUvwJmTiaTaW2lMdEezCAJc5J/hNAQWIKigkmxIOURYT29atD/qyp+zq+wg== dependencies: "@ava/babel-preset-stage-4" "^3.0.0" "@ava/babel-preset-transform-test-files" "^5.0.0" @@ -658,7 +658,7 @@ ava@2.0.0: arrify "^2.0.1" bluebird "^3.5.5" chalk "^2.4.2" - chokidar "^3.0.0" + chokidar "^3.0.1" chunkd "^1.0.0" ci-parallel-vars "^1.0.0" clean-stack "^2.1.0" @@ -672,7 +672,7 @@ ava@2.0.0: currently-unhandled "^0.4.1" debug "^4.1.1" del "^4.1.1" - dot-prop "^5.0.0" + dot-prop "^5.0.1" emittery "^0.4.1" empower-core "^1.2.0" equal-length "^1.0.0" @@ -697,7 +697,7 @@ ava@2.0.0: md5-hex "^3.0.0" meow "^5.0.0" micromatch "^4.0.2" - ms "^2.1.1" + ms "^2.1.2" observable-to-promise "^1.0.0" ora "^3.4.0" package-hash "^4.0.0" @@ -925,10 +925,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.0.tgz#6b538f0fd6d5d31d5dd2b59e05426bec0f49aa40" - integrity sha512-ebzWopcacB2J19Jsb5RPtMrzmjUZ5VAQnsL0Ztrix3lswozHbiDp+1Lg3AWSKHdwsps/W2vtshA/x3I827F78g== +chokidar@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.1.tgz#98fe9aa476c55d9aea7841d6325ffdb30e95b40c" + integrity sha512-2ww34sJWehnbpV0Q4k4V5Hh7juo7po6z7LUWkcIQnSGN1lHOL8GGtLtfwabKvLFQw/hbSUQ0u6V7OgGYgBzlkQ== dependencies: anymatch "^3.0.1" async-each "^1.0.3" @@ -937,7 +937,7 @@ chokidar@^3.0.0: is-binary-path "^2.1.0" is-glob "^4.0.1" normalize-path "^3.0.0" - readdirp "^3.0.1" + readdirp "^3.0.2" optionalDependencies: fsevents "^2.0.6" @@ -1378,10 +1378,10 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dot-prop@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.0.0.tgz#64b7968af349c3a9f966aa12658dbd5829f6b953" - integrity sha512-RTmaF2jx3nOBO2GvtFqjnDLycjFUMqt+2pwRx7JVYa81lDauoj9aNkyrJI2ikR58FbBIchiIlRiGG+muLJ4oHQ== +dot-prop@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.0.1.tgz#e26c283bd1f10aab01e782371a751fb52cc3cb1c" + integrity sha512-5BKAm3KC6kgHOm5WqekMXd0HHRhilE0aJzBuOqtrPo2RDS2FTaOeuF5CEsHvZ8ETfjC9N3BufL6sxEMV8w/IIA== dependencies: is-obj "^1.0.0" @@ -3037,6 +3037,11 @@ ms@^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== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -3612,10 +3617,10 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readdirp@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.0.1.tgz#14a8875883c5575c235579624a1e177cb0b1ec58" - integrity sha512-emMp13NEwWQQX1yeDgrzDNCSY7NHV6k9HTW0OhyQqOAzYacbqQhnmWiCYjxNPcqMTQ9k77oXQJp28jkytm3+jg== +readdirp@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.0.2.tgz#cba63348e9e42fc1bd334b1d2ef895b6a043cbd6" + integrity sha512-LbyJYv48eywrhOlScq16H/VkCiGKGPC2TpOdZCJ7QXnYEjn3NN/Oblh8QEU3vqfSRBB7OGvh5x45NKiVeNujIQ== dependencies: picomatch "^2.0.4" From 9fa2687419be9bc968ff43269a984c8158631221 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 Jun 2019 19:25:27 +0000 Subject: [PATCH 133/341] Update dependency @types/node to v11.13.14 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d955561c..f98f94f2 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.13", + "@types/node": "11.13.14", "ava": "2.1.0", "eslint": "5.16.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index 242cd8ec..d2d2a4b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -447,10 +447,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.13": - version "11.13.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.13.tgz#a3d2a8a908ce322f24f0f8c88160b44c7dd5c452" - integrity sha512-GFWH7e4Q/OGLAO545bupVju+nE1YtLSwYAdLfSzAXnTPqoqKoXCOEtB7Cluvg9B/h2nGLhyzCDyCInYvrOE2nw== +"@types/node@11.13.14": + version "11.13.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.14.tgz#03e9416f7d699d71742e5a1e455def7bd55f8fb9" + integrity sha512-9NjFOB6UUGjJLNANmyIouuaN8YPsPgC4DCOd5lU+DL7HSX/RCfzz0JOtHlspEJq1Ll/JUu/8Cm4wzxpZ8w5sjQ== acorn-jsx@^5.0.0: version "5.0.0" From 8ad55b2592c6e193e52976564306097461f5cebe Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 13 Jun 2019 22:50:29 +0200 Subject: [PATCH 134/341] Add link to discourse --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a990b062..debcdf81 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![npm](https://img.shields.io/npm/dt/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) [![npm](https://img.shields.io/npm/l/configfile.svg?style=flat-square)](https://github.com/Mindsers/configfile/blob/master/LICENSE) [![Patreon](https://img.shields.io/badge/support-patreon-F96854.svg?logo=patreon&style=flat-square)](https://www.patreon.com/bePatron?u=9715649) -[![Discord](https://img.shields.io/badge/chat-discord-7289DA.svg?logo=discord&logoColor=7289DA&style=flat-square)](https://discord.gg/Tfv4ueX) +[![Discourse](https://img.shields.io/discourse/https/community.nathanaelcherrier.com/posts.svg?color=00aeef&logo=discourse&logoColor=00aeef&style=flat-square)](https://community.nathanaelcherrier.com) *configfile* is a command line tool that help user to manage their own configuration files. From 7d683e50f117021e6f88f0d5d83df21ee970024b Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 13 Jun 2019 22:54:47 +0200 Subject: [PATCH 135/341] Fix github accounts and add custom link --- .github/FUNDING.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 92b8cb45..87dc6bff 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,9 +1,9 @@ # These are supported funding model platforms -github: [mindsers] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: mindsers # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: mindsers # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -custom: # Replace with a single custom sponsorship URL +custom: nathanaelcherrier.com/en/support # Replace with a single custom sponsorship URL From 828712bfde7d74e779906aadb81c5e366988d5c9 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Sun, 16 Jun 2019 02:46:57 +0200 Subject: [PATCH 136/341] Update FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 87dc6bff..d73f92c9 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -6,4 +6,7 @@ open_collective: # Replace with a single Open Collective username ko_fi: mindsers # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: mindsers # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username custom: nathanaelcherrier.com/en/support # Replace with a single custom sponsorship URL From 9feca6ce4f698b8cccbb962ae3610a188293f741 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 20 Jun 2019 05:01:44 +0000 Subject: [PATCH 137/341] Update dependency inquirer to v6.4.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f98f94f2..60b87d7b 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "2.20.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "6.3.1", + "inquirer": "6.4.0", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index d2d2a4b0..995a6ac8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2185,10 +2185,10 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" - integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== +inquirer@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.0.tgz#6f9284047c4e48b76b169e46b3ae3b2171ce30a2" + integrity sha512-O3qJQ+fU/AI1K2y5/RjqefMEQTdJQf6sPTvyRA1bx6D634ADxcu97u6YOUciIeU2OWIuvpUsQs6Wx3Fdi3eFaQ== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" From 99882124f68d0eadbd765591e8c5e9bc95051fa1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 21 Jun 2019 08:44:15 +0000 Subject: [PATCH 138/341] Update dependency inquirer to v6.4.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 60b87d7b..2d14b6c2 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "2.20.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "6.4.0", + "inquirer": "6.4.1", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 995a6ac8..4a988018 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2185,10 +2185,10 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.0.tgz#6f9284047c4e48b76b169e46b3ae3b2171ce30a2" - integrity sha512-O3qJQ+fU/AI1K2y5/RjqefMEQTdJQf6sPTvyRA1bx6D634ADxcu97u6YOUciIeU2OWIuvpUsQs6Wx3Fdi3eFaQ== +inquirer@6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" + integrity sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" From 21d9dd6454a6453d914770290628354f40a47e5c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 Jun 2019 07:39:41 +0000 Subject: [PATCH 139/341] Update dependency eslint to v6 --- package.json | 2 +- yarn.lock | 40 ++++++++++++++++------------------------ 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 2d14b6c2..b8de030d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.14", "ava": "2.1.0", - "eslint": "5.16.0", + "eslint": "6.0.0", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.17.3", "eslint-plugin-node": "9.1.0", diff --git a/yarn.lock b/yarn.lock index 4a988018..ffab045c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -462,7 +462,7 @@ acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== -ajv@^6.9.1: +ajv@^6.10.0, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -1549,13 +1549,13 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -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== +eslint@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.0.tgz#9223f19223de73b4ed730e11bff44a376b65844d" + integrity sha512-SrrIfcd4tOgsspOKTSwamuTOAMZOUigHQhVMrzNjz4/B9Za6SHQDIocMIyIDfwDgx6MhS15nS6HC8kumCV2qBQ== dependencies: "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" + ajv "^6.10.0" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" @@ -1563,18 +1563,19 @@ eslint@5.16.0: eslint-scope "^4.0.3" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^5.0.1" + espree "^6.0.0" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" + glob-parent "^3.1.0" globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" inquirer "^6.2.2" - js-yaml "^3.13.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" lodash "^4.17.11" @@ -1582,7 +1583,6 @@ eslint@5.16.0: mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.2" progress "^2.0.0" regexpp "^2.0.1" semver "^5.5.1" @@ -1606,10 +1606,10 @@ espower-location-detector@^1.0.0: source-map "^0.5.0" xtend "^4.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@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" + integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== dependencies: acorn "^6.0.7" acorn-jsx "^5.0.0" @@ -1944,7 +1944,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: +glob@^7.0.3, glob@^7.0.5, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -2592,14 +2592,6 @@ js-yaml@^3.10.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.13.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" - integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -3418,7 +3410,7 @@ 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.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.1: 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= From 87d7c8faf4f2639871a32201afcbcaa9cc0b1298 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 Jun 2019 08:05:51 +0000 Subject: [PATCH 140/341] Update dependency @types/node to v11.13.15 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b8de030d..d242bd46 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.14", + "@types/node": "11.13.15", "ava": "2.1.0", "eslint": "6.0.0", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index ffab045c..a08ae992 100644 --- a/yarn.lock +++ b/yarn.lock @@ -447,10 +447,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.14": - version "11.13.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.14.tgz#03e9416f7d699d71742e5a1e455def7bd55f8fb9" - integrity sha512-9NjFOB6UUGjJLNANmyIouuaN8YPsPgC4DCOd5lU+DL7HSX/RCfzz0JOtHlspEJq1Ll/JUu/8Cm4wzxpZ8w5sjQ== +"@types/node@11.13.15": + version "11.13.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.15.tgz#699afb07a91adced2d6183a0ad156bf82542fc7d" + integrity sha512-x6ypl5Uzly+j23hbxmMzf12Eb4lOhIEqQz0HuczpTUa1KIx1GpbN/o4E3aAED20UoEsdK0wvyY8QcffuWSLDkw== acorn-jsx@^5.0.0: version "5.0.0" From a4bc22bdb9c0dd1ba22dac4f0b9418e2e14bc5bd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 25 Jun 2019 02:03:08 +0000 Subject: [PATCH 141/341] Update dependency eslint to v6.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d242bd46..f31e95e3 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.15", "ava": "2.1.0", - "eslint": "6.0.0", + "eslint": "6.0.1", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.17.3", "eslint-plugin-node": "9.1.0", diff --git a/yarn.lock b/yarn.lock index a08ae992..03802df0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1549,10 +1549,10 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.0.tgz#9223f19223de73b4ed730e11bff44a376b65844d" - integrity sha512-SrrIfcd4tOgsspOKTSwamuTOAMZOUigHQhVMrzNjz4/B9Za6SHQDIocMIyIDfwDgx6MhS15nS6HC8kumCV2qBQ== +eslint@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.1.tgz#4a32181d72cb999d6f54151df7d337131f81cda7" + integrity sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" From e153e43aeecb454d352c8e3d411393016b94d442 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 25 Jun 2019 13:36:09 +0000 Subject: [PATCH 142/341] Update dependency eslint-plugin-import to v2.18.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f31e95e3..030d1333 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "2.1.0", "eslint": "6.0.1", "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.17.3", + "eslint-plugin-import": "2.18.0", "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.1.1", "eslint-plugin-standard": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 03802df0..358a827f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1492,10 +1492,10 @@ eslint-plugin-es@^1.4.0: eslint-utils "^1.3.0" regexpp "^2.0.1" -eslint-plugin-import@2.17.3: - version "2.17.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz#00548b4434c18faebaba04b24ae6198f280de189" - integrity sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q== +eslint-plugin-import@2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" + integrity sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig== dependencies: array-includes "^3.0.3" contains-path "^0.1.0" From 91d32c469951fa468c8c1fc460f8a7d4ee3f5584 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 25 Jun 2019 17:32:43 +0000 Subject: [PATCH 143/341] Update dependency eslint-plugin-promise to v4.2.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 030d1333..0848168f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.18.0", "eslint-plugin-node": "9.1.0", - "eslint-plugin-promise": "4.1.1", + "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.0", "nyc": "14.1.1", "rimraf": "2.6.3", diff --git a/yarn.lock b/yarn.lock index 358a827f..e29cca29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1521,10 +1521,10 @@ eslint-plugin-node@9.1.0: resolve "^1.10.1" semver "^6.1.0" -eslint-plugin-promise@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz#1e08cb68b5b2cd8839f8d5864c796f56d82746db" - integrity sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ== +eslint-plugin-promise@4.2.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-standard@4.0.0: version "4.0.0" From f549e500d27835f4da2b08e10aacc5b1b8d861dd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 3 Jul 2019 17:26:14 +0000 Subject: [PATCH 144/341] Update dependency @types/node to v11.13.17 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0848168f..614d0825 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.15", + "@types/node": "11.13.17", "ava": "2.1.0", "eslint": "6.0.1", "eslint-config-standard": "12.0.0", diff --git a/yarn.lock b/yarn.lock index e29cca29..97ab81bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -447,10 +447,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.15": - version "11.13.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.15.tgz#699afb07a91adced2d6183a0ad156bf82542fc7d" - integrity sha512-x6ypl5Uzly+j23hbxmMzf12Eb4lOhIEqQz0HuczpTUa1KIx1GpbN/o4E3aAED20UoEsdK0wvyY8QcffuWSLDkw== +"@types/node@11.13.17": + version "11.13.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.17.tgz#2e7efbfe5253561087812571e5e6a1e4b1d6295b" + integrity sha512-7W3kSMa8diVH6s24a8Qrmvwu+vG3ahOC/flMHFdWSdnPYoQI0yPO84h5zOWYXAha2Npn3Pw3SSuQSwBUfaniyQ== acorn-jsx@^5.0.0: version "5.0.0" From 1d045cd7087bfb7b7332c164dae1146cb9a2defc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 8 Jul 2019 19:51:44 +0000 Subject: [PATCH 145/341] Update dependency ava to v2.2.0 --- package.json | 2 +- yarn.lock | 1016 ++++++++++++-------------------------------------- 2 files changed, 249 insertions(+), 769 deletions(-) diff --git a/package.json b/package.json index 614d0825..5b04cf78 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.13.17", - "ava": "2.1.0", + "ava": "2.2.0", "eslint": "6.0.1", "eslint-config-standard": "12.0.0", "eslint-plugin-import": "2.18.0", diff --git a/yarn.lock b/yarn.lock index 97ab81bd..fcd572c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,18 +32,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" - integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== +"@babel/core@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.0.tgz#6ed6a2881ad48a732c5433096d96d1b0ee5eb734" + integrity sha512-6Isr4X98pwXqHvtigw71CKgmhL1etZjPs5A67jL/w0TkLM9eqmFR40YrnJvEc1WnMZFsskjsmid8bHZyxKEAnw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.5" + "@babel/generator" "^7.5.0" + "@babel/helpers" "^7.5.0" + "@babel/parser" "^7.5.0" "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.5" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.0" + "@babel/types" "^7.5.0" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -74,12 +74,12 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" - integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== +"@babel/generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a" + integrity sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.5.0" jsesc "^2.5.1" lodash "^4.17.11" source-map "^0.5.0" @@ -182,14 +182,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" - integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== +"@babel/helpers@^7.5.0": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.2.tgz#97424dc82fc0041f4c751119b4d2b1ec68cdb5ba" + integrity sha512-NDkkTqDvgFUeo8djXBOiwO/mFjownznOWvmP9hvNdfiFUmx0nwNOqxuaTTbxjH744eQsD9M5ubC7gdANBvIWPw== dependencies: "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.0" + "@babel/types" "^7.5.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -210,11 +210,16 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== -"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": +"@babel/parser@^7.4.4": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== +"@babel/parser@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" + integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -313,17 +318,17 @@ globals "^11.1.0" lodash "^4.17.11" -"@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" - integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== +"@babel/traverse@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485" + integrity sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" + "@babel/generator" "^7.5.0" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.5" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.5.0" + "@babel/types" "^7.5.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.11" @@ -355,6 +360,15 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@babel/types@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" + integrity sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@concordance/react@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" @@ -362,18 +376,26 @@ dependencies: arrify "^1.0.1" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== +"@nodelib/fs.scandir@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz#7fa8fed654939e1a39753d286b48b4836d00e0eb" + integrity sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg== dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" + "@nodelib/fs.stat" "2.0.1" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.stat@2.0.1", "@nodelib/fs.stat@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz#814f71b1167390cfcb6a6b3d9cdeb0951a192c14" + integrity sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw== + +"@nodelib/fs.walk@^1.2.1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz#6a6450c5e17012abd81450eb74949a4d970d2807" + integrity sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ== + dependencies: + "@nodelib/fs.scandir" "2.1.1" + fastq "^1.6.0" "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -484,12 +506,12 @@ ansi-escapes@^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-escapes@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.1.0.tgz#62a9e5fa78e99c5bb588b1796855f5d729231b53" - integrity sha512-2VY/iCUZTDLD/qxptS3Zn3c6k2MeIbYqjRXqM8T5oC7N2mMjh3xIU3oYru6cHGbldFa9h5i8N0fP65UaUqrMWA== +ansi-escapes@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.0.tgz#c38600259cefba178ee3f7166c5ea3a5dd2e88fc" + integrity sha512-0+VX4uhi8m3aNbzoqKmkAVOEj6uQzcUHXoFPkKjhZPTpGRUBqVh930KbB6PS4zIyDZccphlLIYlu8nsjFzkXwg== dependencies: - type-fest "^0.3.0" + type-fest "^0.5.2" ansi-regex@^2.0.0: version "2.1.1" @@ -547,21 +569,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -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-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -580,7 +592,7 @@ array-includes@^3.0.3: define-properties "^1.1.2" es-abstract "^1.7.0" -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -602,11 +614,6 @@ array-uniq@^2.1.0: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== -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= - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -617,40 +624,25 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -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== -async-each@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -ava@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-2.1.0.tgz#158c5cdf48d1556caf0a9fdf96b61af9e566c153" - integrity sha512-IaS+l1KfYtFpJlDZXrNG0M6SGr/DUvwJmTiaTaW2lMdEezCAJc5J/hNAQWIKigkmxIOURYT29atD/qyp+zq+wg== +ava@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-2.2.0.tgz#5a7d799c2c8cc5926f95d2b76bdfe6081fe9a4f8" + integrity sha512-lROj3eQ8L4ZjfiN5P8UGekEQLfKmseGMtat6pUOHgJLEb2K1kT0ZpR/IlWwuytjvwO6nZpzpD+QsTW/XiayIgg== dependencies: "@ava/babel-preset-stage-4" "^3.0.0" "@ava/babel-preset-transform-test-files" "^5.0.0" - "@babel/core" "^7.4.5" - "@babel/generator" "^7.4.4" + "@babel/core" "^7.5.0" + "@babel/generator" "^7.5.0" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@concordance/react" "^2.0.0" - ansi-escapes "^4.1.0" + ansi-escapes "^4.2.0" ansi-styles "^4.0.0" arr-flatten "^1.1.0" array-union "^2.1.0" @@ -658,13 +650,13 @@ ava@2.1.0: arrify "^2.0.1" bluebird "^3.5.5" chalk "^2.4.2" - chokidar "^3.0.1" + chokidar "^3.0.2" chunkd "^1.0.0" ci-parallel-vars "^1.0.0" clean-stack "^2.1.0" clean-yaml-object "^0.1.0" - cli-cursor "^3.0.0" - cli-truncate "^1.1.0" + cli-cursor "^3.1.0" + cli-truncate "^2.0.0" code-excerpt "^2.1.1" common-path-prefix "^1.0.0" concordance "^4.0.0" @@ -672,18 +664,18 @@ ava@2.1.0: currently-unhandled "^0.4.1" debug "^4.1.1" del "^4.1.1" - dot-prop "^5.0.1" + dot-prop "^5.1.0" emittery "^0.4.1" empower-core "^1.2.0" equal-length "^1.0.0" escape-string-regexp "^2.0.0" esm "^3.2.25" figures "^3.0.0" - find-up "^4.0.0" + find-up "^4.1.0" get-port "^5.0.0" - globby "^9.2.0" + globby "^10.0.1" ignore-by-default "^1.0.0" - import-local "^2.0.0" + import-local "^3.0.1" indent-string "^4.0.0" is-ci "^2.0.0" is-error "^2.2.2" @@ -712,11 +704,11 @@ ava@2.1.0: strip-ansi "^5.2.0" strip-bom-buf "^2.0.0" supertap "^1.0.0" - supports-color "^6.1.0" + supports-color "^7.0.0" trim-off-newlines "^1.0.1" trim-right "^1.0.1" unique-temp-dir "^1.0.0" - update-notifier "^3.0.0" + update-notifier "^3.0.1" write-file-atomic "^3.0.0" babel-plugin-espower@^3.0.1: @@ -737,19 +729,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -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" - binary-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" @@ -782,22 +761,6 @@ 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: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -815,21 +778,6 @@ builtin-modules@^1.0.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= -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@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" @@ -863,11 +811,6 @@ call-matcher@^1.0.0: espurify "^1.6.0" estraverse "^4.0.0" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - call-signature@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" @@ -925,19 +868,18 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.1.tgz#98fe9aa476c55d9aea7841d6325ffdb30e95b40c" - integrity sha512-2ww34sJWehnbpV0Q4k4V5Hh7juo7po6z7LUWkcIQnSGN1lHOL8GGtLtfwabKvLFQw/hbSUQ0u6V7OgGYgBzlkQ== +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== dependencies: anymatch "^3.0.1" - async-each "^1.0.3" 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.0.2" + readdirp "^3.1.1" optionalDependencies: fsevents "^2.0.6" @@ -956,16 +898,6 @@ ci-parallel-vars@^1.0.0: resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== -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" - clean-stack@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" @@ -988,25 +920,25 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-cursor@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.0.0.tgz#f6cc68b8ae372a18894e59fbf2ae3bd659731c15" - integrity sha512-m7avcYLWHHQVU+cFxu301q3kKZJlcZcKXQSL9kffYnIvRNtqX+a7gJKXqOKusHoKXr4oquSgiMlAo1R0dDkSZA== +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: - restore-cursor "^2.0.0" + restore-cursor "^3.1.0" cli-spinners@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.0.0.tgz#4b078756fc17a8f72043fdc9f1f14bf4fa87e2df" integrity sha512-yiEBmhaKPPeBj7wWm4GEdtPZK940p9pl3EANIrnJ3JnvWyrPjcFcsEq6qRUuQ7fzB0+Y82ld3p6B34xo95foWw== -cli-truncate@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" - integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== +cli-truncate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.0.0.tgz#68ff6aaa53b203b52ad89b8b1a80f1f61ad1e1d5" + integrity sha512-C4hp+8GCIFVsUUiXcw+ce+7wexVWImw8rQrgMBFsqerx9LvvcGlwm6sMjQYAEmV/Xb87xc1b5Ttx505MSpZVqg== dependencies: - slice-ansi "^1.0.0" - string-width "^2.0.0" + slice-ansi "^2.1.0" + string-width "^4.1.0" cli-width@^2.0.0: version "2.2.0" @@ -1046,14 +978,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -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" @@ -1098,11 +1022,6 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1154,11 +1073,6 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= -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= - core-js@^2.0.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" @@ -1222,7 +1136,7 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +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== @@ -1256,11 +1170,6 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -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" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -1309,28 +1218,6 @@ define-properties@^1.1.2: 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@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -1349,12 +1236,12 @@ diff@^3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - path-type "^3.0.0" + path-type "^4.0.0" doctrine@1.5.0: version "1.5.0" @@ -1378,12 +1265,12 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dot-prop@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.0.1.tgz#e26c283bd1f10aab01e782371a751fb52cc3cb1c" - integrity sha512-5BKAm3KC6kgHOm5WqekMXd0HHRhilE0aJzBuOqtrPo2RDS2FTaOeuF5CEsHvZ8ETfjC9N3BufL6sxEMV8w/IIA== +dot-prop@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.1.0.tgz#bdd8c986a77b83e3fca524e53786df916cabbd8a" + integrity sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA== dependencies: - is-obj "^1.0.0" + is-obj "^2.0.0" duplexer3@^0.1.4: version "0.1.4" @@ -1400,6 +1287,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + empower-core@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-1.2.0.tgz#ce3fb2484d5187fa29c23fba8344b0b2fdf5601c" @@ -1677,34 +1569,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -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" - -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" - external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -1714,20 +1578,6 @@ external-editor@^3.0.3: 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" - 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" @@ -1738,17 +1588,17 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== +fast-glob@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.0.4.tgz#d484a41005cb6faeb399b951fd1bd70ddaebb602" + integrity sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg== dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" + "@nodelib/fs.stat" "^2.0.1" + "@nodelib/fs.walk" "^1.2.1" + glob-parent "^5.0.0" + is-glob "^4.0.1" merge2 "^1.2.3" - micromatch "^3.1.10" + micromatch "^4.0.2" fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -1760,6 +1610,13 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -1781,16 +1638,6 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -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" @@ -1828,6 +1675,14 @@ find-up@^4.0.0: dependencies: locate-path "^5.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" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -1847,11 +1702,6 @@ flex-exec@^1.0.0: resolved "https://registry.yarnpkg.com/flex-exec/-/flex-exec-1.0.0.tgz#06974b68532839d2a12c32debcdb12378200fdf0" integrity sha1-BpdLaFMoOdKhLDLevNsSN4IA/fA= -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= - foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" @@ -1860,13 +1710,6 @@ foreground-child@^1.5.6: cross-spawn "^4" signal-exit "^3.0.0" -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" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1911,11 +1754,6 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" -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= - gift@0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/gift/-/gift-0.10.2.tgz#4600efe8f284b51fcb01c3527b321e22b494e156" @@ -1939,11 +1777,6 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - glob@^7.0.3, glob@^7.0.5, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -1968,6 +1801,20 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== +globby@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -1979,20 +1826,6 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -2036,42 +1869,16 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + 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-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" @@ -2121,7 +1928,7 @@ ignore-by-default@^1.0.0: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -2144,13 +1951,13 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== +import-local@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.1.tgz#0b0f61a207b6c6b005c931dc72951ddde8303713" + integrity sha512-XlabwTJ9tPOdyjnGdGvxUMnUhmhlnJhdYjp5e8UDb2fO+5Gto1Frlg66ixVAf1Os+zQlrKt3QlTCVodyxYBZjQ== dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" @@ -2233,20 +2040,6 @@ irregular-plurals@^2.0.0: resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== -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-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2259,11 +2052,6 @@ is-binary-path@^2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" @@ -2283,60 +2071,16 @@ 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== - dependencies: - kind-of "^6.0.0" - 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= -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-error@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== -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.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2354,6 +2098,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "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@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -2381,13 +2130,6 @@ is-npm@^3.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== -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= - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2398,6 +2140,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-observable@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-2.0.0.tgz#327af1e8cdea9cd717f95911b87c5d34301721a6" @@ -2427,13 +2174,6 @@ is-plain-obj@^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.1, 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-plain-object@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" @@ -2480,11 +2220,6 @@ is-utf8@^0.2.1: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -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-yarn-global@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" @@ -2495,7 +2230,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= @@ -2505,18 +2240,6 @@ 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= - isobject@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" @@ -2649,30 +2372,6 @@ 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= - 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== - -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== - latest-version@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" @@ -2848,11 +2547,6 @@ map-age-cleaner@^0.1.1: 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-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -2863,13 +2557,6 @@ map-obj@^2.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= -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" - matcher@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.0.0.tgz#85fe38d97670dbd2a46590cf099401e2ffb4755c" @@ -2932,25 +2619,6 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -micromatch@^3.1.10: - 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" - micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" @@ -2964,7 +2632,7 @@ mimic-fn@^1.0.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: +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -3004,14 +2672,6 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -3039,23 +2699,6 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -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" - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3155,34 +2798,11 @@ object-assign@^4.0.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-keys@^1.0.12: version "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.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= - dependencies: - isobject "^3.0.1" - observable-to-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-1.0.0.tgz#37e136f16a15385ac063411ada0e1202bfff58f4" @@ -3205,6 +2825,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -3390,11 +3017,6 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -3405,6 +3027,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -3446,6 +3073,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + picomatch@^2.0.4, picomatch@^2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" @@ -3500,6 +3132,13 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + plur@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b" @@ -3507,11 +3146,6 @@ plur@^3.1.1: dependencies: irregular-plurals "^2.0.0" -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= - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3609,10 +3243,10 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readdirp@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.0.2.tgz#cba63348e9e42fc1bd334b1d2ef895b6a043cbd6" - integrity sha512-LbyJYv48eywrhOlScq16H/VkCiGKGPC2TpOdZCJ7QXnYEjn3NN/Oblh8QEU3vqfSRBB7OGvh5x45NKiVeNujIQ== +readdirp@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.1.tgz#b158123ac343c8b0f31d65680269cc0fc1025db1" + integrity sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ== dependencies: picomatch "^2.0.4" @@ -3636,14 +3270,6 @@ regenerate@^1.4.0: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -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== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -3695,16 +3321,6 @@ release-zalgo@^1.0.0: dependencies: es6-error "^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== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -3720,13 +3336,6 @@ require-precompiled@^0.1.0: resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" integrity sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo= -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -3734,11 +3343,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -3749,11 +3353,6 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -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.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" @@ -3797,10 +3396,18 @@ restore-cursor@^2.0.0: 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== +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@2.6.3, rimraf@^2.6.3: version "2.6.3" @@ -3823,6 +3430,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + rxjs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" @@ -3835,13 +3447,6 @@ safe-buffer@^5.0.1, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -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" - "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -3884,26 +3489,6 @@ 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@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -3934,23 +3519,11 @@ sinon@7.3.2: nise "^1.4.10" supports-color "^5.5.0" -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - 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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - dependencies: - is-fullwidth-code-point "^2.0.0" - slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -3960,47 +3533,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -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" - -source-map-resolve@^0.5.0: - 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== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@^0.5.12: version "0.5.12" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" @@ -4009,12 +3541,7 @@ source-map-support@^0.5.12: 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= @@ -4062,13 +3589,6 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" integrity sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w== -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" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -4079,14 +3599,6 @@ stack-utils@^1.0.2: resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== -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" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -4096,7 +3608,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -4113,6 +3625,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -4186,6 +3707,13 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" +supports-color@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.0.0.tgz#f2392c50ab35bb3cae7beebf24d254a19f880c06" + integrity sha512-WRt32iTpYEZWYOpcetGm0NPeSvaebccx7hhS/5M6sAiqnhedtFCHFxkjzZlJvFNCPowiKSFGiZk5USQDFy83vQ== + dependencies: + has-flag "^4.0.0" + symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -4245,26 +3773,11 @@ to-fast-properties@^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-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4272,16 +3785,6 @@ 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" - trim-newlines@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" @@ -4319,6 +3822,11 @@ type-fest@^0.3.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +type-fest@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -4367,16 +3875,6 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -4393,18 +3891,10 @@ unique-temp-dir@^1.0.0: os-tmpdir "^1.0.1" uid2 "0.0.3" -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" - -update-notifier@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.0.tgz#e9bbf8f0f5b7a2ce6666ca46334fdb29492e8fab" - integrity sha512-6Xe3oF2bvuoj4YECUc52yxVs94yWrxwqHbzyveDktTS1WhnlTRpNcQMxUshcB7nRVGi1jEXiqL5cW1S5WSyzKg== +update-notifier@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250" + integrity sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ== dependencies: boxen "^3.0.0" chalk "^2.0.1" @@ -4426,11 +3916,6 @@ uri-js@^4.2.2: 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@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -4438,11 +3923,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -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== - uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" From 135f519b66070d843554a1bb85df6deee74da709 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2019 23:04:20 +0000 Subject: [PATCH 146/341] Bump lodash.merge from 4.6.1 to 4.6.2 Bumps [lodash.merge](https://github.com/lodash/lodash) from 4.6.1 to 4.6.2. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/commits) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index fcd572c1..74a2de99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2463,9 +2463,9 @@ lodash.islength@^4.0.1: integrity sha1-Tpho1FJXXXUK/9NYyXlUPcIO1Xc= lodash.merge@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.10, lodash@^4.17.11: version "4.17.11" From 117989282f693f32562001f4bea190a2b286bb51 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 12 Jul 2019 13:35:54 +0000 Subject: [PATCH 147/341] Update dependency inquirer to v6.5.0 --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 5b04cf78..e5873c65 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "2.20.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "6.4.1", + "inquirer": "6.5.0", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 74a2de99..43850a00 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1992,10 +1992,10 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" - integrity sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw== +inquirer@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" + integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -2003,7 +2003,7 @@ inquirer@6.4.1: cli-width "^2.0.0" external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.12" mute-stream "0.0.7" run-async "^2.2.0" rxjs "^6.4.0" @@ -2472,6 +2472,11 @@ lodash@^4.17.10, lodash@^4.17.11: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.17.12: + version "4.17.14" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" + integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" From 9e622698afcfb0b0471f5a42c4b102e246f5b644 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 13 Jul 2019 16:22:58 +0000 Subject: [PATCH 148/341] Update dependency eslint-config-standard to v13 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e5873c65..d7921d8d 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.13.17", "ava": "2.2.0", "eslint": "6.0.1", - "eslint-config-standard": "12.0.0", + "eslint-config-standard": "13.0.1", "eslint-plugin-import": "2.18.0", "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 43850a00..24e67883 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1355,10 +1355,10 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-config-standard@12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" - integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== +eslint-config-standard@13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz#c9c6ffe0cfb8a51535bc5c7ec9f70eafb8c6b2c0" + integrity sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw== eslint-import-resolver-node@^0.3.2: version "0.3.2" From a79134501a411a963f5d2c7c8f9924c1ba8a1c63 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 17 Jul 2019 18:39:08 +0000 Subject: [PATCH 149/341] Update dependency @types/node to v11.13.18 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d7921d8d..9c6ac14e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.17", + "@types/node": "11.13.18", "ava": "2.2.0", "eslint": "6.0.1", "eslint-config-standard": "13.0.1", diff --git a/yarn.lock b/yarn.lock index 24e67883..0d1c3c0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -469,10 +469,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.17": - version "11.13.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.17.tgz#2e7efbfe5253561087812571e5e6a1e4b1d6295b" - integrity sha512-7W3kSMa8diVH6s24a8Qrmvwu+vG3ahOC/flMHFdWSdnPYoQI0yPO84h5zOWYXAha2Npn3Pw3SSuQSwBUfaniyQ== +"@types/node@11.13.18": + version "11.13.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.18.tgz#758ec2bf26339d3cc83da22676b64777d0c2befe" + integrity sha512-sMHdXLccscaxI+Hlzz58yLQue3lQyXP+6aQniDRi5oju3n0123kcjhicVGF20WF7cHiwJ2vxMbXc4skOclosoA== acorn-jsx@^5.0.0: version "5.0.0" From 9a7e535559f35b27b97aebfccd59641bae778280 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 21 Jul 2019 04:13:36 +0000 Subject: [PATCH 150/341] Update dependency eslint to v6.1.0 --- package.json | 2 +- yarn.lock | 98 +++++++++++++++++++++------------------------------- 2 files changed, 41 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 9c6ac14e..24ba1afa 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.18", "ava": "2.2.0", - "eslint": "6.0.1", + "eslint": "6.1.0", "eslint-config-standard": "13.0.1", "eslint-plugin-import": "2.18.0", "eslint-plugin-node": "9.1.0", diff --git a/yarn.lock b/yarn.lock index 0d1c3c0c..87fd5767 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1423,10 +1423,10 @@ eslint-plugin-standard@4.0.0: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== -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@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -1441,10 +1441,10 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.1.tgz#4a32181d72cb999d6f54151df7d337131f81cda7" - integrity sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w== +eslint@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" + integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1452,7 +1452,7 @@ eslint@6.0.1: cross-spawn "^6.0.5" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^4.0.3" + eslint-scope "^5.0.0" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" espree "^6.0.0" @@ -1460,28 +1460,29 @@ eslint@6.0.1: esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^3.1.0" + glob-parent "^5.0.0" globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.2.2" + inquirer "^6.4.1" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.11" + lodash "^4.17.14" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" progress "^2.0.0" regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" table "^5.2.3" text-table "^0.2.0" + v8-compile-cache "^2.0.3" esm@3.2.25, esm@^3.2.25: version "3.2.25" @@ -1762,14 +1763,6 @@ gift@0.10.2: flex-exec "^1.0.0" underscore "^1.8.3" -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" @@ -1992,7 +1985,7 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@6.5.0: +inquirer@6.5.0, inquirer@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== @@ -2011,25 +2004,6 @@ inquirer@6.5.0: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" - integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== - 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.11" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.0.0" - through "^2.3.6" - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -2081,7 +2055,7 @@ is-error@^2.2.2: resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -2103,13 +2077,6 @@ 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@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -2477,6 +2444,11 @@ lodash@^4.17.12: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== +lodash@^4.17.14: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -3022,11 +2994,6 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -3484,6 +3451,11 @@ semver@^6.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== +semver@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" + integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== + serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" @@ -3653,7 +3625,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -3682,7 +3654,12 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +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= @@ -3933,6 +3910,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +v8-compile-cache@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + 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" From c0d5223fe322211c2f8361172cdc5ecf102515e6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 28 Jul 2019 21:11:52 +0000 Subject: [PATCH 151/341] Update dependency eslint-plugin-import to v2.18.2 --- package.json | 2 +- yarn.lock | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 24ba1afa..43e053a2 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "2.2.0", "eslint": "6.1.0", "eslint-config-standard": "13.0.1", - "eslint-plugin-import": "2.18.0", + "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 87fd5767..fac8bf7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1211,7 +1211,7 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== -define-properties@^1.1.2: +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" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -1319,7 +1319,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.7.0: +es-abstract@^1.12.0, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -1384,10 +1384,10 @@ eslint-plugin-es@^1.4.0: eslint-utils "^1.3.0" regexpp "^2.0.1" -eslint-plugin-import@2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" - integrity sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig== +eslint-plugin-import@2.18.2: + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== dependencies: array-includes "^3.0.3" contains-path "^0.1.0" @@ -1396,8 +1396,8 @@ eslint-plugin-import@2.18.0: eslint-import-resolver-node "^0.3.2" eslint-module-utils "^2.4.0" has "^1.0.3" - lodash "^4.17.11" minimatch "^3.0.4" + object.values "^1.1.0" read-pkg-up "^2.0.0" resolve "^1.11.0" @@ -2780,6 +2780,16 @@ object-keys@^1.0.12: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +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== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + observable-to-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-1.0.0.tgz#37e136f16a15385ac063411ada0e1202bfff58f4" From 3e0e741e0870ca25b9a6e32b3a300809cc1cd83b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 4 Aug 2019 12:19:13 +0000 Subject: [PATCH 152/341] Update dependency sinon to v7.4.0 --- package.json | 2 +- yarn.lock | 52 ++++++++++++++++++++++++++++------------------------ 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 43e053a2..f5b97835 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.0", "nyc": "14.1.1", "rimraf": "2.6.3", - "sinon": "7.3.2" + "sinon": "7.4.0" } } diff --git a/yarn.lock b/yarn.lock index fac8bf7b..4379969a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -416,7 +416,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/formatio@^3.1.0", "@sinonjs/formatio@^3.2.1": +"@sinonjs/formatio@^3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== @@ -424,7 +424,7 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^3.1.0" -"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.1": +"@sinonjs/samsam@^3.1.0": version "3.3.1" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" integrity sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw== @@ -433,6 +433,15 @@ array-from "^2.1.1" lodash "^4.17.11" +"@sinonjs/samsam@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.2.tgz#63942e3d5eb0b79f6de3bef9abfad15fb4b6401b" + integrity sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA== + dependencies: + "@sinonjs/commons" "^1.0.2" + array-from "^2.1.1" + lodash "^4.17.11" + "@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" @@ -2456,15 +2465,10 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -lolex@^2.3.2: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" - integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== - -lolex@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.0.1.tgz#4a99c2251579d693c6a083446dae0e5c3844d3fa" - integrity sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw== +lolex@^4.1.0, lolex@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" + integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== loud-rejection@^1.0.0: version "1.6.0" @@ -2696,15 +2700,15 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.4.10: - version "1.4.10" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" - integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== +nise@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.1.tgz#de61d99a1d3b46b5233be4531569b9a8e27372b2" + integrity sha512-edFWm0fsFG2n318rfEnKlTZTkjlbVOFF9XIA+fj+Ed+Qz1laYW2lobwavWoMzGrYDHH1EpiNJgDfvGnkZztR/g== dependencies: - "@sinonjs/formatio" "^3.1.0" + "@sinonjs/formatio" "^3.2.1" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" - lolex "^2.3.2" + lolex "^4.1.0" path-to-regexp "^1.7.0" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: @@ -3493,17 +3497,17 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.2.tgz#82dba3a6d85f6d2181e1eca2c10d8657c2161f28" - integrity sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA== +sinon@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.4.0.tgz#1e0c12538aa2170a3a98467d112cf361c7ade8a8" + integrity sha512-Els0KRgijhuHz9qEyzUFmZtpS1kuj6CMwyKdyWyPW1dnYGOcwqdqFp95u7fcLJbuga/SrVYGxaqCY3JPWMOJAQ== dependencies: "@sinonjs/commons" "^1.4.0" "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.1" + "@sinonjs/samsam" "^3.3.2" diff "^3.5.0" - lolex "^4.0.1" - nise "^1.4.10" + lolex "^4.2.0" + nise "^1.5.1" supports-color "^5.5.0" slash@^3.0.0: From 1072c2ee4aaace0350d485a971fca8630d5fd275 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 5 Aug 2019 12:31:54 +0000 Subject: [PATCH 153/341] Roll back dependency sinon to 7.3.2 --- package.json | 2 +- yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index f5b97835..43e053a2 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.0", "nyc": "14.1.1", "rimraf": "2.6.3", - "sinon": "7.4.0" + "sinon": "7.3.2" } } diff --git a/yarn.lock b/yarn.lock index 4379969a..4fc0ab07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -433,7 +433,7 @@ array-from "^2.1.1" lodash "^4.17.11" -"@sinonjs/samsam@^3.3.2": +"@sinonjs/samsam@^3.3.1": version "3.3.2" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.2.tgz#63942e3d5eb0b79f6de3bef9abfad15fb4b6401b" integrity sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA== @@ -2465,7 +2465,7 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -lolex@^4.1.0, lolex@^4.2.0: +lolex@^4.0.1, lolex@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== @@ -2700,7 +2700,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.5.1: +nise@^1.4.10: version "1.5.1" resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.1.tgz#de61d99a1d3b46b5233be4531569b9a8e27372b2" integrity sha512-edFWm0fsFG2n318rfEnKlTZTkjlbVOFF9XIA+fj+Ed+Qz1laYW2lobwavWoMzGrYDHH1EpiNJgDfvGnkZztR/g== @@ -3497,17 +3497,17 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.4.0.tgz#1e0c12538aa2170a3a98467d112cf361c7ade8a8" - integrity sha512-Els0KRgijhuHz9qEyzUFmZtpS1kuj6CMwyKdyWyPW1dnYGOcwqdqFp95u7fcLJbuga/SrVYGxaqCY3JPWMOJAQ== +sinon@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.2.tgz#82dba3a6d85f6d2181e1eca2c10d8657c2161f28" + integrity sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA== dependencies: "@sinonjs/commons" "^1.4.0" "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.2" + "@sinonjs/samsam" "^3.3.1" diff "^3.5.0" - lolex "^4.2.0" - nise "^1.5.1" + lolex "^4.0.1" + nise "^1.4.10" supports-color "^5.5.0" slash@^3.0.0: From 64f63adfe6531c223471ca116d87d1e3a2ab3dd1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 6 Aug 2019 09:35:43 +0000 Subject: [PATCH 154/341] Update dependency sinon to v7.4.1 --- package.json | 2 +- yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 43e053a2..897a86eb 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.0", "nyc": "14.1.1", "rimraf": "2.6.3", - "sinon": "7.3.2" + "sinon": "7.4.1" } } diff --git a/yarn.lock b/yarn.lock index 4fc0ab07..c9825e20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -433,7 +433,7 @@ array-from "^2.1.1" lodash "^4.17.11" -"@sinonjs/samsam@^3.3.1": +"@sinonjs/samsam@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.2.tgz#63942e3d5eb0b79f6de3bef9abfad15fb4b6401b" integrity sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA== @@ -2465,7 +2465,7 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -lolex@^4.0.1, lolex@^4.1.0: +lolex@^4.1.0, lolex@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== @@ -2700,7 +2700,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.4.10: +nise@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.1.tgz#de61d99a1d3b46b5233be4531569b9a8e27372b2" integrity sha512-edFWm0fsFG2n318rfEnKlTZTkjlbVOFF9XIA+fj+Ed+Qz1laYW2lobwavWoMzGrYDHH1EpiNJgDfvGnkZztR/g== @@ -3497,17 +3497,17 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.2.tgz#82dba3a6d85f6d2181e1eca2c10d8657c2161f28" - integrity sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA== +sinon@7.4.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.4.1.tgz#bcd0c63953893e87fa0cc502f52489c32a83d4d9" + integrity sha512-7s9buHGHN/jqoy/v4bJgmt0m1XEkCEd/tqdHXumpBp0JSujaT4Ng84JU5wDdK4E85ZMq78NuDe0I3NAqXY8TFg== dependencies: "@sinonjs/commons" "^1.4.0" "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.1" + "@sinonjs/samsam" "^3.3.2" diff "^3.5.0" - lolex "^4.0.1" - nise "^1.4.10" + lolex "^4.2.0" + nise "^1.5.1" supports-color "^5.5.0" slash@^3.0.0: From c69e410c06cf1cfb19d45173a49e53c456eb580c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 7 Aug 2019 21:48:32 +0000 Subject: [PATCH 155/341] Update dependency @types/node to v11.13.19 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 897a86eb..56c89791 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.18", + "@types/node": "11.13.19", "ava": "2.2.0", "eslint": "6.1.0", "eslint-config-standard": "13.0.1", diff --git a/yarn.lock b/yarn.lock index c9825e20..d8e8dea6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -478,10 +478,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.18": - version "11.13.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.18.tgz#758ec2bf26339d3cc83da22676b64777d0c2befe" - integrity sha512-sMHdXLccscaxI+Hlzz58yLQue3lQyXP+6aQniDRi5oju3n0123kcjhicVGF20WF7cHiwJ2vxMbXc4skOclosoA== +"@types/node@11.13.19": + version "11.13.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.19.tgz#c7bd7009aa850464775d8a814e18138d633cd676" + integrity sha512-tLRDU1hmcWamtgRT2iVRdraAQVGFQGgtcqracSo9XyMN1VeZLSVGb8RJJxVqab7UGbijoUijGPVFMjmqzyZIUw== acorn-jsx@^5.0.0: version "5.0.0" From 0905da27a061ac2bc51ea665acb7e9877ca851c8 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Aug 2019 21:25:06 +0200 Subject: [PATCH 156/341] Update issue_template.md --- .github/issue_template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/issue_template.md b/.github/issue_template.md index 0c72a26e..7ea364d6 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,14 +1,14 @@ -[...description...] + ### Steps to reproduce * ... ### Expected behavior -Tell us what should happen + ### Actual behavior -Tell us what happens instead + ### System configuration **OS and version**: From 77c49ee45fceb30b731ea1adedc19f1ddcfb17a5 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Aug 2019 21:28:19 +0200 Subject: [PATCH 157/341] New issue tamplate --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..449caeff --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'type: bug' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..3166f913 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'type: enhancement' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 29171c7158d1fb25e68407bd4dcc15e1257f7aea Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Aug 2019 21:29:09 +0200 Subject: [PATCH 158/341] Delete issue_template.md --- .github/issue_template.md | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .github/issue_template.md diff --git a/.github/issue_template.md b/.github/issue_template.md deleted file mode 100644 index 7ea364d6..00000000 --- a/.github/issue_template.md +++ /dev/null @@ -1,18 +0,0 @@ - - -### Steps to reproduce - -* ... - -### Expected behavior - - -### Actual behavior - - -### System configuration -**OS and version**: - -**NodeJS version**: - -**Yarn version**: From 2085144c55229dd7c9ebbd11f702ac51495f62a0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 14 Aug 2019 17:00:57 +0000 Subject: [PATCH 159/341] Update dependency rimraf to v2.7.1 --- package.json | 2 +- yarn.lock | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 56c89791..e3af0396 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.0", "nyc": "14.1.1", - "rimraf": "2.6.3", + "rimraf": "2.7.1", "sinon": "7.4.1" } } diff --git a/yarn.lock b/yarn.lock index d8e8dea6..1ebcda12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3402,6 +3402,13 @@ rimraf@2.6.3, rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@2.7.1: + 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.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" From d3118345a097de0c0f9d6c936bf478809172dbd4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 16 Aug 2019 09:38:00 +0000 Subject: [PATCH 160/341] Update dependency inquirer to v6.5.1 --- package.json | 2 +- yarn.lock | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e3af0396..afa74bab 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "2.20.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "6.5.0", + "inquirer": "6.5.1", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 1ebcda12..aed42479 100644 --- a/yarn.lock +++ b/yarn.lock @@ -522,6 +522,13 @@ ansi-escapes@^4.2.0: dependencies: type-fest "^0.5.2" +ansi-escapes@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" + integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== + dependencies: + type-fest "^0.5.2" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1994,7 +2001,26 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@6.5.0, inquirer@^6.4.1: +inquirer@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.1.tgz#8bfb7a5ac02dac6ff641ac4c5ff17da112fcdb42" + integrity sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== @@ -2453,7 +2479,7 @@ lodash@^4.17.12: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== -lodash@^4.17.14: +lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -2680,6 +2706,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" From ca96eb94c00a0aa6e79cbe80b14a73ae52a1d41f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 16 Aug 2019 19:27:31 +0000 Subject: [PATCH 161/341] Update dependency rimraf to v3 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index afa74bab..e387255d 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.0", "nyc": "14.1.1", - "rimraf": "2.7.1", + "rimraf": "3.0.0", "sinon": "7.4.1" } } diff --git a/yarn.lock b/yarn.lock index aed42479..e91da763 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3433,10 +3433,10 @@ rimraf@2.6.3, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== +rimraf@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== dependencies: glob "^7.1.3" From ab5389cbeee7f71843ce497364787f41c20548c2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 19 Aug 2019 20:32:13 +0000 Subject: [PATCH 162/341] Update dependency eslint-plugin-standard to v4.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e387255d..af617b94 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.2.1", - "eslint-plugin-standard": "4.0.0", + "eslint-plugin-standard": "4.0.1", "nyc": "14.1.1", "rimraf": "3.0.0", "sinon": "7.4.1" diff --git a/yarn.lock b/yarn.lock index e91da763..3e56c87b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1434,10 +1434,10 @@ eslint-plugin-promise@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-standard@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" - integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== +eslint-plugin-standard@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" + integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== eslint-scope@^5.0.0: version "5.0.0" From 16f1fc813a6cc037a936aa2c778ec083d2c429fc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 20 Aug 2019 11:46:35 +0000 Subject: [PATCH 163/341] Update dependency eslint to v6.2.1 --- package.json | 2 +- yarn.lock | 46 +++++++++++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index af617b94..3b868335 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.19", "ava": "2.2.0", - "eslint": "6.1.0", + "eslint": "6.2.1", "eslint-config-standard": "13.0.1", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "9.1.0", diff --git a/yarn.lock b/yarn.lock index 3e56c87b..43e392ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -488,10 +488,10 @@ acorn-jsx@^5.0.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.0.tgz#958584ddb60990c02c97c1bd9d521fce433bb101" integrity sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg== -acorn@^6.0.7: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a" + integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ== ajv@^6.10.0, ajv@^6.9.1: version "6.10.0" @@ -1452,15 +1452,27 @@ eslint-utils@^1.3.0, eslint-utils@^1.3.1: resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== +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== + dependencies: + eslint-visitor-keys "^1.0.0" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" - integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== +eslint-visitor-keys@^1.1.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@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.2.1.tgz#66c2e4fe8b6356b9f01e828adc3ad04030122df1" + integrity sha512-ES7BzEzr0Q6m5TK9i+/iTpKjclXitOdDK4vT07OqbkBT2/VcN/gO9EL1C4HlK3TAOXYv2ItcmbVR9jO1MR0fJg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1469,9 +1481,9 @@ eslint@6.1.0: debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^6.0.0" + eslint-utils "^1.4.2" + eslint-visitor-keys "^1.1.0" + espree "^6.1.0" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -1515,14 +1527,14 @@ espower-location-detector@^1.0.0: source-map "^0.5.0" xtend "^4.0.0" -espree@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" - integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== +espree@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.0.tgz#a1e8aa65bf29a331d70351ed814a80e7534e0884" + integrity sha512-boA7CHRLlVWUSg3iL5Kmlt/xT3Q+sXnKoRYYzj1YeM10A76TEJBbotV5pKbnK42hEUIr121zTv+QLRM5LsCPXQ== dependencies: - acorn "^6.0.7" + acorn "^7.0.0" acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" + eslint-visitor-keys "^1.1.0" esprima@^4.0.0: version "4.0.1" From 535b93af64cb206556fda1172d2f4968493d02e5 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 21 Aug 2019 19:13:28 +0000 Subject: [PATCH 164/341] Update dependency commander to v3 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3b868335..c5a0dd9a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "2.4.2", - "commander": "2.20.0", + "commander": "3.0.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "6.5.1", diff --git a/yarn.lock b/yarn.lock index 43e392ec..f065dad7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1018,10 +1018,10 @@ 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== -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== +commander@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.0.tgz#0641ea00838c7a964627f04cddc336a2deddd60a" + integrity sha512-pl3QrGOBa9RZaslQiqnnKX2J068wcQw7j9AIaBQ9/JEp5RY6je4jKTImg0Bd+rpoONSe7GUFSgkxLeo17m3Pow== commander@~2.17.1: version "2.17.1" From 742cf14b76a60e9899fd0327e2ecb03a0c48d27f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 21 Aug 2019 20:26:28 +0000 Subject: [PATCH 165/341] Update dependency ava to v2.3.0 --- package.json | 2 +- yarn.lock | 243 ++++++++++++++++++++++++++++----------------------- 2 files changed, 137 insertions(+), 108 deletions(-) diff --git a/package.json b/package.json index c5a0dd9a..700a760b 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.13.19", - "ava": "2.2.0", + "ava": "2.3.0", "eslint": "6.2.1", "eslint-config-standard": "13.0.1", "eslint-plugin-import": "2.18.2", diff --git a/yarn.lock b/yarn.lock index f065dad7..8c88f6a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,27 +2,28 @@ # yarn lockfile v1 -"@ava/babel-plugin-throws-helper@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-3.0.0.tgz#2c933ec22da0c4ce1fc5369f2b95452c70420586" - integrity sha512-mN9UolOs4WX09QkheU1ELkVy2WPnwonlO3XMdN8JF8fQqRVgVTR21xDbvEOUsbwz6Zwjq7ji9yzyjuXqDPalxg== +"@ava/babel-plugin-throws-helper@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-4.0.0.tgz#8f5b45b7a0a79c6f4032de2101e0c221847efb62" + integrity sha512-3diBLIVBPPh3j4+hb5lo0I1D+S/O/VDJPI4Y502apBxmwEqjyXG4gTSPFUlm41sSZeZzMarT/Gzovw9kV7An0w== -"@ava/babel-preset-stage-4@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-3.0.0.tgz#32c46b22b640d1ba0c6e38ae4abd58efab965558" - integrity sha512-uI5UBx++UsckkfnbF0HH6jvTIvM4r/Kxt1ROO2YXKu5H15sScAtxUIAHiUVbPIw24zPqz/PlF3xxlIDuyFzlQw== +"@ava/babel-preset-stage-4@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-4.0.0.tgz#9be5a59ead170062e228bb6ffd2b29f0489424fd" + integrity sha512-lZEV1ZANzfzSYBU6WHSErsy7jLPbD1iIgAboASPMcKo7woVni5/5IKWeT0RxC8rY802MFktur3OKEw2JY1Tv2w== dependencies: "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-dotall-regex" "^7.4.3" - "@babel/plugin-transform-modules-commonjs" "^7.4.3" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-modules-commonjs" "^7.5.0" -"@ava/babel-preset-transform-test-files@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-5.0.0.tgz#e06fc762069511e597531cc1120e22216aac6981" - integrity sha512-rqgyQwkT0+j2JzYP51dOv80u33rzAvjBtXRzUON+7+6u26mjoudRXci2+1s18rat8r4uOlZfbzm114YS6pwmYw== +"@ava/babel-preset-transform-test-files@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-6.0.0.tgz#639e8929d2cdc8863c1f16020ce644c525723cd4" + integrity sha512-8eKhFzZp7Qcq1VLfoC75ggGT8nQs9q8fIxltU47yCB7Wi7Y8Qf6oqY1Bm0z04fIec24vEgr0ENhDHEOUGVDqnA== dependencies: - "@ava/babel-plugin-throws-helper" "^3.0.0" + "@ava/babel-plugin-throws-helper" "^4.0.0" babel-plugin-espower "^3.0.1" "@babel/code-frame@^7.0.0": @@ -32,22 +33,29 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.0.tgz#6ed6a2881ad48a732c5433096d96d1b0ee5eb734" - integrity sha512-6Isr4X98pwXqHvtigw71CKgmhL1etZjPs5A67jL/w0TkLM9eqmFR40YrnJvEc1WnMZFsskjsmid8bHZyxKEAnw== +"@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== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/helpers" "^7.5.0" - "@babel/parser" "^7.5.0" + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" + integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helpers" "^7.5.5" + "@babel/parser" "^7.5.5" "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" - lodash "^4.17.11" + lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" @@ -74,14 +82,14 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a" - integrity sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA== +"@babel/generator@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" + integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== dependencies: - "@babel/types" "^7.5.0" + "@babel/types" "^7.5.5" jsesc "^2.5.1" - lodash "^4.17.11" + lodash "^4.17.13" source-map "^0.5.0" trim-right "^1.0.1" @@ -182,14 +190,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.5.0": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.2.tgz#97424dc82fc0041f4c751119b4d2b1ec68cdb5ba" - integrity sha512-NDkkTqDvgFUeo8djXBOiwO/mFjownznOWvmP9hvNdfiFUmx0nwNOqxuaTTbxjH744eQsD9M5ubC7gdANBvIWPw== +"@babel/helpers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" + integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== dependencies: "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" "@babel/highlight@^7.0.0": version "7.0.0" @@ -215,10 +223,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== -"@babel/parser@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" - integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== +"@babel/parser@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" + integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -229,6 +237,14 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" @@ -244,10 +260,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.2.0": +"@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -258,7 +274,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.4.3": +"@babel/plugin-transform-dotall-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== @@ -267,14 +283,15 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/plugin-transform-modules-commonjs@^7.4.3": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" - integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== +"@babel/plugin-transform-modules-commonjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" + integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== dependencies: "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" "@babel/template@^7.1.0": version "7.1.2" @@ -318,20 +335,20 @@ globals "^11.1.0" lodash "^4.17.11" -"@babel/traverse@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485" - integrity sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg== +"@babel/traverse@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" + integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.0" - "@babel/types" "^7.5.0" + "@babel/parser" "^7.5.5" + "@babel/types" "^7.5.5" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.11" + lodash "^4.17.13" "@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": version "7.1.3" @@ -360,13 +377,13 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@babel/types@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" - integrity sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ== +"@babel/types@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" + integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== dependencies: esutils "^2.0.2" - lodash "^4.17.11" + lodash "^4.17.13" to-fast-properties "^2.0.0" "@concordance/react@^2.0.0": @@ -515,13 +532,6 @@ ansi-escapes@^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-escapes@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.0.tgz#c38600259cefba178ee3f7166c5ea3a5dd2e88fc" - integrity sha512-0+VX4uhi8m3aNbzoqKmkAVOEj6uQzcUHXoFPkKjhZPTpGRUBqVh930KbB6PS4zIyDZccphlLIYlu8nsjFzkXwg== - dependencies: - type-fest "^0.5.2" - ansi-escapes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" @@ -645,20 +655,17 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -ava@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-2.2.0.tgz#5a7d799c2c8cc5926f95d2b76bdfe6081fe9a4f8" - integrity sha512-lROj3eQ8L4ZjfiN5P8UGekEQLfKmseGMtat6pUOHgJLEb2K1kT0ZpR/IlWwuytjvwO6nZpzpD+QsTW/XiayIgg== +ava@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-2.3.0.tgz#cac4d7f0a30077a852c6bf5bc7c0bc78c3021e63" + integrity sha512-4VaaSnl13vpTZmqW3aMqioSolT0/ozRkjQxTLi3p8wtyRONuX/uLKL3uF0j50w2BNRoLsJqztnkX2h8xeVp2lg== dependencies: - "@ava/babel-preset-stage-4" "^3.0.0" - "@ava/babel-preset-transform-test-files" "^5.0.0" - "@babel/core" "^7.5.0" - "@babel/generator" "^7.5.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@ava/babel-preset-stage-4" "^4.0.0" + "@ava/babel-preset-transform-test-files" "^6.0.0" + "@babel/core" "^7.5.5" + "@babel/generator" "^7.5.5" "@concordance/react" "^2.0.0" - ansi-escapes "^4.2.0" + ansi-escapes "^4.2.1" ansi-styles "^4.0.0" arr-flatten "^1.1.0" array-union "^2.1.0" @@ -669,7 +676,7 @@ ava@2.2.0: chokidar "^3.0.2" chunkd "^1.0.0" ci-parallel-vars "^1.0.0" - clean-stack "^2.1.0" + clean-stack "^2.2.0" clean-yaml-object "^0.1.0" cli-cursor "^3.1.0" cli-truncate "^2.0.0" @@ -691,18 +698,18 @@ ava@2.2.0: get-port "^5.0.0" globby "^10.0.1" ignore-by-default "^1.0.0" - import-local "^3.0.1" + import-local "^3.0.2" indent-string "^4.0.0" is-ci "^2.0.0" is-error "^2.2.2" is-observable "^2.0.0" is-plain-object "^3.0.0" is-promise "^2.1.0" - lodash "^4.17.11" + lodash "^4.17.15" loud-rejection "^2.1.0" make-dir "^3.0.0" matcher "^2.0.0" - md5-hex "^3.0.0" + md5-hex "^3.0.1" meow "^5.0.0" micromatch "^4.0.2" ms "^2.1.2" @@ -715,7 +722,7 @@ ava@2.2.0: require-precompiled "^0.1.0" resolve-cwd "^3.0.0" slash "^3.0.0" - source-map-support "^0.5.12" + source-map-support "^0.5.13" stack-utils "^1.0.2" strip-ansi "^5.2.0" strip-bom-buf "^2.0.0" @@ -727,6 +734,13 @@ ava@2.2.0: update-notifier "^3.0.1" write-file-atomic "^3.0.0" +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-espower@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-3.0.1.tgz#180db17126f88e754105b8b5216d21e520a6bd4e" @@ -755,6 +769,11 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== +blueimp-md5@^2.10.0: + version "2.11.1" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.11.1.tgz#b1f6b6218d13cdedbf5743f32b3023b2afefcbd3" + integrity sha512-4UiOAmql2XO0Sws07OVzYdCKK0K2Va5g6AVgYXoGhEQiKrdSOefjUCm1frPk6E+xiIOHRqaFg+TUGo7cClKg5g== + boxen@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb" @@ -914,10 +933,10 @@ ci-parallel-vars@^1.0.0: resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== -clean-stack@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" - integrity sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA== +clean-stack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== clean-yaml-object@^0.1.0: version "0.1.0" @@ -1972,10 +1991,10 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -import-local@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.1.tgz#0b0f61a207b6c6b005c931dc72951ddde8303713" - integrity sha512-XlabwTJ9tPOdyjnGdGvxUMnUhmhlnJhdYjp5e8UDb2fO+5Gto1Frlg66ixVAf1Os+zQlrKt3QlTCVodyxYBZjQ== +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -2491,7 +2510,7 @@ lodash@^4.17.12: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== -lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -2590,12 +2609,12 @@ md5-hex@^2.0.0: dependencies: md5-o-matic "^0.1.1" -md5-hex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.0.tgz#96cf5c62cedea41e04124b9473ef7481db6de5fb" - integrity sha512-uA+EX5IV1r5lKBJecwTSec3k6xl4ziBUZihRiOpOHCeHjKA0ai6+eImamXQy/cI3Qep5mQgFTeJld9tcwdBNFw== +md5-hex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" + integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== dependencies: - md5-o-matic "^0.1.1" + blueimp-md5 "^2.10.0" md5-o-matic@^0.1.1: version "0.1.1" @@ -2822,11 +2841,21 @@ object-assign@^4.0.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-keys@^1.0.12: +object-keys@^1.0.11, object-keys@^1.0.12: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +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== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" @@ -3574,10 +3603,10 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -source-map-support@^0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== +source-map-support@^0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" From 07161f1b5ff08455da3cd9a4a2230472cd22dd0e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 21 Aug 2019 20:51:38 +0000 Subject: [PATCH 166/341] Update dependency eslint-config-standard to v14 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 700a760b..61a88127 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.13.19", "ava": "2.3.0", "eslint": "6.2.1", - "eslint-config-standard": "13.0.1", + "eslint-config-standard": "14.0.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 8c88f6a2..63a536ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1390,10 +1390,10 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-config-standard@13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz#c9c6ffe0cfb8a51535bc5c7ec9f70eafb8c6b2c0" - integrity sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw== +eslint-config-standard@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.0.0.tgz#1de7bf5af37542dc6eef879ab7eb5e5e0f830747" + integrity sha512-bV6e2LFvJEetrLjVAy4KWPOUsIhPWr040c649MigTPR6yUtaGuOt6CEAyNeez2lRiC+2+vjGWa02byjs25EB3A== eslint-import-resolver-node@^0.3.2: version "0.3.2" From 0c5bb4f04416e768608fb715f45948b7358653d1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 27 Aug 2019 22:19:16 +0000 Subject: [PATCH 167/341] Update dependency eslint-config-standard to v14.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 61a88127..10665350 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.13.19", "ava": "2.3.0", "eslint": "6.2.1", - "eslint-config-standard": "14.0.0", + "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "9.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 63a536ce..b951a8d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1390,10 +1390,10 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-config-standard@14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.0.0.tgz#1de7bf5af37542dc6eef879ab7eb5e5e0f830747" - integrity sha512-bV6e2LFvJEetrLjVAy4KWPOUsIhPWr040c649MigTPR6yUtaGuOt6CEAyNeez2lRiC+2+vjGWa02byjs25EB3A== +eslint-config-standard@14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz#b23da2b76fe5a2eba668374f246454e7058f15d4" + integrity sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA== eslint-import-resolver-node@^0.3.2: version "0.3.2" From b6a933a2c7756ddab5e5c08ca2479688b3310020 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 28 Aug 2019 17:27:59 +0000 Subject: [PATCH 168/341] Update dependency inquirer to v7 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 10665350..d66fdbdb 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "3.0.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "6.5.1", + "inquirer": "7.0.0", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index b951a8d0..88f97c4e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2032,10 +2032,10 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.1.tgz#8bfb7a5ac02dac6ff641ac4c5ff17da112fcdb42" - integrity sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw== +inquirer@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== dependencies: ansi-escapes "^4.2.1" chalk "^2.4.2" From 47117a8d4c1ceaf4ebba15bf085b861cb27ddeeb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 28 Aug 2019 17:34:20 +0000 Subject: [PATCH 169/341] Update dependency eslint to v6.2.2 --- package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index d66fdbdb..7e844a56 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.19", "ava": "2.3.0", - "eslint": "6.2.1", + "eslint": "6.2.2", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "9.1.0", diff --git a/yarn.lock b/yarn.lock index 88f97c4e..25aaa094 100644 --- a/yarn.lock +++ b/yarn.lock @@ -500,10 +500,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.19.tgz#c7bd7009aa850464775d8a814e18138d633cd676" integrity sha512-tLRDU1hmcWamtgRT2iVRdraAQVGFQGgtcqracSo9XyMN1VeZLSVGb8RJJxVqab7UGbijoUijGPVFMjmqzyZIUw== -acorn-jsx@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.0.tgz#958584ddb60990c02c97c1bd9d521fce433bb101" - integrity sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg== +acorn-jsx@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" + integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== acorn@^7.0.0: version "7.0.0" @@ -1488,10 +1488,10 @@ eslint-visitor-keys@^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@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.2.1.tgz#66c2e4fe8b6356b9f01e828adc3ad04030122df1" - integrity sha512-ES7BzEzr0Q6m5TK9i+/iTpKjclXitOdDK4vT07OqbkBT2/VcN/gO9EL1C4HlK3TAOXYv2ItcmbVR9jO1MR0fJg== +eslint@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.2.2.tgz#03298280e7750d81fcd31431f3d333e43d93f24f" + integrity sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1502,7 +1502,7 @@ eslint@6.2.1: eslint-scope "^5.0.0" eslint-utils "^1.4.2" eslint-visitor-keys "^1.1.0" - espree "^6.1.0" + espree "^6.1.1" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -1546,13 +1546,13 @@ espower-location-detector@^1.0.0: source-map "^0.5.0" xtend "^4.0.0" -espree@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.0.tgz#a1e8aa65bf29a331d70351ed814a80e7534e0884" - integrity sha512-boA7CHRLlVWUSg3iL5Kmlt/xT3Q+sXnKoRYYzj1YeM10A76TEJBbotV5pKbnK42hEUIr121zTv+QLRM5LsCPXQ== +espree@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" + integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== dependencies: acorn "^7.0.0" - acorn-jsx "^5.0.0" + acorn-jsx "^5.0.2" eslint-visitor-keys "^1.1.0" esprima@^4.0.0: From e31b9f44ce994a6716edd454dfdb6f66eea3c454 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 29 Aug 2019 10:15:45 +0000 Subject: [PATCH 170/341] Update dependency eslint-plugin-node to v9.2.0 --- package.json | 2 +- yarn.lock | 27 +++++++++++---------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 7e844a56..e2b1e755 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint": "6.2.2", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", - "eslint-plugin-node": "9.1.0", + "eslint-plugin-node": "9.2.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", "nyc": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 25aaa094..a98b4853 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1411,12 +1411,12 @@ eslint-module-utils@^2.4.0: debug "^2.6.8" pkg-dir "^2.0.0" -eslint-plugin-es@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" - integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== +eslint-plugin-es@^1.4.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== dependencies: - eslint-utils "^1.3.0" + eslint-utils "^1.4.2" regexpp "^2.0.1" eslint-plugin-import@2.18.2: @@ -1436,13 +1436,13 @@ eslint-plugin-import@2.18.2: read-pkg-up "^2.0.0" resolve "^1.11.0" -eslint-plugin-node@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a" - integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw== +eslint-plugin-node@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz#b1911f111002d366c5954a6d96d3cd5bf2a3036a" + integrity sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA== dependencies: - eslint-plugin-es "^1.4.0" - eslint-utils "^1.3.1" + eslint-plugin-es "^1.4.1" + eslint-utils "^1.4.2" ignore "^5.1.1" minimatch "^3.0.4" resolve "^1.10.1" @@ -1466,11 +1466,6 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.0, eslint-utils@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" - integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== - eslint-utils@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" From a3c16b4f05aadd1aeb021891fb181d11b5cec4a3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 30 Aug 2019 05:24:44 +0000 Subject: [PATCH 171/341] Update dependency @types/node to v11.13.20 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e2b1e755..baaa6321 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.19", + "@types/node": "11.13.20", "ava": "2.3.0", "eslint": "6.2.2", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index a98b4853..3231da75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -495,10 +495,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.19": - version "11.13.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.19.tgz#c7bd7009aa850464775d8a814e18138d633cd676" - integrity sha512-tLRDU1hmcWamtgRT2iVRdraAQVGFQGgtcqracSo9XyMN1VeZLSVGb8RJJxVqab7UGbijoUijGPVFMjmqzyZIUw== +"@types/node@11.13.20": + version "11.13.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.20.tgz#da42fe93d6599f80b35ffeb5006f4c31f40d89ea" + integrity sha512-JE0UpLWZTV1sGcaj0hN+Q0760OEjpgyFJ06DOMVW6qKBducKdJQaIw0TGL6ccj7VXRduIOHLWQi+tHwulZJHVQ== acorn-jsx@^5.0.2: version "5.0.2" From e7acd50b50549077d2a9a5d2896c9f253090b6fd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Sep 2019 21:40:52 +0000 Subject: [PATCH 172/341] Update dependency sinon to v7.4.2 --- package.json | 2 +- yarn.lock | 39 +++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index baaa6321..883e0b3d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "14.1.1", "rimraf": "3.0.0", - "sinon": "7.4.1" + "sinon": "7.4.2" } } diff --git a/yarn.lock b/yarn.lock index 3231da75..3f4ceec0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -433,6 +433,13 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^1.3.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" + integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== + dependencies: + type-detect "4.0.8" + "@sinonjs/formatio@^3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" @@ -450,14 +457,14 @@ array-from "^2.1.1" lodash "^4.17.11" -"@sinonjs/samsam@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.2.tgz#63942e3d5eb0b79f6de3bef9abfad15fb4b6401b" - integrity sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA== +"@sinonjs/samsam@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" + integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== dependencies: - "@sinonjs/commons" "^1.0.2" + "@sinonjs/commons" "^1.3.0" array-from "^2.1.1" - lodash "^4.17.11" + lodash "^4.17.15" "@sinonjs/text-encoding@^0.7.1": version "0.7.1" @@ -2757,10 +2764,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.1.tgz#de61d99a1d3b46b5233be4531569b9a8e27372b2" - integrity sha512-edFWm0fsFG2n318rfEnKlTZTkjlbVOFF9XIA+fj+Ed+Qz1laYW2lobwavWoMzGrYDHH1EpiNJgDfvGnkZztR/g== +nise@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" + integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== dependencies: "@sinonjs/formatio" "^3.2.1" "@sinonjs/text-encoding" "^0.7.1" @@ -3571,17 +3578,17 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@7.4.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.4.1.tgz#bcd0c63953893e87fa0cc502f52489c32a83d4d9" - integrity sha512-7s9buHGHN/jqoy/v4bJgmt0m1XEkCEd/tqdHXumpBp0JSujaT4Ng84JU5wDdK4E85ZMq78NuDe0I3NAqXY8TFg== +sinon@7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.4.2.tgz#ecd54158fef2fcfbdb231a3fa55140e8cb02ad6c" + integrity sha512-pY5RY99DKelU3pjNxcWo6XqeB1S118GBcVIIdDi6V+h6hevn1izcg2xv1hTHW/sViRXU7sUOxt4wTUJ3gsW2CQ== dependencies: "@sinonjs/commons" "^1.4.0" "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.2" + "@sinonjs/samsam" "^3.3.3" diff "^3.5.0" lolex "^4.2.0" - nise "^1.5.1" + nise "^1.5.2" supports-color "^5.5.0" slash@^3.0.0: From 637ca9b5e9418843398f6eb6d87f5547bdb7e244 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Sep 2019 23:07:38 +0000 Subject: [PATCH 173/341] Update dependency commander to v3.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 883e0b3d..86a8b881 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "2.4.2", - "commander": "3.0.0", + "commander": "3.0.1", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.0.0", diff --git a/yarn.lock b/yarn.lock index 3f4ceec0..e9ccf251 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1044,10 +1044,10 @@ 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== -commander@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.0.tgz#0641ea00838c7a964627f04cddc336a2deddd60a" - integrity sha512-pl3QrGOBa9RZaslQiqnnKX2J068wcQw7j9AIaBQ9/JEp5RY6je4jKTImg0Bd+rpoONSe7GUFSgkxLeo17m3Pow== +commander@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.1.tgz#4595aec3530525e671fb6f85fb173df8ff8bf57a" + integrity sha512-UNgvDd+csKdc9GD4zjtkHKQbT8Aspt2jCBqNSPp53vAS0L1tS9sXB2TCEOPHJ7kt9bN/niWkYj8T3RQSoMXdSQ== commander@~2.17.1: version "2.17.1" From 6fc2b298fa887132bab708804dd8b59f43fe16c8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 6 Sep 2019 23:51:48 +0000 Subject: [PATCH 174/341] Update dependency eslint-plugin-node to v10 --- package.json | 2 +- yarn.lock | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 86a8b881..925128e5 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint": "6.2.2", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", - "eslint-plugin-node": "9.2.0", + "eslint-plugin-node": "10.0.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", "nyc": "14.1.1", diff --git a/yarn.lock b/yarn.lock index e9ccf251..8f4b8ae3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1418,13 +1418,13 @@ eslint-module-utils@^2.4.0: debug "^2.6.8" pkg-dir "^2.0.0" -eslint-plugin-es@^1.4.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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" + integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== dependencies: eslint-utils "^1.4.2" - regexpp "^2.0.1" + regexpp "^3.0.0" eslint-plugin-import@2.18.2: version "2.18.2" @@ -1443,12 +1443,12 @@ eslint-plugin-import@2.18.2: read-pkg-up "^2.0.0" resolve "^1.11.0" -eslint-plugin-node@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz#b1911f111002d366c5954a6d96d3cd5bf2a3036a" - integrity sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA== +eslint-plugin-node@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" + integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== dependencies: - eslint-plugin-es "^1.4.1" + eslint-plugin-es "^2.0.0" eslint-utils "^1.4.2" ignore "^5.1.1" minimatch "^3.0.4" @@ -3335,6 +3335,11 @@ regexpp@^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: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + regexpu-core@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" From 3e4d07f123ea805d84fc19d95c4b02df5b6f8412 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 10 Sep 2019 19:04:12 +0000 Subject: [PATCH 175/341] Update dependency eslint to v6.3.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 925128e5..5dcf775a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.20", "ava": "2.3.0", - "eslint": "6.2.2", + "eslint": "6.3.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 8f4b8ae3..69beb2a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1490,10 +1490,10 @@ eslint-visitor-keys@^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@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.2.2.tgz#03298280e7750d81fcd31431f3d333e43d93f24f" - integrity sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw== +eslint@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.3.0.tgz#1f1a902f67bfd4c354e7288b81e40654d927eb6a" + integrity sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" From a5dd0b67d6ad9125da29dd2aff3c26cdbed6fd0e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 14 Sep 2019 01:44:23 +0000 Subject: [PATCH 176/341] Update dependency eslint to v6.4.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5dcf775a..925395a7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.20", "ava": "2.3.0", - "eslint": "6.3.0", + "eslint": "6.4.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 69beb2a8..67cf2ade 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1490,10 +1490,10 @@ eslint-visitor-keys@^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@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.3.0.tgz#1f1a902f67bfd4c354e7288b81e40654d927eb6a" - integrity sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow== +eslint@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.4.0.tgz#5aa9227c3fbe921982b2eda94ba0d7fae858611a" + integrity sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" From 64cdb8cd6787ad43847c5736a3961fbe49c4a8cd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Sep 2019 07:16:20 +0000 Subject: [PATCH 177/341] Update dependency ava to v2.4.0 --- package.json | 2 +- yarn.lock | 115 +++++++++++++++++++++++++++------------------------ 2 files changed, 63 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 925395a7..842cba61 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.13.20", - "ava": "2.3.0", + "ava": "2.4.0", "eslint": "6.4.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", diff --git a/yarn.lock b/yarn.lock index 67cf2ade..336acfbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,18 +40,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== +"@babel/core@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48" + integrity sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helpers" "^7.5.5" - "@babel/parser" "^7.5.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/generator" "^7.6.0" + "@babel/helpers" "^7.6.0" + "@babel/parser" "^7.6.0" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.0" + "@babel/types" "^7.6.0" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -82,12 +82,12 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== +"@babel/generator@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56" + integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.6.0" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -190,14 +190,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" - integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== +"@babel/helpers@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.0.tgz#21961d16c6a3c3ab597325c34c465c0887d31c6e" + integrity sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ== dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.0" + "@babel/types" "^7.6.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -223,10 +223,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== -"@babel/parser@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" - integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b" + integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -320,6 +320,15 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" +"@babel/template@^7.6.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.1.0", "@babel/traverse@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" @@ -335,17 +344,17 @@ globals "^11.1.0" lodash "^4.17.11" -"@babel/traverse@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" - integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== +"@babel/traverse@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516" + integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" + "@babel/generator" "^7.6.0" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" @@ -377,10 +386,10 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== +"@babel/types@^7.6.0": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" + integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -568,12 +577,12 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.0.0.tgz#f6b84e8fc97ea7add7a53b7530ef28f3fde0e048" - integrity sha512-8zjUtFJ3db/QoPXuuEMloS2AUf79/yeyttJ7Abr3hteopJu9HK8vsgGviGUMq+zyA6cZZO6gAyZoMTF6TgaEjA== +ansi-styles@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.1.0.tgz#d3ba8047b818293eaaa7978321dd61bff9842cfc" + integrity sha512-Qts4KCLKG+waHc9C4m07weIY8qyeixoS0h6RnbsNVD6Fw+pEZGW3vTyObL3WXpE09Mq4Oi7/lBEyLmOiLtlYWQ== dependencies: - color-convert "^2.0.0" + color-convert "^2.0.1" anymatch@^3.0.1: version "3.0.2" @@ -662,18 +671,18 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -ava@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-2.3.0.tgz#cac4d7f0a30077a852c6bf5bc7c0bc78c3021e63" - integrity sha512-4VaaSnl13vpTZmqW3aMqioSolT0/ozRkjQxTLi3p8wtyRONuX/uLKL3uF0j50w2BNRoLsJqztnkX2h8xeVp2lg== +ava@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-2.4.0.tgz#a3bd8b0e01d8826004c91de375eb2313ba5237c3" + integrity sha512-CQWtzZZZeU2g4StojRv6MO9RIRi4sLxGSB9+3C3hv0ttUEG1tkJLTLyrBQeFS4WEeK12Z4ovE3f2iPVhSy8elA== dependencies: "@ava/babel-preset-stage-4" "^4.0.0" "@ava/babel-preset-transform-test-files" "^6.0.0" - "@babel/core" "^7.5.5" - "@babel/generator" "^7.5.5" + "@babel/core" "^7.6.0" + "@babel/generator" "^7.6.0" "@concordance/react" "^2.0.0" ansi-escapes "^4.2.1" - ansi-styles "^4.0.0" + ansi-styles "^4.1.0" arr-flatten "^1.1.0" array-union "^2.1.0" array-uniq "^2.1.0" @@ -1027,10 +1036,10 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" -color-convert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.0.tgz#9851ac61cc0d3898a8a3088650d5bf447bf69d97" - integrity sha512-hzTicsCJIHdxih9+2aLR1tNGZX5qSJGRHDPVwSY26tVrEf55XNajLOBWz2UuWSIergszA09/bqnOiHyqx9fxQg== +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" From 713e47edfd072573f4e5200c2847c8dc0d684198 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Sep 2019 15:22:26 +0000 Subject: [PATCH 178/341] Update dependency sinon to v7.5.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 842cba61..17961a5c 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "14.1.1", "rimraf": "3.0.0", - "sinon": "7.4.2" + "sinon": "7.5.0" } } diff --git a/yarn.lock b/yarn.lock index 336acfbb..0fe28fe0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3592,10 +3592,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.4.2.tgz#ecd54158fef2fcfbdb231a3fa55140e8cb02ad6c" - integrity sha512-pY5RY99DKelU3pjNxcWo6XqeB1S118GBcVIIdDi6V+h6hevn1izcg2xv1hTHW/sViRXU7sUOxt4wTUJ3gsW2CQ== +sinon@7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" + integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== dependencies: "@sinonjs/commons" "^1.4.0" "@sinonjs/formatio" "^3.2.1" From a69597173ff85bc4a760d00fb4e581238d4ca6b5 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 24 Sep 2019 16:23:39 +0000 Subject: [PATCH 179/341] Update dependency @types/node to v11.13.21 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 17961a5c..622e6f09 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.20", + "@types/node": "11.13.21", "ava": "2.4.0", "eslint": "6.4.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 0fe28fe0..8a1e3646 100644 --- a/yarn.lock +++ b/yarn.lock @@ -511,10 +511,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.20": - version "11.13.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.20.tgz#da42fe93d6599f80b35ffeb5006f4c31f40d89ea" - integrity sha512-JE0UpLWZTV1sGcaj0hN+Q0760OEjpgyFJ06DOMVW6qKBducKdJQaIw0TGL6ccj7VXRduIOHLWQi+tHwulZJHVQ== +"@types/node@11.13.21": + version "11.13.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.21.tgz#afcf913437eeb1f9e1994a62a03b1762ee4600d3" + integrity sha512-fLwcSjMmDnjfk4FP7/QDiNzXSCEOGNvEe9eA6vaITmC784+Gm70wF7woaFQxUb2CpMjgLBhSPyhH0oIe1JS2uw== acorn-jsx@^5.0.2: version "5.0.2" From 3a24102550794c6ef8462e497775b78ecbbf414a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 3 Oct 2019 16:42:08 +0000 Subject: [PATCH 180/341] Update dependency @types/node to v11.13.22 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 622e6f09..e7f069e0 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.21", + "@types/node": "11.13.22", "ava": "2.4.0", "eslint": "6.4.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 8a1e3646..6a20919a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -511,10 +511,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.21": - version "11.13.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.21.tgz#afcf913437eeb1f9e1994a62a03b1762ee4600d3" - integrity sha512-fLwcSjMmDnjfk4FP7/QDiNzXSCEOGNvEe9eA6vaITmC784+Gm70wF7woaFQxUb2CpMjgLBhSPyhH0oIe1JS2uw== +"@types/node@11.13.22": + version "11.13.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.22.tgz#91ee88ebfa25072433497f6f3150f84fa8c3a91b" + integrity sha512-rOsaPRUGTOXbRBOKToy4cgZXY4Y+QSVhxcLwdEveozbk7yuudhWMpxxcaXqYizLMP3VY7OcWCFtx9lGFh5j5kg== acorn-jsx@^5.0.2: version "5.0.2" From 27f67baa3a8971d71b70e1e4c48c17aefa1ae7b8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 7 Oct 2019 23:27:15 +0000 Subject: [PATCH 181/341] Update dependency commander to v3.0.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e7f069e0..08bfc8ec 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "2.4.2", - "commander": "3.0.1", + "commander": "3.0.2", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.0.0", diff --git a/yarn.lock b/yarn.lock index 6a20919a..1f12722f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1053,10 +1053,10 @@ 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== -commander@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.1.tgz#4595aec3530525e671fb6f85fb173df8ff8bf57a" - integrity sha512-UNgvDd+csKdc9GD4zjtkHKQbT8Aspt2jCBqNSPp53vAS0L1tS9sXB2TCEOPHJ7kt9bN/niWkYj8T3RQSoMXdSQ== +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== commander@~2.17.1: version "2.17.1" From a6d9c66fd15f9890ec5bc2bad5c04ae5ecfaaaac Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 8 Oct 2019 09:05:30 +0000 Subject: [PATCH 182/341] Update dependency eslint to v6.5.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 08bfc8ec..2e6b7d7d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.22", "ava": "2.4.0", - "eslint": "6.4.0", + "eslint": "6.5.1", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 1f12722f..aa196bde 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1499,10 +1499,10 @@ eslint-visitor-keys@^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@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.4.0.tgz#5aa9227c3fbe921982b2eda94ba0d7fae858611a" - integrity sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA== +eslint@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6" + integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" From b428f5bd37f1c43c2da00a0ae33807390d979992 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Fri, 25 Oct 2019 08:31:50 +0200 Subject: [PATCH 183/341] Add Mindsers' Github Sponsor account --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index d73f92c9..6664f2e0 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: [mindsers] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: mindsers # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: mindsers # Replace with a single Ko-fi username From b4df3db853c9048a14899fd50bccc6263ead7fd8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 25 Oct 2019 19:05:53 +0000 Subject: [PATCH 184/341] Update dependency eslint to v6.6.0 --- package.json | 2 +- yarn.lock | 94 +++++++++++++++++----------------------------------- 2 files changed, 31 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 2e6b7d7d..44f14e66 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.13.22", "ava": "2.4.0", - "eslint": "6.5.1", + "eslint": "6.6.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "10.0.0", diff --git a/yarn.lock b/yarn.lock index aa196bde..49d9b29a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -516,15 +516,15 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.22.tgz#91ee88ebfa25072433497f6f3150f84fa8c3a91b" integrity sha512-rOsaPRUGTOXbRBOKToy4cgZXY4Y+QSVhxcLwdEveozbk7yuudhWMpxxcaXqYizLMP3VY7OcWCFtx9lGFh5j5kg== -acorn-jsx@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" - integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== +acorn-jsx@^5.1.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@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a" - integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ== +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== ajv@^6.10.0, ajv@^6.9.1: version "6.10.0" @@ -543,11 +543,6 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -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-escapes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" @@ -1489,6 +1484,13 @@ eslint-utils@^1.4.2: dependencies: eslint-visitor-keys "^1.0.0" +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" @@ -1499,10 +1501,10 @@ eslint-visitor-keys@^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@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6" - integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A== +eslint@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" + integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1511,9 +1513,9 @@ eslint@6.5.1: debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.4.2" + eslint-utils "^1.4.3" eslint-visitor-keys "^1.1.0" - espree "^6.1.1" + espree "^6.1.2" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -1523,7 +1525,7 @@ eslint@6.5.1: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.4.1" + inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" @@ -1557,13 +1559,13 @@ espower-location-detector@^1.0.0: source-map "^0.5.0" xtend "^4.0.0" -espree@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" - integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== dependencies: - acorn "^7.0.0" - acorn-jsx "^5.0.2" + acorn "^7.1.0" + acorn-jsx "^5.1.0" eslint-visitor-keys "^1.1.0" esprima@^4.0.0: @@ -1676,13 +1678,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.0" -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" - figures@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" @@ -2043,7 +2038,7 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@7.0.0: +inquirer@7.0.0, inquirer@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== @@ -2062,25 +2057,6 @@ inquirer@7.0.0: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== - 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" - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -2516,11 +2492,6 @@ lodash@^4.17.10, lodash@^4.17.11: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@^4.17.12: - version "4.17.14" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" - integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== - lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -2743,11 +2714,6 @@ ms@^2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -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.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -3694,7 +3660,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== From bb45873060fd459bf1245c1969ccb73e988b4494 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 29 Oct 2019 08:22:56 +0000 Subject: [PATCH 185/341] Update dependency @types/node to v11.15.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 44f14e66..a7447145 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.13.22", + "@types/node": "11.15.0", "ava": "2.4.0", "eslint": "6.6.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 49d9b29a..922e878b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -511,10 +511,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.13.22": - version "11.13.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.22.tgz#91ee88ebfa25072433497f6f3150f84fa8c3a91b" - integrity sha512-rOsaPRUGTOXbRBOKToy4cgZXY4Y+QSVhxcLwdEveozbk7yuudhWMpxxcaXqYizLMP3VY7OcWCFtx9lGFh5j5kg== +"@types/node@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.0.tgz#1a0974a5bfdf5eee1b85945790a03bcea2f63fa5" + integrity sha512-JRq4kw1GQZrF90YRrp3C1kIoioAEj9PweNF2Qgp/6XZYVgXPl7OWKdggFNtRxlBPyl40Fz/bOhCnXuKMFaJ06w== acorn-jsx@^5.1.0: version "5.1.0" From 28d5a6691f330a0ff9c45f086db3070ca7585715 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 30 Oct 2019 16:20:09 +0000 Subject: [PATCH 186/341] Update dependency @types/node to v11.15.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a7447145..0d353d81 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.0", + "@types/node": "11.15.2", "ava": "2.4.0", "eslint": "6.6.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 922e878b..3d4df0dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -511,10 +511,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.0": - version "11.15.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.0.tgz#1a0974a5bfdf5eee1b85945790a03bcea2f63fa5" - integrity sha512-JRq4kw1GQZrF90YRrp3C1kIoioAEj9PweNF2Qgp/6XZYVgXPl7OWKdggFNtRxlBPyl40Fz/bOhCnXuKMFaJ06w== +"@types/node@11.15.2": + version "11.15.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.2.tgz#998b9cacc5f26e441d8396340818fde8e08aada5" + integrity sha512-BqCU9uIFkUH9Sgo2uLYbmIiFB1T+VBiM8AI/El3LIAI5KzwtckeSG+3WOYZr9aMoX4UIvRFBWBeSaOu6hFue2Q== acorn-jsx@^5.1.0: version "5.1.0" From 8f286b0ae5131453ce41948beae5d85391a074cf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 1 Nov 2019 10:11:33 +0000 Subject: [PATCH 187/341] Update dependency commander to v4 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0d353d81..04c94026 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "2.4.2", - "commander": "3.0.2", + "commander": "4.0.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.0.0", diff --git a/yarn.lock b/yarn.lock index 3d4df0dd..eb5c09e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1048,10 +1048,10 @@ 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== -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.0.tgz#e782b6afe6a0f1b1408be59429919e1305160e3f" + integrity sha512-SEa2abMBTZuEjLVYpNrAFoRgxPwG4rXP3+SGY6CM/HZGeDzIA7Pzp+7H3AHDukKEpyy2SoSGGPShKqqfH9T9AQ== commander@~2.17.1: version "2.17.1" From 8920c6d86cb0308c745fce9e3062dc10db21cfa6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 9 Nov 2019 07:08:53 +0000 Subject: [PATCH 188/341] Update dependency chalk to v3 --- package.json | 2 +- yarn.lock | 29 ++++++++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 04c94026..fc3b086e 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "yarn test:lint && yarn test:unit:coverage" }, "dependencies": { - "chalk": "2.4.2", + "chalk": "3.0.0", "commander": "4.0.0", "esm": "3.2.25", "gift": "0.10.2", diff --git a/yarn.lock b/yarn.lock index eb5c09e2..14a4f371 100644 --- a/yarn.lock +++ b/yarn.lock @@ -891,14 +891,13 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@2.4.2, 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== +chalk@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.4.1" @@ -909,6 +908,15 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^5.3.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== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3771,6 +3779,13 @@ supports-color@^7.0.0: dependencies: has-flag "^4.0.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" + symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" From 3450d71445631993c0c0f2889bb8fd3e375ecaee Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 14 Nov 2019 11:05:03 +0000 Subject: [PATCH 189/341] Update dependency commander to v4.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fc3b086e..cf17ca97 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "3.0.0", - "commander": "4.0.0", + "commander": "4.0.1", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.0.0", diff --git a/yarn.lock b/yarn.lock index 14a4f371..4546e85e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1056,10 +1056,10 @@ 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== -commander@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.0.tgz#e782b6afe6a0f1b1408be59429919e1305160e3f" - integrity sha512-SEa2abMBTZuEjLVYpNrAFoRgxPwG4rXP3+SGY6CM/HZGeDzIA7Pzp+7H3AHDukKEpyy2SoSGGPShKqqfH9T9AQ== +commander@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" + integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== commander@~2.17.1: version "2.17.1" From 81a0bcceee8cd79ebebbc36030df716131218169 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 25 Nov 2019 22:15:31 +0000 Subject: [PATCH 190/341] Update dependency @types/node to v11.15.3 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cf17ca97..4a275fcc 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.2", + "@types/node": "11.15.3", "ava": "2.4.0", "eslint": "6.6.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 4546e85e..6a635f4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -511,10 +511,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.2": - version "11.15.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.2.tgz#998b9cacc5f26e441d8396340818fde8e08aada5" - integrity sha512-BqCU9uIFkUH9Sgo2uLYbmIiFB1T+VBiM8AI/El3LIAI5KzwtckeSG+3WOYZr9aMoX4UIvRFBWBeSaOu6hFue2Q== +"@types/node@11.15.3": + version "11.15.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.3.tgz#cb7f19846a83ac5a88fc22756b74633cdeb476a7" + integrity sha512-5RzvXVietaB8S4dwDjxjltAOHtTO87fiksjqjWGZih97j6KSrdCDaRfmYMNrgrLM87odGBrsTHAl6N3fLraQaw== acorn-jsx@^5.1.0: version "5.1.0" From 0296c1cd213669b5b866c656cacfe3f932193a26 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 30 Nov 2019 17:34:38 +0000 Subject: [PATCH 191/341] Update dependency eslint to v6.7.2 --- package.json | 2 +- yarn.lock | 50 +++++++++++++++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index cf17ca97..8870204e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.2", "ava": "2.4.0", - "eslint": "6.6.0", + "eslint": "6.7.2", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-node": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 4546e85e..0b5eebc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1509,10 +1509,10 @@ eslint-visitor-keys@^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@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" - integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== +eslint@6.7.2: + version "6.7.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1" + integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1529,7 +1529,7 @@ eslint@6.6.0: file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^11.7.0" + globals "^12.1.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -1542,7 +1542,7 @@ eslint@6.6.0: minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" + optionator "^0.8.3" progress "^2.0.0" regexpp "^2.0.1" semver "^6.1.2" @@ -1674,7 +1674,7 @@ fast-json-stable-stringify@^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= -fast-levenshtein@~2.0.4: +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= @@ -1850,11 +1850,18 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.8.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + globby@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" @@ -2888,17 +2895,17 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -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.3: + 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" + word-wrap "~1.2.3" ora@^3.4.0: version "3.4.0" @@ -3899,6 +3906,11 @@ type-fest@^0.5.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -4044,16 +4056,16 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +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@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" From 79d17f236600b95bcbf1e67933611ddfa0ab314e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Dec 2019 13:13:22 +0000 Subject: [PATCH 192/341] Update dependency eslint-plugin-import to v2.19.1 --- package.json | 2 +- yarn.lock | 95 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 79 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index c80beb49..c83b663c 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "2.4.0", "eslint": "6.7.2", "eslint-config-standard": "14.1.0", - "eslint-plugin-import": "2.18.2", + "eslint-plugin-import": "2.19.1", "eslint-plugin-node": "10.0.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", diff --git a/yarn.lock b/yarn.lock index 352b6bfd..de672f7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -651,6 +651,15 @@ array-uniq@^2.1.0: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== +array.prototype.flat@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz#8f3c71d245ba349b6b64b4078f76f5576f1fd723" + integrity sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.15.0" + function-bind "^1.1.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -1190,7 +1199,7 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@^2.6.8, debug@^2.6.9: +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== @@ -1385,6 +1394,22 @@ es-abstract@^1.12.0, es-abstract@^1.7.0: is-regex "^1.0.4" object-keys "^1.0.12" +es-abstract@^1.15.0: + version "1.16.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.3.tgz#52490d978f96ff9f89ec15b5cf244304a5bca161" + integrity sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.7.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" + 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" @@ -1394,6 +1419,15 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" @@ -1422,12 +1456,12 @@ eslint-import-resolver-node@^0.3.2: debug "^2.6.9" resolve "^1.5.0" -eslint-module-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" - integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== +eslint-module-utils@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz#cdf0b40d623032274ccd2abd7e64c4e524d6e19c" + integrity sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw== dependencies: - debug "^2.6.8" + debug "^2.6.9" pkg-dir "^2.0.0" eslint-plugin-es@^2.0.0: @@ -1438,22 +1472,23 @@ eslint-plugin-es@^2.0.0: eslint-utils "^1.4.2" regexpp "^3.0.0" -eslint-plugin-import@2.18.2: - version "2.18.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" - integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== +eslint-plugin-import@2.19.1: + version "2.19.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" + integrity sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw== dependencies: array-includes "^3.0.3" + array.prototype.flat "^1.2.1" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.0" + eslint-module-utils "^2.4.1" has "^1.0.3" minimatch "^3.0.4" object.values "^1.1.0" read-pkg-up "^2.0.0" - resolve "^1.11.0" + resolve "^1.12.0" eslint-plugin-node@10.0.0: version "10.0.0" @@ -1940,6 +1975,11 @@ has-symbols@^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-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" @@ -2833,7 +2873,12 @@ object-assign@^4.0.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-keys@^1.0.11, object-keys@^1.0.12: +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -3415,10 +3460,10 @@ resolve@^1.10.1: dependencies: path-parse "^1.0.6" -resolve@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" - integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== +resolve@^1.12.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" + integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== dependencies: path-parse "^1.0.6" @@ -3701,6 +3746,22 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" +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== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" From 772791b721f461e677f6170269ec3377cabd991d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 15 Dec 2019 11:32:37 +0000 Subject: [PATCH 193/341] Update dependency inquirer to v7.0.1 --- package.json | 2 +- yarn.lock | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c83b663c..1422730e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "4.0.1", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.0.0", + "inquirer": "7.0.1", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index de672f7e..05cc72c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2093,7 +2093,26 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@7.0.0, inquirer@^7.0.0: +inquirer@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" + integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== @@ -3549,6 +3568,13 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" +rxjs@^6.5.3: + 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: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" From 963a465e97d5ca270c885e6a5b904317eee7dbb7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Dec 2019 09:37:11 +0000 Subject: [PATCH 194/341] Update dependency sinon to v8 --- package.json | 2 +- yarn.lock | 110 ++++++++++++++++++++++++--------------------------- 2 files changed, 52 insertions(+), 60 deletions(-) diff --git a/package.json b/package.json index 1422730e..833e604b 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "14.1.1", "rimraf": "3.0.0", - "sinon": "7.5.0" + "sinon": "8.0.1" } } diff --git a/yarn.lock b/yarn.lock index 05cc72c5..9a762af2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -428,52 +428,36 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^1", "@sinonjs/commons@^1.4.0": +"@sinonjs/commons@^1": version "1.4.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw== dependencies: type-detect "4.0.8" -"@sinonjs/commons@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.0.2.tgz#3e0ac737781627b8844257fadc3d803997d0526e" - integrity sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^1.3.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" - integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6" + integrity sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg== dependencies: type-detect "4.0.8" -"@sinonjs/formatio@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" - integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== +"@sinonjs/formatio@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-4.0.1.tgz#50ac1da0c3eaea117ca258b06f4f88a471668bdb" + integrity sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw== dependencies: "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" - -"@sinonjs/samsam@^3.1.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" - integrity sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw== - dependencies: - "@sinonjs/commons" "^1.0.2" - array-from "^2.1.1" - lodash "^4.17.11" + "@sinonjs/samsam" "^4.2.0" -"@sinonjs/samsam@^3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== +"@sinonjs/samsam@^4.0.1", "@sinonjs/samsam@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.0.tgz#64a9994331cc3da0a0d7cc06cae44faa09cb5f2c" + integrity sha512-yG7QbUz38ZPIegfuSMEcbOo0kkLGmPa8a0Qlz4dk7+cXYALDScWjIZzAm/u2+Frh+bcdZF6wZJZwwuJjY0WAjA== dependencies: - "@sinonjs/commons" "^1.3.0" + "@sinonjs/commons" "^1.6.0" array-from "^2.1.1" - lodash "^4.17.15" + lodash.get "^4.4.2" "@sinonjs/text-encoding@^0.7.1": version "0.7.1" @@ -1294,10 +1278,10 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== dir-glob@^3.0.1: version "3.0.1" @@ -2551,6 +2535,11 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= +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.islength@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577" @@ -2578,10 +2567,12 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -lolex@^4.1.0, lolex@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" - integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== +lolex@^5.0.1, lolex@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== + dependencies: + "@sinonjs/commons" "^1.7.0" loud-rejection@^1.0.0: version "1.6.0" @@ -2813,15 +2804,16 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" - integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== +nise@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-3.0.0.tgz#811330bf07ed3661c4b8bd72b18d9b6c6eb76f9f" + integrity sha512-EObFx5tioBMePHpU/gGczaY2YDqL255iwjmZwswu2CiwEW8xIGrr3E2xij+efIppS1nLQo9NyXSIUySGHUOhHQ== dependencies: - "@sinonjs/formatio" "^3.2.1" + "@sinonjs/commons" "^1.7.0" + "@sinonjs/formatio" "^4.0.1" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" - lolex "^4.1.0" + lolex "^5.0.1" path-to-regexp "^1.7.0" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: @@ -3644,18 +3636,18 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" - integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== - dependencies: - "@sinonjs/commons" "^1.4.0" - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.3" - diff "^3.5.0" - lolex "^4.2.0" - nise "^1.5.2" - supports-color "^5.5.0" +sinon@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.0.1.tgz#c256376cd133dbb0c69ba4d73ed5bdd591597502" + integrity sha512-vbXMHBszVioyPsuRDLEiPEgvkZnbjfdCFvLYV4jONNJqZNLWTwZ/gYSNh3SuiT1w9MRXUz+S7aX0B4Ar2XI8iw== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/formatio" "^4.0.1" + "@sinonjs/samsam" "^4.0.1" + diff "^4.0.1" + lolex "^5.1.2" + nise "^3.0.0" + supports-color "^7.1.0" slash@^3.0.0: version "3.0.0" @@ -3852,7 +3844,7 @@ supertap@^1.0.0: serialize-error "^2.1.0" strip-ansi "^4.0.0" -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== From f807ebfcb270034795b0e2fd071c6c05f40242da Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Dec 2019 12:58:05 +0000 Subject: [PATCH 195/341] Update dependency eslint to v6.8.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 833e604b..fa37d42f 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.3", "ava": "2.4.0", - "eslint": "6.7.2", + "eslint": "6.8.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.19.1", "eslint-plugin-node": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 9a762af2..b3c029fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1528,10 +1528,10 @@ eslint-visitor-keys@^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@6.7.2: - version "6.7.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1" - integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng== +eslint@6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" From 605d940088f70f288ece13ae041a2a3cc39580d0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Dec 2019 14:37:51 +0000 Subject: [PATCH 196/341] Update dependency nyc to v15 --- package.json | 2 +- yarn.lock | 831 ++++++++++++++++++++++++++------------------------- 2 files changed, 425 insertions(+), 408 deletions(-) diff --git a/package.json b/package.json index fa37d42f..80702764 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "eslint-plugin-node": "10.0.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", - "nyc": "14.1.1", + "nyc": "15.0.0", "rimraf": "3.0.0", "sinon": "8.0.1" } diff --git a/yarn.lock b/yarn.lock index b3c029fc..245d9250 100644 --- a/yarn.lock +++ b/yarn.lock @@ -60,6 +60,26 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.7.5": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" + integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.7" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.7" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.0.0": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" @@ -93,6 +113,16 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.7.4", "@babel/generator@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" + integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== + dependencies: + "@babel/types" "^7.7.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -109,6 +139,15 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== + dependencies: + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + "@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" @@ -116,6 +155,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" @@ -180,6 +226,13 @@ dependencies: "@babel/types" "^7.4.4" +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -199,6 +252,15 @@ "@babel/traverse" "^7.6.0" "@babel/types" "^7.6.0" +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== + dependencies: + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -213,7 +275,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== -"@babel/parser@^7.4.0", "@babel/parser@^7.4.3": +"@babel/parser@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== @@ -228,6 +290,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b" integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ== +"@babel/parser@^7.7.4", "@babel/parser@^7.7.5", "@babel/parser@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -302,15 +369,6 @@ "@babel/parser" "^7.1.2" "@babel/types" "^7.1.2" -"@babel/template@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" - integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.0" - "@babel/types" "^7.4.0" - "@babel/template@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" @@ -329,7 +387,16 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3": +"@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/traverse@^7.1.0": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== @@ -359,6 +426,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" @@ -395,6 +477,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@concordance/react@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" @@ -402,6 +493,21 @@ dependencies: arrify "^1.0.1" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" + integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + "@nodelib/fs.scandir@2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz#7fa8fed654939e1a39753d286b48b4836d00e0eb" @@ -471,6 +577,11 @@ dependencies: defer-to-connect "^1.0.1" +"@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/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -510,6 +621,14 @@ acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.10.0, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" @@ -534,11 +653,6 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.5.2" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -549,6 +663,11 @@ 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-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -556,6 +675,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" + integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + ansi-styles@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.1.0.tgz#d3ba8047b818293eaaa7978321dd61bff9842cfc" @@ -571,12 +698,12 @@ anymatch@^3.0.1: normalize-path "^3.0.0" picomatch "^2.0.4" -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== +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 "^2.0.0" + default-require-extensions "^3.0.0" archy@^1.0.0: version "1.0.0" @@ -830,15 +957,15 @@ cacheable-request@^6.0.0: normalize-url "^3.1.0" responselike "^1.0.2" -caching-transform@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" - integrity sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: - hasha "^3.0.0" - make-dir "^2.0.0" - package-hash "^3.0.0" - write-file-atomic "^2.4.2" + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" call-matcher@^1.0.0: version "1.1.0" @@ -945,7 +1072,7 @@ ci-parallel-vars@^1.0.0: resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== -clean-stack@^2.2.0: +clean-stack@^2.0.0, clean-stack@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== @@ -992,14 +1119,14 @@ cli-width@^2.0.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== +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" clone-response@^1.0.2: version "1.0.2" @@ -1020,11 +1147,6 @@ code-excerpt@^2.1.1: dependencies: convert-to-spaces "^1.0.1" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1054,11 +1176,6 @@ commander@4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== -commander@~2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== - common-path-prefix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" @@ -1115,6 +1232,13 @@ convert-source-map@^1.1.0, convert-source-map@^1.6.0: dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + convert-to-spaces@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" @@ -1125,25 +1249,6 @@ core-js@^2.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -cp-file@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" - integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== - dependencies: - graceful-fs "^4.1.2" - make-dir "^2.0.0" - nested-error-stacks "^2.0.0" - pify "^4.0.1" - safe-buffer "^5.0.1" - -cross-spawn@^4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -1153,7 +1258,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -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== @@ -1164,6 +1269,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -1239,12 +1353,12 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -default-require-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= +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 "^3.0.0" + strip-bom "^4.0.0" defaults@^1.0.3: version "1.0.3" @@ -1644,19 +1758,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -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" - external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -1726,14 +1827,14 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== +find-cache-dir@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" + integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== dependencies: commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" + make-dir "^3.0.0" + pkg-dir "^4.1.0" find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" @@ -1783,13 +1884,18 @@ flex-exec@^1.0.0: resolved "https://registry.yarnpkg.com/flex-exec/-/flex-exec-1.0.0.tgz#06974b68532839d2a12c32debcdb12378200fdf0" integrity sha1-BpdLaFMoOdKhLDLevNsSN4IA/fA= -foreground-child@^1.5.6: - version "1.5.6" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" - integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: - cross-spawn "^4" - signal-exit "^3.0.0" + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +fromentries@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" + integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== fs.realpath@^1.0.0: version "1.0.0" @@ -1850,7 +1956,7 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.3: +glob@^7.0.3, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -1862,6 +1968,18 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.4, glob@^7.1.6: + 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-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -1933,17 +2051,6 @@ graceful-fs@^4.1.15: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -handlebars@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -1976,13 +2083,6 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" -hasha@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" - integrity sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk= - dependencies: - is-stream "^1.0.1" - hasha@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.0.0.tgz#fdc3785caea03df29535fc8adb512c3d3a709004" @@ -1996,6 +2096,11 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + http-cache-semantics@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" @@ -2115,11 +2220,6 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" -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== - irregular-plurals@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" @@ -2171,13 +2271,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -2271,7 +2364,7 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-stream@^1.0.1, is-stream@^1.1.0: +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= @@ -2298,6 +2391,11 @@ is-utf8@^0.2.1: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +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-yarn-global@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" @@ -2323,57 +2421,69 @@ isobject@^4.0.0: resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== -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-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -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== +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 "^1.0.0" + append-transform "^2.0.0" -istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== +istanbul-lib-instrument@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz#53321a7970f076262fd3292c8f9b2e4ac544aae1" + integrity sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ== + dependencies: + "@babel/core" "^7.7.5" + "@babel/parser" "^7.7.5" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" + integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" + archy "^1.0.0" + cross-spawn "^7.0.0" + istanbul-lib-coverage "^3.0.0-alpha.1" + make-dir "^3.0.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^3.3.3" -istanbul-lib-report@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" -istanbul-lib-source-maps@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" + istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^2.2.4: - version "2.2.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.5.tgz#7fd354847124b46861365ac41165a4dfe5f67ea5" - integrity sha512-ilCSjE6f7elNIRxnSnIhnOpXdf3ryUT7Zkl+TaADItM638SWXjfNW40cujZCIjex4g4DTkzIy9kzwkaLruB50Q== +istanbul-reports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.0.tgz#d4d16d035db99581b6194e119bbf36c963c5eb70" + integrity sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A== dependencies: - handlebars "^4.1.2" + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" js-string-escape@^1.0.1: version "1.0.1" @@ -2457,13 +2567,6 @@ latest-version@^5.0.0: dependencies: package-json "^6.3.0" -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" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -2610,14 +2713,6 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - make-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" @@ -2625,13 +2720,6 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -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-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -2668,15 +2756,6 @@ md5-o-matic@^0.1.1: resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= -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== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" @@ -2692,13 +2771,6 @@ meow@^5.0.0: trim-newlines "^2.0.0" yargs-parser "^10.0.0" -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - merge2@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" @@ -2717,7 +2789,7 @@ mimic-fn@^1.0.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, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -2752,12 +2824,7 @@ minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -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= - -mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -2789,16 +2856,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -neo-async@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== - -nested-error-stacks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -2816,6 +2873,13 @@ nise@^3.0.0: lolex "^5.0.1" path-to-regexp "^1.7.0" +node-preload@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -2843,41 +2907,39 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nyc@14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.1.tgz#151d64a6a9f9f5908a1b73233931e4a0a3075eeb" - integrity sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw== +nyc@15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.0.tgz#eb32db2c0f29242c2414fe46357f230121cfc162" + integrity sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg== dependencies: - archy "^1.0.0" - caching-transform "^3.0.2" - convert-source-map "^1.6.0" - cp-file "^6.2.0" - find-cache-dir "^2.1.0" - find-up "^3.0.0" - foreground-child "^1.5.6" - glob "^7.1.3" - istanbul-lib-coverage "^2.0.5" - istanbul-lib-hook "^2.0.7" - istanbul-lib-instrument "^3.3.0" - istanbul-lib-report "^2.0.8" - istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.4" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.0" js-yaml "^3.13.1" - make-dir "^2.1.0" - merge-source-map "^1.1.0" - resolve-from "^4.0.0" - rimraf "^2.6.3" + make-dir "^3.0.0" + node-preload "^0.2.0" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" signal-exit "^3.0.2" - spawn-wrap "^1.4.2" - test-exclude "^5.2.3" - uuid "^3.3.2" - yargs "^13.2.2" - yargs-parser "^13.0.0" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + uuid "^3.3.3" + yargs "^15.0.2" object-assign@^4.0.1: version "4.1.1" @@ -2943,14 +3005,6 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.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= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -2975,20 +3029,6 @@ ora@^3.4.0: strip-ansi "^5.2.0" wcwidth "^1.0.1" -os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -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" - os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -2999,21 +3039,11 @@ p-cancelable@^1.0.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-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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" - integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -3061,6 +3091,13 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.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" @@ -3071,16 +3108,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== -package-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e" - integrity sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA== - dependencies: - graceful-fs "^4.1.15" - hasha "^3.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - package-hash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" @@ -3153,6 +3180,11 @@ path-key@^2.0.0, path-key@^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.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -3231,14 +3263,7 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.2.0: +pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -3269,6 +3294,13 @@ pretty-ms@^5.0.0: dependencies: parse-ms "^2.1.0" +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + progress@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" @@ -3323,14 +3355,6 @@ read-pkg-up@^3.0.0: find-up "^2.0.0" read-pkg "^3.0.0" -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -3527,20 +3551,13 @@ rimraf@2.6.3, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@3.0.0: +rimraf@3.0.0, rimraf@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== dependencies: glob "^7.1.3" -rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -3609,6 +3626,11 @@ semver@^6.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== +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== + serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" @@ -3626,11 +3648,23 @@ 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= +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== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -3676,22 +3710,22 @@ source-map@^0.5.0: 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== -spawn-wrap@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" - integrity sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg== +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: - foreground-child "^1.5.6" - mkdirp "^0.5.0" - os-homedir "^1.0.1" - rimraf "^2.6.2" + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" signal-exit "^3.0.2" - which "^1.3.0" + which "^2.0.1" spdx-correct@^3.0.0: version "3.0.2" @@ -3729,15 +3763,6 @@ stack-utils@^1.0.2: resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -3764,6 +3789,15 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" +string-width@^4.2.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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + 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" @@ -3780,13 +3814,6 @@ string.prototype.trimright@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -3801,6 +3828,13 @@ 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== + dependencies: + ansi-regex "^5.0.0" + strip-bom-buf@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz#ff9c223937f8e7154b77e9de9bde094186885c15" @@ -3813,6 +3847,11 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +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-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -3851,13 +3890,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.0.0.tgz#f2392c50ab35bb3cae7beebf24d254a19f880c06" @@ -3894,15 +3926,14 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - glob "^7.1.3" + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" text-table@^0.2.0: version "0.2.0" @@ -3997,14 +4028,6 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -uglify-js@^3.1.4: - version "3.4.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== - dependencies: - commander "~2.17.1" - source-map "~0.6.1" - uid2@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" @@ -4086,10 +4109,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +uuid@^3.3.3: + 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.0.3" @@ -4121,13 +4144,20 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" +which@^2.0.1: + 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" + widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -4140,18 +4170,14 @@ word-wrap@~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@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -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= +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" @@ -4167,15 +4193,6 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" - integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - write-file-atomic@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.0.tgz#1b64dbbf77cb58fd09056963d63e62667ab4fb21" @@ -4225,27 +4242,27 @@ yargs-parser@^10.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" - integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== +yargs-parser@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" + integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^13.2.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" - integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== +yargs@^15.0.2: + version "15.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3" + integrity sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q== dependencies: - cliui "^4.0.0" - find-up "^3.0.0" + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" get-caller-file "^2.0.1" - os-locale "^3.1.0" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^3.0.0" + string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.0.0" + yargs-parser "^16.1.0" From 5c9723fd9db4beebd23d913c6c8114f71d58fb74 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 26 Dec 2019 11:50:50 +0000 Subject: [PATCH 197/341] Update dependency eslint-plugin-node to v11 --- package.json | 2 +- yarn.lock | 39 +++++++++++++++++---------------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 80702764..336c5ea8 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint": "6.8.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.19.1", - "eslint-plugin-node": "10.0.0", + "eslint-plugin-node": "11.0.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", diff --git a/yarn.lock b/yarn.lock index 245d9250..8922a1b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1562,12 +1562,12 @@ eslint-module-utils@^2.4.1: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-es@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" - integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== +eslint-plugin-es@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" + integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng== dependencies: - eslint-utils "^1.4.2" + eslint-utils "^2.0.0" regexpp "^3.0.0" eslint-plugin-import@2.19.1: @@ -1588,13 +1588,13 @@ eslint-plugin-import@2.19.1: read-pkg-up "^2.0.0" resolve "^1.12.0" -eslint-plugin-node@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" - integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== +eslint-plugin-node@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz#365944bb0804c5d1d501182a9bc41a0ffefed726" + integrity sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg== dependencies: - eslint-plugin-es "^2.0.0" - eslint-utils "^1.4.2" + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" ignore "^5.1.1" minimatch "^3.0.4" resolve "^1.10.1" @@ -1618,13 +1618,6 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.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== - dependencies: - eslint-visitor-keys "^1.0.0" - eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -1632,10 +1625,12 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== +eslint-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" + integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== + dependencies: + eslint-visitor-keys "^1.1.0" eslint-visitor-keys@^1.1.0: version "1.1.0" From f66026323386555e1a7453cc24beecc50f7744c1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Dec 2019 15:16:11 +0000 Subject: [PATCH 198/341] Update dependency sinon to v8.0.2 --- package.json | 2 +- yarn.lock | 33 +++++++++++++++++++++------------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 336c5ea8..cf6500a1 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", "rimraf": "3.0.0", - "sinon": "8.0.1" + "sinon": "8.0.2" } } diff --git a/yarn.lock b/yarn.lock index 8922a1b6..77528f71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -556,7 +556,7 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^4.2.0" -"@sinonjs/samsam@^4.0.1", "@sinonjs/samsam@^4.2.0": +"@sinonjs/samsam@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.0.tgz#64a9994331cc3da0a0d7cc06cae44faa09cb5f2c" integrity sha512-yG7QbUz38ZPIegfuSMEcbOo0kkLGmPa8a0Qlz4dk7+cXYALDScWjIZzAm/u2+Frh+bcdZF6wZJZwwuJjY0WAjA== @@ -565,6 +565,15 @@ array-from "^2.1.1" lodash.get "^4.4.2" +"@sinonjs/samsam@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.1.tgz#cee77dc95f8d00339633e1683e026f2d73ed1d3a" + integrity sha512-7+5S4C4wpug5pzHS+z/63+XUwsH7dtyYELDafoT1QnfruFh7eFjlDWwZXltUB0GLk6y5eMeAt34Bjx8wJ4KfSA== + 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" @@ -2856,10 +2865,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-3.0.0.tgz#811330bf07ed3661c4b8bd72b18d9b6c6eb76f9f" - integrity sha512-EObFx5tioBMePHpU/gGczaY2YDqL255iwjmZwswu2CiwEW8xIGrr3E2xij+efIppS1nLQo9NyXSIUySGHUOhHQ== +nise@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-3.0.1.tgz#0659982af515e5aac15592226246243e8da0013d" + integrity sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/formatio" "^4.0.1" @@ -3665,17 +3674,17 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.0.1.tgz#c256376cd133dbb0c69ba4d73ed5bdd591597502" - integrity sha512-vbXMHBszVioyPsuRDLEiPEgvkZnbjfdCFvLYV4jONNJqZNLWTwZ/gYSNh3SuiT1w9MRXUz+S7aX0B4Ar2XI8iw== +sinon@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.0.2.tgz#cc5f6daa9cc351b86b03faaca1e9c3650a04ae11" + integrity sha512-8W1S7BnCyvk7SK+Xi15B1QAVLuS81G/NGmWefPb31+ly6xI3fXaug/g5oUdfc8+7ruC4Ay51AxuLlYm8diq6kA== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/formatio" "^4.0.1" - "@sinonjs/samsam" "^4.0.1" + "@sinonjs/samsam" "^4.2.1" diff "^4.0.1" lolex "^5.1.2" - nise "^3.0.0" + nise "^3.0.1" supports-color "^7.1.0" slash@^3.0.0: @@ -3996,7 +4005,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8: +type-detect@4.0.8, 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== From 7cc18f7822e5ae65e9ae07a335de4e73878f3698 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 5 Jan 2020 06:09:31 +0000 Subject: [PATCH 199/341] Update dependency inquirer to v7.0.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cf6500a1..9c82e336 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "4.0.1", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.0.1", + "inquirer": "7.0.2", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 77528f71..946c3fe0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2186,10 +2186,10 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" - integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== +inquirer@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.2.tgz#b39b205b95c9424839a1fd991d60426cf9bbc0e9" + integrity sha512-cZGvHaHwcR9E3xK9EGO5pHKELU+yaeJO7l2qGKIbqk4bCuDuAn15LCoUTS2nSkfv9JybFlnAGrOcVpCDZZOLhw== dependencies: ansi-escapes "^4.2.1" chalk "^2.4.2" From 1aa5fb0e9ff4a921fc7d68749f42539b1f1cd60b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 6 Jan 2020 09:19:31 +0000 Subject: [PATCH 200/341] Update dependency commander to v4.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9c82e336..0eb69bbb 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "3.0.0", - "commander": "4.0.1", + "commander": "4.1.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.0.2", diff --git a/yarn.lock b/yarn.lock index 946c3fe0..0bcfce58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1180,10 +1180,10 @@ 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== -commander@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" - integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== +commander@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" + integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== common-path-prefix@^1.0.0: version "1.0.0" From 93ba58538f853c7d0d8b314a77b769c7b900725b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 28 Jan 2020 19:41:14 +0000 Subject: [PATCH 201/341] Update dependency @types/node to v11.15.5 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0eb69bbb..04218a25 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.3", + "@types/node": "11.15.5", "ava": "2.4.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 0bcfce58..51d9a10e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -615,10 +615,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.3": - version "11.15.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.3.tgz#cb7f19846a83ac5a88fc22756b74633cdeb476a7" - integrity sha512-5RzvXVietaB8S4dwDjxjltAOHtTO87fiksjqjWGZih97j6KSrdCDaRfmYMNrgrLM87odGBrsTHAl6N3fLraQaw== +"@types/node@11.15.5": + version "11.15.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.5.tgz#a8fe0c37e7db0099015baf8adafef60e71f568d5" + integrity sha512-rqXbkoHWqRWdw9ncT3GqKL7OSm77QGOf4/cJPinoeLEzpErdKQZlpwJApETuDtecW55UDJpugnSMkbffh68geA== acorn-jsx@^5.1.0: version "5.1.0" From 6dba88823a40f0a43ec849d99480c8c15e4b09a6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 29 Jan 2020 17:57:58 +0000 Subject: [PATCH 202/341] Update dependency sinon to v8.1.1 --- package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 04218a25..10afd3f7 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", "rimraf": "3.0.0", - "sinon": "8.0.2" + "sinon": "8.1.1" } } diff --git a/yarn.lock b/yarn.lock index 51d9a10e..0fbaaad8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -565,10 +565,10 @@ array-from "^2.1.1" lodash.get "^4.4.2" -"@sinonjs/samsam@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.1.tgz#cee77dc95f8d00339633e1683e026f2d73ed1d3a" - integrity sha512-7+5S4C4wpug5pzHS+z/63+XUwsH7dtyYELDafoT1QnfruFh7eFjlDWwZXltUB0GLk6y5eMeAt34Bjx8wJ4KfSA== +"@sinonjs/samsam@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.2.tgz#0f6cb40e467865306d8a20a97543a94005204e23" + integrity sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -1401,10 +1401,10 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -diff@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" - integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== +diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dir-glob@^3.0.1: version "3.0.1" @@ -3674,15 +3674,15 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.0.2.tgz#cc5f6daa9cc351b86b03faaca1e9c3650a04ae11" - integrity sha512-8W1S7BnCyvk7SK+Xi15B1QAVLuS81G/NGmWefPb31+ly6xI3fXaug/g5oUdfc8+7ruC4Ay51AxuLlYm8diq6kA== +sinon@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.1.1.tgz#21fffd5ad0a2d072a8aa7f8a3cf7ed2ced497497" + integrity sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/formatio" "^4.0.1" - "@sinonjs/samsam" "^4.2.1" - diff "^4.0.1" + "@sinonjs/samsam" "^4.2.2" + diff "^4.0.2" lolex "^5.1.2" nise "^3.0.1" supports-color "^7.1.0" From 3b76451cff8acda3020fde9b4bbd7e7c9b6fefa9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 9 Feb 2020 06:39:36 +0000 Subject: [PATCH 203/341] Update dependency rimraf to v3.0.2 --- package.json | 2 +- yarn.lock | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 10afd3f7..3c7be9d5 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", - "rimraf": "3.0.0", + "rimraf": "3.0.2", "sinon": "8.1.1" } } diff --git a/yarn.lock b/yarn.lock index 0fbaaad8..2fc7f45a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3555,7 +3555,14 @@ rimraf@2.6.3, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@3.0.0, rimraf@^3.0.0: +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== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== From 4b8ef291e2aedf519c0b2a0f32daf4230a460d7f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 Feb 2020 14:08:02 +0000 Subject: [PATCH 204/341] Update dependency inquirer to v7.0.4 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3c7be9d5..73cf335b 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "4.1.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.0.2", + "inquirer": "7.0.4", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 2fc7f45a..e6e75709 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2186,10 +2186,10 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.2.tgz#b39b205b95c9424839a1fd991d60426cf9bbc0e9" - integrity sha512-cZGvHaHwcR9E3xK9EGO5pHKELU+yaeJO7l2qGKIbqk4bCuDuAn15LCoUTS2nSkfv9JybFlnAGrOcVpCDZZOLhw== +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== dependencies: ansi-escapes "^4.2.1" chalk "^2.4.2" From d1dce040f26e1d5bcfd456e6dbbb388bf0692c7f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 Feb 2020 14:21:41 +0000 Subject: [PATCH 205/341] Update dependency ava to v3 --- package.json | 2 +- yarn.lock | 1614 +++++++++++++------------------------------------- 2 files changed, 429 insertions(+), 1187 deletions(-) diff --git a/package.json b/package.json index 73cf335b..1b927ce6 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.5", - "ava": "2.4.0", + "ava": "3.3.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.19.1", diff --git a/yarn.lock b/yarn.lock index e6e75709..5f22ce0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,30 +2,6 @@ # yarn lockfile v1 -"@ava/babel-plugin-throws-helper@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-4.0.0.tgz#8f5b45b7a0a79c6f4032de2101e0c221847efb62" - integrity sha512-3diBLIVBPPh3j4+hb5lo0I1D+S/O/VDJPI4Y502apBxmwEqjyXG4gTSPFUlm41sSZeZzMarT/Gzovw9kV7An0w== - -"@ava/babel-preset-stage-4@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-4.0.0.tgz#9be5a59ead170062e228bb6ffd2b29f0489424fd" - integrity sha512-lZEV1ZANzfzSYBU6WHSErsy7jLPbD1iIgAboASPMcKo7woVni5/5IKWeT0RxC8rY802MFktur3OKEw2JY1Tv2w== - dependencies: - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" - -"@ava/babel-preset-transform-test-files@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-6.0.0.tgz#639e8929d2cdc8863c1f16020ce644c525723cd4" - integrity sha512-8eKhFzZp7Qcq1VLfoC75ggGT8nQs9q8fIxltU47yCB7Wi7Y8Qf6oqY1Bm0z04fIec24vEgr0ENhDHEOUGVDqnA== - dependencies: - "@ava/babel-plugin-throws-helper" "^4.0.0" - babel-plugin-espower "^3.0.1" - "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -40,26 +16,6 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48" - integrity sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.0" - "@babel/helpers" "^7.6.0" - "@babel/parser" "^7.6.0" - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.0" - "@babel/types" "^7.6.0" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/core@^7.7.5": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" @@ -80,39 +36,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" - integrity sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ== - dependencies: - "@babel/types" "^7.1.3" - jsesc "^2.5.1" - lodash "^4.17.10" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" - integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== - dependencies: - "@babel/types" "^7.4.0" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56" - integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA== - dependencies: - "@babel/types" "^7.6.0" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - trim-right "^1.0.1" - "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" @@ -123,22 +46,6 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== - dependencies: - "@babel/types" "^7.0.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== - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - "@babel/helper-function-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" @@ -148,13 +55,6 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" -"@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== - dependencies: - "@babel/types" "^7.0.0" - "@babel/helper-get-function-arity@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" @@ -162,70 +62,6 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-transforms@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" - integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.4.4" - lodash "^4.17.11" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" - integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== - dependencies: - lodash "^4.17.11" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-split-export-declaration@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" - integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== - dependencies: - "@babel/types" "^7.4.0" - -"@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== - dependencies: - "@babel/types" "^7.4.4" - "@babel/helper-split-export-declaration@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" @@ -233,25 +69,6 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.0.tgz#21961d16c6a3c3ab597325c34c465c0887d31c6e" - integrity sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ== - dependencies: - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.0" - "@babel/types" "^7.6.0" - "@babel/helpers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" @@ -270,123 +87,11 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.2": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" - integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== - -"@babel/parser@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" - integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== - -"@babel/parser@^7.4.4": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" - integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== - -"@babel/parser@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b" - integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ== - "@babel/parser@^7.7.4", "@babel/parser@^7.7.5", "@babel/parser@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-dynamic-import@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" - integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== - dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/template@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" - integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.1.2" - "@babel/types" "^7.1.2" - -"@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/template@^7.6.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/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -396,36 +101,6 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/traverse@^7.1.0": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" - integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/types" "^7.4.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/traverse@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516" - integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" @@ -441,42 +116,6 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" - integrity sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" - -"@babel/types@^7.2.0", "@babel/types@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" - integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@babel/types@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" - integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@babel/types@^7.6.0": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" - integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" @@ -516,11 +155,24 @@ "@nodelib/fs.stat" "2.0.1" run-parallel "^1.1.9" +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + "@nodelib/fs.stat@2.0.1", "@nodelib/fs.stat@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz#814f71b1167390cfcb6a6b3d9cdeb0951a192c14" integrity sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw== +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + "@nodelib/fs.walk@^1.2.1": version "1.2.2" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz#6a6450c5e17012abd81450eb74949a4d970d2807" @@ -529,6 +181,14 @@ "@nodelib/fs.scandir" "2.1.1" fastq "^1.6.0" +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -620,6 +280,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.5.tgz#a8fe0c37e7db0099015baf8adafef60e71f568d5" integrity sha512-rqXbkoHWqRWdw9ncT3GqKL7OSm77QGOf4/cJPinoeLEzpErdKQZlpwJApETuDtecW55UDJpugnSMkbffh68geA== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + acorn-jsx@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" @@ -699,10 +364,18 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.0.2.tgz#ddb3a8495d44875423af7b919aace11e91732a41" - integrity sha512-rUe9SxpRQlVg4EM8It7JMNWWYHAirTPpbTuvaSKybb5IejNgWB3PGBBX9rrPKDx2pM/p3Wh+7+ASaWRyyAbxmQ== +ansi-styles@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@~3.1.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" @@ -726,11 +399,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -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== - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -749,28 +417,11 @@ array-includes@^3.0.3: define-properties "^1.1.2" es-abstract "^1.7.0" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - 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-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-uniq@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" - integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== - array.prototype.flat@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz#8f3c71d245ba349b6b64b4078f76f5576f1fd723" @@ -780,6 +431,11 @@ array.prototype.flat@^1.2.1: es-abstract "^1.15.0" function-bind "^1.1.1" +arrgv@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arrgv/-/arrgv-1.0.2.tgz#025ed55a6a433cad9b604f8112fc4292715a6ec0" + integrity sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw== + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -795,104 +451,68 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -ava@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-2.4.0.tgz#a3bd8b0e01d8826004c91de375eb2313ba5237c3" - integrity sha512-CQWtzZZZeU2g4StojRv6MO9RIRi4sLxGSB9+3C3hv0ttUEG1tkJLTLyrBQeFS4WEeK12Z4ovE3f2iPVhSy8elA== +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== + +ava@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.3.0.tgz#f95d9630e0811e7c03cbd1fa1316a9c8a872c6bb" + integrity sha512-RaH6jpiS/9ZdIuP1QkyhHvhprk0h38LVdkkpL7Mw25XR3z/6w1N3Nq9O2qm3awnw38CfIztmipzkv+671nWH2w== dependencies: - "@ava/babel-preset-stage-4" "^4.0.0" - "@ava/babel-preset-transform-test-files" "^6.0.0" - "@babel/core" "^7.6.0" - "@babel/generator" "^7.6.0" "@concordance/react" "^2.0.0" - ansi-escapes "^4.2.1" - ansi-styles "^4.1.0" - arr-flatten "^1.1.0" - array-union "^2.1.0" - array-uniq "^2.1.0" + ansi-styles "^4.2.1" + arrgv "^1.0.2" arrify "^2.0.1" - bluebird "^3.5.5" - chalk "^2.4.2" - chokidar "^3.0.2" - chunkd "^1.0.0" + chalk "^3.0.0" + chokidar "^3.3.1" + chunkd "^2.0.1" ci-parallel-vars "^1.0.0" clean-stack "^2.2.0" clean-yaml-object "^0.1.0" cli-cursor "^3.1.0" - cli-truncate "^2.0.0" + cli-truncate "^2.1.0" code-excerpt "^2.1.1" - common-path-prefix "^1.0.0" + common-path-prefix "^3.0.0" concordance "^4.0.0" - convert-source-map "^1.6.0" + convert-source-map "^1.7.0" currently-unhandled "^0.4.1" debug "^4.1.1" - del "^4.1.1" - dot-prop "^5.1.0" - emittery "^0.4.1" - empower-core "^1.2.0" + del "^5.1.0" + emittery "^0.5.1" equal-length "^1.0.0" - escape-string-regexp "^2.0.0" - esm "^3.2.25" - figures "^3.0.0" - find-up "^4.1.0" - get-port "^5.0.0" - globby "^10.0.1" + figures "^3.1.0" + globby "^11.0.0" ignore-by-default "^1.0.0" import-local "^3.0.2" indent-string "^4.0.0" is-ci "^2.0.0" is-error "^2.2.2" - is-observable "^2.0.0" is-plain-object "^3.0.0" is-promise "^2.1.0" lodash "^4.17.15" - loud-rejection "^2.1.0" - make-dir "^3.0.0" - matcher "^2.0.0" + matcher "^2.1.0" md5-hex "^3.0.1" - meow "^5.0.0" - micromatch "^4.0.2" ms "^2.1.2" - observable-to-promise "^1.0.0" - ora "^3.4.0" - package-hash "^4.0.0" + ora "^4.0.3" + p-map "^3.0.0" + picomatch "^2.2.1" pkg-conf "^3.1.0" plur "^3.1.1" - pretty-ms "^5.0.0" - require-precompiled "^0.1.0" + pretty-ms "^5.1.0" + read-pkg "^5.2.0" resolve-cwd "^3.0.0" slash "^3.0.0" - source-map-support "^0.5.13" - stack-utils "^1.0.2" - strip-ansi "^5.2.0" - strip-bom-buf "^2.0.0" + source-map-support "^0.5.16" + stack-utils "^2.0.1" + strip-ansi "^6.0.0" supertap "^1.0.0" - supports-color "^7.0.0" + temp-dir "^2.0.0" trim-off-newlines "^1.0.1" - trim-right "^1.0.1" - unique-temp-dir "^1.0.0" - update-notifier "^3.0.1" - write-file-atomic "^3.0.0" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-espower@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-3.0.1.tgz#180db17126f88e754105b8b5216d21e520a6bd4e" - integrity sha512-Ms49U7VIAtQ/TtcqRbD6UBmJBUCSxiC3+zPc+eGqxKUIFO1lTshyEDRUjhoAbd2rWfwYf3cZ62oXozrd8W6J0A== - dependencies: - "@babel/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - call-matcher "^1.0.0" - core-js "^2.0.0" - espower-location-detector "^1.0.0" - espurify "^1.6.0" - estraverse "^4.1.1" + update-notifier "^4.0.0" + write-file-atomic "^3.0.1" + yargs "^15.1.0" balanced-match@^1.0.0: version "1.0.0" @@ -904,29 +524,24 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== -bluebird@^3.5.5: - version "3.5.5" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== - blueimp-md5@^2.10.0: version "2.11.1" resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.11.1.tgz#b1f6b6218d13cdedbf5743f32b3023b2afefcbd3" integrity sha512-4UiOAmql2XO0Sws07OVzYdCKK0K2Va5g6AVgYXoGhEQiKrdSOefjUCm1frPk6E+xiIOHRqaFg+TUGo7cClKg5g== -boxen@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb" - integrity sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A== +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== dependencies: ansi-align "^3.0.0" camelcase "^5.3.1" - chalk "^2.4.2" + chalk "^3.0.0" cli-boxes "^2.2.0" - string-width "^3.0.0" - term-size "^1.2.0" - type-fest "^0.3.0" - widest-line "^2.0.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" brace-expansion@^1.1.7: version "1.1.11" @@ -936,7 +551,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1, 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== @@ -976,40 +591,11 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-matcher@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.1.0.tgz#23b2c1bc7a8394c8be28609d77ddbd5786680432" - integrity sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw== - dependencies: - core-js "^2.0.0" - deep-equal "^1.0.0" - espurify "^1.6.0" - estraverse "^4.0.0" - -call-signature@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" - integrity sha1-qEq8glpV70yysCi9dOIFpluaSZY= - callsites@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -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: version "5.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.0.tgz#0a110882cbeba41f72f99fcf918f4a0a92a13ebf" @@ -1020,7 +606,7 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@3.0.0: +chalk@3.0.0, chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== @@ -1028,7 +614,7 @@ chalk@3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: +chalk@^2.0.0, chalk@^2.1.0: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== @@ -1051,25 +637,25 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -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== - 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" +chokidar@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" optionalDependencies: - fsevents "^2.0.6" + fsevents "~2.1.2" -chunkd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-1.0.0.tgz#4ead4a3704bcce510c4bb4d4a8be30c557836dd1" - integrity sha512-xx3Pb5VF9QaqCotolyZ1ywFBgyuJmu6+9dLiqBxgelEse9Xsr3yUlpoX3O4Oh11M00GT2kYMsRByTKIMJW2Lkg== +chunkd@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920" + integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== ci-info@^2.0.0: version "2.0.0" @@ -1096,13 +682,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-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -1110,18 +689,18 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.0.0.tgz#4b078756fc17a8f72043fdc9f1f14bf4fa87e2df" - integrity sha512-yiEBmhaKPPeBj7wWm4GEdtPZK940p9pl3EANIrnJ3JnvWyrPjcFcsEq6qRUuQ7fzB0+Y82ld3p6B34xo95foWw== +cli-spinners@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" + integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== -cli-truncate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.0.0.tgz#68ff6aaa53b203b52ad89b8b1a80f1f61ad1e1d5" - integrity sha512-C4hp+8GCIFVsUUiXcw+ce+7wexVWImw8rQrgMBFsqerx9LvvcGlwm6sMjQYAEmV/Xb87xc1b5Ttx505MSpZVqg== +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: - slice-ansi "^2.1.0" - string-width "^4.1.0" + slice-ansi "^3.0.0" + string-width "^4.2.0" cli-width@^2.0.0: version "2.2.0" @@ -1185,10 +764,10 @@ commander@4.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== -common-path-prefix@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" - integrity sha1-zVL28HEuC6q5fW+XModPIvR3UsA= +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== commondir@^1.0.1: version "1.0.1" @@ -1217,30 +796,23 @@ concordance@^4.0.0: semver "^5.5.1" well-known-symbols "^2.0.0" -configstore@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" - integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== +configstore@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.0.tgz#37de662c7a49b5fe8dbcf8f6f5818d2d81ed852b" + integrity sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ== dependencies: - dot-prop "^4.1.0" + dot-prop "^5.1.0" graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -convert-source-map@^1.1.0, convert-source-map@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -1253,20 +825,6 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= -core-js@^2.0.0: - version "2.5.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" - integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1287,10 +845,10 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "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== currently-unhandled@^0.4.1: version "0.4.1" @@ -1327,15 +885,7 @@ debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, 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= @@ -1347,11 +897,6 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -deep-equal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -1388,18 +933,19 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== +del@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" diff@^4.0.2: version "4.0.2" @@ -1428,13 +974,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - dependencies: - is-obj "^1.0.0" - dot-prop@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.1.0.tgz#bdd8c986a77b83e3fca524e53786df916cabbd8a" @@ -1447,10 +986,10 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -emittery@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" - integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== +emittery@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.5.1.tgz#9fbbf57e9aecc258d727d78858a598eb05ea5c96" + integrity sha512-sYZXNHH9PhTfs98ROEFVC3bLiR8KSqXQsEHIwZ9J6H0RaQObC3JYq4G8IvDd0b45/LxfGKYBpmaUN4LiKytaNw== emoji-regex@^7.0.1: version "7.0.3" @@ -1462,14 +1001,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -empower-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-1.2.0.tgz#ce3fb2484d5187fa29c23fba8344b0b2fdf5601c" - integrity sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ== - dependencies: - call-signature "0.0.2" - core-js "^2.0.0" - end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -1689,21 +1220,11 @@ eslint@6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esm@3.2.25, esm@^3.2.25: +esm@3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espower-location-detector@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" - integrity sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU= - dependencies: - is-url "^1.2.1" - path-is-absolute "^1.0.0" - source-map "^0.5.0" - xtend "^4.0.0" - espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -1718,13 +1239,6 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -espurify@^1.6.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.8.1.tgz#5746c6c1ab42d302de10bd1d5bf7f0e8c0515056" - integrity sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg== - dependencies: - core-js "^2.0.0" - esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -1749,19 +1263,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -1793,6 +1294,17 @@ fast-glob@^3.0.3: merge2 "^1.2.3" micromatch "^4.0.2" +fast-glob@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" + integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + 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" @@ -1817,6 +1329,13 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + 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" @@ -1906,10 +1425,10 @@ 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.0.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a" - integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ== +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== function-bind@^1.1.1: version "1.1.1" @@ -1926,18 +1445,6 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-port@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.0.0.tgz#aa22b6b86fd926dd7884de3e23332c9f70c031a6" - integrity sha512-imzMU0FjsZqNa6BqOjbbW6w5BivHIuQKopjpPqcnx0AVHJQKCxK1O+Ab3OrVXhrekqfVMjwA9ZYu062R+KcIsQ== - dependencies: - type-fest "^0.3.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: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -1960,7 +1467,14 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" -glob@^7.0.3, glob@^7.1.3: +glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + 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== @@ -1984,12 +1498,12 @@ glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= +global-dirs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" + integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== dependencies: - ini "^1.3.4" + ini "^1.3.5" globals@^11.1.0: version "11.8.0" @@ -2017,16 +1531,17 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= +globby@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" + integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" got@^9.6.0: version "9.6.0" @@ -2045,16 +1560,21 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - graceful-fs@^4.1.15: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + +graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2132,6 +1652,11 @@ ignore@^5.1.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== +ignore@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + import-fresh@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" @@ -2158,7 +1683,7 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.0.0, indent-string@^3.2.0: +indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -2181,7 +1706,7 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@~1.3.0: +ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -2234,7 +1759,7 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-binary-path@^2.1.0: +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== @@ -2285,69 +1810,50 @@ 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.0, is-glob@^4.0.1: +is-glob@^4.0.0, 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== dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= +is-installed-globally@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.1.tgz#679afef819347a72584617fd19497f010b8ed35f" + integrity sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg== dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" + global-dirs "^2.0.1" + is-path-inside "^3.0.1" -is-npm@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" - integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +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@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-observable@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-2.0.0.tgz#327af1e8cdea9cd717f95911b87c5d34301721a6" - integrity sha512-fhBZv3eFKUbyHXZ1oHujdo2tZ+CNbdpdzzlENgCGZUC8keoGxUew2jYFLYcUB4qo7LDD03o4KK11m/QYD7kEjg== - -is-path-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.0.0.tgz#d4777a8e227a00096a31f030db3770f84b116c02" - integrity sha512-m5dHHzpOXEiv18JEORttBO64UgTEypx99vCxQLjbBvGhOJxnTNglYoFXxwo6AbsQb79sqqycQEHv2hWkHZAijA== + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-in-cwd@^2.0.0: +is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.0.0.tgz#68e452a6eec260500cec21e029c0a44cc0dcd2ea" - integrity sha512-6Vz5Gc9s/sDA3JBVu0FzWufm8xaBsqy1zn8Q6gmvGP6nSDMw78aS4poBNeatWjaRpTpxxLn1WOndAiOlk+qY8A== - dependencies: - is-path-inside "^1.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -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-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== is-plain-object@^3.0.0: version "3.0.0" @@ -2385,16 +1891,6 @@ is-typedarray@^1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-url@^1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2520,11 +2016,6 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= -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" @@ -2579,6 +2070,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -2589,16 +2085,6 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - load-json-file@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.2.0.tgz#1553627a18bf7b08cd7ec232d63981239085a578" @@ -2657,7 +2143,7 @@ lodash.merge@^4.6.1: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.10, lodash@^4.17.11: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -2667,12 +2153,12 @@ lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -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== +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== dependencies: - chalk "^2.0.1" + chalk "^2.4.2" lolex@^5.0.1, lolex@^5.1.2: version "5.1.2" @@ -2681,42 +2167,11 @@ lolex@^5.0.1, lolex@^5.1.2: dependencies: "@sinonjs/commons" "^1.7.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -loud-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.1.0.tgz#4020547ddbc39ed711c8434326df9fc7d2395355" - integrity sha512-g/6MQxUXYHeVqZ4PGpPL1fS1fOvlXoi7bay0pizmjAd/3JhyXwxzwrnr74yzdmhuerlslbRJ3x7IOXzFz0cE5w== - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.2" - 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" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - make-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" @@ -2724,20 +2179,10 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -matcher@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.0.0.tgz#85fe38d97670dbd2a46590cf099401e2ffb4755c" - integrity sha512-nlmfSlgHBFx36j/Pl/KQPbIaqE8Zf0TqmSMjsuddHDg6PMSVgmyW9HpkLs0o0M1n2GIZ/S2BZBLIww/xjhiGng== +matcher@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.1.0.tgz#64e1041c15b993e23b786f93320a7474bf833c28" + integrity sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ== dependencies: escape-string-regexp "^2.0.0" @@ -2760,26 +2205,16 @@ md5-o-matic@^0.1.1: resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" - merge2@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== +merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" @@ -2788,11 +2223,6 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" -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.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -2810,14 +2240,6 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -2884,7 +2306,7 @@ node-preload@^0.2.0: dependencies: process-on-spawn "^1.0.0" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== @@ -2894,7 +2316,17 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^3.0.0: +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -2904,13 +2336,6 @@ normalize-url@^3.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -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" - nyc@15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.0.tgz#eb32db2c0f29242c2414fe46357f230121cfc162" @@ -2945,31 +2370,16 @@ nyc@15.0.0: uuid "^3.3.3" yargs "^15.0.2" -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - object-inspect@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -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== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" @@ -2980,14 +2390,6 @@ object.values@^1.1.0: function-bind "^1.1.1" has "^1.0.3" -observable-to-promise@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-1.0.0.tgz#37e136f16a15385ac063411ada0e1202bfff58f4" - integrity sha512-cqnGUrNsE6vdVDTPAX9/WeVzwy/z37vdxupdQXU8vgTXRFH72KCZiZga8aca2ulRPIeem8W3vW9rQHBwfIl2WA== - dependencies: - is-observable "^2.0.0" - symbol-observable "^1.0.4" - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2995,13 +2397,6 @@ 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" - onetime@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" @@ -3021,19 +2416,21 @@ optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -ora@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== +ora@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05" + integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg== dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-spinners "^2.2.0" + is-interactive "^1.0.0" + log-symbols "^3.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +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= @@ -3043,11 +2440,6 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -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-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -3090,11 +2482,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" - integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== - p-map@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" @@ -3154,6 +2541,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-ms@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" @@ -3174,12 +2571,7 @@ 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.1: - 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= @@ -3208,13 +2600,6 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3225,6 +2610,11 @@ picomatch@^2.0.4, picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.0.7, picomatch@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3235,23 +2625,6 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - pkg-conf@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" @@ -3291,10 +2664,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-ms@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.0.0.tgz#6133a8f55804b208e4728f6aa7bf01085e951e24" - integrity sha512-94VRYjL9k33RzfKiGokPBPpsmloBYSf5Ri+Pq19zlsEcUKFob+admeXr5eFDRuPjFmEOcjJvPGdillYOJyvZ7Q== +pretty-ms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.1.0.tgz#b906bdd1ec9e9799995c372e2b1c34f073f95384" + integrity sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw== dependencies: parse-ms "^2.1.0" @@ -3310,11 +2683,6 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -3328,11 +2696,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -3351,14 +2714,6 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -3368,41 +2723,22 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readdirp@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.1.tgz#b158123ac343c8b0f31d65680269cc0fc1025db1" - integrity sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ== - dependencies: - picomatch "^2.0.4" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" -regenerate-unicode-properties@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" - integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + picomatch "^2.0.7" regexpp@^2.0.1: version "2.0.1" @@ -3414,18 +2750,6 @@ regexpp@^3.0.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== -regexpu-core@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" - integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.0.2" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - registry-auth-token@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -3441,18 +2765,6 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" - release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" @@ -3470,11 +2782,6 @@ require-main-filename@^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== -require-precompiled@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" - integrity sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo= - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -3492,6 +2799,13 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve@^1.10.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + resolve@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" @@ -3527,14 +2841,6 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^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= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -3548,7 +2854,7 @@ reusify@^1.0.0: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3, rimraf@^2.6.3: +rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -3605,14 +2911,14 @@ safe-buffer@^5.0.1, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== dependencies: - semver "^5.0.3" + semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -3676,7 +2982,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= @@ -3708,10 +3014,19 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -source-map-support@^0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-map-support@^0.5.16: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -3769,18 +3084,12 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -stack-utils@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +stack-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.1.tgz#3df48345a3b92adc06038f0e95782df61beff742" + integrity sha512-BvBTnHGm8boe+HiJFqP19ywEsGlfQAKqW78pbfvUuzCbUuxPPUyLrH5dYFY+Xn9IpLY3b5ZmMcl8jAqXB4wddg== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + escape-string-regexp "^2.0.0" string-width@^3.0.0: version "3.1.0" @@ -3791,6 +3100,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.0.0, string-width@^4.2.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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string-width@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" @@ -3800,15 +3118,6 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" -string-width@^4.2.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== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - 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" @@ -3846,13 +3155,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom-buf@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz#ff9c223937f8e7154b77e9de9bde094186885c15" - integrity sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ== - dependencies: - is-utf8 "^0.2.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -3863,16 +3165,6 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -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-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - strip-json-comments@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" @@ -3901,13 +3193,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.0.0.tgz#f2392c50ab35bb3cae7beebf24d254a19f880c06" - integrity sha512-WRt32iTpYEZWYOpcetGm0NPeSvaebccx7hhS/5M6sAiqnhedtFCHFxkjzZlJvFNCPowiKSFGiZk5USQDFy83vQ== - dependencies: - has-flag "^4.0.0" - supports-color@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" @@ -3915,11 +3200,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -symbol-observable@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - table@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" @@ -3930,12 +3210,15 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +term-size@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" + integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== test-exclude@^6.0.0: version "6.0.0" @@ -3985,21 +3268,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - trim-off-newlines@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -4027,6 +3300,11 @@ type-fest@^0.5.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -4039,72 +3317,35 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -uid2@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" - integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= - underscore@^1.8.3: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - -unique-temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" - integrity sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U= +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: - mkdirp "^0.5.1" - os-tmpdir "^1.0.1" - uid2 "0.0.3" + crypto-random-string "^2.0.0" -update-notifier@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250" - integrity sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ== +update-notifier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.0.0.tgz#f344a6f8b03e00e31b323d632a0e632e9f0e0654" + integrity sha512-p9zf71hWt5GVXM4iEBujpUgx8mK9AWiCCapEJm/O1z5ntCim83Z1ATqzZFBHFYqx03laMqv8LiDgs/7ikXjf/g== dependencies: - boxen "^3.0.0" - chalk "^2.0.1" - configstore "^4.0.0" + boxen "^4.2.0" + chalk "^3.0.0" + configstore "^5.0.0" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" - is-installed-globally "^0.1.0" - is-npm "^3.0.0" + is-installed-globally "^0.3.1" + is-npm "^4.0.0" is-yarn-global "^0.3.0" latest-version "^5.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" uri-js@^4.2.2: version "4.2.2" @@ -4169,12 +3410,12 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: - string-width "^2.1.1" + string-width "^4.0.0" word-wrap@~1.2.3: version "1.2.3" @@ -4195,15 +3436,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - write-file-atomic@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.0.tgz#1b64dbbf77cb58fd09056963d63e62667ab4fb21" @@ -4214,6 +3446,16 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b" + integrity sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -4221,15 +3463,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== y18n@^4.0.0: version "4.0.0" @@ -4241,18 +3478,6 @@ yabf@2.1.0: resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.1.0.tgz#b67325eb9f16f14921cfe75985b9948b5b1429fe" integrity sha512-LmqXbL6JX8JHq5e3M2BnvijLvNHZToZseg5jbhs1ylHxHggPHFYRaFogBRBP2beyzsn4yTTmVUDb71AlJYEc6g== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^16.1.0: version "16.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" @@ -4277,3 +3502,20 @@ yargs@^15.0.2: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^16.1.0" + +yargs@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" + integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^16.1.0" From caad3676f9208213d78835f4f01c3e0af328eeb7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 Feb 2020 18:39:51 +0000 Subject: [PATCH 206/341] Update dependency @types/node to v11.15.6 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 1b927ce6..0c0d4527 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.5", + "@types/node": "11.15.6", "ava": "3.3.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index 5f22ce0d..2a85f33d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -275,10 +275,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.5": - version "11.15.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.5.tgz#a8fe0c37e7db0099015baf8adafef60e71f568d5" - integrity sha512-rqXbkoHWqRWdw9ncT3GqKL7OSm77QGOf4/cJPinoeLEzpErdKQZlpwJApETuDtecW55UDJpugnSMkbffh68geA== +"@types/node@11.15.6": + version "11.15.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.6.tgz#b4b525cc760e4efe614c5819c29232edc4241fa4" + integrity sha512-QylJmcJXqKCOhx1VE29kKA2wDjzVBQuKzoSJPykpelTmNQX/GAlPXgT1ZiIc6+sL81z66vXbrDexGale/JVIsQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 3c4948b0f35e8338a132245e23942a39d22b60dd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 13 Feb 2020 00:41:27 +0000 Subject: [PATCH 207/341] Update dependency eslint-plugin-import to v2.20.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0c0d4527..88727070 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "3.3.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.0", - "eslint-plugin-import": "2.19.1", + "eslint-plugin-import": "2.20.1", "eslint-plugin-node": "11.0.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", diff --git a/yarn.lock b/yarn.lock index 2a85f33d..b0c858cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1110,10 +1110,10 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@2.19.1: - version "2.19.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" - integrity sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw== +eslint-plugin-import@2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" + integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== dependencies: array-includes "^3.0.3" array.prototype.flat "^1.2.1" From 3abaa67ece00d58dc4362100bad95a0fa1b57c75 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 19 Feb 2020 11:34:25 +0000 Subject: [PATCH 208/341] Update dependency sinon to v9 --- package.json | 2 +- yarn.lock | 56 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 88727070..9fbc2a85 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", "rimraf": "3.0.2", - "sinon": "8.1.1" + "sinon": "9.0.0" } } diff --git a/yarn.lock b/yarn.lock index b0c858cd..ef6a65a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -208,6 +208,13 @@ dependencies: type-detect "4.0.8" +"@sinonjs/fake-timers@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz#b64b0faadfdd01a6dcf0c4dcdb78438d86fa7dbf" + integrity sha512-atR1J/jRXvQAb47gfzSK8zavXy7BcpnYq21ALon0U99etu99vsir0trzIO3wpeLtW+LLVY6X7EkfVTbjGSH8Ww== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/formatio@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-4.0.1.tgz#50ac1da0c3eaea117ca258b06f4f88a471668bdb" @@ -216,6 +223,14 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^4.2.0" +"@sinonjs/formatio@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.0.tgz#25036ae59a7c95f886c1578baaeb44c81f934c65" + integrity sha512-ejFRrFNMaTAmhg9u1lYKJQxDocowta6KQKFnBE7XtZb/AAPlLkWQQSaqwlGYnDWQ6paXzyM1vbMhLAujSFiVPw== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^4.2.0" + "@sinonjs/samsam@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.0.tgz#64a9994331cc3da0a0d7cc06cae44faa09cb5f2c" @@ -225,10 +240,10 @@ array-from "^2.1.1" lodash.get "^4.4.2" -"@sinonjs/samsam@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.2.tgz#0f6cb40e467865306d8a20a97543a94005204e23" - integrity sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA== +"@sinonjs/samsam@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.1.tgz#4b278c00181e19f1f84c1bc598a942aaba18bac0" + integrity sha512-iSZdE68szyFvV8ReYve6t4gAA1rLVwGyyhWBg9qrz8VAn1FH141gdg0NJcMrAJ069rD2XM2KQzY8ZNDgmTfBQA== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -2160,13 +2175,6 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -lolex@^5.0.1, lolex@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" - 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" @@ -2287,16 +2295,16 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-3.0.1.tgz#0659982af515e5aac15592226246243e8da0013d" - integrity sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA== +nise@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.1.tgz#16c1b893e8ac4e3958dcab5cc174c07c8ff42cdc" + integrity sha512-10PKL272rqg80o2RsWcTT6X9cDYqJ4kXqPTf8yCXPc9hbphZSDmbiG5FqUNeR5nouKCQMM24ld45kgYnBdx2rw== dependencies: "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" "@sinonjs/formatio" "^4.0.1" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" - lolex "^5.0.1" path-to-regexp "^1.7.0" node-preload@^0.2.0: @@ -2987,17 +2995,17 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.1.1.tgz#21fffd5ad0a2d072a8aa7f8a3cf7ed2ced497497" - integrity sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew== +sinon@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.0.tgz#9f1ed502fa2e287e65220de08f6a44f33e314006" + integrity sha512-c4bREcvuK5VuEGyMW/Oim9I3Rq49Vzb0aMdxouFaA44QCFpilc5LJOugrX+mkrvikbqCimxuK+4cnHVNnLR41g== dependencies: "@sinonjs/commons" "^1.7.0" - "@sinonjs/formatio" "^4.0.1" - "@sinonjs/samsam" "^4.2.2" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/formatio" "^5.0.0" + "@sinonjs/samsam" "^5.0.1" diff "^4.0.2" - lolex "^5.1.2" - nise "^3.0.1" + nise "^4.0.1" supports-color "^7.1.0" slash@^3.0.0: From d0369555a8dc1a2dd383905196b46410264d123b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 19 Feb 2020 19:28:21 +0000 Subject: [PATCH 209/341] Update dependency @types/node to v11.15.7 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9fbc2a85..469e961f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.6", + "@types/node": "11.15.7", "ava": "3.3.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.0", diff --git a/yarn.lock b/yarn.lock index ef6a65a0..79bde922 100644 --- a/yarn.lock +++ b/yarn.lock @@ -290,10 +290,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.6": - version "11.15.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.6.tgz#b4b525cc760e4efe614c5819c29232edc4241fa4" - integrity sha512-QylJmcJXqKCOhx1VE29kKA2wDjzVBQuKzoSJPykpelTmNQX/GAlPXgT1ZiIc6+sL81z66vXbrDexGale/JVIsQ== +"@types/node@11.15.7": + version "11.15.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.7.tgz#97559c6d7f8b15dcf275365512799f405c20cd4e" + integrity sha512-3c3Kc7VIdE5UpqpmztRy7FU+turZgIurGnwpGFy/fRFOirfPc7ZnoFL83qVoqEDENJENqDhtGyQZ5fkXNQ6Qkw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 6ef614e4737b1b3a44a2940d475d3f0bc7c6af6d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 19 Feb 2020 22:56:57 +0000 Subject: [PATCH 210/341] Update dependency commander to v4.1.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 469e961f..6dbda3a7 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "3.0.0", - "commander": "4.1.0", + "commander": "4.1.1", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.0.4", diff --git a/yarn.lock b/yarn.lock index 79bde922..00c58d17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -774,10 +774,10 @@ 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== -commander@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" - integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== +commander@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== common-path-prefix@^3.0.0: version "3.0.0" From 08cb331eb44040f1d6544865944a9f0feaba0853 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 23 Feb 2020 16:18:48 +0000 Subject: [PATCH 211/341] Update dependency ava to v3.4.0 --- package.json | 2 +- yarn.lock | 81 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 6dbda3a7..6d3508a1 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.7", - "ava": "3.3.0", + "ava": "3.4.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.20.1", diff --git a/yarn.lock b/yarn.lock index 00c58d17..d2ec9fec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -471,10 +471,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.3.0.tgz#f95d9630e0811e7c03cbd1fa1316a9c8a872c6bb" - integrity sha512-RaH6jpiS/9ZdIuP1QkyhHvhprk0h38LVdkkpL7Mw25XR3z/6w1N3Nq9O2qm3awnw38CfIztmipzkv+671nWH2w== +ava@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.4.0.tgz#0d082eb645e52e07fce03e3345ba5660891227aa" + integrity sha512-Y32CkzR8mrAmn0A9sWhq36kc9GR4eunZ4LZYoFi1VImhNfRh2zmI+8RcNdL/SYdQI1wIklK08rvDdCI58YQQEA== dependencies: "@concordance/react" "^2.0.0" ansi-styles "^4.2.1" @@ -514,8 +514,8 @@ ava@3.3.0: p-map "^3.0.0" picomatch "^2.2.1" pkg-conf "^3.1.0" - plur "^3.1.1" - pretty-ms "^5.1.0" + plur "^4.0.0" + pretty-ms "^6.0.0" read-pkg "^5.2.0" resolve-cwd "^3.0.0" slash "^3.0.0" @@ -525,7 +525,7 @@ ava@3.3.0: supertap "^1.0.0" temp-dir "^2.0.0" trim-off-newlines "^1.0.1" - update-notifier "^4.0.0" + update-notifier "^4.1.0" write-file-atomic "^3.0.1" yargs "^15.1.0" @@ -811,12 +811,12 @@ concordance@^4.0.0: semver "^5.5.1" well-known-symbols "^2.0.0" -configstore@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.0.tgz#37de662c7a49b5fe8dbcf8f6f5818d2d81ed852b" - integrity sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ== +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== dependencies: - dot-prop "^5.1.0" + dot-prop "^5.2.0" graceful-fs "^4.1.2" make-dir "^3.0.0" unique-string "^2.0.0" @@ -989,10 +989,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.1.0.tgz#bdd8c986a77b83e3fca524e53786df916cabbd8a" - integrity sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA== +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== dependencies: is-obj "^2.0.0" @@ -1086,6 +1086,11 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +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: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1764,10 +1769,10 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" -irregular-plurals@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" - integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== +irregular-plurals@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" + integrity sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q== is-arrayish@^0.2.1: version "0.2.1" @@ -2655,12 +2660,12 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -plur@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b" - integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w== +plur@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" + integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== dependencies: - irregular-plurals "^2.0.0" + irregular-plurals "^3.2.0" prelude-ls@~1.1.2: version "1.1.2" @@ -2672,10 +2677,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-ms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.1.0.tgz#b906bdd1ec9e9799995c372e2b1c34f073f95384" - integrity sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw== +pretty-ms@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-6.0.0.tgz#39a0eb5f31d359bcee43c9579e6ddf4a02a82ff0" + integrity sha512-X5i1y9/8VuBMb9WU8zubTiLKnJG4lcKvL7eaCEVc/jpTe3aS74gCcBM6Yd1vvUDoTCXm4Y15obNS/16yB0FTaQ== dependencies: parse-ms "^2.1.0" @@ -2704,6 +2709,13 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pupa@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" + integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== + dependencies: + escape-goat "^2.0.0" + rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -3337,14 +3349,14 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -update-notifier@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.0.0.tgz#f344a6f8b03e00e31b323d632a0e632e9f0e0654" - integrity sha512-p9zf71hWt5GVXM4iEBujpUgx8mK9AWiCCapEJm/O1z5ntCim83Z1ATqzZFBHFYqx03laMqv8LiDgs/7ikXjf/g== +update-notifier@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" + integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== dependencies: boxen "^4.2.0" chalk "^3.0.0" - configstore "^5.0.0" + configstore "^5.0.1" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" @@ -3352,6 +3364,7 @@ update-notifier@^4.0.0: is-npm "^4.0.0" is-yarn-global "^0.3.0" latest-version "^5.0.0" + pupa "^2.0.1" semver-diff "^3.1.1" xdg-basedir "^4.0.0" From 659b6e9702a7574ae0660813f831697234256237 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 1 Mar 2020 17:29:46 +0000 Subject: [PATCH 212/341] Update dependency ava to v3.5.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6d3508a1..ab5448f1 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.7", - "ava": "3.4.0", + "ava": "3.5.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.0", "eslint-plugin-import": "2.20.1", diff --git a/yarn.lock b/yarn.lock index d2ec9fec..2c9d959b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -471,10 +471,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.4.0.tgz#0d082eb645e52e07fce03e3345ba5660891227aa" - integrity sha512-Y32CkzR8mrAmn0A9sWhq36kc9GR4eunZ4LZYoFi1VImhNfRh2zmI+8RcNdL/SYdQI1wIklK08rvDdCI58YQQEA== +ava@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.5.0.tgz#589f0f35f51e6ab67eb230a9057fd2442807c62f" + integrity sha512-o+xq1RgAZrQ7GX5nddTNeYbUDogwlBoa/Hnt+b1ciCLLxSOj5U6ZFblLNBSKwHtP1X/8R06bmzvX47jmlVu9KQ== dependencies: "@concordance/react" "^2.0.0" ansi-styles "^4.2.1" From ca235c8434c15ed4a64211d4c80ca1f0c636598b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 2 Mar 2020 16:04:54 +0000 Subject: [PATCH 213/341] Update dependency inquirer to v7.0.5 --- package.json | 2 +- yarn.lock | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index ab5448f1..6b30f547 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "4.1.1", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.0.4", + "inquirer": "7.0.5", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 2c9d959b..68790e9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1731,23 +1731,23 @@ 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@7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== +inquirer@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.5.tgz#fb95b238ba19966c1a1f55db53c3f0ce5c9e4275" + integrity sha512-6Z5cP+LAO0rzNE7xWjWtT84jxKa5ScLEGLgegPXeO3dGeU8lNe5Ii7SlXH6KVtLGlDuaEhsvsFjrjWjw8j5lFg== dependencies: ansi-escapes "^4.2.1" - chalk "^2.4.2" + chalk "^3.0.0" cli-cursor "^3.1.0" cli-width "^2.0.0" external-editor "^3.0.3" figures "^3.0.0" lodash "^4.17.15" mute-stream "0.0.8" - run-async "^2.2.0" + run-async "^2.4.0" rxjs "^6.5.3" string-width "^4.1.0" - strip-ansi "^5.1.0" + strip-ansi "^6.0.0" through "^2.3.6" inquirer@^7.0.0: @@ -2902,6 +2902,13 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + dependencies: + is-promise "^2.1.0" + run-parallel@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" From 8c17ca7b11ecdf328af19c900e9ec5362a503353 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Mar 2020 13:21:55 +0000 Subject: [PATCH 214/341] Update dependency inquirer to v7.0.6 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6b30f547..dd20ee0a 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "4.1.1", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.0.5", + "inquirer": "7.0.6", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 68790e9a..df020df3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1731,10 +1731,10 @@ 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@7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.5.tgz#fb95b238ba19966c1a1f55db53c3f0ce5c9e4275" - integrity sha512-6Z5cP+LAO0rzNE7xWjWtT84jxKa5ScLEGLgegPXeO3dGeU8lNe5Ii7SlXH6KVtLGlDuaEhsvsFjrjWjw8j5lFg== +inquirer@7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.6.tgz#ee4ff0ea7ecda5324656fe665878790f66df7d0c" + integrity sha512-7SVO4h+QIdMq6XcqIqrNte3gS5MzCCKZdsq9DO4PJziBFNYzP3PGFbDjgadDb//MCahzgjCxvQ/O2wa7kx9o4w== dependencies: ansi-escapes "^4.2.1" chalk "^3.0.0" From 05d65a1e26288e9e901b9666ddc8e90f262c905c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 10 Mar 2020 09:14:04 +0000 Subject: [PATCH 215/341] Update dependency sinon to v9.0.1 --- package.json | 2 +- yarn.lock | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index dd20ee0a..b88ce496 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", "rimraf": "3.0.2", - "sinon": "9.0.0" + "sinon": "9.0.1" } } diff --git a/yarn.lock b/yarn.lock index df020df3..13d66dd9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -223,13 +223,13 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^4.2.0" -"@sinonjs/formatio@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.0.tgz#25036ae59a7c95f886c1578baaeb44c81f934c65" - integrity sha512-ejFRrFNMaTAmhg9u1lYKJQxDocowta6KQKFnBE7XtZb/AAPlLkWQQSaqwlGYnDWQ6paXzyM1vbMhLAujSFiVPw== +"@sinonjs/formatio@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" + integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== dependencies: "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^4.2.0" + "@sinonjs/samsam" "^5.0.2" "@sinonjs/samsam@^4.2.0": version "4.2.0" @@ -240,10 +240,10 @@ array-from "^2.1.1" lodash.get "^4.4.2" -"@sinonjs/samsam@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.1.tgz#4b278c00181e19f1f84c1bc598a942aaba18bac0" - integrity sha512-iSZdE68szyFvV8ReYve6t4gAA1rLVwGyyhWBg9qrz8VAn1FH141gdg0NJcMrAJ069rD2XM2KQzY8ZNDgmTfBQA== +"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" + integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -3014,15 +3014,15 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.0.tgz#9f1ed502fa2e287e65220de08f6a44f33e314006" - integrity sha512-c4bREcvuK5VuEGyMW/Oim9I3Rq49Vzb0aMdxouFaA44QCFpilc5LJOugrX+mkrvikbqCimxuK+4cnHVNnLR41g== +sinon@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.1.tgz#dbb18f7d8f5835bcf91578089c0a97b2fffdd73b" + integrity sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/fake-timers" "^6.0.0" - "@sinonjs/formatio" "^5.0.0" - "@sinonjs/samsam" "^5.0.1" + "@sinonjs/formatio" "^5.0.1" + "@sinonjs/samsam" "^5.0.3" diff "^4.0.2" nise "^4.0.1" supports-color "^7.1.0" From a69e01c07ac0fa02a294752aa7380e544a8ee529 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2020 22:50:21 +0000 Subject: [PATCH 216/341] Bump acorn from 7.1.0 to 7.1.1 Bumps [acorn](https://github.com/acornjs/acorn) from 7.1.0 to 7.1.1. - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/7.1.0...7.1.1) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 13d66dd9..9e18b1e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -306,9 +306,9 @@ acorn-jsx@^5.1.0: integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== aggregate-error@^3.0.0: version "3.0.1" From cbdb5d4913be65f5ccaf0de11b5ed8e06f7e4db5 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 13 Mar 2020 23:53:02 +0000 Subject: [PATCH 217/341] Update dependency inquirer to v7.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b88ce496..32150850 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "4.1.1", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.0.6", + "inquirer": "7.1.0", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 9e18b1e7..ad6a0f7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1731,10 +1731,10 @@ 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@7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.6.tgz#ee4ff0ea7ecda5324656fe665878790f66df7d0c" - integrity sha512-7SVO4h+QIdMq6XcqIqrNte3gS5MzCCKZdsq9DO4PJziBFNYzP3PGFbDjgadDb//MCahzgjCxvQ/O2wa7kx9o4w== +inquirer@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== dependencies: ansi-escapes "^4.2.1" chalk "^3.0.0" From a2de8bf4add8868d6296bc6b65e41c7c45c0065e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 20 Mar 2020 19:58:22 +0000 Subject: [PATCH 218/341] Update dependency eslint-config-standard to v14.1.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 32150850..b70645c7 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.15.7", "ava": "3.5.0", "eslint": "6.8.0", - "eslint-config-standard": "14.1.0", + "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.20.1", "eslint-plugin-node": "11.0.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index ad6a0f7e..7e4f75fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1101,10 +1101,10 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-config-standard@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz#b23da2b76fe5a2eba668374f246454e7058f15d4" - integrity sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA== +eslint-config-standard@14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" + integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== eslint-import-resolver-node@^0.3.2: version "0.3.2" From d33116857c8d76b391230de6cf72861e9cb6a09b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 20 Mar 2020 20:18:10 +0000 Subject: [PATCH 219/341] Update dependency commander to v5 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b70645c7..3ae3d131 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "3.0.0", - "commander": "4.1.1", + "commander": "5.0.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.1.0", diff --git a/yarn.lock b/yarn.lock index 7e4f75fc..facc54fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -774,10 +774,10 @@ 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== -commander@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.0.0.tgz#dbf1909b49e5044f8fdaf0adc809f0c0722bdfd0" + integrity sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ== common-path-prefix@^3.0.0: version "3.0.0" From 9679555cb1e22b5fb95bcb9bfa358e26a3be50ea Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 22 Mar 2020 12:20:13 +0000 Subject: [PATCH 220/341] Update dependency ava to v3.5.1 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3ae3d131..126da47e 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.7", - "ava": "3.5.0", + "ava": "3.5.1", "eslint": "6.8.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.20.1", diff --git a/yarn.lock b/yarn.lock index facc54fd..9e377299 100644 --- a/yarn.lock +++ b/yarn.lock @@ -471,10 +471,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.5.0.tgz#589f0f35f51e6ab67eb230a9057fd2442807c62f" - integrity sha512-o+xq1RgAZrQ7GX5nddTNeYbUDogwlBoa/Hnt+b1ciCLLxSOj5U6ZFblLNBSKwHtP1X/8R06bmzvX47jmlVu9KQ== +ava@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.5.1.tgz#6dde079621606824495957c78f95c8485639bc14" + integrity sha512-gde/nh438C6cj6/pKntjoPmGg1VSsZlRjyuYTjp0ixsNDj+1YNVeASrlzI+NgvcUmbx17G8uOgByt7lDu8ddXA== dependencies: "@concordance/react" "^2.0.0" ansi-styles "^4.2.1" @@ -483,6 +483,7 @@ ava@3.5.0: chalk "^3.0.0" chokidar "^3.3.1" chunkd "^2.0.1" + ci-info "^2.0.0" ci-parallel-vars "^1.0.0" clean-stack "^2.2.0" clean-yaml-object "^0.1.0" @@ -502,7 +503,6 @@ ava@3.5.0: ignore-by-default "^1.0.0" import-local "^3.0.2" indent-string "^4.0.0" - is-ci "^2.0.0" is-error "^2.2.2" is-plain-object "^3.0.0" is-promise "^2.1.0" From 33ce381106b797b14b7f3a34d554c9cf03ff0e05 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 27 Mar 2020 16:52:24 +0000 Subject: [PATCH 221/341] Update dependency @types/node to v11.15.8 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 126da47e..cbf3fb80 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.7", + "@types/node": "11.15.8", "ava": "3.5.1", "eslint": "6.8.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 9e377299..0214f90c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -290,10 +290,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.7": - version "11.15.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.7.tgz#97559c6d7f8b15dcf275365512799f405c20cd4e" - integrity sha512-3c3Kc7VIdE5UpqpmztRy7FU+turZgIurGnwpGFy/fRFOirfPc7ZnoFL83qVoqEDENJENqDhtGyQZ5fkXNQ6Qkw== +"@types/node@11.15.8": + version "11.15.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.8.tgz#c3a1ac3f65a9570f9165722948caac8a4953c9d0" + integrity sha512-D8rGbTabqe6PA14bmSTw4WIPLJkCb7eL7MlWCV4kv0LrIJzMyPjveeIc3kr8GsLt2Tc8cmkpmId6Gis2zPYclg== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 962e79afd524b5f8c3407e53d9bafc40be6bc4fb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Mar 2020 04:30:21 +0000 Subject: [PATCH 222/341] Update dependency eslint-plugin-import to v2.20.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cbf3fb80..b3017bfb 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "3.5.1", "eslint": "6.8.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.20.1", + "eslint-plugin-import": "2.20.2", "eslint-plugin-node": "11.0.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", diff --git a/yarn.lock b/yarn.lock index 0214f90c..3b4386d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1130,10 +1130,10 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" - integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== +eslint-plugin-import@2.20.2: + version "2.20.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" + integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== dependencies: array-includes "^3.0.3" array.prototype.flat "^1.2.1" From 567497cde3748d8b425bf53dc94bf0d10ac92501 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Mar 2020 06:08:07 +0000 Subject: [PATCH 223/341] Update dependency eslint-plugin-node to v11.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b3017bfb..0c926d41 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint": "6.8.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.20.2", - "eslint-plugin-node": "11.0.0", + "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", diff --git a/yarn.lock b/yarn.lock index 3b4386d8..e106d783 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1148,10 +1148,10 @@ eslint-plugin-import@2.20.2: read-pkg-up "^2.0.0" resolve "^1.12.0" -eslint-plugin-node@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz#365944bb0804c5d1d501182a9bc41a0ffefed726" - integrity sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg== +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 "^3.0.0" eslint-utils "^2.0.0" From e5315b9b6e92f057bc524744590661ba1f9d147c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Mar 2020 08:52:03 +0000 Subject: [PATCH 224/341] Update dependency ava to v3.5.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0c926d41..3dd8e6f1 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.8", - "ava": "3.5.1", + "ava": "3.5.2", "eslint": "6.8.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.20.2", diff --git a/yarn.lock b/yarn.lock index e106d783..9dba212b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -471,10 +471,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.5.1.tgz#6dde079621606824495957c78f95c8485639bc14" - integrity sha512-gde/nh438C6cj6/pKntjoPmGg1VSsZlRjyuYTjp0ixsNDj+1YNVeASrlzI+NgvcUmbx17G8uOgByt7lDu8ddXA== +ava@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.5.2.tgz#9a37305c03840c4b63eb53edae29741d8414633e" + integrity sha512-4MYpx0D7VQwzvqCOQsbnPK2Dmg7lipWe2k/n75i0cuFwuosq9MYIWc9MnmCZ1GIlPQ70qOP1DgQcD0ScH/W79Q== dependencies: "@concordance/react" "^2.0.0" ansi-styles "^4.2.1" From ff3415de1bb3c9d957fb1996f434ef00faa506e4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Mar 2020 22:45:48 +0000 Subject: [PATCH 225/341] Update dependency @types/node to v11.15.9 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3dd8e6f1..a466ada8 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.8", + "@types/node": "11.15.9", "ava": "3.5.2", "eslint": "6.8.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 9dba212b..363018e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -290,10 +290,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.8": - version "11.15.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.8.tgz#c3a1ac3f65a9570f9165722948caac8a4953c9d0" - integrity sha512-D8rGbTabqe6PA14bmSTw4WIPLJkCb7eL7MlWCV4kv0LrIJzMyPjveeIc3kr8GsLt2Tc8cmkpmId6Gis2zPYclg== +"@types/node@11.15.9": + version "11.15.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.9.tgz#656b2f61ebe6af278769dfc24e6ab00528a373eb" + integrity sha512-NcOiyA/gxMAounNa4IPm/e13kYqU48onEarMnbLzz3ynEdlxFKYFoBbMBSefAHJR77r9MCtD88J0Z2TVtNsBbw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From e2eb1878b8b84adbe275f76c8d996cda222e8fc3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 5 Apr 2020 14:39:00 +0000 Subject: [PATCH 226/341] Update dependency ava to v3.6.0 --- package.json | 2 +- yarn.lock | 96 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 63 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index a466ada8..096c5a00 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.9", - "ava": "3.5.2", + "ava": "3.6.0", "eslint": "6.8.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.20.2", diff --git a/yarn.lock b/yarn.lock index 363018e5..fe54e85d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -471,16 +471,16 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.5.2.tgz#9a37305c03840c4b63eb53edae29741d8414633e" - integrity sha512-4MYpx0D7VQwzvqCOQsbnPK2Dmg7lipWe2k/n75i0cuFwuosq9MYIWc9MnmCZ1GIlPQ70qOP1DgQcD0ScH/W79Q== +ava@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.6.0.tgz#1fa57f8601a81d11b4771ba701428d9972659dfd" + integrity sha512-cp+oK06JTFK9m4EhLq0APPSi6aTpwUOK0aKH5pCzIhU8AHFLXis0HNarfIr/EeBe9GzQKouuIsnlVedY7Lg0Cw== dependencies: "@concordance/react" "^2.0.0" ansi-styles "^4.2.1" arrgv "^1.0.2" arrify "^2.0.1" - chalk "^3.0.0" + chalk "^4.0.0" chokidar "^3.3.1" chunkd "^2.0.1" ci-info "^2.0.0" @@ -496,9 +496,9 @@ ava@3.5.2: currently-unhandled "^0.4.1" debug "^4.1.1" del "^5.1.0" - emittery "^0.5.1" + emittery "^0.6.0" equal-length "^1.0.0" - figures "^3.1.0" + figures "^3.2.0" globby "^11.0.0" ignore-by-default "^1.0.0" import-local "^3.0.2" @@ -511,11 +511,11 @@ ava@3.5.2: md5-hex "^3.0.1" ms "^2.1.2" ora "^4.0.3" - p-map "^3.0.0" - picomatch "^2.2.1" + p-map "^4.0.0" + picomatch "^2.2.2" pkg-conf "^3.1.0" plur "^4.0.0" - pretty-ms "^6.0.0" + pretty-ms "^6.0.1" read-pkg "^5.2.0" resolve-cwd "^3.0.0" slash "^3.0.0" @@ -526,8 +526,8 @@ ava@3.5.2: temp-dir "^2.0.0" trim-off-newlines "^1.0.1" update-notifier "^4.1.0" - write-file-atomic "^3.0.1" - yargs "^15.1.0" + write-file-atomic "^3.0.3" + yargs "^15.3.1" balanced-match@^1.0.0: version "1.0.0" @@ -647,6 +647,14 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -1001,10 +1009,10 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -emittery@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.5.1.tgz#9fbbf57e9aecc258d727d78858a598eb05ea5c96" - integrity sha512-sYZXNHH9PhTfs98ROEFVC3bLiR8KSqXQsEHIwZ9J6H0RaQObC3JYq4G8IvDd0b45/LxfGKYBpmaUN4LiKytaNw== +emittery@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.6.0.tgz#e85312468d77c3ed9a6adf43bb57d34849e0c95a" + integrity sha512-6EMRGr9KzYWp8DzHFZsKVZBsMO6QhAeHMeHND8rhyBNCHKMLpgW9tZv40bwN3rAIKRS5CxcK8oLRKUJSB9h7yQ== emoji-regex@^7.0.1: version "7.0.3" @@ -1349,10 +1357,10 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -2502,6 +2510,13 @@ p-map@^3.0.0: dependencies: aggregate-error "^3.0.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.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" @@ -2623,11 +2638,16 @@ picomatch@^2.0.4, picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== -picomatch@^2.0.7, picomatch@^2.2.1: +picomatch@^2.0.7: version "2.2.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== +picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -2677,10 +2697,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-ms@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-6.0.0.tgz#39a0eb5f31d359bcee43c9579e6ddf4a02a82ff0" - integrity sha512-X5i1y9/8VuBMb9WU8zubTiLKnJG4lcKvL7eaCEVc/jpTe3aS74gCcBM6Yd1vvUDoTCXm4Y15obNS/16yB0FTaQ== +pretty-ms@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-6.0.1.tgz#03ec6cfee20329f142645e63efad96bb775d3da4" + integrity sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw== dependencies: parse-ms "^2.1.0" @@ -3474,10 +3494,10 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b" - integrity sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw== +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" is-typedarray "^1.0.0" @@ -3514,6 +3534,14 @@ yargs-parser@^16.1.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^18.1.1: + version "18.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" + integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs@^15.0.2: version "15.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3" @@ -3531,10 +3559,10 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^16.1.0" -yargs@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" - integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== +yargs@^15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -3546,4 +3574,4 @@ yargs@^15.1.0: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^16.1.0" + yargs-parser "^18.1.1" From fe057bf915a1e615cfce8b9d372c9b86378da763 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 8 Apr 2020 11:49:34 +0000 Subject: [PATCH 227/341] Update dependency sinon to v9.0.2 --- package.json | 2 +- yarn.lock | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 096c5a00..61a3484a 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.0.0", "rimraf": "3.0.2", - "sinon": "9.0.1" + "sinon": "9.0.2" } } diff --git a/yarn.lock b/yarn.lock index fe54e85d..4910fe0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -208,6 +208,13 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" + integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== + dependencies: + type-detect "4.0.8" + "@sinonjs/fake-timers@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz#b64b0faadfdd01a6dcf0c4dcdb78438d86fa7dbf" @@ -215,6 +222,13 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/formatio@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-4.0.1.tgz#50ac1da0c3eaea117ca258b06f4f88a471668bdb" @@ -3034,13 +3048,13 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.1.tgz#dbb18f7d8f5835bcf91578089c0a97b2fffdd73b" - integrity sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg== +sinon@9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.2.tgz#b9017e24633f4b1c98dfb6e784a5f0509f5fd85d" + integrity sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A== dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/commons" "^1.7.2" + "@sinonjs/fake-timers" "^6.0.1" "@sinonjs/formatio" "^5.0.1" "@sinonjs/samsam" "^5.0.3" diff "^4.0.2" From 2e6abd167266dd35e1e2a70b7316c1f952817340 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 9 Apr 2020 19:52:05 +0000 Subject: [PATCH 228/341] Update dependency chalk to v4 --- package.json | 2 +- yarn.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 61a3484a..2802501d 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "yarn test:lint && yarn test:unit:coverage" }, "dependencies": { - "chalk": "3.0.0", + "chalk": "4.0.0", "commander": "5.0.0", "esm": "3.2.25", "gift": "0.10.2", diff --git a/yarn.lock b/yarn.lock index 4910fe0c..082a1b85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -635,10 +635,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@3.0.0, chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== +chalk@4.0.0, chalk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -661,10 +661,10 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" From 241a639bcb89b14070c204b08ea7ca85d0a30b92 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 9 Apr 2020 20:22:50 +0000 Subject: [PATCH 229/341] Update dependency nyc to v15.0.1 --- package.json | 2 +- yarn.lock | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 2802501d..833b8a0c 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", - "nyc": "15.0.0", + "nyc": "15.0.1", "rimraf": "3.0.2", "sinon": "9.0.2" } diff --git a/yarn.lock b/yarn.lock index 082a1b85..fd416194 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2019,10 +2019,10 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.0.tgz#d4d16d035db99581b6194e119bbf36c963c5eb70" - integrity sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A== +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -2334,7 +2334,7 @@ nise@^4.0.1: just-extend "^4.0.2" path-to-regexp "^1.7.0" -node-preload@^0.2.0: +node-preload@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== @@ -2371,10 +2371,10 @@ normalize-url@^3.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -nyc@15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.0.tgz#eb32db2c0f29242c2414fe46357f230121cfc162" - integrity sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg== +nyc@15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.1.tgz#bd4d5c2b17f2ec04370365a5ca1fc0ed26f9f93d" + integrity sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" @@ -2391,10 +2391,9 @@ nyc@15.0.0: istanbul-lib-processinfo "^2.0.2" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.0" - js-yaml "^3.13.1" + istanbul-reports "^3.0.2" make-dir "^3.0.0" - node-preload "^0.2.0" + node-preload "^0.2.1" p-map "^3.0.0" process-on-spawn "^1.0.0" resolve-from "^5.0.0" @@ -2402,7 +2401,6 @@ nyc@15.0.0: signal-exit "^3.0.2" spawn-wrap "^2.0.0" test-exclude "^6.0.0" - uuid "^3.3.3" yargs "^15.0.2" object-inspect@^1.7.0: From 49fc73fb8eb80a1f72c6daecf7fad70960dfff30 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 25 Apr 2020 02:32:27 +0000 Subject: [PATCH 230/341] Update dependency commander to v5.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 833b8a0c..a76ab548 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "4.0.0", - "commander": "5.0.0", + "commander": "5.1.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.1.0", diff --git a/yarn.lock b/yarn.lock index fd416194..7dcccad7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -796,10 +796,10 @@ 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== -commander@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.0.0.tgz#dbf1909b49e5044f8fdaf0adc809f0c0722bdfd0" - integrity sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ== +commander@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== common-path-prefix@^3.0.0: version "3.0.0" From 7343a42e6446eacf7529c1842dd225454dd7cc48 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 8 May 2020 20:18:34 +0000 Subject: [PATCH 231/341] Update dependency eslint to v7 --- package.json | 2 +- yarn.lock | 214 ++++++++++++++++++++++----------------------------- 2 files changed, 91 insertions(+), 125 deletions(-) diff --git a/package.json b/package.json index a76ab548..1c2f9f3d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.9", "ava": "3.6.0", - "eslint": "6.8.0", + "eslint": "7.0.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.20.2", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 7dcccad7..f71f2025 100644 --- a/yarn.lock +++ b/yarn.lock @@ -314,12 +314,12 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== -acorn-jsx@^5.1.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.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -acorn@^7.1.0: +acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== @@ -643,7 +643,7 @@ chalk@4.0.0, chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.1.0: +chalk@^2.0.0: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== @@ -862,17 +862,6 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= -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== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" @@ -882,6 +871,15 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" @@ -939,7 +937,7 @@ 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: +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= @@ -1200,13 +1198,6 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" @@ -1219,22 +1210,22 @@ eslint-visitor-keys@^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@6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.0.0.tgz#c35dfd04a4372110bd78c69a8d79864273919a08" + integrity sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" + chalk "^4.0.0" + cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.4.3" + eslint-utils "^2.0.0" eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + espree "^7.0.0" + esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" @@ -1247,17 +1238,16 @@ eslint@6.8.0: is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" + levn "^0.4.1" lodash "^4.17.14" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" table "^5.2.3" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -1267,13 +1257,13 @@ esm@3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== +espree@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.0.0.tgz#8a7a60f218e69f120a842dc24c5a88aa7748a74e" + integrity sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw== dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" + acorn "^7.1.1" + acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" esprima@^4.0.0: @@ -1281,12 +1271,12 @@ 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.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -1295,11 +1285,16 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1352,7 +1347,7 @@ fast-json-stable-stringify@^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= -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= @@ -2104,13 +2099,13 @@ latest-version@^5.0.0: dependencies: package-json "^6.3.0" -levn@^0.3.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= +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.1.2" - type-check "~0.3.2" + prelude-ls "^1.2.1" + type-check "~0.4.0" lines-and-columns@^1.1.6: version "1.1.6" @@ -2317,11 +2312,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -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== - nise@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.1.tgz#16c1b893e8ac4e3958dcab5cc174c07c8ff42cdc" @@ -2437,17 +2427,17 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== +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: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" + 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" ora@^4.0.3: version "4.0.3" @@ -2611,11 +2601,6 @@ 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-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.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -2699,10 +2684,10 @@ plur@^4.0.0: dependencies: irregular-plurals "^3.2.0" -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= +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== prepend-http@^2.0.0: version "2.0.0" @@ -2792,16 +2777,16 @@ readdirp@~3.3.0: dependencies: picomatch "^2.0.7" -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: version "3.0.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + registry-auth-token@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -2977,7 +2962,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -2997,16 +2982,16 @@ semver@^6.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== -semver@^6.1.2: - version "6.2.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" - integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== - 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.2.1: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" @@ -3017,13 +3002,6 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - 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" @@ -3031,11 +3009,6 @@ shebang-command@^2.0.0: 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= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -3224,10 +3197,10 @@ strip-bom@^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.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== strip-json-comments@~2.0.1: version "2.0.1" @@ -3337,12 +3310,12 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= +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.1.2" + prelude-ls "^1.2.1" type-detect@4.0.8, type-detect@^4.0.8: version "4.0.8" @@ -3456,13 +3429,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -3477,7 +3443,7 @@ widest-line@^3.1.0: dependencies: string-width "^4.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== From 39b6fd7a1a1468bbc59082b5faeea158ec1424d1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 12 May 2020 12:23:13 +0000 Subject: [PATCH 232/341] Update dependency ava to v3.8.2 --- package.json | 2 +- yarn.lock | 143 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 94 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 1c2f9f3d..7fa05b39 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.9", - "ava": "3.6.0", + "ava": "3.8.2", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.20.2", diff --git a/yarn.lock b/yarn.lock index f71f2025..8b0775fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -319,6 +319,11 @@ acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-walk@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" + integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== + acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" @@ -485,21 +490,23 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.6.0.tgz#1fa57f8601a81d11b4771ba701428d9972659dfd" - integrity sha512-cp+oK06JTFK9m4EhLq0APPSi6aTpwUOK0aKH5pCzIhU8AHFLXis0HNarfIr/EeBe9GzQKouuIsnlVedY7Lg0Cw== +ava@3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.8.2.tgz#877c9eb861763a185bbabd54f359e1fbe57d1754" + integrity sha512-sph3oUsVTGsq4qbgeWys03QKCmXjkZUO3oPnFWXEW6g1SReCY9vuONGghMgw1G6VOzkg1k+niqJsOzwfO8h9Ng== dependencies: "@concordance/react" "^2.0.0" + acorn "^7.1.1" + acorn-walk "^7.1.1" ansi-styles "^4.2.1" arrgv "^1.0.2" arrify "^2.0.1" + callsites "^3.1.0" chalk "^4.0.0" - chokidar "^3.3.1" + chokidar "^3.4.0" chunkd "^2.0.1" ci-info "^2.0.0" ci-parallel-vars "^1.0.0" - clean-stack "^2.2.0" clean-yaml-object "^0.1.0" cli-cursor "^3.1.0" cli-truncate "^2.1.0" @@ -519,22 +526,23 @@ ava@3.6.0: indent-string "^4.0.0" is-error "^2.2.2" is-plain-object "^3.0.0" - is-promise "^2.1.0" + is-promise "^4.0.0" lodash "^4.17.15" - matcher "^2.1.0" + matcher "^3.0.0" md5-hex "^3.0.1" + mem "^6.1.0" ms "^2.1.2" - ora "^4.0.3" + ora "^4.0.4" p-map "^4.0.0" picomatch "^2.2.2" pkg-conf "^3.1.0" plur "^4.0.0" - pretty-ms "^6.0.1" + pretty-ms "^7.0.0" read-pkg "^5.2.0" resolve-cwd "^3.0.0" slash "^3.0.0" - source-map-support "^0.5.16" - stack-utils "^2.0.1" + source-map-support "^0.5.19" + stack-utils "^2.0.2" strip-ansi "^6.0.0" supertap "^1.0.0" temp-dir "^2.0.0" @@ -625,6 +633,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== +callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.0.tgz#0a110882cbeba41f72f99fcf918f4a0a92a13ebf" @@ -674,10 +687,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -685,7 +698,7 @@ chokidar@^3.3.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" @@ -704,7 +717,7 @@ ci-parallel-vars@^1.0.0: resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== -clean-stack@^2.0.0, clean-stack@^2.2.0: +clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== @@ -1121,6 +1134,11 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +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== + eslint-config-standard@14.1.1: version "14.1.1" resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" @@ -1904,6 +1922,11 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -2209,12 +2232,19 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -matcher@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.1.0.tgz#64e1041c15b993e23b786f93320a7474bf833c28" - integrity sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ== +map-age-cleaner@^0.1.3: + 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: - escape-string-regexp "^2.0.0" + p-defer "^1.0.0" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" md5-hex@^2.0.0: version "2.0.0" @@ -2235,6 +2265,14 @@ md5-o-matic@^0.1.1: resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= +mem@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.0.tgz#846eca0bd4708a8f04b9c3f3cd769e194ae63c5c" + integrity sha512-RlbnLQgRHk5lwqTtpEkBTQ2ll/CG/iB+J4Hy2Wh97PjgZgXgWJWrFF+XXujh3UUVLvR4OOTgZzcWMMwnehlEUg== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.0.0" + merge2@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" @@ -2258,6 +2296,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.0.0.tgz#76044cfa8818bbf6999c5c9acadf2d3649b14b4b" + integrity sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ== + 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" @@ -2439,10 +2482,10 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05" - integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg== +ora@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d" + integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww== dependencies: chalk "^3.0.0" cli-cursor "^3.1.0" @@ -2463,6 +2506,11 @@ p-cancelable@^1.0.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-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -2635,12 +2683,7 @@ picomatch@^2.0.4, picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== -picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== - -picomatch@^2.2.2: +picomatch@^2.2.1, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -2694,10 +2737,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-ms@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-6.0.1.tgz#03ec6cfee20329f142645e63efad96bb775d3da4" - integrity sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw== +pretty-ms@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.0.tgz#45781273110caf35f55cab21a8a9bd403a233dc0" + integrity sha512-J3aPWiC5e9ZeZFuSeBraGxSkGMOvulSWsxDByOcbD1Pr75YL3LSNIKIb52WXbCLE1sS5s4inBBbryjF4Y05Ceg== dependencies: parse-ms "^2.1.0" @@ -2770,12 +2813,12 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" regexpp@^3.0.0: version "3.0.0" @@ -3055,10 +3098,10 @@ slice-ansi@^3.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -source-map-support@^0.5.16: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== +source-map-support@^0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -3116,10 +3159,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -stack-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.1.tgz#3df48345a3b92adc06038f0e95782df61beff742" - integrity sha512-BvBTnHGm8boe+HiJFqP19ywEsGlfQAKqW78pbfvUuzCbUuxPPUyLrH5dYFY+Xn9IpLY3b5ZmMcl8jAqXB4wddg== +stack-utils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" + integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== dependencies: escape-string-regexp "^2.0.0" From 162bcd71a9504be40886953ad5d69522c0e186c0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 12 May 2020 12:23:41 +0000 Subject: [PATCH 233/341] Update dependency @types/node to v11.15.12 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7fa05b39..a641046b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.9", + "@types/node": "11.15.12", "ava": "3.8.2", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 8b0775fe..0d51926f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -304,10 +304,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.9": - version "11.15.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.9.tgz#656b2f61ebe6af278769dfc24e6ab00528a373eb" - integrity sha512-NcOiyA/gxMAounNa4IPm/e13kYqU48onEarMnbLzz3ynEdlxFKYFoBbMBSefAHJR77r9MCtD88J0Z2TVtNsBbw== +"@types/node@11.15.12": + version "11.15.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.12.tgz#bf5d348c4d37c026029ad81e874946fa6ad100ba" + integrity sha512-iefeBfpmhoYaZfj+gJM5z9H9eiTwhuzhPsJgH/flx4HP2SBI2FNDra1D3vKljqPLGDr9Cazvh9gP9Xszc30ncA== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 2450a0394cc8bfd23d71655497ef75891fbf3d89 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 1 Jun 2020 01:06:28 +0000 Subject: [PATCH 234/341] Update dependency nyc to v15.1.0 --- package.json | 2 +- yarn.lock | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a641046b..2ff06c52 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", - "nyc": "15.0.1", + "nyc": "15.1.0", "rimraf": "3.0.2", "sinon": "9.0.2" } diff --git a/yarn.lock b/yarn.lock index 0d51926f..651f9ca8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1500,6 +1500,11 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -2404,10 +2409,10 @@ normalize-url@^3.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -nyc@15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.1.tgz#bd4d5c2b17f2ec04370365a5ca1fc0ed26f9f93d" - integrity sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg== +nyc@15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" @@ -2417,6 +2422,7 @@ nyc@15.0.1: find-cache-dir "^3.2.0" find-up "^4.1.0" foreground-child "^2.0.0" + get-package-type "^0.1.0" glob "^7.1.6" istanbul-lib-coverage "^3.0.0" istanbul-lib-hook "^3.0.0" From 9e4a3c7eb7af93f4a0dbc3ddb4e3211a15edd38f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 10 Jun 2020 02:35:45 +0000 Subject: [PATCH 235/341] Update dependency eslint-plugin-import to v2.21.2 --- package.json | 2 +- yarn.lock | 222 +++++++++++++++++++++++++++++---------------------- 2 files changed, 129 insertions(+), 95 deletions(-) diff --git a/package.json b/package.json index 2ff06c52..9d7f1a6d 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "3.8.2", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.20.2", + "eslint-plugin-import": "2.21.2", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", diff --git a/yarn.lock b/yarn.lock index 651f9ca8..2445c2d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -294,6 +294,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -443,27 +448,27 @@ array-from@^2.1.1: resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= -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.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" 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.prototype.flat@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz#8f3c71d245ba349b6b64b4078f76f5576f1fd723" - integrity sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ== +array.prototype.flat@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== dependencies: define-properties "^1.1.3" - es-abstract "^1.15.0" - function-bind "^1.1.1" + es-abstract "^1.17.0-next.1" arrgv@^1.0.2: version "1.0.2" @@ -1068,42 +1073,22 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.12.0, es-abstract@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - -es-abstract@^1.15.0: - version "1.16.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.3.tgz#52490d978f96ff9f89ec15b5cf244304a5bca161" - integrity sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw== +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.4" - is-regex "^1.0.4" + is-callable "^1.1.5" + is-regex "^1.0.5" object-inspect "^1.7.0" object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" - -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== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -1144,18 +1129,18 @@ eslint-config-standard@14.1.1: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== -eslint-import-resolver-node@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== +eslint-import-resolver-node@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" + integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== dependencies: debug "^2.6.9" - resolve "^1.5.0" + resolve "^1.13.1" -eslint-module-utils@^2.4.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz#cdf0b40d623032274ccd2abd7e64c4e524d6e19c" - integrity sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw== +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: debug "^2.6.9" pkg-dir "^2.0.0" @@ -1168,23 +1153,24 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@2.20.2: - version "2.20.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" - integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== +eslint-plugin-import@2.21.2: + version "2.21.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c" + integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA== dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.1" + eslint-import-resolver-node "^0.3.3" + eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" - object.values "^1.1.0" + object.values "^1.1.1" read-pkg-up "^2.0.0" - resolve "^1.12.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" eslint-plugin-node@11.1.0: version "11.1.0" @@ -1660,7 +1646,7 @@ has-yarn@^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== @@ -1838,6 +1824,11 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -1932,18 +1923,23 @@ is-promise@^4.0.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== -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= +is-regex@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== dependencies: - has "^1.0.1" + has-symbols "^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-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -2101,6 +2097,13 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" @@ -2447,18 +2450,28 @@ object-inspect@^1.7.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -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.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== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== dependencies: define-properties "^1.1.3" - es-abstract "^1.12.0" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" has "^1.0.3" @@ -2660,7 +2673,7 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.6: +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== @@ -2899,10 +2912,10 @@ resolve@^1.10.1: dependencies: path-parse "^1.0.6" -resolve@^1.12.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" - integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== +resolve@^1.13.1, resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -2913,13 +2926,6 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.6" -resolve@^1.5.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== - dependencies: - path-parse "^1.0.5" - responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -3199,21 +3205,39 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" -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== +string.prototype.trimend@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" -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.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" + +string.prototype.trimright@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" strip-ansi@^4.0.0: version "4.0.0" @@ -3354,6 +3378,16 @@ trim-off-newlines@^1.0.1: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" From 4f561c83a2478c7c39f7ae421b1756f208c31226 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 14 Jun 2020 15:55:00 +0000 Subject: [PATCH 236/341] Update dependency ava to v3.9.0 --- package.json | 2 +- yarn.lock | 126 +++++++++++++++++++++++---------------------------- 2 files changed, 58 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index 9d7f1a6d..078515ba 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.12", - "ava": "3.8.2", + "ava": "3.9.0", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.21.2", diff --git a/yarn.lock b/yarn.lock index 2445c2d7..04b8578a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -334,6 +334,11 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== + aggregate-error@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" @@ -495,19 +500,19 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.8.2.tgz#877c9eb861763a185bbabd54f359e1fbe57d1754" - integrity sha512-sph3oUsVTGsq4qbgeWys03QKCmXjkZUO3oPnFWXEW6g1SReCY9vuONGghMgw1G6VOzkg1k+niqJsOzwfO8h9Ng== +ava@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.9.0.tgz#ac91eac980555fcc6c1b91872ac6923ff4c0ffae" + integrity sha512-EnK5I/AX1U5nF4X1YG3QQYg2+jWnpvMW3z2y096DBvbwITkq9rB7Gu1j5clWcuizAJUlYbvcX6YfP+zkRFgC8Q== dependencies: "@concordance/react" "^2.0.0" - acorn "^7.1.1" + acorn "^7.3.1" acorn-walk "^7.1.1" ansi-styles "^4.2.1" arrgv "^1.0.2" arrify "^2.0.1" callsites "^3.1.0" - chalk "^4.0.0" + chalk "^4.1.0" chokidar "^3.4.0" chunkd "^2.0.1" ci-info "^2.0.0" @@ -517,16 +522,16 @@ ava@3.8.2: cli-truncate "^2.1.0" code-excerpt "^2.1.1" common-path-prefix "^3.0.0" - concordance "^4.0.0" + concordance "^5.0.0" convert-source-map "^1.7.0" currently-unhandled "^0.4.1" debug "^4.1.1" del "^5.1.0" - emittery "^0.6.0" + emittery "^0.7.0" equal-length "^1.0.0" figures "^3.2.0" - globby "^11.0.0" - ignore-by-default "^1.0.0" + globby "^11.0.1" + ignore-by-default "^2.0.0" import-local "^3.0.2" indent-string "^4.0.0" is-error "^2.2.2" @@ -687,6 +692,14 @@ chalk@^3.0.0: 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== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -834,21 +847,18 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concordance@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-4.0.0.tgz#5932fdee397d129bdbc3a1885fbe69839b1b7e15" - integrity sha512-l0RFuB8RLfCS0Pt2Id39/oCPykE01pyxgAFypWTlaGRgvLkZrtczZ8atEHpTeEIW+zYWXTBuA9cCSeEOScxReQ== +concordance@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.0.tgz#6d4552f76c78301dd65e748c26af2cf131f9dd49" + integrity sha512-stOCz9ffg0+rytwTaL2njUOIyMfANwfwmqc9Dr4vTUS/x/KkVFlWx9Zlzu6tHYtjKxxaCF/cEAZgPDac+n35sg== dependencies: - date-time "^2.1.0" - esutils "^2.0.2" - fast-diff "^1.1.2" + date-time "^3.1.0" + esutils "^2.0.3" + fast-diff "^1.2.0" js-string-escape "^1.0.1" - lodash.clonedeep "^4.5.0" - lodash.flattendeep "^4.4.0" - lodash.islength "^4.0.1" - lodash.merge "^4.6.1" - md5-hex "^2.0.0" - semver "^5.5.1" + lodash "^4.17.15" + md5-hex "^3.0.1" + semver "^7.3.2" well-known-symbols "^2.0.0" configstore@^5.0.1: @@ -910,10 +920,10 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -date-time@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" - integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== +date-time@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" + integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== dependencies: time-zone "^1.0.0" @@ -1039,10 +1049,10 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -emittery@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.6.0.tgz#e85312468d77c3ed9a6adf43bb57d34849e0c95a" - integrity sha512-6EMRGr9KzYWp8DzHFZsKVZBsMO6QhAeHMeHND8rhyBNCHKMLpgW9tZv40bwN3rAIKRS5CxcK8oLRKUJSB9h7yQ== +emittery@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.0.tgz#0f0789ea90e03f3de7865feb806e4f0916d16c93" + integrity sha512-/kshvS+tZaggOPQDLGzXopumRRIzxciGILDlYTGIU+PmqbSfhn4wDVphFPry4H+2TNl2QxLduexPhxcWLULA5A== emoji-regex@^7.0.1: version "7.0.3" @@ -1304,6 +1314,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= +esutils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -1318,7 +1333,7 @@ fast-deep-equal@^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-diff@^1.1.2: +fast-diff@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== @@ -1577,10 +1592,10 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" - integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -1683,10 +1698,10 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ignore-by-default@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= +ignore-by-default@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.0.0.tgz#537092018540640459569fe7c8c7a408af581146" + integrity sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA== ignore@^4.0.6: version "4.0.6" @@ -2186,11 +2201,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -2201,16 +2211,6 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash.islength@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577" - integrity sha1-Tpho1FJXXXUK/9NYyXlUPcIO1Xc= - -lodash.merge@^4.6.1: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -2254,13 +2254,6 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" -md5-hex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" - integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= - dependencies: - md5-o-matic "^0.1.1" - md5-hex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" @@ -2268,11 +2261,6 @@ md5-hex@^3.0.1: dependencies: blueimp-md5 "^2.10.0" -md5-o-matic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" - integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= - mem@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.0.tgz#846eca0bd4708a8f04b9c3f3cd769e194ae63c5c" @@ -3017,7 +3005,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -3042,7 +3030,7 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1: +semver@^7.2.1, 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== From 308b506c0d47bacb58fc61a26655a90462e3ab59 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 27 Jun 2020 06:47:07 +0000 Subject: [PATCH 237/341] Update dependency eslint-plugin-import to v2.22.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 078515ba..99f5f1ef 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "3.9.0", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.21.2", + "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", diff --git a/yarn.lock b/yarn.lock index 04b8578a..90fa0831 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1163,10 +1163,10 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@2.21.2: - version "2.21.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c" - integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA== +eslint-plugin-import@2.22.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" + integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" From cb39fa15457a2bae9013b23e716877c460a2f290 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 2 Jul 2020 04:24:41 +0000 Subject: [PATCH 238/341] Update dependency inquirer to v7.3.0 --- package.json | 2 +- yarn.lock | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 078515ba..a239e67e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "5.1.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.1.0", + "inquirer": "7.3.0", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 04b8578a..1d0fe0b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -775,6 +775,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -1772,21 +1777,21 @@ 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@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== +inquirer@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.0.tgz#aa3e7cb0c18a410c3c16cdd2bc9dcbe83c4d333e" + integrity sha512-K+LZp6L/6eE5swqIcVXrxl21aGDU4S50gKH0/d96OMQnSBCyGyZl/oZhbkVmdp5sBoINHd4xZvFSARh2dk6DWA== dependencies: ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" lodash "^4.17.15" mute-stream "0.0.8" run-async "^2.4.0" - rxjs "^6.5.3" + rxjs "^6.6.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" @@ -2981,10 +2986,10 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -rxjs@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== +rxjs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" + integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== dependencies: tslib "^1.9.0" From c07b106915d478a36bf4930260589c4aa4d0b657 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 3 Jul 2020 12:46:37 +0000 Subject: [PATCH 239/341] Update dependency @types/node to v11.15.16 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 99f5f1ef..834f3f84 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.12", + "@types/node": "11.15.16", "ava": "3.9.0", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 90fa0831..974e5d18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -309,10 +309,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.12": - version "11.15.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.12.tgz#bf5d348c4d37c026029ad81e874946fa6ad100ba" - integrity sha512-iefeBfpmhoYaZfj+gJM5z9H9eiTwhuzhPsJgH/flx4HP2SBI2FNDra1D3vKljqPLGDr9Cazvh9gP9Xszc30ncA== +"@types/node@11.15.16": + version "11.15.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.16.tgz#0d7072715d51bb0f1dced2a7749db77b61b7a8e6" + integrity sha512-QUb2Wgrw0aq7Pfk9LhjOXrnm8E7CmwHSa5fy0IYvxWSujNVV0wDkaGxnAsu2WZcdYRBerYqnf6e6Qiq1FkBxGw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 2bb4b5022bde1027eb04177114390ab0a4e25fba Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 3 Jul 2020 12:46:51 +0000 Subject: [PATCH 240/341] Update dependency chalk to v4.1.0 --- package.json | 2 +- yarn.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 99f5f1ef..19c45f39 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "yarn test:lint && yarn test:unit:coverage" }, "dependencies": { - "chalk": "4.0.0", + "chalk": "4.1.0", "commander": "5.1.0", "esm": "3.2.25", "gift": "0.10.2", diff --git a/yarn.lock b/yarn.lock index 90fa0831..abbc93a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -658,10 +658,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@4.0.0, chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== +chalk@4.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== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -692,10 +692,10 @@ chalk@^3.0.0: 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: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" From ba93bcea86d36efe9c56edb9ae7bf9bd57f90396 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 5 Jul 2020 16:05:25 +0000 Subject: [PATCH 241/341] Update dependency ava to v3.10.0 --- package.json | 2 +- yarn.lock | 109 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 68 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 316ca46c..acd69f5a 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.16", - "ava": "3.9.0", + "ava": "3.10.0", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", diff --git a/yarn.lock b/yarn.lock index 4e9bd3c2..c06d5b81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -92,6 +92,14 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== +"@babel/runtime-corejs3@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d" + integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -324,10 +332,10 @@ acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -acorn-walk@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" - integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== +acorn-walk@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^7.1.1: version "7.1.1" @@ -500,14 +508,14 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.9.0.tgz#ac91eac980555fcc6c1b91872ac6923ff4c0ffae" - integrity sha512-EnK5I/AX1U5nF4X1YG3QQYg2+jWnpvMW3z2y096DBvbwITkq9rB7Gu1j5clWcuizAJUlYbvcX6YfP+zkRFgC8Q== +ava@3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.10.0.tgz#ed1a53986435fc1cd8c15978cd8ff81217c34831" + integrity sha512-CxcYQYeE39pcLWrN2/TASMpnqH/SoaX+W61+4m3saETU041PIDcoP9LLNWPAE/yJZXjp0M1RWTohSkmGqJZKww== dependencies: "@concordance/react" "^2.0.0" acorn "^7.3.1" - acorn-walk "^7.1.1" + acorn-walk "^7.2.0" ansi-styles "^4.2.1" arrgv "^1.0.2" arrify "^2.0.1" @@ -516,11 +524,11 @@ ava@3.9.0: chokidar "^3.4.0" chunkd "^2.0.1" ci-info "^2.0.0" - ci-parallel-vars "^1.0.0" + ci-parallel-vars "^1.0.1" clean-yaml-object "^0.1.0" cli-cursor "^3.1.0" cli-truncate "^2.1.0" - code-excerpt "^2.1.1" + code-excerpt "^3.0.0" common-path-prefix "^3.0.0" concordance "^5.0.0" convert-source-map "^1.7.0" @@ -535,7 +543,7 @@ ava@3.9.0: import-local "^3.0.2" indent-string "^4.0.0" is-error "^2.2.2" - is-plain-object "^3.0.0" + is-plain-object "^3.0.1" is-promise "^4.0.0" lodash "^4.17.15" matcher "^3.0.0" @@ -559,7 +567,7 @@ ava@3.9.0: trim-off-newlines "^1.0.1" update-notifier "^4.1.0" write-file-atomic "^3.0.3" - yargs "^15.3.1" + yargs "^15.4.0" balanced-match@^1.0.0: version "1.0.0" @@ -730,10 +738,10 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-parallel-vars@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" - integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== +ci-parallel-vars@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz#e87ff0625ccf9d286985b29b4ada8485ca9ffbc2" + integrity sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg== clean-stack@^2.0.0: version "2.2.0" @@ -801,10 +809,10 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -code-excerpt@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.1.tgz#5fe3057bfbb71a5f300f659ef2cc0a47651ba77c" - integrity sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw== +code-excerpt@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" + integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== dependencies: convert-to-spaces "^1.0.1" @@ -895,6 +903,11 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= +core-js-pure@^3.0.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== + cross-spawn@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" @@ -958,6 +971,13 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851" + integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw== + dependencies: + xregexp "^4.2.4" + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -1926,12 +1946,10 @@ is-path-inside@^3.0.1: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== -is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" +is-plain-object@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" + integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== is-promise@^2.1.0: version "2.1.0" @@ -1997,11 +2015,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" @@ -2832,6 +2845,11 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + regexpp@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" @@ -3570,6 +3588,13 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xregexp@^4.2.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -3588,10 +3613,10 @@ yargs-parser@^16.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.1: - version "18.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" - integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -3613,13 +3638,13 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^16.1.0" -yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== +yargs@^15.4.0: + version "15.4.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.0.tgz#53949fb768309bac1843de9b17b80051e9805ec2" + integrity sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw== dependencies: cliui "^6.0.0" - decamelize "^1.2.0" + decamelize "^3.2.0" find-up "^4.1.0" get-caller-file "^2.0.1" require-directory "^2.1.1" @@ -3628,4 +3653,4 @@ yargs@^15.3.1: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.1" + yargs-parser "^18.1.2" From 67edbc48474ef3ae6dcda53d7fd6185c985ba059 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 7 Jul 2020 15:55:57 +0000 Subject: [PATCH 242/341] Update dependency ava to v3.10.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index acd69f5a..ec9fbcfe 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.16", - "ava": "3.10.0", + "ava": "3.10.1", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", diff --git a/yarn.lock b/yarn.lock index c06d5b81..01364638 100644 --- a/yarn.lock +++ b/yarn.lock @@ -508,10 +508,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.10.0.tgz#ed1a53986435fc1cd8c15978cd8ff81217c34831" - integrity sha512-CxcYQYeE39pcLWrN2/TASMpnqH/SoaX+W61+4m3saETU041PIDcoP9LLNWPAE/yJZXjp0M1RWTohSkmGqJZKww== +ava@3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.10.1.tgz#a4e68b1a2bb248fa0d96529d23dd83f57082e944" + integrity sha512-+w86ZHyFHIGCABi7NUrn/WJMyC+fDj0BSIlFNVS45WDKAD5vxbIiDWeclctxOOc2KDPfQD7tFOURSBz0FBLD0A== dependencies: "@concordance/react" "^2.0.0" acorn "^7.3.1" From 9ae3ecfd58aa9b190a4497c637ca31f1b07031c7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 8 Jul 2020 14:18:51 +0000 Subject: [PATCH 243/341] Update dependency @types/node to v11.15.17 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ec9fbcfe..8ee864ac 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.16", + "@types/node": "11.15.17", "ava": "3.10.1", "eslint": "7.0.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 01364638..82dfec11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -317,10 +317,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.16": - version "11.15.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.16.tgz#0d7072715d51bb0f1dced2a7749db77b61b7a8e6" - integrity sha512-QUb2Wgrw0aq7Pfk9LhjOXrnm8E7CmwHSa5fy0IYvxWSujNVV0wDkaGxnAsu2WZcdYRBerYqnf6e6Qiq1FkBxGw== +"@types/node@11.15.17": + version "11.15.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.17.tgz#e64ad0bc4a15f68f5ad5e3d08e882f0c2f832d4a" + integrity sha512-E80F/POUH2MURsoO3XwerkVZ7HAalXqTIEHf8jrx43iTO6MPTBgNdKNxlIJCvXp0o8VhYcpY9ZSBsXqBvkf6fw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 5a3e4b48ec4eb836af7eecbbf3d705c1d2cccae2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 8 Jul 2020 14:21:54 +0000 Subject: [PATCH 244/341] Update dependency eslint to v7.4.0 --- package.json | 2 +- yarn.lock | 98 +++++++++++++++++++--------------------------------- 2 files changed, 37 insertions(+), 63 deletions(-) diff --git a/package.json b/package.json index 8ee864ac..1615a866 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.17", "ava": "3.10.1", - "eslint": "7.0.0", + "eslint": "7.4.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 82dfec11..8d12b469 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,12 +337,7 @@ acorn-walk@^7.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== - -acorn@^7.3.1: +acorn@^7.2.0, acorn@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== @@ -372,6 +367,11 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" +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@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" @@ -778,11 +778,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.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= - cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -1096,6 +1091,13 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +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" + equal-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" @@ -1229,10 +1231,10 @@ eslint-plugin-standard@4.0.1: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-scope@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -1249,10 +1251,15 @@ eslint-visitor-keys@^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@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.0.0.tgz#c35dfd04a4372110bd78c69a8d79864273919a08" - integrity sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg== +eslint-visitor-keys@^1.2.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@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.4.0.tgz#4e35a2697e6c1972f9d6ef2b690ad319f80f206f" + integrity sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1260,10 +1267,11 @@ eslint@7.0.0: cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.0" eslint-utils "^2.0.0" - eslint-visitor-keys "^1.1.0" - espree "^7.0.0" + eslint-visitor-keys "^1.2.0" + espree "^7.1.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -1273,7 +1281,6 @@ eslint@7.0.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" @@ -1296,14 +1303,14 @@ esm@3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.0.0.tgz#8a7a60f218e69f120a842dc24c5a88aa7748a74e" - integrity sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw== +espree@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" + integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== dependencies: - acorn "^7.1.1" + acorn "^7.2.0" acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + eslint-visitor-keys "^1.2.0" esprima@^4.0.0: version "4.0.1" @@ -1816,25 +1823,6 @@ inquirer@7.3.0: strip-ansi "^6.0.0" through "^2.3.6" -inquirer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" - integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - irregular-plurals@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" @@ -2978,13 +2966,6 @@ rimraf@^3.0.0: dependencies: glob "^7.1.3" -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-async@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" @@ -2997,13 +2978,6 @@ run-parallel@^1.1.9: resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== -rxjs@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" - integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== - dependencies: - tslib "^1.9.0" - rxjs@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" From b11ca2ccda2c4ff51a33498b217c53af5f8cf0a8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 10 Jul 2020 15:45:51 +0000 Subject: [PATCH 245/341] Update dependency inquirer to v7.3.1 --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 1615a866..10600a66 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "5.1.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.3.0", + "inquirer": "7.3.1", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 8d12b469..c6d6f389 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1804,10 +1804,10 @@ 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@7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.0.tgz#aa3e7cb0c18a410c3c16cdd2bc9dcbe83c4d333e" - integrity sha512-K+LZp6L/6eE5swqIcVXrxl21aGDU4S50gKH0/d96OMQnSBCyGyZl/oZhbkVmdp5sBoINHd4xZvFSARh2dk6DWA== +inquirer@7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.1.tgz#ac6aba1abdfdd5ad34e7069370411edba17f6439" + integrity sha512-/+vOpHQHhoh90Znev8BXiuw1TDQ7IDxWsQnFafUEoK5+4uN5Eoz1p+3GqOj/NtzEi9VzWKQcV9Bm+i8moxedsA== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.0" @@ -1815,7 +1815,7 @@ inquirer@7.3.0: cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.16" mute-stream "0.0.8" run-async "^2.4.0" rxjs "^6.6.0" @@ -2227,6 +2227,11 @@ lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.16: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" From 9566e7f54d8e51162593f9585d3390b10b111d70 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 13 Jul 2020 14:13:01 +0000 Subject: [PATCH 246/341] Update dependency @types/node to v11.15.18 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 10600a66..874f9b1e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.17", + "@types/node": "11.15.18", "ava": "3.10.1", "eslint": "7.4.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index c6d6f389..fbe543fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -317,10 +317,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.17": - version "11.15.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.17.tgz#e64ad0bc4a15f68f5ad5e3d08e882f0c2f832d4a" - integrity sha512-E80F/POUH2MURsoO3XwerkVZ7HAalXqTIEHf8jrx43iTO6MPTBgNdKNxlIJCvXp0o8VhYcpY9ZSBsXqBvkf6fw== +"@types/node@11.15.18": + version "11.15.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.18.tgz#b92ad2f5ef31a2b8a432f15db68265013d9f43db" + integrity sha512-3p2M6moxwdDFyPia2ROI8CCkRa9ZzYjvCys2TOE1xgwYDQmY49Cj0cvkdBkzh/rY9gkvzgzYOeECYtB4f0/fDA== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 4f2f909aeaabc9af2ed4fd02b750897c08559504 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 13 Jul 2020 17:16:02 +0000 Subject: [PATCH 247/341] Update dependency inquirer to v7.3.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 874f9b1e..6cd849c6 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "5.1.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.3.1", + "inquirer": "7.3.2", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index fbe543fe..ac97b089 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1804,10 +1804,10 @@ 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@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.1.tgz#ac6aba1abdfdd5ad34e7069370411edba17f6439" - integrity sha512-/+vOpHQHhoh90Znev8BXiuw1TDQ7IDxWsQnFafUEoK5+4uN5Eoz1p+3GqOj/NtzEi9VzWKQcV9Bm+i8moxedsA== +inquirer@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.2.tgz#25245d2e32dc9f33dbe26eeaada231daa66e9c7c" + integrity sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.0" From 4bd4b98f59aaeb725327e8a69d0bcc5a8a61a34e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 19 Jul 2020 14:17:34 +0000 Subject: [PATCH 248/341] Update dependency commander to v6 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6cd849c6..93eb690a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "4.1.0", - "commander": "5.1.0", + "commander": "6.0.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.3.2", diff --git a/yarn.lock b/yarn.lock index ac97b089..8825972f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -835,10 +835,10 @@ 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== -commander@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" + integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== common-path-prefix@^3.0.0: version "3.0.0" From 0cc3f0d10fd6c12ab172b25581887f5239833d47 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 19 Jul 2020 15:22:32 +0000 Subject: [PATCH 249/341] Update dependency eslint to v7.5.0 --- package.json | 2 +- yarn.lock | 43 +++++++++++++++++++++++++------------------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 93eb690a..2c0e2fc3 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.18", "ava": "3.10.1", - "eslint": "7.4.0", + "eslint": "7.5.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 8825972f..54e00026 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,7 +337,7 @@ acorn-walk@^7.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.2.0, acorn@^7.3.1: +acorn@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== @@ -1246,20 +1246,27 @@ eslint-utils@^2.0.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.1.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-visitor-keys@^1.1.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-visitor-keys@^1.2.0: +eslint-visitor-keys@^1.3.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@7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.4.0.tgz#4e35a2697e6c1972f9d6ef2b690ad319f80f206f" - integrity sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g== +eslint@7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.5.0.tgz#9ecbfad62216d223b82ac9ffea7ef3444671d135" + integrity sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -1269,9 +1276,9 @@ eslint@7.4.0: doctrine "^3.0.0" enquirer "^2.3.5" eslint-scope "^5.1.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.2.0" - espree "^7.1.0" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.2.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -1285,7 +1292,7 @@ eslint@7.4.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.14" + lodash "^4.17.19" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -1303,14 +1310,14 @@ esm@3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" - integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== +espree@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" + integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== dependencies: - acorn "^7.2.0" + acorn "^7.3.1" acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.2.0" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0: version "4.0.1" @@ -2222,12 +2229,12 @@ lodash@^4.17.11: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.13, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.17.16: +lodash@^4.17.16, lodash@^4.17.19: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== From ed48b2a462c812f4cbff410adb6c7d7477a1a187 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 23 Jul 2020 02:34:52 +0000 Subject: [PATCH 250/341] Update dependency inquirer to v7.3.3 --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2c0e2fc3..5b9a594a 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "commander": "6.0.0", "esm": "3.2.25", "gift": "0.10.2", - "inquirer": "7.3.2", + "inquirer": "7.3.3", "yabf": "2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 54e00026..9fbfb2d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1811,10 +1811,10 @@ 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@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.2.tgz#25245d2e32dc9f33dbe26eeaada231daa66e9c7c" - integrity sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w== +inquirer@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.0" @@ -1822,7 +1822,7 @@ inquirer@7.3.2: cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.16" + lodash "^4.17.19" mute-stream "0.0.8" run-async "^2.4.0" rxjs "^6.6.0" @@ -2234,7 +2234,7 @@ lodash@^4.17.13, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.17.16, lodash@^4.17.19: +lodash@^4.17.19: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== From 5b535993e09307767172af69eb2fff18cb4f6b79 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 24 Jul 2020 21:55:30 +0000 Subject: [PATCH 251/341] Update dependency @types/node to v11.15.20 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5b9a594a..1e249ba9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.18", + "@types/node": "11.15.20", "ava": "3.10.1", "eslint": "7.5.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 9fbfb2d2..77ce8d53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -317,10 +317,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.18": - version "11.15.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.18.tgz#b92ad2f5ef31a2b8a432f15db68265013d9f43db" - integrity sha512-3p2M6moxwdDFyPia2ROI8CCkRa9ZzYjvCys2TOE1xgwYDQmY49Cj0cvkdBkzh/rY9gkvzgzYOeECYtB4f0/fDA== +"@types/node@11.15.20": + version "11.15.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.20.tgz#dacd63b282c1a0d40fa0ad216b7ca128afded614" + integrity sha512-DY2QwdrBqNlsxdMehwzUtSsWHgYYPLVCAuXvOcu3wkzYmchbRunQ7OEZFOrmFoBLfA1ysz2Ypr6vtNP9WQkUaQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" From b560fd602cdd1843f5ea758158043f3f1b51d49d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 27 Jul 2020 08:07:39 +0000 Subject: [PATCH 252/341] Update dependency ava to v3.11.0 --- package.json | 2 +- yarn.lock | 94 +++++++++++++++++----------------------------------- 2 files changed, 32 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 1e249ba9..c9c0194d 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.20", - "ava": "3.10.1", + "ava": "3.11.0", "eslint": "7.5.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", diff --git a/yarn.lock b/yarn.lock index 77ce8d53..884a050d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -92,14 +92,6 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== -"@babel/runtime-corejs3@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d" - integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw== - dependencies: - core-js-pure "^3.0.0" - regenerator-runtime "^0.13.4" - "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -508,10 +500,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.10.1.tgz#a4e68b1a2bb248fa0d96529d23dd83f57082e944" - integrity sha512-+w86ZHyFHIGCABi7NUrn/WJMyC+fDj0BSIlFNVS45WDKAD5vxbIiDWeclctxOOc2KDPfQD7tFOURSBz0FBLD0A== +ava@3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.11.0.tgz#484f25efa7cf6ec354defd75f19c3cc28fcf0141" + integrity sha512-y5U8BGeSRjs/OypsC4CJxr+L1KtLKU5kUyHr5hcghXn7HNr2f4LE/4gvl0Q5lNkLX1obdRW1oODphNdU/glwmA== dependencies: "@concordance/react" "^2.0.0" acorn "^7.3.1" @@ -521,7 +513,7 @@ ava@3.10.1: arrify "^2.0.1" callsites "^3.1.0" chalk "^4.1.0" - chokidar "^3.4.0" + chokidar "^3.4.1" chunkd "^2.0.1" ci-info "^2.0.0" ci-parallel-vars "^1.0.1" @@ -535,7 +527,7 @@ ava@3.10.1: currently-unhandled "^0.4.1" debug "^4.1.1" del "^5.1.0" - emittery "^0.7.0" + emittery "^0.7.1" equal-length "^1.0.0" figures "^3.2.0" globby "^11.0.1" @@ -543,14 +535,14 @@ ava@3.10.1: import-local "^3.0.2" indent-string "^4.0.0" is-error "^2.2.2" - is-plain-object "^3.0.1" + is-plain-object "^4.1.1" is-promise "^4.0.0" - lodash "^4.17.15" + lodash "^4.17.19" matcher "^3.0.0" md5-hex "^3.0.1" mem "^6.1.0" ms "^2.1.2" - ora "^4.0.4" + ora "^4.0.5" p-map "^4.0.0" picomatch "^2.2.2" pkg-conf "^3.1.0" @@ -567,7 +559,7 @@ ava@3.10.1: trim-off-newlines "^1.0.1" update-notifier "^4.1.0" write-file-atomic "^3.0.3" - yargs "^15.4.0" + yargs "^15.4.1" balanced-match@^1.0.0: version "1.0.0" @@ -713,10 +705,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" - integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== +chokidar@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" + integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -898,11 +890,6 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= -core-js-pure@^3.0.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" - integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== - cross-spawn@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" @@ -966,13 +953,6 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decamelize@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851" - integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw== - dependencies: - xregexp "^4.2.4" - decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -1069,10 +1049,10 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -emittery@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.0.tgz#0f0789ea90e03f3de7865feb806e4f0916d16c93" - integrity sha512-/kshvS+tZaggOPQDLGzXopumRRIzxciGILDlYTGIU+PmqbSfhn4wDVphFPry4H+2TNl2QxLduexPhxcWLULA5A== +emittery@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" + integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== emoji-regex@^7.0.1: version "7.0.3" @@ -1941,10 +1921,10 @@ is-path-inside@^3.0.1: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== -is-plain-object@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" - integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== +is-plain-object@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-4.1.1.tgz#1a14d6452cbd50790edc7fdaa0aed5a40a35ebb5" + integrity sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA== is-promise@^2.1.0: version "2.1.0" @@ -2507,10 +2487,10 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d" - integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww== +ora@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.5.tgz#7410b5cc2d99fa637fd5099bbb9f02bfbb5a361e" + integrity sha512-jCDgm9DqvRcNIAEv2wZPrh7E5PcQiDUnbnWbAfu4NGAE2ZNqPFbDixmWldy1YG2QfLeQhuiu6/h5VRrk6cG50w== dependencies: chalk "^3.0.0" cli-cursor "^3.1.0" @@ -2845,11 +2825,6 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== - regexpp@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" @@ -3574,13 +3549,6 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xregexp@^4.2.4: - version "4.3.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" - integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== - dependencies: - "@babel/runtime-corejs3" "^7.8.3" - y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -3624,13 +3592,13 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^16.1.0" -yargs@^15.4.0: - version "15.4.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.0.tgz#53949fb768309bac1843de9b17b80051e9805ec2" - integrity sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw== +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== dependencies: cliui "^6.0.0" - decamelize "^3.2.0" + decamelize "^1.2.0" find-up "^4.1.0" get-caller-file "^2.0.1" require-directory "^2.1.1" From 9baf85dc2292b590cb29b833704f59b8226517d4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 31 Jul 2020 23:43:08 +0000 Subject: [PATCH 253/341] Update dependency eslint to v7.6.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c9c0194d..9353dc23 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.20", "ava": "3.11.0", - "eslint": "7.5.0", + "eslint": "7.6.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 884a050d..ce893a02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1243,10 +1243,10 @@ eslint-visitor-keys@^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@7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.5.0.tgz#9ecbfad62216d223b82ac9ffea7ef3444671d135" - integrity sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q== +eslint@7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6" + integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" From 4571e5538d365bb449a459dc5d8f04d82d1d8f69 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 3 Aug 2020 06:54:14 +0000 Subject: [PATCH 254/341] Update dependency ava to v3.11.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9353dc23..788e55a9 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.20", - "ava": "3.11.0", + "ava": "3.11.1", "eslint": "7.6.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", diff --git a/yarn.lock b/yarn.lock index ce893a02..5358ecd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -500,10 +500,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.11.0.tgz#484f25efa7cf6ec354defd75f19c3cc28fcf0141" - integrity sha512-y5U8BGeSRjs/OypsC4CJxr+L1KtLKU5kUyHr5hcghXn7HNr2f4LE/4gvl0Q5lNkLX1obdRW1oODphNdU/glwmA== +ava@3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.11.1.tgz#580bfc974b858fb13f7ce948b9651da4e5b17bc8" + integrity sha512-yGPD0msa5Qronw7GHDNlLaB7oU5zryYtXeuvny40YV6TMskSghqK7Ky3NisM/sr+aqI3DY7sfmORx8dIWQgMoQ== dependencies: "@concordance/react" "^2.0.0" acorn "^7.3.1" From 4cf307bbb17e97c5f54de64a0f7f309914b34682 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 Aug 2020 07:57:55 +0000 Subject: [PATCH 255/341] Update dependency sinon to v9.0.3 --- package.json | 2 +- yarn.lock | 52 +++++++++++++++++++--------------------------------- 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 788e55a9..ee80fb58 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "9.0.2" + "sinon": "9.0.3" } } diff --git a/yarn.lock b/yarn.lock index 5358ecd7..559a237c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -229,14 +229,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/formatio@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-4.0.1.tgz#50ac1da0c3eaea117ca258b06f4f88a471668bdb" - integrity sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^4.2.0" - "@sinonjs/formatio@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" @@ -245,19 +237,19 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^5.0.2" -"@sinonjs/samsam@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.0.tgz#64a9994331cc3da0a0d7cc06cae44faa09cb5f2c" - integrity sha512-yG7QbUz38ZPIegfuSMEcbOo0kkLGmPa8a0Qlz4dk7+cXYALDScWjIZzAm/u2+Frh+bcdZF6wZJZwwuJjY0WAjA== +"@sinonjs/samsam@^5.0.2": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" + integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== dependencies: "@sinonjs/commons" "^1.6.0" - array-from "^2.1.1" lodash.get "^4.4.2" + type-detect "^4.0.8" -"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" - integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== +"@sinonjs/samsam@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.1.0.tgz#3afe719232b541bb6cf3411a4c399a188de21ec0" + integrity sha512-42nyaQOVunX5Pm6GRJobmzbS7iLI+fhERITnETXzzwDZh+TtDr/Au3yAvXVjFmZ4wEUaE4Y3NFZfKv0bV0cbtg== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -448,11 +440,6 @@ array-find-index@^1.0.1: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - array-includes@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" @@ -2349,14 +2336,13 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -nise@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.1.tgz#16c1b893e8ac4e3958dcab5cc174c07c8ff42cdc" - integrity sha512-10PKL272rqg80o2RsWcTT6X9cDYqJ4kXqPTf8yCXPc9hbphZSDmbiG5FqUNeR5nouKCQMM24ld45kgYnBdx2rw== +nise@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" + integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/fake-timers" "^6.0.0" - "@sinonjs/formatio" "^4.0.1" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" path-to-regexp "^1.7.0" @@ -3046,17 +3032,17 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.2.tgz#b9017e24633f4b1c98dfb6e784a5f0509f5fd85d" - integrity sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A== +sinon@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.3.tgz#bffc3ec28c936332cd2a41833547b9eed201ecff" + integrity sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg== dependencies: "@sinonjs/commons" "^1.7.2" "@sinonjs/fake-timers" "^6.0.1" "@sinonjs/formatio" "^5.0.1" - "@sinonjs/samsam" "^5.0.3" + "@sinonjs/samsam" "^5.1.0" diff "^4.0.2" - nise "^4.0.1" + nise "^4.0.4" supports-color "^7.1.0" slash@^3.0.0: From 9ea19e80c363423c5b3dade0fe8761b6a71c537b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 15 Aug 2020 17:29:35 +0000 Subject: [PATCH 256/341] Update dependency eslint to v7.7.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ee80fb58..f1b5d2a0 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.20", "ava": "3.11.1", - "eslint": "7.6.0", + "eslint": "7.7.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 559a237c..ea57f067 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1230,10 +1230,10 @@ eslint-visitor-keys@^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@7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6" - integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w== +eslint@7.7.0: + version "7.7.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.7.0.tgz#18beba51411927c4b64da0a8ceadefe4030d6073" + integrity sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" From f6cd284c81b9d2d6071005a54535d3699b842934 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 Aug 2020 10:04:58 +0000 Subject: [PATCH 257/341] Update dependency ava to v3.12.1 --- package.json | 2 +- yarn.lock | 105 ++++++++++++++++++++++++++------------------------- 2 files changed, 54 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index f1b5d2a0..ca0e30b4 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.20", - "ava": "3.11.1", + "ava": "3.12.1", "eslint": "7.7.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", diff --git a/yarn.lock b/yarn.lock index ea57f067..0a1d6e36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -316,16 +316,21 @@ acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -acorn-walk@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.0.0.tgz#56ae4c0f434a45fff4a125e7ea95fa9c98f67a16" + integrity sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA== acorn@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +acorn@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.1.tgz#d7e8eca9b71d5840db0e7e415b3b2b20e250f938" + integrity sha512-dmKn4pqZ29iQl2Pvze1zTrps2luvls2PBY//neO2WJ0s10B3AxJXshN+Ph7B4GrhfGhHXrl4dnUwyNNXQcnWGQ== + aggregate-error@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" @@ -487,20 +492,20 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.11.1: - version "3.11.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.11.1.tgz#580bfc974b858fb13f7ce948b9651da4e5b17bc8" - integrity sha512-yGPD0msa5Qronw7GHDNlLaB7oU5zryYtXeuvny40YV6TMskSghqK7Ky3NisM/sr+aqI3DY7sfmORx8dIWQgMoQ== +ava@3.12.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.12.1.tgz#0181b5ca10d178539a0d503e0fc9244146303717" + integrity sha512-cS41+X+UfrcPed+CIgne/YV/6eWxaUjHEPH+W8WvNSqWTWku5YitjZGE5cMHFuJxwHELdR541xTBRn8Uwi4PSw== dependencies: "@concordance/react" "^2.0.0" - acorn "^7.3.1" - acorn-walk "^7.2.0" + acorn "^8.0.1" + acorn-walk "^8.0.0" ansi-styles "^4.2.1" arrgv "^1.0.2" arrify "^2.0.1" callsites "^3.1.0" chalk "^4.1.0" - chokidar "^3.4.1" + chokidar "^3.4.2" chunkd "^2.0.1" ci-info "^2.0.0" ci-parallel-vars "^1.0.1" @@ -509,7 +514,7 @@ ava@3.11.1: cli-truncate "^2.1.0" code-excerpt "^3.0.0" common-path-prefix "^3.0.0" - concordance "^5.0.0" + concordance "^5.0.1" convert-source-map "^1.7.0" currently-unhandled "^0.4.1" debug "^4.1.1" @@ -524,12 +529,12 @@ ava@3.11.1: is-error "^2.2.2" is-plain-object "^4.1.1" is-promise "^4.0.0" - lodash "^4.17.19" + lodash "^4.17.20" matcher "^3.0.0" md5-hex "^3.0.1" mem "^6.1.0" ms "^2.1.2" - ora "^4.0.5" + ora "^5.0.0" p-map "^4.0.0" picomatch "^2.2.2" pkg-conf "^3.1.0" @@ -544,7 +549,7 @@ ava@3.11.1: supertap "^1.0.0" temp-dir "^2.0.0" trim-off-newlines "^1.0.1" - update-notifier "^4.1.0" + update-notifier "^4.1.1" write-file-atomic "^3.0.3" yargs "^15.4.1" @@ -662,15 +667,6 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.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== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -692,10 +688,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" - integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== +chokidar@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -744,10 +740,10 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" - integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== +cli-spinners@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f" + integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA== cli-truncate@^2.1.0: version "2.1.0" @@ -834,10 +830,10 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concordance@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.0.tgz#6d4552f76c78301dd65e748c26af2cf131f9dd49" - integrity sha512-stOCz9ffg0+rytwTaL2njUOIyMfANwfwmqc9Dr4vTUS/x/KkVFlWx9Zlzu6tHYtjKxxaCF/cEAZgPDac+n35sg== +concordance@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.1.tgz#7a248aca8b286125d1d76f77b03320acf3f4ac63" + integrity sha512-TbNtInKVElgEBnJ1v2Xg+MFX2lvFLbmlv3EuSC5wTfCwpB8kC3w3mffF6cKuUhkn475Ym1f1I4qmuXzx2+uXpw== dependencies: date-time "^3.1.0" esutils "^2.0.3" @@ -2206,12 +2202,17 @@ lodash@^4.17.19: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== -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== +lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - chalk "^2.4.2" + chalk "^4.0.0" lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" @@ -2473,16 +2474,16 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.5.tgz#7410b5cc2d99fa637fd5099bbb9f02bfbb5a361e" - integrity sha512-jCDgm9DqvRcNIAEv2wZPrh7E5PcQiDUnbnWbAfu4NGAE2ZNqPFbDixmWldy1YG2QfLeQhuiu6/h5VRrk6cG50w== +ora@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.0.0.tgz#4f0b34f2994877b49b452a707245ab1e9f6afccb" + integrity sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw== dependencies: - chalk "^3.0.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-spinners "^2.2.0" + cli-spinners "^2.4.0" is-interactive "^1.0.0" - log-symbols "^3.0.0" + log-symbols "^4.0.0" mute-stream "0.0.8" strip-ansi "^6.0.0" wcwidth "^1.0.1" @@ -3402,10 +3403,10 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -update-notifier@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" - integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== +update-notifier@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746" + integrity sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg== dependencies: boxen "^4.2.0" chalk "^3.0.0" From c3112e57786aee01ace0b8242321da09d6fc23fe Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Tue, 25 Aug 2020 09:23:20 +0200 Subject: [PATCH 258/341] Update forum link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index debcdf81..223d06e2 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![npm](https://img.shields.io/npm/dt/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) [![npm](https://img.shields.io/npm/l/configfile.svg?style=flat-square)](https://github.com/Mindsers/configfile/blob/master/LICENSE) [![Patreon](https://img.shields.io/badge/support-patreon-F96854.svg?logo=patreon&style=flat-square)](https://www.patreon.com/bePatron?u=9715649) -[![Discourse](https://img.shields.io/discourse/https/community.nathanaelcherrier.com/posts.svg?color=00aeef&logo=discourse&logoColor=00aeef&style=flat-square)](https://community.nathanaelcherrier.com) +[![Discourse](https://img.shields.io/discourse/https/community.nathanaelcherrier.com/posts.svg?color=00aeef&logo=discourse&logoColor=00aeef&style=flat-square)](https://community.nathanaelcherrier.com/c/open-source/configfile/8) *configfile* is a command line tool that help user to manage their own configuration files. From 744678ae03be2b125e3f24a01e95909be1a45d73 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Tue, 25 Aug 2020 09:24:32 +0200 Subject: [PATCH 259/341] Update community link --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0ef602be..ca9a789b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,13 +48,13 @@ This file is a set of guilines for contributing to *Configfile* project. These a ### Do you intend to add a new feature or change an existing one? -* Please ask first ([open an issue][Issues] or [talk about it on gitter][gitter]) before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project. +* Please ask first ([open an issue][Issues] or [talk about it on the community forum][forum]) before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project. * Please adhere to the coding conventions used in this project (indentation, accurate comments, etc.) and any other requirements (such as test coverage, documentation). ### Do you have questions about the source code? -* Ask any question about how to use Configfile in the [gitter channel][gitter] or on [Stack Overflow](https://stackoverflow.com). +* Ask any question about how to use Configfile in the [community forum][forum] or on [Stack Overflow](https://stackoverflow.com). ### Do you want to contribute to the Configfile documentation? @@ -109,4 +109,4 @@ All the rules are listed in `.eslinrc.json` on the root directory. [Issues]: https://github.com/Mindsers/configfile/issues -[gitter]: https://gitter.im/mindsers/configfile +[forum]: https://community.nathanaelcherrier.com/c/open-source/configfile/8 From 06f12285abb0de5caa48a1500617b199e0bda4bb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 28 Aug 2020 01:24:37 +0000 Subject: [PATCH 260/341] Update dependency commander to v6.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ca0e30b4..0d10edde 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "4.1.0", - "commander": "6.0.0", + "commander": "6.1.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.3.3", diff --git a/yarn.lock b/yarn.lock index 0a1d6e36..d98dc40a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -810,10 +810,10 @@ 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== -commander@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" - integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== +commander@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" + integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== common-path-prefix@^3.0.0: version "3.0.0" From 666f0167c827e6901c5e5c371d290d063fb9b773 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 31 Aug 2020 22:48:56 +0000 Subject: [PATCH 261/341] Update dependency eslint to v7.8.0 --- package.json | 2 +- yarn.lock | 67 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 0d10edde..6f96ecca 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.20", "ava": "3.12.1", - "eslint": "7.7.0", + "eslint": "7.8.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index d98dc40a..a7bd2d46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -132,6 +132,16 @@ dependencies: arrify "^1.0.1" +"@eslint/eslintrc@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.0.tgz#3d1f19fb797d42fb1c85458c1c73541eeb1d9e76" + integrity sha512-bfL5365QSCmH6cPeFT7Ywclj8C7LiF7sO6mUGzZhtAMV7iID1Euq6740u/SRi4C80NOnVz/CEfK8/HO+nCAPJg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + import-fresh "^3.2.1" + strip-json-comments "^3.1.1" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" @@ -321,10 +331,10 @@ acorn-walk@^8.0.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.0.0.tgz#56ae4c0f434a45fff4a125e7ea95fa9c98f67a16" integrity sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA== -acorn@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" - integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +acorn@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== acorn@^8.0.1: version "8.0.1" @@ -349,6 +359,16 @@ ajv@^6.10.0, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.4: + version "6.12.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" + integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== + 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" + ansi-align@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" @@ -1226,12 +1246,13 @@ eslint-visitor-keys@^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@7.7.0: - version "7.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.7.0.tgz#18beba51411927c4b64da0a8ceadefe4030d6073" - integrity sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg== +eslint@7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.0.tgz#9a3e2e6e4d0a3f8c42686073c25ebf2e91443e8a" + integrity sha512-qgtVyLZqKd2ZXWnLQA4NtVbOyH56zivOAdBFWE54RFkSZjokzNrcP4Z0eVWsZ+84ByXv+jL9k/wE1ENYe8xRFw== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -1241,7 +1262,7 @@ eslint@7.7.0: eslint-scope "^5.1.0" eslint-utils "^2.1.0" eslint-visitor-keys "^1.3.0" - espree "^7.2.0" + espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -1273,12 +1294,12 @@ esm@3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" - integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== +espree@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== dependencies: - acorn "^7.3.1" + acorn "^7.4.0" acorn-jsx "^5.2.0" eslint-visitor-keys "^1.3.0" @@ -1335,6 +1356,11 @@ fast-deep-equal@^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: + 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== + fast-diff@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" @@ -1728,6 +1754,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -3234,6 +3268,11 @@ strip-json-comments@^3.1.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== +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: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" From 496702dad73f4ef50bbea502045f576a02776756 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 2 Sep 2020 15:43:40 +0000 Subject: [PATCH 262/341] Update dependency @types/node to v11.15.21 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6f96ecca..2b356f28 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.20", + "@types/node": "11.15.21", "ava": "3.12.1", "eslint": "7.8.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index a7bd2d46..bfe86a73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -311,10 +311,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.20": - version "11.15.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.20.tgz#dacd63b282c1a0d40fa0ad216b7ca128afded614" - integrity sha512-DY2QwdrBqNlsxdMehwzUtSsWHgYYPLVCAuXvOcu3wkzYmchbRunQ7OEZFOrmFoBLfA1ysz2Ypr6vtNP9WQkUaQ== +"@types/node@11.15.21": + version "11.15.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.21.tgz#6cdf7656b4b0686b303572d3b37e84bab921de11" + integrity sha512-pYC/tp6UctD/laukjIoO48Owmf4OacwEKaDErnlarkatott0j3B5wp9q2M0zn/XgZUpebuFeKMX4UFf578/+Vw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 02b5a41c1dea401403a2caa7b405f26abd0ed326 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 4 Sep 2020 13:01:10 +0000 Subject: [PATCH 263/341] Update dependency eslint to v7.8.1 --- package.json | 2 +- yarn.lock | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 2b356f28..e7183a5b 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.21", "ava": "3.12.1", - "eslint": "7.8.0", + "eslint": "7.8.1", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index bfe86a73..1caf9ba4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -132,14 +132,20 @@ dependencies: arrify "^1.0.1" -"@eslint/eslintrc@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.0.tgz#3d1f19fb797d42fb1c85458c1c73541eeb1d9e76" - integrity sha512-bfL5365QSCmH6cPeFT7Ywclj8C7LiF7sO6mUGzZhtAMV7iID1Euq6740u/SRi4C80NOnVz/CEfK8/HO+nCAPJg== +"@eslint/eslintrc@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" + integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== dependencies: ajv "^6.12.4" debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" strip-json-comments "^3.1.1" "@istanbuljs/load-nyc-config@^1.0.0": @@ -1246,13 +1252,13 @@ eslint-visitor-keys@^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@7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.0.tgz#9a3e2e6e4d0a3f8c42686073c25ebf2e91443e8a" - integrity sha512-qgtVyLZqKd2ZXWnLQA4NtVbOyH56zivOAdBFWE54RFkSZjokzNrcP4Z0eVWsZ+84ByXv+jL9k/wE1ENYe8xRFw== +eslint@7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.1.tgz#e59de3573fb6a5be8ff526c791571646d124a8fa" + integrity sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.1.0" + "@eslint/eslintrc" "^0.1.3" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" From bb4c500e8283353848199db41d46efa93010f245 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 8 Sep 2020 12:59:42 +0000 Subject: [PATCH 264/341] Update dependency @types/node to v11.15.22 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e7183a5b..9d7f4510 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.21", + "@types/node": "11.15.22", "ava": "3.12.1", "eslint": "7.8.1", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 1caf9ba4..3a8847b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -317,10 +317,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.21": - version "11.15.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.21.tgz#6cdf7656b4b0686b303572d3b37e84bab921de11" - integrity sha512-pYC/tp6UctD/laukjIoO48Owmf4OacwEKaDErnlarkatott0j3B5wp9q2M0zn/XgZUpebuFeKMX4UFf578/+Vw== +"@types/node@11.15.22": + version "11.15.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.22.tgz#aab78781ad8b2a75ce818f4a340bb12efac86bc9" + integrity sha512-uVDufn8nnM/F84VPbwGgG4JN3iUajEgpkxkE6oRIH0bPFsQJhNZDNZB6wJbBdjO4IDgwS02ipZidAnroOS53Qg== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 6d78234b8f904f4c950659b572c2878065d1998d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 16 Sep 2020 23:05:14 +0000 Subject: [PATCH 265/341] Update dependency @types/node to v11.15.27 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9d7f4510..45acde1b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.22", + "@types/node": "11.15.27", "ava": "3.12.1", "eslint": "7.8.1", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 3a8847b9..8271b570 100644 --- a/yarn.lock +++ b/yarn.lock @@ -317,10 +317,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== -"@types/node@11.15.22": - version "11.15.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.22.tgz#aab78781ad8b2a75ce818f4a340bb12efac86bc9" - integrity sha512-uVDufn8nnM/F84VPbwGgG4JN3iUajEgpkxkE6oRIH0bPFsQJhNZDNZB6wJbBdjO4IDgwS02ipZidAnroOS53Qg== +"@types/node@11.15.27": + version "11.15.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.27.tgz#2473edcb8a9a51e25332dc24692cbce19dc89dc2" + integrity sha512-LbLwyGC/ukDV0EbHFP1OCfs2V5h3vUS8ZXJJjS2L5YYg8rNkJe6Tl/yv+L+g94sbHllyXUCfUCn5+sZLBegvyw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From e27ceb45a626200ab31e37c57d8d67f8373f0020 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 17 Sep 2020 08:11:50 +0000 Subject: [PATCH 266/341] Update dependency eslint to v7.9.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 45acde1b..96d687b3 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.27", "ava": "3.12.1", - "eslint": "7.8.1", + "eslint": "7.9.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.0", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 8271b570..f4aff0d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1252,10 +1252,10 @@ eslint-visitor-keys@^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@7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.1.tgz#e59de3573fb6a5be8ff526c791571646d124a8fa" - integrity sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w== +eslint@7.9.0: + version "7.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337" + integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.1.3" From b0db4500784e7bca4c3a8b98c7b747ab0d53e6c7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Sep 2020 01:43:08 +0000 Subject: [PATCH 267/341] Update dependency eslint-plugin-import to v2.22.1 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 96d687b3..a7ed82b3 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ava": "3.12.1", "eslint": "7.9.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.22.0", + "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-standard": "4.0.1", diff --git a/yarn.lock b/yarn.lock index f4aff0d4..93f71d8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1155,10 +1155,10 @@ eslint-config-standard@14.1.1: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== -eslint-import-resolver-node@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" - integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== dependencies: debug "^2.6.9" resolve "^1.13.1" @@ -1179,17 +1179,17 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== +eslint-plugin-import@2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" + eslint-import-resolver-node "^0.3.4" eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" From aa828cda9544d979b0d878b35e0fff096bdf8a55 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Sep 2020 18:09:02 +0000 Subject: [PATCH 268/341] Update dependency eslint to v7.10.0 --- package.json | 2 +- yarn.lock | 37 +++++++++++++++++++++---------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index a7ed82b3..634abb95 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.27", "ava": "3.12.1", - "eslint": "7.9.0", + "eslint": "7.10.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 93f71d8c..ffee3d03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1220,12 +1220,12 @@ eslint-plugin-standard@4.0.1: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== -eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +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-utils@^2.0.0: @@ -1252,10 +1252,10 @@ eslint-visitor-keys@^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@7.9.0: - version "7.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337" - integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA== +eslint@7.10.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9" + integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.1.3" @@ -1265,7 +1265,7 @@ eslint@7.9.0: debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" + eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^1.3.0" espree "^7.3.0" @@ -1321,14 +1321,14 @@ esquery@^1.2.0: dependencies: 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@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -1338,6 +1338,11 @@ estraverse@^5.1.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" From 7c08a20287a19d35ecc4ab36dae51153ee893f64 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Sep 2020 18:11:41 +0000 Subject: [PATCH 269/341] Update dependency ava to v3.13.0 --- package.json | 2 +- yarn.lock | 260 +++++++++++++++++++++++---------------------------- 2 files changed, 117 insertions(+), 145 deletions(-) diff --git a/package.json b/package.json index 634abb95..86b22bcc 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.27", - "ava": "3.12.1", + "ava": "3.13.0", "eslint": "7.10.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.1", diff --git a/yarn.lock b/yarn.lock index ffee3d03..2cc90709 100644 --- a/yarn.lock +++ b/yarn.lock @@ -163,14 +163,6 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@nodelib/fs.scandir@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz#7fa8fed654939e1a39753d286b48b4836d00e0eb" - integrity sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg== - dependencies: - "@nodelib/fs.stat" "2.0.1" - run-parallel "^1.1.9" - "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -179,24 +171,11 @@ "@nodelib/fs.stat" "2.0.3" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.1", "@nodelib/fs.stat@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz#814f71b1167390cfcb6a6b3d9cdeb0951a192c14" - integrity sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw== - "@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== -"@nodelib/fs.walk@^1.2.1": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz#6a6450c5e17012abd81450eb74949a4d970d2807" - integrity sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ== - dependencies: - "@nodelib/fs.scandir" "2.1.1" - fastq "^1.6.0" - "@nodelib/fs.walk@^1.2.3": version "1.2.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" @@ -288,35 +267,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*": - version "12.0.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" - integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== - "@types/node@11.15.27": version "11.15.27" resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.27.tgz#2473edcb8a9a51e25332dc24692cbce19dc89dc2" @@ -518,10 +473,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.12.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.12.1.tgz#0181b5ca10d178539a0d503e0fc9244146303717" - integrity sha512-cS41+X+UfrcPed+CIgne/YV/6eWxaUjHEPH+W8WvNSqWTWku5YitjZGE5cMHFuJxwHELdR541xTBRn8Uwi4PSw== +ava@3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.13.0.tgz#df789d71ace66db99b213395338288d6d4322690" + integrity sha512-yzky+gark5PdsFFlZ4CnBVxm/OgBUWtn9vAsSSnuooVJNOk5ER17HJXVeUzy63LIt06Zy34oThcn+2ZqgMs7SA== dependencies: "@concordance/react" "^2.0.0" acorn "^8.0.1" @@ -543,8 +498,8 @@ ava@3.12.1: concordance "^5.0.1" convert-source-map "^1.7.0" currently-unhandled "^0.4.1" - debug "^4.1.1" - del "^5.1.0" + debug "^4.2.0" + del "^6.0.0" emittery "^0.7.1" equal-length "^1.0.0" figures "^3.2.0" @@ -553,19 +508,20 @@ ava@3.12.1: import-local "^3.0.2" indent-string "^4.0.0" is-error "^2.2.2" - is-plain-object "^4.1.1" + is-plain-object "^5.0.0" is-promise "^4.0.0" lodash "^4.17.20" matcher "^3.0.0" md5-hex "^3.0.1" - mem "^6.1.0" + mem "^6.1.1" ms "^2.1.2" - ora "^5.0.0" + ora "^5.1.0" + p-event "^4.2.0" p-map "^4.0.0" picomatch "^2.2.2" pkg-conf "^3.1.0" plur "^4.0.0" - pretty-ms "^7.0.0" + pretty-ms "^7.0.1" read-pkg "^5.2.0" resolve-cwd "^3.0.0" slash "^3.0.0" @@ -577,7 +533,7 @@ ava@3.12.1: trim-off-newlines "^1.0.1" update-notifier "^4.1.1" write-file-atomic "^3.0.3" - yargs "^15.4.1" + yargs "^16.0.3" balanced-match@^1.0.0: version "1.0.0" @@ -793,6 +749,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.1.tgz#a4cb67aad45cd83d8d05128fc9f4d8fbb887e6b3" + integrity sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -957,6 +922,13 @@ debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" +debug@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1005,18 +977,18 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -del@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" + globby "^11.0.1" + graceful-fs "^4.2.4" is-glob "^4.0.1" is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" slash "^3.0.0" diff@^4.0.2: @@ -1130,6 +1102,11 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +escalade@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" + integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -1377,18 +1354,6 @@ fast-diff@^1.2.0: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.0.4.tgz#d484a41005cb6faeb399b951fd1bd70ddaebb602" - integrity sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg== - dependencies: - "@nodelib/fs.stat" "^2.0.1" - "@nodelib/fs.walk" "^1.2.1" - glob-parent "^5.0.0" - is-glob "^4.0.1" - merge2 "^1.2.3" - micromatch "^4.0.2" - fast-glob@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" @@ -1535,7 +1500,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -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== @@ -1617,20 +1582,6 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globby@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" - integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - globby@^11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" @@ -1670,10 +1621,10 @@ graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== has-flag@^3.0.0: version "3.0.0" @@ -1944,15 +1895,15 @@ is-path-cwd@^2.2.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^3.0.1: +is-path-inside@^3.0.1, is-path-inside@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== -is-plain-object@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-4.1.1.tgz#1a14d6452cbd50790edc7fdaa0aed5a40a35ebb5" - integrity sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA== +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-promise@^2.1.0: version "2.1.0" @@ -2292,19 +2243,14 @@ md5-hex@^3.0.1: dependencies: blueimp-md5 "^2.10.0" -mem@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.0.tgz#846eca0bd4708a8f04b9c3f3cd769e194ae63c5c" - integrity sha512-RlbnLQgRHk5lwqTtpEkBTQ2ll/CG/iB+J4Hy2Wh97PjgZgXgWJWrFF+XXujh3UUVLvR4OOTgZzcWMMwnehlEUg== +mem@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.1.tgz#ea110c2ebc079eca3022e6b08c85a795e77f6318" + integrity sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q== dependencies: map-age-cleaner "^0.1.3" mimic-fn "^3.0.0" -merge2@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== - merge2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" @@ -2362,16 +2308,16 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@2.1.2, 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: 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== - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -2519,10 +2465,10 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.0.0.tgz#4f0b34f2994877b49b452a707245ab1e9f6afccb" - integrity sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw== +ora@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.1.0.tgz#b188cf8cd2d4d9b13fd25383bc3e5cba352c94f8" + integrity sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w== dependencies: chalk "^4.1.0" cli-cursor "^3.1.0" @@ -2548,6 +2494,18 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-event@^4.2.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-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -2604,6 +2562,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +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" @@ -2774,10 +2739,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-ms@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.0.tgz#45781273110caf35f55cab21a8a9bd403a233dc0" - integrity sha512-J3aPWiC5e9ZeZFuSeBraGxSkGMOvulSWsxDByOcbD1Pr75YL3LSNIKIb52WXbCLE1sS5s4inBBbryjF4Y05Ceg== +pretty-ms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== dependencies: parse-ms "^2.1.0" @@ -2971,7 +2936,7 @@ rimraf@2.6.3: 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== @@ -3549,6 +3514,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" @@ -3591,6 +3565,11 @@ y18n@^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.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.1.tgz#1ad2a7eddfa8bce7caa2e1f6b5da96c39d99d571" + integrity sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg== + yabf@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.1.0.tgz#b67325eb9f16f14921cfe75985b9948b5b1429fe" @@ -3604,13 +3583,10 @@ yargs-parser@^16.1.0: 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" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^20.0.0: + version "20.2.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.0.tgz#944791ca2be2e08ddadd3d87e9de4c6484338605" + integrity sha512-2agPoRFPoIcFzOIp6656gcvsg2ohtscpw2OINr/q46+Sq41xz2OYLqx5HRHabmFU1OARIPAYH5uteICE7mn/5A== yargs@^15.0.2: version "15.0.2" @@ -3629,19 +3605,15 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^16.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== +yargs@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.0.3.tgz#7a919b9e43c90f80d4a142a89795e85399a7e54c" + integrity sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA== dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + cliui "^7.0.0" + escalade "^3.0.2" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" + y18n "^5.0.1" + yargs-parser "^20.0.0" From 779228d31584a56aec148dcc3720a333551af2de Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 29 Sep 2020 20:40:28 +0000 Subject: [PATCH 270/341] Update dependency sinon to v9.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 86b22bcc..d5f082c3 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "9.0.3" + "sinon": "9.1.0" } } diff --git a/yarn.lock b/yarn.lock index 2cc90709..ae5dfce6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3043,10 +3043,10 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.3.tgz#bffc3ec28c936332cd2a41833547b9eed201ecff" - integrity sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg== +sinon@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.1.0.tgz#4afc90707c8e360fe051398eed2d3b197980ffc3" + integrity sha512-9zQShgaeylYH6qtsnNXlTvv0FGTTckuDfHBi+qhgj5PvW2r2WslHZpgc3uy3e/ZAoPkqaOASPi+juU6EdYRYxA== dependencies: "@sinonjs/commons" "^1.7.2" "@sinonjs/fake-timers" "^6.0.1" From dc90af0981355a6c487916dac8e0c3ebd357abe8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 6 Oct 2020 05:50:04 +0000 Subject: [PATCH 271/341] Update dependency @types/node to v11.15.29 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d5f082c3..8eeb9266 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.27", + "@types/node": "11.15.29", "ava": "3.13.0", "eslint": "7.10.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index ae5dfce6..c07b8be2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.27": - version "11.15.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.27.tgz#2473edcb8a9a51e25332dc24692cbce19dc89dc2" - integrity sha512-LbLwyGC/ukDV0EbHFP1OCfs2V5h3vUS8ZXJJjS2L5YYg8rNkJe6Tl/yv+L+g94sbHllyXUCfUCn5+sZLBegvyw== +"@types/node@11.15.29": + version "11.15.29" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.29.tgz#f8d8831ef4c6961de748aeb37588b419b043bf27" + integrity sha512-qX3rjMp9f9SiectkYjMz66Yvoyte3W8gRPQ6wmNjtt/Y7tHP/okNE2mFCvaMY/fCgWJsNRSmHfe6Oo0CsjZgdA== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 329e933f45dc250b9a18085498c20d034fdd3f33 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 6 Oct 2020 19:15:53 +0000 Subject: [PATCH 272/341] Update dependency sinon to v9.2.0 --- package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 8eeb9266..6c28ddee 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.1", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "9.1.0" + "sinon": "9.2.0" } } diff --git a/yarn.lock b/yarn.lock index c07b8be2..a9c6943c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -203,10 +203,10 @@ dependencies: type-detect "4.0.8" -"@sinonjs/commons@^1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" - integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== +"@sinonjs/commons@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== dependencies: type-detect "4.0.8" @@ -241,10 +241,10 @@ lodash.get "^4.4.2" type-detect "^4.0.8" -"@sinonjs/samsam@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.1.0.tgz#3afe719232b541bb6cf3411a4c399a188de21ec0" - integrity sha512-42nyaQOVunX5Pm6GRJobmzbS7iLI+fhERITnETXzzwDZh+TtDr/Au3yAvXVjFmZ4wEUaE4Y3NFZfKv0bV0cbtg== +"@sinonjs/samsam@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.2.0.tgz#fcff83ab86f83b5498f4a967869c079408d9b5eb" + integrity sha512-CaIcyX5cDsjcW/ab7HposFWzV1kC++4HNsfnEdFJa7cP1QIuILAKV+BgfeqRXhcnSAc76r/Rh/O5C+300BwUIw== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -3043,15 +3043,15 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.1.0.tgz#4afc90707c8e360fe051398eed2d3b197980ffc3" - integrity sha512-9zQShgaeylYH6qtsnNXlTvv0FGTTckuDfHBi+qhgj5PvW2r2WslHZpgc3uy3e/ZAoPkqaOASPi+juU6EdYRYxA== +sinon@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.0.tgz#1d333967e30023609f7347351ebc0dc964c0f3c9" + integrity sha512-eSNXz1XMcGEMHw08NJXSyTHIu6qTCOiN8x9ODACmZpNQpr0aXTBXBnI4xTzQzR+TEpOmLiKowGf9flCuKIzsbw== dependencies: - "@sinonjs/commons" "^1.7.2" + "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" "@sinonjs/formatio" "^5.0.1" - "@sinonjs/samsam" "^5.1.0" + "@sinonjs/samsam" "^5.2.0" diff "^4.0.2" nise "^4.0.4" supports-color "^7.1.0" From 2333787167750c2527f1b81145c9334b3368495f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 8 Oct 2020 19:37:15 +0000 Subject: [PATCH 273/341] Update dependency @types/node to v11.15.30 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6c28ddee..c321905a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.29", + "@types/node": "11.15.30", "ava": "3.13.0", "eslint": "7.10.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index a9c6943c..bb9090ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.29": - version "11.15.29" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.29.tgz#f8d8831ef4c6961de748aeb37588b419b043bf27" - integrity sha512-qX3rjMp9f9SiectkYjMz66Yvoyte3W8gRPQ6wmNjtt/Y7tHP/okNE2mFCvaMY/fCgWJsNRSmHfe6Oo0CsjZgdA== +"@types/node@11.15.30": + version "11.15.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.30.tgz#bf3aa4c770952facbf3cd928d280eec8ae09b48a" + integrity sha512-hfwDEF18Jyh94A9D8d/VVQlty0gOeNjQLvNjo2pHwosSfI7D+yUTzEZSop4vltJ1iEoimUqi5u3ABs2UlLvfcw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 6d6cfc95c5f2ead81efaf39b4bea1623d2e219b3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 9 Oct 2020 07:40:25 +0000 Subject: [PATCH 274/341] Update dependency @types/node to v11.15.31 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c321905a..e472ee97 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.30", + "@types/node": "11.15.31", "ava": "3.13.0", "eslint": "7.10.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index bb9090ac..357d80d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.30": - version "11.15.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.30.tgz#bf3aa4c770952facbf3cd928d280eec8ae09b48a" - integrity sha512-hfwDEF18Jyh94A9D8d/VVQlty0gOeNjQLvNjo2pHwosSfI7D+yUTzEZSop4vltJ1iEoimUqi5u3ABs2UlLvfcw== +"@types/node@11.15.31": + version "11.15.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.31.tgz#5b6defddc463e22228662f70fb994ebac09af8f3" + integrity sha512-knokd17nR451ndiysNuYmVSypYDbA6Rgojxmj8xJz1NG8nn8lodw1N3Mt4oKaMcPAgSX3smhfn2+lGvQ8UTXtg== "@types/normalize-package-data@^2.4.0": version "2.4.0" From f2b10811173f565007dfc43d9f80aaf5c35a48eb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 15 Oct 2020 19:59:38 +0000 Subject: [PATCH 275/341] Update dependency eslint to v7.11.0 --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e472ee97..630ce72d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.31", "ava": "3.13.0", - "eslint": "7.10.0", + "eslint": "7.11.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 357d80d4..5b30757b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1229,10 +1229,15 @@ eslint-visitor-keys@^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@7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9" - integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.11.0.tgz#aaf2d23a0b5f1d652a08edacea0c19f7fadc0b3b" + integrity sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.1.3" @@ -1244,7 +1249,7 @@ eslint@7.10.0: enquirer "^2.3.5" eslint-scope "^5.1.1" eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" + eslint-visitor-keys "^2.0.0" espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" From e4e43adcce1b286a2b6fae1f3bd8516ff5eaf013 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 16 Oct 2020 17:26:10 +0000 Subject: [PATCH 276/341] Update dependency @types/node to v11.15.32 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 630ce72d..25d7087e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.31", + "@types/node": "11.15.32", "ava": "3.13.0", "eslint": "7.11.0", "eslint-config-standard": "14.1.1", diff --git a/yarn.lock b/yarn.lock index 5b30757b..8960ad17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.31": - version "11.15.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.31.tgz#5b6defddc463e22228662f70fb994ebac09af8f3" - integrity sha512-knokd17nR451ndiysNuYmVSypYDbA6Rgojxmj8xJz1NG8nn8lodw1N3Mt4oKaMcPAgSX3smhfn2+lGvQ8UTXtg== +"@types/node@11.15.32": + version "11.15.32" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.32.tgz#9b115b4632825670b596912c4dc135a06d240487" + integrity sha512-e1PHKso2b2UBvAeR9kVUWfmAQlmjEcSM+vjuwIyvd24UjlC1WeAFD/XPAvicR/ahvhfiIeT//1GiF/3Rklsq/g== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 11f9148dc2df0a279d3f7afb0015c22f7a6ae228 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 24 Oct 2020 03:25:37 +0000 Subject: [PATCH 277/341] Update dependency eslint to v7.12.0 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 25d7087e..0e4d2f79 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.32", "ava": "3.13.0", - "eslint": "7.11.0", + "eslint": "7.12.0", "eslint-config-standard": "14.1.1", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 8960ad17..a4dd6528 100644 --- a/yarn.lock +++ b/yarn.lock @@ -132,10 +132,10 @@ dependencies: arrify "^1.0.1" -"@eslint/eslintrc@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" - integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== +"@eslint/eslintrc@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.0.tgz#bc7e3c4304d4c8720968ccaee793087dfb5fe6b4" + integrity sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -1234,13 +1234,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.11.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.11.0.tgz#aaf2d23a0b5f1d652a08edacea0c19f7fadc0b3b" - integrity sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw== +eslint@7.12.0: + version "7.12.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.0.tgz#7b6a85f87a9adc239e979bb721cde5ce0dc27da6" + integrity sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.1.3" + "@eslint/eslintrc" "^0.2.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" From f1cd3ba1784d6b473a5d7d6395d5ecc86481eebe Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 25 Oct 2020 02:41:17 +0000 Subject: [PATCH 278/341] Update dependency commander to v6.2.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 25d7087e..93ec1892 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "4.1.0", - "commander": "6.1.0", + "commander": "6.2.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.3.3", diff --git a/yarn.lock b/yarn.lock index 8960ad17..5a7a5666 100644 --- a/yarn.lock +++ b/yarn.lock @@ -801,10 +801,10 @@ 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== -commander@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" - integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== +commander@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" + integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== common-path-prefix@^3.0.0: version "3.0.0" From a873f8d5ddb48d4971923c3ea93b4f3488b66de7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 25 Oct 2020 03:27:47 +0000 Subject: [PATCH 279/341] Update dependency eslint-plugin-standard to v4.0.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c5d9e44e..d2d639dc 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", - "eslint-plugin-standard": "4.0.1", + "eslint-plugin-standard": "4.0.2", "nyc": "15.1.0", "rimraf": "3.0.2", "sinon": "9.2.0" diff --git a/yarn.lock b/yarn.lock index 30032d4e..a064419c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1192,10 +1192,10 @@ eslint-plugin-promise@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-standard@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" - integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== +eslint-plugin-standard@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz#021211a9f077e63a6847e7bb9ab4247327ac8e0c" + integrity sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA== eslint-scope@^5.1.1: version "5.1.1" From 59524007738b3a48aadabcc110ccb7033e8c71a7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 25 Oct 2020 03:29:01 +0000 Subject: [PATCH 280/341] Update dependency eslint-config-standard to v15 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d2d639dc..f722ef11 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.15.32", "ava": "3.13.0", "eslint": "7.12.0", - "eslint-config-standard": "14.1.1", + "eslint-config-standard": "15.0.0", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index a064419c..2d030a3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,10 +1127,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-standard@14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== +eslint-config-standard@15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-15.0.0.tgz#459f823b47ac0541b0a22b1d0a161a9da543f687" + integrity sha512-MZ8KRhUJLtMbjQo9PsEzFG29vqbQJfLoLBHrTaAaFMtDx9PIm1GZgyUanOLgf1xOE1aWrtZZSbxBYCy8dJCCBg== eslint-import-resolver-node@^0.3.4: version "0.3.4" From 2536f8fd0e78655515fa2dc33f5327f8003de758 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 25 Oct 2020 03:29:43 +0000 Subject: [PATCH 281/341] Update dependency @types/node to v11.15.33 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f722ef11..785f8a80 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.32", + "@types/node": "11.15.33", "ava": "3.13.0", "eslint": "7.12.0", "eslint-config-standard": "15.0.0", diff --git a/yarn.lock b/yarn.lock index 2d030a3e..70739704 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.32": - version "11.15.32" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.32.tgz#9b115b4632825670b596912c4dc135a06d240487" - integrity sha512-e1PHKso2b2UBvAeR9kVUWfmAQlmjEcSM+vjuwIyvd24UjlC1WeAFD/XPAvicR/ahvhfiIeT//1GiF/3Rklsq/g== +"@types/node@11.15.33": + version "11.15.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.33.tgz#8337b7ab924e541efe5a5aaa2a3a6585f57f5ac5" + integrity sha512-Hjp188ODKWJ+3C1uFKTSPsHp+7NPImGLGEIYEyfOiFYwrKpVXuxzPoBt3LsuAR61VNN0QuD4nQmk48p/kbfubw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From c4eb37e5f447346214aaa6925c2db76c8a030260 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 26 Oct 2020 23:05:43 +0000 Subject: [PATCH 282/341] Update dependency @types/node to v11.15.34 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 785f8a80..abf87b83 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.33", + "@types/node": "11.15.34", "ava": "3.13.0", "eslint": "7.12.0", "eslint-config-standard": "15.0.0", diff --git a/yarn.lock b/yarn.lock index 70739704..e716bbd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.33": - version "11.15.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.33.tgz#8337b7ab924e541efe5a5aaa2a3a6585f57f5ac5" - integrity sha512-Hjp188ODKWJ+3C1uFKTSPsHp+7NPImGLGEIYEyfOiFYwrKpVXuxzPoBt3LsuAR61VNN0QuD4nQmk48p/kbfubw== +"@types/node@11.15.34": + version "11.15.34" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.34.tgz#9d0f7a2bdea9250515ea3f8e86fe10911cea0e64" + integrity sha512-mT918tcEWkw9SYzpKzDdrYzjMDh68wmLfiVo6PDPEt1k71qcuPQumGcLlxB2AW/pLdTDNO+Nxj2fvsClDrtkqg== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 59573e8e8b71b16742aa8d98d4141aa09f8563c1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 27 Oct 2020 13:53:10 +0000 Subject: [PATCH 283/341] Update dependency eslint to v7.12.1 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index abf87b83..48919688 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.34", "ava": "3.13.0", - "eslint": "7.12.0", + "eslint": "7.12.1", "eslint-config-standard": "15.0.0", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index e716bbd2..532da685 100644 --- a/yarn.lock +++ b/yarn.lock @@ -132,10 +132,10 @@ dependencies: arrify "^1.0.1" -"@eslint/eslintrc@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.0.tgz#bc7e3c4304d4c8720968ccaee793087dfb5fe6b4" - integrity sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ== +"@eslint/eslintrc@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" + integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -1234,13 +1234,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.12.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.0.tgz#7b6a85f87a9adc239e979bb721cde5ce0dc27da6" - integrity sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA== +eslint@7.12.1: + version "7.12.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801" + integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.0" + "@eslint/eslintrc" "^0.2.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" From 4c2983965aef4e165ef04d90144d7e7ea2208f0d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 28 Oct 2020 04:08:54 +0000 Subject: [PATCH 284/341] Update dependency eslint-config-standard to v15.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 48919688..82f8ef82 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.15.34", "ava": "3.13.0", "eslint": "7.12.1", - "eslint-config-standard": "15.0.0", + "eslint-config-standard": "15.0.1", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 532da685..9b3e65d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,10 +1127,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-standard@15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-15.0.0.tgz#459f823b47ac0541b0a22b1d0a161a9da543f687" - integrity sha512-MZ8KRhUJLtMbjQo9PsEzFG29vqbQJfLoLBHrTaAaFMtDx9PIm1GZgyUanOLgf1xOE1aWrtZZSbxBYCy8dJCCBg== +eslint-config-standard@15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-15.0.1.tgz#1262eafaba66f4f03fdf3cf655a28aa8b40868b7" + integrity sha512-UGorkix49kBium7Y124o2U9Qy7Lpa+nO0FsaqQSIPeno5hGNxZtSBJbqJX6gtpYfDFWCtqCAN9wyK+oDd9jT7Q== eslint-import-resolver-node@^0.3.4: version "0.3.4" From 535f22ebe649bc1887c1281b7166e87c09bd34fc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 28 Oct 2020 19:10:57 +0000 Subject: [PATCH 285/341] Update dependency @types/node to v11.15.35 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 82f8ef82..2f4424ed 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.34", + "@types/node": "11.15.35", "ava": "3.13.0", "eslint": "7.12.1", "eslint-config-standard": "15.0.1", diff --git a/yarn.lock b/yarn.lock index 9b3e65d9..6b6c48cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.34": - version "11.15.34" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.34.tgz#9d0f7a2bdea9250515ea3f8e86fe10911cea0e64" - integrity sha512-mT918tcEWkw9SYzpKzDdrYzjMDh68wmLfiVo6PDPEt1k71qcuPQumGcLlxB2AW/pLdTDNO+Nxj2fvsClDrtkqg== +"@types/node@11.15.35": + version "11.15.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.35.tgz#282b97494e4967649d776c3cc91da5f861a03c40" + integrity sha512-kmxE30w+R//Vh/+dlVS5DPPyzPtWtrMrJ9+io7jvkPtWv3X43ERA4HTcFEn/R7dtHO3HCMU1y3WKf3NDLYhQEQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 14692f2c57e139e6f54500f47374b30d00d1acc8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 29 Oct 2020 06:34:34 +0000 Subject: [PATCH 286/341] Update dependency eslint-config-standard to v16 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 82f8ef82..741ba2ec 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.15.34", "ava": "3.13.0", "eslint": "7.12.1", - "eslint-config-standard": "15.0.1", + "eslint-config-standard": "16.0.0", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 9b3e65d9..a05b186a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,10 +1127,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-standard@15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-15.0.1.tgz#1262eafaba66f4f03fdf3cf655a28aa8b40868b7" - integrity sha512-UGorkix49kBium7Y124o2U9Qy7Lpa+nO0FsaqQSIPeno5hGNxZtSBJbqJX6gtpYfDFWCtqCAN9wyK+oDd9jT7Q== +eslint-config-standard@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.0.tgz#5f21e9b8be8be28c096e592e1137769d33c5cd92" + integrity sha512-kMCehB9yXIG+LNsu9uXfm06o6Pt63TFAOzn9tUOzw4r/hFIxHhNR1Xomxy+B5zMrXhqyfHVEcmanzttEjGei9w== eslint-import-resolver-node@^0.3.4: version "0.3.4" From 77e8c1133ef2937d1d45b515ec5689980f451e61 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 29 Oct 2020 20:22:06 +0000 Subject: [PATCH 287/341] Update dependency sinon to v9.2.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 8ab7662e..ccd6db45 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.0.2", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "9.2.0" + "sinon": "9.2.1" } } diff --git a/yarn.lock b/yarn.lock index ea8eb467..0f398817 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3048,10 +3048,10 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.0.tgz#1d333967e30023609f7347351ebc0dc964c0f3c9" - integrity sha512-eSNXz1XMcGEMHw08NJXSyTHIu6qTCOiN8x9ODACmZpNQpr0aXTBXBnI4xTzQzR+TEpOmLiKowGf9flCuKIzsbw== +sinon@9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.1.tgz#64cc88beac718557055bd8caa526b34a2231be6d" + integrity sha512-naPfsamB5KEE1aiioaoqJ6MEhdUs/2vtI5w1hPAXX/UwvoPjXcwh1m5HiKx0HGgKR8lQSoFIgY5jM6KK8VrS9w== dependencies: "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" From 33009826b3bd80af9fe09ab35135af7f04b2f577 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 30 Oct 2020 21:16:55 +0000 Subject: [PATCH 288/341] Update dependency eslint-config-standard to v16.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ccd6db45..596598af 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.15.35", "ava": "3.13.0", "eslint": "7.12.1", - "eslint-config-standard": "16.0.0", + "eslint-config-standard": "16.0.1", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 0f398817..ac08a3b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,10 +1127,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-standard@16.0.0: - version "16.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.0.tgz#5f21e9b8be8be28c096e592e1137769d33c5cd92" - integrity sha512-kMCehB9yXIG+LNsu9uXfm06o6Pt63TFAOzn9tUOzw4r/hFIxHhNR1Xomxy+B5zMrXhqyfHVEcmanzttEjGei9w== +eslint-config-standard@16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.1.tgz#9a385eea27f96b7918cb53f07e01e9d10cc56401" + integrity sha512-WBBiQQZdaPyL+4sPkGWhWrHCDtvJoU195B9j8yXE9uFQnX34gMXI5CeBRm95gx3PMEZPM5OpwET10hH4F4SxCA== eslint-import-resolver-node@^0.3.4: version "0.3.4" From cc35f2c3145be10fe4bd1eb21cf2916afde9155c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 7 Nov 2020 02:19:41 +0000 Subject: [PATCH 289/341] Update dependency eslint to v7.13.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 596598af..4e36904e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.35", "ava": "3.13.0", - "eslint": "7.12.1", + "eslint": "7.13.0", "eslint-config-standard": "16.0.1", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index ac08a3b6..ea1f8c9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1234,10 +1234,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.12.1: - version "7.12.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801" - integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg== +eslint@7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.13.0.tgz#7f180126c0dcdef327bfb54b211d7802decc08da" + integrity sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.2.1" From 10845dc66a29ff9bb03e563f846c560aac92e220 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 10 Nov 2020 05:06:43 +0000 Subject: [PATCH 290/341] Update dependency eslint-plugin-standard to v4.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4e36904e..e8ea8ed3 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", - "eslint-plugin-standard": "4.0.2", + "eslint-plugin-standard": "4.1.0", "nyc": "15.1.0", "rimraf": "3.0.2", "sinon": "9.2.1" diff --git a/yarn.lock b/yarn.lock index ea1f8c9e..44604391 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1192,10 +1192,10 @@ eslint-plugin-promise@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-standard@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz#021211a9f077e63a6847e7bb9ab4247327ac8e0c" - integrity sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA== +eslint-plugin-standard@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" + integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== eslint-scope@^5.1.1: version "5.1.1" From b3e22f906e50771d82befe98bf3979ee2ad00036 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 17 Nov 2020 23:58:44 +0000 Subject: [PATCH 291/341] Update dependency @types/node to v11.15.36 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e8ea8ed3..44d71b8e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.35", + "@types/node": "11.15.36", "ava": "3.13.0", "eslint": "7.13.0", "eslint-config-standard": "16.0.1", diff --git a/yarn.lock b/yarn.lock index 44604391..25a2619b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.35": - version "11.15.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.35.tgz#282b97494e4967649d776c3cc91da5f861a03c40" - integrity sha512-kmxE30w+R//Vh/+dlVS5DPPyzPtWtrMrJ9+io7jvkPtWv3X43ERA4HTcFEn/R7dtHO3HCMU1y3WKf3NDLYhQEQ== +"@types/node@11.15.36": + version "11.15.36" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.36.tgz#e4a9da7c042cea6a836d1915f2f085ac6ddeb7f8" + integrity sha512-mI+sDwwudPsftB5Dn3pYDI0J/133enPJe0XIv7akV4KG8ZRt+9M/PpyKH/37mdL2tTYmdWfKc/XpLpnLteP2qQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" From ca4fdaa52325fcf1b45d3ea2c9b19cc246a9bcfc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 18 Nov 2020 01:57:13 +0000 Subject: [PATCH 292/341] Update dependency eslint-config-standard to v16.0.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e8ea8ed3..d62635ad 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "11.15.35", "ava": "3.13.0", "eslint": "7.13.0", - "eslint-config-standard": "16.0.1", + "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 44604391..e128e517 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,10 +1127,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-standard@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.1.tgz#9a385eea27f96b7918cb53f07e01e9d10cc56401" - integrity sha512-WBBiQQZdaPyL+4sPkGWhWrHCDtvJoU195B9j8yXE9uFQnX34gMXI5CeBRm95gx3PMEZPM5OpwET10hH4F4SxCA== +eslint-config-standard@16.0.2: + version "16.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz#71e91727ac7a203782d0a5ca4d1c462d14e234f6" + integrity sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw== eslint-import-resolver-node@^0.3.4: version "0.3.4" From 6714df606a446b32e92f97d7418d10eb5f96e43d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 25 Nov 2020 06:58:42 +0000 Subject: [PATCH 293/341] Update dependency @types/node to v11.15.38 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7f8db24b..ad2115ec 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.36", + "@types/node": "11.15.38", "ava": "3.13.0", "eslint": "7.13.0", "eslint-config-standard": "16.0.2", diff --git a/yarn.lock b/yarn.lock index e5a3725b..bfe51e61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.36": - version "11.15.36" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.36.tgz#e4a9da7c042cea6a836d1915f2f085ac6ddeb7f8" - integrity sha512-mI+sDwwudPsftB5Dn3pYDI0J/133enPJe0XIv7akV4KG8ZRt+9M/PpyKH/37mdL2tTYmdWfKc/XpLpnLteP2qQ== +"@types/node@11.15.38": + version "11.15.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.38.tgz#002372724f35a9755d35b9ebd70839617e967519" + integrity sha512-Bx0NCSyy9oCxjDySk7/c0K4ULn7hq2QOocbQWhG15nUAiibE8E5i2kXQKfFzU8o1yXEhC2etAu78+jw6cdoW2w== "@types/normalize-package-data@^2.4.0": version "2.4.0" From d1def53be940f206f0f7f90d90739d53e038f4c9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 26 Nov 2020 11:07:44 +0000 Subject: [PATCH 294/341] Update dependency eslint to v7.14.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ad2115ec..260a5474 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.38", "ava": "3.13.0", - "eslint": "7.13.0", + "eslint": "7.14.0", "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index bfe51e61..73d3deaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1234,10 +1234,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.13.0: - version "7.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.13.0.tgz#7f180126c0dcdef327bfb54b211d7802decc08da" - integrity sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ== +eslint@7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344" + integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.2.1" From 54012e8ee814a533c40d80eeb60bc66a7aaf0763 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Nov 2020 19:10:40 +0000 Subject: [PATCH 295/341] Update dependency @types/node to v11.15.39 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 260a5474..c5e77602 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.38", + "@types/node": "11.15.39", "ava": "3.13.0", "eslint": "7.14.0", "eslint-config-standard": "16.0.2", diff --git a/yarn.lock b/yarn.lock index 73d3deaa..14f314d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.38": - version "11.15.38" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.38.tgz#002372724f35a9755d35b9ebd70839617e967519" - integrity sha512-Bx0NCSyy9oCxjDySk7/c0K4ULn7hq2QOocbQWhG15nUAiibE8E5i2kXQKfFzU8o1yXEhC2etAu78+jw6cdoW2w== +"@types/node@11.15.39": + version "11.15.39" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.39.tgz#00043d22cb2814c0ca32ef17e789911aa2325d9a" + integrity sha512-vVNBFg0n7vd2GuIEDa/s854RpcqAMRer/8IPmhKCYEoC2cLDGeTPNwlnAmSoI0sddOPhTb82DDWeHMrqEi5p3w== "@types/normalize-package-data@^2.4.0": version "2.4.0" From d6e269cd4bf6cebec085bc5aaf5b123ab74f5b58 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 5 Dec 2020 08:24:02 +0000 Subject: [PATCH 296/341] Update dependency eslint to v7.15.0 --- package.json | 2 +- yarn.lock | 93 ++++++++++++++++++++++------------------------------ 2 files changed, 41 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index c5e77602..a96cbd0d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.39", "ava": "3.13.0", - "eslint": "7.14.0", + "eslint": "7.15.0", "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 14f314d6..6dabf84d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -132,10 +132,10 @@ dependencies: arrify "^1.0.1" -"@eslint/eslintrc@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" - integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -287,6 +287,11 @@ acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + acorn-walk@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.0.0.tgz#56ae4c0f434a45fff4a125e7ea95fa9c98f67a16" @@ -1234,13 +1239,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344" - integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA== +eslint@7.15.0: + version "7.15.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.15.0.tgz#eb155fb8ed0865fcf5d903f76be2e5b6cd7e0bc7" + integrity sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.1" + "@eslint/eslintrc" "^0.2.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -1250,10 +1255,10 @@ eslint@7.14.0: eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" - espree "^7.3.0" + espree "^7.3.1" esquery "^1.2.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + file-entry-cache "^6.0.0" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" globals "^12.1.0" @@ -1291,6 +1296,15 @@ espree@^7.3.0: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.3.0" +espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -1401,12 +1415,12 @@ figures@^3.2.0: 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.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" @@ -1453,19 +1467,18 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -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== +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: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" - integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== flex-exec@^1.0.0: version "1.0.0" @@ -2291,23 +2304,11 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -mkdirp@^0.5.1: - 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" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -2934,13 +2935,6 @@ reusify@^1.0.0: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - 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: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -3553,13 +3547,6 @@ write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -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" - xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" From b2e0574ac68de96d19fcb2a6737aeacb66c77ffc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Dec 2020 02:35:54 +0000 Subject: [PATCH 297/341] Bump ini from 1.3.5 to 1.3.7 Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6dabf84d..fa303eab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1784,9 +1784,9 @@ inherits@2: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== inquirer@7.3.3: version "7.3.3" From ffada78483f595d08e78df8e31f59d266764a37c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 12 Dec 2020 17:32:55 +0000 Subject: [PATCH 298/341] Update dependency @types/node to v11.15.40 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a96cbd0d..337c893c 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.39", + "@types/node": "11.15.40", "ava": "3.13.0", "eslint": "7.15.0", "eslint-config-standard": "16.0.2", diff --git a/yarn.lock b/yarn.lock index 6dabf84d..0cef5f78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.39": - version "11.15.39" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.39.tgz#00043d22cb2814c0ca32ef17e789911aa2325d9a" - integrity sha512-vVNBFg0n7vd2GuIEDa/s854RpcqAMRer/8IPmhKCYEoC2cLDGeTPNwlnAmSoI0sddOPhTb82DDWeHMrqEi5p3w== +"@types/node@11.15.40": + version "11.15.40" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.40.tgz#66b17b7a9b06fe2689a77afeaa6f432779018b28" + integrity sha512-pGIHnyS9XYo7uSV6YHWSsXlqZ1NanfsxMCreJX94T963sA9733Ctsjo2VIq74MvKx3+i4t50HQPfuLfNuZSo4g== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 9bd6cc3a208e15902b882ddef091b3bf5418c8d4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 14 Dec 2020 00:51:44 +0000 Subject: [PATCH 299/341] Update dependency commander to v6.2.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a96cbd0d..94956115 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "4.1.0", - "commander": "6.2.0", + "commander": "6.2.1", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.3.3", diff --git a/yarn.lock b/yarn.lock index 6dabf84d..338a7834 100644 --- a/yarn.lock +++ b/yarn.lock @@ -806,10 +806,10 @@ 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== -commander@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" - integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== +commander@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== common-path-prefix@^3.0.0: version "3.0.0" From 0092871723bb4a1892f9cc834f30f7c35b55e830 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Dec 2020 20:07:32 +0000 Subject: [PATCH 300/341] Update dependency sinon to v9.2.2 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 94956115..d07dcd23 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.1.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "9.2.1" + "sinon": "9.2.2" } } diff --git a/yarn.lock b/yarn.lock index 338a7834..72427181 100644 --- a/yarn.lock +++ b/yarn.lock @@ -241,10 +241,10 @@ lodash.get "^4.4.2" type-detect "^4.0.8" -"@sinonjs/samsam@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.2.0.tgz#fcff83ab86f83b5498f4a967869c079408d9b5eb" - integrity sha512-CaIcyX5cDsjcW/ab7HposFWzV1kC++4HNsfnEdFJa7cP1QIuILAKV+BgfeqRXhcnSAc76r/Rh/O5C+300BwUIw== +"@sinonjs/samsam@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.0.tgz#1d2f0743dc54bf13fe9d508baefacdffa25d4329" + integrity sha512-hXpcfx3aq+ETVBwPlRFICld5EnrkexXuXDwqUNhDdr5L8VjvMeSRwyOa0qL7XFmR+jVWR4rUZtnxlG7RX72sBg== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -3042,15 +3042,15 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.1.tgz#64cc88beac718557055bd8caa526b34a2231be6d" - integrity sha512-naPfsamB5KEE1aiioaoqJ6MEhdUs/2vtI5w1hPAXX/UwvoPjXcwh1m5HiKx0HGgKR8lQSoFIgY5jM6KK8VrS9w== +sinon@9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.2.tgz#b83cf5d43838f99cfa3644453f4c7db23e7bd535" + integrity sha512-9Owi+RisvCZpB0bdOVFfL314I6I4YoRlz6Isi4+fr8q8YQsDPoCe5UnmNtKHRThX3negz2bXHWIuiPa42vM8EQ== dependencies: "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" "@sinonjs/formatio" "^5.0.1" - "@sinonjs/samsam" "^5.2.0" + "@sinonjs/samsam" "^5.3.0" diff "^4.0.2" nise "^4.0.4" supports-color "^7.1.0" From a58bbce6fa85f44f445108f4e206ce756df32343 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Dec 2020 20:08:14 +0000 Subject: [PATCH 301/341] Update dependency eslint to v7.16.0 --- package.json | 2 +- yarn.lock | 58 ++++++++++++++++++++++------------------------------ 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 7fc6728c..f7ec3ca2 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.40", "ava": "3.13.0", - "eslint": "7.15.0", + "eslint": "7.16.0", "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 44e6d1de..3b6b5e16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -315,7 +315,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.9.1: +ajv@^6.10.0: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -369,7 +369,7 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -468,11 +468,6 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -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" @@ -1239,10 +1234,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.15.0: - version "7.15.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.15.0.tgz#eb155fb8ed0865fcf5d903f76be2e5b6cd7e0bc7" - integrity sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA== +eslint@7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.16.0.tgz#a761605bf9a7b32d24bb7cde59aeb0fd76f06092" + integrity sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.2.2" @@ -1278,7 +1273,7 @@ eslint@7.15.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.4" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -2201,11 +2196,6 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - lodash@^4.17.13, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -3060,15 +3050,6 @@ slash@^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== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -3078,6 +3059,15 @@ slice-ansi@^3.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +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 "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + source-map-support@^0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -3278,15 +3268,15 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -table@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" - integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== +table@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" + integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== dependencies: - ajv "^6.9.1" - lodash "^4.17.11" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^6.12.4" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" temp-dir@^2.0.0: version "2.0.0" From ffea2191dad787b04666556c2fa8643db2914b49 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Dec 2020 20:08:53 +0000 Subject: [PATCH 302/341] Update dependency ava to v3.14.0 --- package.json | 2 +- yarn.lock | 198 +++++++++++++++++++++++++-------------------------- 2 files changed, 99 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index 48fd7d83..6248a91f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.40", - "ava": "3.13.0", + "ava": "3.14.0", "eslint": "7.16.0", "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", diff --git a/yarn.lock b/yarn.lock index 68c60b81..6be1da4c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -302,10 +302,10 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== -acorn@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.1.tgz#d7e8eca9b71d5840db0e7e415b3b2b20e250f938" - integrity sha512-dmKn4pqZ29iQl2Pvze1zTrps2luvls2PBY//neO2WJ0s10B3AxJXshN+Ph7B4GrhfGhHXrl4dnUwyNNXQcnWGQ== +acorn@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" + integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== aggregate-error@^3.0.0: version "3.0.1" @@ -391,13 +391,10 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.0.0.tgz#675dbbb5ca1908fa90abe4e5b1c2e9b1f4080d99" + integrity sha512-6564t0m0fuQMnockqBv7wJxo9T5C2V9JpYXyNScfRDPVLusOQQhkpMGrFC17QbiolraQ1sMXX+Y5nJpjqozL4g== anymatch@~3.1.1: version "3.1.1" @@ -473,20 +470,20 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.13.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.13.0.tgz#df789d71ace66db99b213395338288d6d4322690" - integrity sha512-yzky+gark5PdsFFlZ4CnBVxm/OgBUWtn9vAsSSnuooVJNOk5ER17HJXVeUzy63LIt06Zy34oThcn+2ZqgMs7SA== +ava@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.14.0.tgz#d519bc9abce9a44ead34c86b98bbe72771a6bd81" + integrity sha512-AkXNi3DBXZE8A1z1JiNvdK6WmpN8oJQcZLkaWU24C3knCN9WVaxoDy90IVQlwjjPySeyQFqWDrsW9KomSNlRmQ== dependencies: "@concordance/react" "^2.0.0" - acorn "^8.0.1" + acorn "^8.0.4" acorn-walk "^8.0.0" - ansi-styles "^4.2.1" + ansi-styles "^5.0.0" arrgv "^1.0.2" arrify "^2.0.1" callsites "^3.1.0" chalk "^4.1.0" - chokidar "^3.4.2" + chokidar "^3.4.3" chunkd "^2.0.1" ci-info "^2.0.0" ci-parallel-vars "^1.0.1" @@ -498,9 +495,9 @@ ava@3.13.0: concordance "^5.0.1" convert-source-map "^1.7.0" currently-unhandled "^0.4.1" - debug "^4.2.0" + debug "^4.3.1" del "^6.0.0" - emittery "^0.7.1" + emittery "^0.7.2" equal-length "^1.0.0" figures "^3.2.0" globby "^11.0.1" @@ -513,7 +510,7 @@ ava@3.13.0: lodash "^4.17.20" matcher "^3.0.0" md5-hex "^3.0.1" - mem "^6.1.1" + mem "^8.0.0" ms "^2.1.2" ora "^5.1.0" p-event "^4.2.0" @@ -526,14 +523,14 @@ ava@3.13.0: resolve-cwd "^3.0.0" slash "^3.0.0" source-map-support "^0.5.19" - stack-utils "^2.0.2" + stack-utils "^2.0.3" strip-ansi "^6.0.0" supertap "^1.0.0" temp-dir "^2.0.0" trim-off-newlines "^1.0.1" - update-notifier "^4.1.1" + update-notifier "^5.0.1" write-file-atomic "^3.0.3" - yargs "^16.0.3" + yargs "^16.2.0" balanced-match@^1.0.0: version "1.0.0" @@ -670,10 +667,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== +chokidar@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -681,7 +678,7 @@ chokidar@^3.4.2: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.5.0" optionalDependencies: fsevents "~2.1.2" @@ -749,10 +746,10 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -cliui@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.1.tgz#a4cb67aad45cd83d8d05128fc9f4d8fbb887e6b3" - integrity sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ== +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" @@ -922,10 +919,10 @@ debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debug@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== +debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" @@ -1030,10 +1027,10 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -emittery@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" - integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== +emittery@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== emoji-regex@^7.0.1: version "7.0.3" @@ -1102,10 +1099,10 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escalade@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" - integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== +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" @@ -1875,10 +1872,10 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.1.tgz#679afef819347a72584617fd19497f010b8ed35f" - integrity sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg== +is-installed-globally@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" + integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== dependencies: global-dirs "^2.0.1" is-path-inside "^3.0.1" @@ -1888,10 +1885,10 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -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-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== is-number@^7.0.0: version "7.0.0" @@ -2123,7 +2120,7 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -latest-version@^5.0.0: +latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== @@ -2251,13 +2248,13 @@ md5-hex@^3.0.1: dependencies: blueimp-md5 "^2.10.0" -mem@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.1.tgz#ea110c2ebc079eca3022e6b08c85a795e77f6318" - integrity sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q== +mem@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-8.0.0.tgz#b5e4b6d2d241c6296da05436173b4d0c7ae1f9ac" + integrity sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA== dependencies: map-age-cleaner "^0.1.3" - mimic-fn "^3.0.0" + mimic-fn "^3.1.0" merge2@^1.3.0: version "1.3.0" @@ -2277,10 +2274,10 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.0.0.tgz#76044cfa8818bbf6999c5c9acadf2d3649b14b4b" - integrity sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ== +mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" @@ -2767,10 +2764,10 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== dependencies: escape-goat "^2.0.0" @@ -2811,10 +2808,10 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.5.0: + 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" @@ -3129,10 +3126,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -stack-utils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" - integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== +stack-utils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== dependencies: escape-string-regexp "^2.0.0" @@ -3407,22 +3404,23 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -update-notifier@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746" - integrity sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg== +update-notifier@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.0.1.tgz#1f92d45fb1f70b9e33880a72dd262bc12d22c20d" + integrity sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg== dependencies: boxen "^4.2.0" - chalk "^3.0.0" + chalk "^4.1.0" configstore "^5.0.1" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" + is-installed-globally "^0.3.2" + is-npm "^5.0.0" is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.2" semver-diff "^3.1.1" xdg-basedir "^4.0.0" @@ -3547,10 +3545,10 @@ y18n@^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.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.1.tgz#1ad2a7eddfa8bce7caa2e1f6b5da96c39d99d571" - integrity sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yabf@2.1.0: version "2.1.0" @@ -3565,10 +3563,10 @@ yargs-parser@^16.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.0.0: - version "20.2.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.0.tgz#944791ca2be2e08ddadd3d87e9de4c6484338605" - integrity sha512-2agPoRFPoIcFzOIp6656gcvsg2ohtscpw2OINr/q46+Sq41xz2OYLqx5HRHabmFU1OARIPAYH5uteICE7mn/5A== +yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== yargs@^15.0.2: version "15.0.2" @@ -3587,15 +3585,15 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^16.1.0" -yargs@^16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.0.3.tgz#7a919b9e43c90f80d4a142a89795e85399a7e54c" - integrity sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA== +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.0" - escalade "^3.0.2" + cliui "^7.0.2" + escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.0" - y18n "^5.0.1" - yargs-parser "^20.0.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" From 1c95cfd32d7fda63d0e4d6d03e139bea436db8e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Dec 2020 20:21:11 +0000 Subject: [PATCH 303/341] Bump minimist from 1.2.0 to 1.2.5 Bumps [minimist](https://github.com/substack/minimist) from 1.2.0 to 1.2.5. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.0...1.2.5) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6be1da4c..5406a1c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2292,9 +2292,9 @@ minimatch@^3.0.4: brace-expansion "^1.1.7" minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== ms@2.0.0: version "2.0.0" From e32970762300bf0b12e9cd4c35b4e7df448bb302 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Dec 2020 20:43:05 +0000 Subject: [PATCH 304/341] Update dependency @types/node to v11.15.42 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6248a91f..6d228c49 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.40", + "@types/node": "11.15.42", "ava": "3.14.0", "eslint": "7.16.0", "eslint-config-standard": "16.0.2", diff --git a/yarn.lock b/yarn.lock index 6be1da4c..63c40caa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.40": - version "11.15.40" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.40.tgz#66b17b7a9b06fe2689a77afeaa6f432779018b28" - integrity sha512-pGIHnyS9XYo7uSV6YHWSsXlqZ1NanfsxMCreJX94T963sA9733Ctsjo2VIq74MvKx3+i4t50HQPfuLfNuZSo4g== +"@types/node@11.15.42": + version "11.15.42" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.42.tgz#e2c8ad740c4e849fb0d9ea9e6f4b4e6f62a4d9a0" + integrity sha512-CUwq20cDEavWvtzSQVcBKjG6bj/JiBMGJqar7uNPQR+JUbpPg6Pvjk/piV1YTJzCck8yD2SZQOmnJ3ZvOkq4Mg== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 1df1d1f470404abaf5b9e748e7c0c81e4b4a9894 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 2 Jan 2021 03:39:06 +0000 Subject: [PATCH 305/341] Update dependency eslint to v7.17.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6d228c49..e182d87f 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.42", "ava": "3.14.0", - "eslint": "7.16.0", + "eslint": "7.17.0", "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 8b1001da..64ba5929 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1231,10 +1231,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.16.0.tgz#a761605bf9a7b32d24bb7cde59aeb0fd76f06092" - integrity sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw== +eslint@7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" + integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.2.2" From e71a13551d183888d925bdb3e732de3e89e28845 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 4 Jan 2021 10:08:12 +0000 Subject: [PATCH 306/341] Update dependency ava to v3.15.0 --- package.json | 2 +- yarn.lock | 171 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 113 insertions(+), 60 deletions(-) diff --git a/package.json b/package.json index e182d87f..ccede6b7 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/node": "11.15.42", - "ava": "3.14.0", + "ava": "3.15.0", "eslint": "7.17.0", "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", diff --git a/yarn.lock b/yarn.lock index 64ba5929..69ab881f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -354,11 +354,6 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.5.2" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" @@ -470,10 +465,10 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -ava@3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.14.0.tgz#d519bc9abce9a44ead34c86b98bbe72771a6bd81" - integrity sha512-AkXNi3DBXZE8A1z1JiNvdK6WmpN8oJQcZLkaWU24C3knCN9WVaxoDy90IVQlwjjPySeyQFqWDrsW9KomSNlRmQ== +ava@3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.15.0.tgz#a239658ab1de8a29a243cc902e6b42e4574de2f0" + integrity sha512-HGAnk1SHPk4Sx6plFAUkzV/XC1j9+iQhOzt4vBly18/yo0AV8Oytx7mtJd/CR8igCJ5p160N/Oo/cNJi2uSeWA== dependencies: "@concordance/react" "^2.0.0" acorn "^8.0.4" @@ -497,7 +492,7 @@ ava@3.14.0: currently-unhandled "^0.4.1" debug "^4.3.1" del "^6.0.0" - emittery "^0.7.2" + emittery "^0.8.0" equal-length "^1.0.0" figures "^3.2.0" globby "^11.0.1" @@ -511,8 +506,8 @@ ava@3.14.0: matcher "^3.0.0" md5-hex "^3.0.1" mem "^8.0.0" - ms "^2.1.2" - ora "^5.1.0" + ms "^2.1.3" + ora "^5.2.0" p-event "^4.2.0" p-map "^4.0.0" picomatch "^2.2.2" @@ -525,7 +520,7 @@ ava@3.14.0: source-map-support "^0.5.19" stack-utils "^2.0.3" strip-ansi "^6.0.0" - supertap "^1.0.0" + supertap "^2.0.0" temp-dir "^2.0.0" trim-off-newlines "^1.0.1" update-notifier "^5.0.1" @@ -537,11 +532,25 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + binary-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== +bl@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" + integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blueimp-md5@^2.10.0: version "2.11.1" resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.11.1.tgz#b1f6b6218d13cdedbf5743f32b3023b2afefcbd3" @@ -581,6 +590,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -719,10 +736,10 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f" - integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA== +cli-spinners@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" + integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== cli-truncate@^2.1.0: version "2.1.0" @@ -1027,10 +1044,10 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -emittery@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== +emittery@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== emoji-regex@^7.0.1: version "7.0.3" @@ -1698,6 +1715,11 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore-by-default@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.0.0.tgz#537092018540640459569fe7c8c7a408af581146" @@ -1752,11 +1774,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -1775,6 +1792,11 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + ini@^1.3.5, ini@~1.3.0: version "1.3.7" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" @@ -2053,14 +2075,6 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.10.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -2069,6 +2083,14 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.14.0: + 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" + jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -2301,7 +2323,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2, ms@^2.1.2: +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== @@ -2311,6 +2333,11 @@ ms@^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.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -2458,17 +2485,17 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.1.0.tgz#b188cf8cd2d4d9b13fd25383bc3e5cba352c94f8" - integrity sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w== +ora@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.2.0.tgz#de10bfd2d15514384af45f3fa9d9b1aaf344fda1" + integrity sha512-+wG2v8TUU8EgzPHun1k/n45pXquQ9fHnbXVetl9rRgO6kjZszGGbraF3XPTIdgeA+s1lbRjSEftAnyT0w8ZMvQ== dependencies: + bl "^4.0.3" chalk "^4.1.0" cli-cursor "^3.1.0" - cli-spinners "^2.4.0" + cli-spinners "^2.5.0" is-interactive "^1.0.0" log-symbols "^4.0.0" - mute-stream "0.0.8" strip-ansi "^6.0.0" wcwidth "^1.0.1" @@ -2808,6 +2835,15 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" +readable-stream@^3.4.0: + 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" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -2960,6 +2996,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +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== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -3002,10 +3043,12 @@ semver@^7.2.1, semver@^7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" set-blocking@^2.0.0: version "2.0.0" @@ -3194,12 +3237,12 @@ string.prototype.trimstart@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - ansi-regex "^3.0.0" + safe-buffer "~5.2.0" strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" @@ -3240,16 +3283,16 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supertap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supertap/-/supertap-1.0.0.tgz#bd9751c7fafd68c68cf8222a29892206a119fa9e" - integrity sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA== +supertap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supertap/-/supertap-2.0.0.tgz#8b587d6e14b8e885fa5183a9c45abf429feb9f7f" + integrity sha512-jRzcXlCeDYvKoZGA5oRhYyR3jUIYu0enkSxtmAgHRlD7HwrovTpH4bDSi0py9FtuA8si9cW/fKommJHuaoDHJA== dependencies: - arrify "^1.0.1" - indent-string "^3.2.0" - js-yaml "^3.10.0" - serialize-error "^2.1.0" - strip-ansi "^4.0.0" + arrify "^2.0.1" + indent-string "^4.0.0" + js-yaml "^3.14.0" + serialize-error "^7.0.1" + strip-ansi "^6.0.0" supports-color@^5.3.0: version "5.5.0" @@ -3365,6 +3408,11 @@ type-detect@4.0.8, type-detect@^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.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.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -3438,6 +3486,11 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + uuid@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" From c21fdba800d59ba211cdac5afb7e6e6d56f7c695 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 4 Jan 2021 22:16:25 +0000 Subject: [PATCH 307/341] Update dependency @types/node to v11.15.43 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ccede6b7..3b60f5c4 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.42", + "@types/node": "11.15.43", "ava": "3.15.0", "eslint": "7.17.0", "eslint-config-standard": "16.0.2", diff --git a/yarn.lock b/yarn.lock index 69ab881f..bf872e01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,10 +272,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.42": - version "11.15.42" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.42.tgz#e2c8ad740c4e849fb0d9ea9e6f4b4e6f62a4d9a0" - integrity sha512-CUwq20cDEavWvtzSQVcBKjG6bj/JiBMGJqar7uNPQR+JUbpPg6Pvjk/piV1YTJzCck8yD2SZQOmnJ3ZvOkq4Mg== +"@types/node@11.15.43": + version "11.15.43" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.43.tgz#aacd9a70dc7c43ac4d28461faf98cefb4b759602" + integrity sha512-EAUAH6KQiz/aLjyaLgfcKdcNCmuPTqPeaZHMg3bxbDUeZXnAABqsT+jQLqvINEN76+0HRi9pcuZQlvV3cy4kow== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 855686fa5dd1648291ddbb34612b4903a0ffcc3b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 6 Jan 2021 15:32:32 +0000 Subject: [PATCH 308/341] Update dependency sinon to v9.2.3 --- package.json | 2 +- yarn.lock | 33 ++++----------------------------- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 3b60f5c4..75c82599 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-plugin-standard": "4.1.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "9.2.2" + "sinon": "9.2.3" } } diff --git a/yarn.lock b/yarn.lock index bf872e01..e6ddc498 100644 --- a/yarn.lock +++ b/yarn.lock @@ -189,13 +189,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^1": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" - integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw== - dependencies: - type-detect "4.0.8" - "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6" @@ -224,23 +217,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/formatio@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" - integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^5.0.2" - -"@sinonjs/samsam@^5.0.2": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" - integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - "@sinonjs/samsam@^5.3.0": version "5.3.0" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.0.tgz#1d2f0743dc54bf13fe9d508baefacdffa25d4329" @@ -3072,14 +3048,13 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.2.tgz#b83cf5d43838f99cfa3644453f4c7db23e7bd535" - integrity sha512-9Owi+RisvCZpB0bdOVFfL314I6I4YoRlz6Isi4+fr8q8YQsDPoCe5UnmNtKHRThX3negz2bXHWIuiPa42vM8EQ== +sinon@9.2.3: + version "9.2.3" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.3.tgz#f68ce414e843e2fd638703043c97f260697caa52" + integrity sha512-m+DyAWvqVHZtjnjX/nuShasykFeiZ+nPuEfD4G3gpvKGkXRhkF/6NSt2qN2FjZhfrcHXFzUzI+NLnk+42fnLEw== dependencies: "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" - "@sinonjs/formatio" "^5.0.1" "@sinonjs/samsam" "^5.3.0" diff "^4.0.2" nise "^4.0.4" From 2866d8720aea418e8a5e917179ad5d0b16c9021a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 14 Jan 2021 23:13:59 +0000 Subject: [PATCH 309/341] Update dependency @types/node to v11.15.44 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 75c82599..d5d9be9d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "yabf": "2.1.0" }, "devDependencies": { - "@types/node": "11.15.43", + "@types/node": "11.15.44", "ava": "3.15.0", "eslint": "7.17.0", "eslint-config-standard": "16.0.2", diff --git a/yarn.lock b/yarn.lock index e6ddc498..f1835ff9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -248,10 +248,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@11.15.43": - version "11.15.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.43.tgz#aacd9a70dc7c43ac4d28461faf98cefb4b759602" - integrity sha512-EAUAH6KQiz/aLjyaLgfcKdcNCmuPTqPeaZHMg3bxbDUeZXnAABqsT+jQLqvINEN76+0HRi9pcuZQlvV3cy4kow== +"@types/node@11.15.44": + version "11.15.44" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.44.tgz#5c3463a489ddd6d1d9f6717dff84e15097b0b362" + integrity sha512-fHAcNn2FlzDMA9rV5KP73r1cMZdbommWic2foHAEWoa/LITi91AueHDsJpnqjBEJ7bYoT2WC+KN1RL0vsM20zA== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 6800d749282fa5d5abd12a814beafd3647b71ed6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 15 Jan 2021 09:58:57 +0000 Subject: [PATCH 310/341] Update dependency commander to v7 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d5d9be9d..ec44b30f 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "chalk": "4.1.0", - "commander": "6.2.1", + "commander": "7.0.0", "esm": "3.2.25", "gift": "0.10.2", "inquirer": "7.3.3", diff --git a/yarn.lock b/yarn.lock index f1835ff9..8f44efdb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -791,10 +791,10 @@ 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== -commander@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.0.0.tgz#3e2bbfd8bb6724760980988fb5b22b7ee6b71ab2" + integrity sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA== common-path-prefix@^3.0.0: version "3.0.0" From 32075c6ff264a758c30afa1a4494c36838824c99 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 18 Jan 2021 12:50:13 +0000 Subject: [PATCH 311/341] Update dependency eslint to v7.18.0 --- package.json | 2 +- yarn.lock | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index ec44b30f..05aa38c7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@types/node": "11.15.44", "ava": "3.15.0", - "eslint": "7.17.0", + "eslint": "7.18.0", "eslint-config-standard": "16.0.2", "eslint-plugin-import": "2.22.1", "eslint-plugin-node": "11.1.0", diff --git a/yarn.lock b/yarn.lock index 8f44efdb..84ce2ecd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -132,10 +132,10 @@ dependencies: arrify "^1.0.1" -"@eslint/eslintrc@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" - integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== +"@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -144,7 +144,7 @@ ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.19" + lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -1224,13 +1224,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.17.0: - version "7.17.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" - integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== +eslint@7.18.0: + version "7.18.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" + integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.2" + "@eslint/eslintrc" "^0.3.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -1254,7 +1254,7 @@ eslint@7.17.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash "^4.17.20" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" From 364a757d785fd86834518866fd83e0b9c560bea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 20:56:48 +0000 Subject: [PATCH 312/341] Bump underscore from 1.9.1 to 1.13.1 Bumps [underscore](https://github.com/jashkenas/underscore) from 1.9.1 to 1.13.1. - [Release notes](https://github.com/jashkenas/underscore/releases) - [Commits](https://github.com/jashkenas/underscore/compare/1.9.1...1.13.1) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 84ce2ecd..401a2149 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3416,9 +3416,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" underscore@^1.8.3: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== unique-string@^2.0.0: version "2.0.0" From 91cd39cb6af33dbc38542db73e7afb87e57928d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 May 2021 06:14:38 +0000 Subject: [PATCH 313/341] Bump lodash from 4.17.15 to 4.17.21 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.21) Signed-off-by: dependabot[bot] --- yarn.lock | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index 84ce2ecd..cfafc6e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2191,20 +2191,10 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash@^4.17.13, lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.19: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - -lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.0.0: version "4.0.0" From d7de1aab16c2741cc184bebf6e0cc91a839354ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 00:43:39 +0000 Subject: [PATCH 314/341] Bump hosted-git-info from 2.7.1 to 2.8.9 Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.7.1 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.7.1...v2.8.9) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 84ce2ecd..cb5fd91a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1670,9 +1670,9 @@ hasha@^5.0.0: type-fest "^0.3.0" hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-escaper@^2.0.0: version "2.0.0" From 017c1cbf7b75e74184ade2a2de3e5dc3161324b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jun 2021 23:30:10 +0000 Subject: [PATCH 315/341] Bump glob-parent from 5.0.0 to 5.1.2 Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.0.0 to 5.1.2. - [Release notes](https://github.com/gulpjs/glob-parent/releases) - [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) - [Commits](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.2) --- updated-dependencies: - dependency-name: glob-parent dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index 84ce2ecd..766c00ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1528,17 +1528,10 @@ gift@0.10.2: flex-exec "^1.0.0" underscore "^1.8.3" -glob-parent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" - integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== - dependencies: - is-glob "^4.0.1" - -glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + 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" From b9f41a95313659133b449a9733746eb70a93a4f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Aug 2021 22:20:07 +0000 Subject: [PATCH 316/341] Bump path-parse from 1.0.6 to 1.0.7 Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 84ce2ecd..1ec125be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2653,9 +2653,9 @@ path-key@^3.1.0: 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== + 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" From 38d1094dc803ca7f687a97dc68f8240e109255e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 02:30:31 +0000 Subject: [PATCH 317/341] Bump http-cache-semantics from 4.0.3 to 4.1.1 Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.0.3 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.0.3...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1fc398a1..206f4cc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1673,9 +1673,9 @@ html-escaper@^2.0.0: integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== http-cache-semantics@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" - integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== iconv-lite@^0.4.24: version "0.4.24" From adc7e8a6e50b02220691178817344542740e2df7 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Wed, 30 Sep 2026 15:39:34 +0200 Subject: [PATCH 318/341] feat!: rewrite configfile in TypeScript for 1.0 (#281) --- .eslintrc.json | 34 - .github/pull_request_template.md | 3 + .github/workflows/ci.yml | 37 + .gitignore | 6 + .node-version | 1 + .renovaterc.json | 5 +- CHANGELOG.md | 34 +- CONTRIBUTING.md | 64 +- README.md | 148 +- bin/configfile-modules.js | 32 - bin/configfile-scripts.js | 32 - bin/configfile.js | 55 - biome.json | 50 + docs/home.md | 36 +- package.json | 69 +- pnpm-lock.yaml | 1536 +++++++ src/cli.ts | 13 + src/commands/index.js | 3 - src/commands/init.ts | 133 + src/commands/init/index.js | 1 - src/commands/init/init-stop-by-user.error.js | 5 - src/commands/init/init.command.js | 167 - src/commands/modules.ts | 499 +++ .../modules/deploy-stop-by-user.error.js | 5 - src/commands/modules/deploy.command.js | 120 - src/commands/modules/index.js | 2 - src/commands/modules/list.command.js | 48 - src/commands/scripts.ts | 73 + src/commands/scripts/index.js | 2 - src/commands/scripts/list.command.js | 48 - src/commands/scripts/run.command.js | 53 - src/commands/update.ts | 37 + src/config.ts | 137 + src/context.ts | 16 + src/core/command.js | 19 - src/core/index.js | 2 - src/core/term-application.js | 106 - src/deploy.ts | 348 ++ src/errors.ts | 27 + src/index.js | 4 - src/main.js | 7 - src/output.ts | 58 + src/paths.ts | 19 + src/process.ts | 183 + src/program.ts | 65 + src/prompts.ts | 23 + src/repository.ts | 362 ++ src/services/config.service.js | 87 - src/services/deploy.service.js | 86 - src/services/exec.service.js | 22 - src/services/file.service.js | 126 - src/services/index.js | 5 - src/services/message.service.js | 78 - src/shared/config.js | 3 - .../errors/bad-script-permission.error.js | 7 - .../errors/config-file-not-exist.error.js | 5 - src/shared/errors/file-not-directory.error.js | 5 - src/shared/errors/folder-not-empty.error.js | 5 - src/shared/errors/index.js | 6 - src/shared/errors/script-not-exist.error.js | 7 - .../errors/target-file-already-exist.error.js | 7 - src/shared/utils/fs.utils.js | 86 - src/shared/utils/git.utils.js | 22 - src/shared/utils/index.js | 4 - src/shared/utils/pakage.utils.js | 15 - src/shared/utils/process.utils.js | 12 - src/state.ts | 109 + tests/commands.test.ts | 949 +++++ tests/config.test.ts | 132 + tests/deploy.test.ts | 409 ++ tests/e2e.test.ts | 118 + tests/global-setup.ts | 8 + tests/helpers.ts | 169 + tests/repository.test.ts | 370 ++ .../config/config-file-not-exist.error.js | 15 - tests/services/config/config.service.js | 123 - .../exec/bad-script-permission.error.js | 21 - tests/services/exec/exec.service.js | 53 - tests/services/exec/script-not-exist.error.js | 21 - tests/services/file.service.js | 66 - .../shared/errors/file-not-directory.error.js | 15 - tests/shared/errors/folder-not-empty.error.js | 15 - tsconfig.build.json | 9 + tsconfig.json | 20 + vitest.config.ts | 15 + yarn.lock | 3610 ----------------- 86 files changed, 6180 insertions(+), 5382 deletions(-) delete mode 100644 .eslintrc.json create mode 100644 .github/workflows/ci.yml create mode 100644 .node-version delete mode 100644 bin/configfile-modules.js delete mode 100644 bin/configfile-scripts.js delete mode 100755 bin/configfile.js create mode 100644 biome.json create mode 100644 pnpm-lock.yaml create mode 100644 src/cli.ts delete mode 100644 src/commands/index.js create mode 100644 src/commands/init.ts delete mode 100644 src/commands/init/index.js delete mode 100644 src/commands/init/init-stop-by-user.error.js delete mode 100644 src/commands/init/init.command.js create mode 100644 src/commands/modules.ts delete mode 100644 src/commands/modules/deploy-stop-by-user.error.js delete mode 100644 src/commands/modules/deploy.command.js delete mode 100644 src/commands/modules/index.js delete mode 100644 src/commands/modules/list.command.js create mode 100644 src/commands/scripts.ts delete mode 100644 src/commands/scripts/index.js delete mode 100644 src/commands/scripts/list.command.js delete mode 100644 src/commands/scripts/run.command.js create mode 100644 src/commands/update.ts create mode 100644 src/config.ts create mode 100644 src/context.ts delete mode 100644 src/core/command.js delete mode 100644 src/core/index.js delete mode 100644 src/core/term-application.js create mode 100644 src/deploy.ts create mode 100644 src/errors.ts delete mode 100644 src/index.js delete mode 100644 src/main.js create mode 100644 src/output.ts create mode 100644 src/paths.ts create mode 100644 src/process.ts create mode 100644 src/program.ts create mode 100644 src/prompts.ts create mode 100644 src/repository.ts delete mode 100644 src/services/config.service.js delete mode 100644 src/services/deploy.service.js delete mode 100644 src/services/exec.service.js delete mode 100644 src/services/file.service.js delete mode 100644 src/services/index.js delete mode 100644 src/services/message.service.js delete mode 100644 src/shared/config.js delete mode 100644 src/shared/errors/bad-script-permission.error.js delete mode 100644 src/shared/errors/config-file-not-exist.error.js delete mode 100644 src/shared/errors/file-not-directory.error.js delete mode 100644 src/shared/errors/folder-not-empty.error.js delete mode 100644 src/shared/errors/index.js delete mode 100644 src/shared/errors/script-not-exist.error.js delete mode 100644 src/shared/errors/target-file-already-exist.error.js delete mode 100644 src/shared/utils/fs.utils.js delete mode 100644 src/shared/utils/git.utils.js delete mode 100644 src/shared/utils/index.js delete mode 100644 src/shared/utils/pakage.utils.js delete mode 100644 src/shared/utils/process.utils.js create mode 100644 src/state.ts create mode 100644 tests/commands.test.ts create mode 100644 tests/config.test.ts create mode 100644 tests/deploy.test.ts create mode 100644 tests/e2e.test.ts create mode 100644 tests/global-setup.ts create mode 100644 tests/helpers.ts create mode 100644 tests/repository.test.ts delete mode 100644 tests/services/config/config-file-not-exist.error.js delete mode 100644 tests/services/config/config.service.js delete mode 100644 tests/services/exec/bad-script-permission.error.js delete mode 100644 tests/services/exec/exec.service.js delete mode 100644 tests/services/exec/script-not-exist.error.js delete mode 100644 tests/services/file.service.js delete mode 100644 tests/shared/errors/file-not-directory.error.js delete mode 100644 tests/shared/errors/folder-not-empty.error.js create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json create mode 100644 vitest.config.ts delete mode 100644 yarn.lock diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index a49930c4..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "extends": "standard", - "env": { - "es6": true, - "node": true - }, - "rules": { - "arrow-body-style": ["error", "as-needed"], - "arrow-parens": ["error", "as-needed"], - "arrow-spacing": "error", - "default-case": "error", - "guard-for-in": "error", - "generator-star-spacing": ["error", { "before": true, "after": false }], - "getter-return": ["error", { "allowImplicit": true }], - "no-compare-neg-zero": "error", - "no-confusing-arrow": "error", - "no-else-return": "error", - "no-empty": "error", - "no-implicit-coercion": "error", - "no-useless-return": "error", - "no-redeclare": "error", - "no-var": "error", - "prefer-arrow-callback": "error", - "prefer-const": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "prefer-template": "error", - "space-before-function-paren": ["error", { - "anonymous": "always", - "named": "never", - "asyncArrow": "always" - }] - } -} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8193ead1..8b5e591c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,3 +1,6 @@ + + ### Summary Provide a general description of the code changes in your pull diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..94b492cc --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +name: CI + +on: + push: + branches: [develop, master] + pull_request: + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: pnpm/setup@v3 + with: + cache: true + require-lockfile: true + - run: pnpm lint + - run: pnpm typecheck + + test: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + node: [22, 24, 26] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v7 + - uses: pnpm/setup@v3 + with: + runtime: node@${{ matrix.node }} + cache: true + require-lockfile: true + - run: pnpm test diff --git a/.gitignore b/.gitignore index 00cbbdf5..87a215c8 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,9 @@ typings/ # dotenv environment variables file .env + +# Build output +dist/ + +# macOS +.DS_Store diff --git a/.node-version b/.node-version new file mode 100644 index 00000000..a45fd52c --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +24 diff --git a/.renovaterc.json b/.renovaterc.json index c0095aa5..5e5328c4 100644 --- a/.renovaterc.json +++ b/.renovaterc.json @@ -1,7 +1,6 @@ { - "extends": [ - "config:js-app" - ], + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended"], "assignees": ["mindsers"], "labels": ["state: need review", "type: enhancement"] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 61bc049e..88f5491a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,15 +6,43 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Added -- Add new contrubitor to SPONSORS.md -- Configfile will emit log making debug easier ([!57](https://github.com/Mindsers/configfile/pull/57), [!80](https://github.com/mindsers/configfile/pull/80)) +- Add new contributor to SPONSORS.md +- The `modules undeploy` command to remove deployed files and restore the saved versions + configfile made (recorded in `~/.configfile/`). +- The `modules status` command to see which files are deployed. +- The `update` command to pull the latest version of the dotfiles repository. +- A preview of the changes with `--dry-run` on `modules deploy` and `modules undeploy`. +- Options to use configfile in scripts without questions: `--repo`, `--folder` and `--force` + on `init`, `--all` and `--force` on `modules deploy`, `--all` on `modules undeploy`. +- The `deploy` setting in `settings.json` to choose how a file is deployed: `"global"`, `"local"` + or `"none"` to keep a file in the repository without deploying it. +- Arguments can be passed to scripts: `configfile scripts run -- `. +- A script can be a folder containing an `index` file. +- The `settings.json` format is documented in the README. ### Changed -- Use [Yabf](https://github.com/Mindsers/yabf) as base to build the next configfile. +- **Breaking:** Node.js 22.13 or later is required, and only macOS and Linux are supported. +- **Breaking:** a relative `target_path` of a global file now starts from the home folder instead + of the current folder. +- The `global` setting in `settings.json` is deprecated. Use `deploy` instead; `global` will be + removed in 2.0. +- Configfile is rewritten in TypeScript ([!281](https://github.com/mindsers/configfile/pull/281)). +- Commands exit with an error code when something fails, so configfile can be used in scripts. +- Files replaced by `modules deploy --local` are saved as `.old` files, like global files. +- Configfile no longer makes scripts executable: scripts that are not executable run with the + interpreter of their first line (`#!`), or with `node` or `sh` for `.js` and `.sh` files. +- Deploying refuses targets inside the dotfiles repository, or containing it. +- `init` reuses a folder that already contains the repository. ### Fixed - Git URL verification in `init` command is less strict. ([#48](https://github.com/Mindsers/configfile/issues/48)) - Script standard outputs are correctly displayed ([!57](https://github.com/Mindsers/configfile/pull/57), [#13](https://github.com/Mindsers/configfile/issues/13)) +- A failed `init` saved the configuration anyway. +- Deploying a module could overwrite a previously saved `.old` file. +- Hidden files such as `.DS_Store` were listed as scripts. +- Stopping configfile while a script runs (for example with `kill`) could leave the script + running. +- Scripts could not read input from the terminal. ## [0.3.1] - 2018-08-05 ### Fixed diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ca9a789b..5140736d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,8 @@ This file is a set of guilines for contributing to *Configfile* project. These a [Styleguides](#styleguides) -* [JavaScript styleguide](#javaScript-styleguide) +* [Development setup](#development-setup) +* [TypeScript styleguide](#typescript-styleguide) * [Git commit messages](#git-commit-messages) ## How can I contribute? @@ -64,49 +65,48 @@ Documentation file are stored in the project source code. ## Styleguides -### JavaScript styleguide +### Development setup -All JavaScript must adhere to [JavaScript Standard Style](https://standardjs.com). +*Configfile* is written in TypeScript and uses [pnpm](https://pnpm.io). Use the Node.js version from `.node-version` (22.13 or later is supported). -Exepctions to Standard style: +```bash +pnpm install +pnpm check # lint, type check and tests +pnpm test:watch # tests in watch mode +pnpm build # compile to dist/ +node dist/cli.js --help +``` -* We do not want space after function name `function name(arg) { ... }` +### TypeScript styleguide -Additional rules: +Formatting and linting are handled by [Biome](https://biomejs.dev), configured in `biome.json`. Run `pnpm format` before committing; `pnpm lint` must pass. -* Prefer spread operator (`prefer-spread`) -* No useless brackets for arrow functions (`arrow-body-style`) -* No useless parens for arrow functions (`arrow-parens`) -* Require space before/after arrow function’s arrow (`arrow-spacing`) -* `switch` must have a default case (`default-case`) -* `for...in` loop must be guard by an `if` (`guard-for-in`) -* Require space before the star of generator function (`generator-star-spacing`) -* Getter properties must return a value (`getter-return`) -* Compare to `-0` is an error (`no-compare-neg-zero`) -* Use brackets if arrow function body could be confused with comparisons (`no-confusing-arrow`) -* No `else` when return is used (`no-else-return`) -* No empty block statements (`no-empty`) -* No type conversion with shorter notations (`no-implicit-coercion`) -* No useless `return` statement (`no-useless-return`) -* No redeclare variables (`no-redeclare`) -* Using `var` statement is an error (`no-var`) -* Prefer arrow function for callback (`prefer-arrow-callback`) -* Prefer using constant (`prefer-const`) -* Prefer rest parameter (`prefer-rest-params`) -* Prefer using template literals (`prefer-template`) - -All the rules are listed in `.eslinrc.json` on the root directory. +* Relative imports use the `.js` extension (`import { x } from './x.js'`). +* Expected failures throw a `CliError` (exit code and message for the user); never call `process.exit`. +* Commands get everything from the injected `Context` (home, cwd, output, prompts) so they can be tested. The only exception is the `DEBUG` environment variable, read where stack traces are printed. +* Bug fixes come with a test that reproduces the bug. ### Git commit messages -* Use the present tense ("Add feature" not "Added feature"). +Commit messages and pull request titles follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/): + +```txt +[optional scope][!]: + +[optional body] + +[optional footer(s)] +``` + +* Use one of these types: `feat` (a new feature), `fix` (a bug fix), `docs`, `refactor`, `perf`, `test`, `build`, `ci`, `chore` or `revert`. -* Use the imperative mood ("Move cursor to..." not "Moves cursor to..."). +* The scope is optional and names the part of the project: `feat(modules): add status command`, `docs(changelog): …`. -* Limit the first line to 72 characters or less. +* Mark breaking changes with `!` after the type or scope (`feat!: …`), and explain them in a `BREAKING CHANGE:` footer. -* Reference issues and pull requests liberally after the first line. +* Write the description in the imperative mood and present tense, starting with a lowercase letter and without a final period ("add feature", not "Added feature."). Keep the first line to 72 characters or less. +* Reference issues and pull requests in the body or the footer (`Fixes #48`). [Issues]: https://github.com/Mindsers/configfile/issues [forum]: https://community.nathanaelcherrier.com/c/open-source/configfile/8 diff --git a/README.md b/README.md index 223d06e2..4cb708e5 100644 --- a/README.md +++ b/README.md @@ -2,62 +2,148 @@ [![npm](https://img.shields.io/npm/v/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) [![npm](https://img.shields.io/npm/dt/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) -[![npm](https://img.shields.io/npm/l/configfile.svg?style=flat-square)](https://github.com/Mindsers/configfile/blob/master/LICENSE) +[![CI](https://img.shields.io/github/actions/workflow/status/mindsers/configfile/ci.yml?branch=develop&style=flat-square)](https://github.com/mindsers/configfile/actions/workflows/ci.yml) +[![npm](https://img.shields.io/npm/l/configfile.svg?style=flat-square)](https://github.com/mindsers/configfile/blob/develop/LICENSE) [![Patreon](https://img.shields.io/badge/support-patreon-F96854.svg?logo=patreon&style=flat-square)](https://www.patreon.com/bePatron?u=9715649) -[![Discourse](https://img.shields.io/discourse/https/community.nathanaelcherrier.com/posts.svg?color=00aeef&logo=discourse&logoColor=00aeef&style=flat-square)](https://community.nathanaelcherrier.com/c/open-source/configfile/8) -*configfile* is a command line tool that help user to manage their own configuration files. +*configfile* is a command line tool that helps you manage your configuration files (dotfiles) and setup scripts from a git repository. -## Data storage +## Requirements + +- macOS or Linux +- Node.js 22.13 or later +- git + +## Installation + +```bash +npm install --global configfile +``` -This tool **does not store** configuration files for you. A git repo ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files. +## Data storage -Please follow this structure: +This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files, with this structure: ```txt -/files/ - /module1/ - /module2/ - /settings.json - /configurationfile.txt - /module3/ -/scripts/ - /scriptfile.sh +files/ + zsh/ + settings.json + zshrc + git/ + settings.json + gitconfig +scripts/ + setup.sh + macos/ + index.sh ``` -## Installation +### Modules -To install *Configfile*, you need to use NPM or Yarn. +Every folder of `files/` (or symbolic link to a folder) that contains a `settings.json` is a **module**. Its name is the folder name, lowercased, with spaces replaced by `-` and other characters than ASCII letters, digits, `_` and `-` removed: `My Zsh.d` is the `my-zshd` module. Hidden folders are ignored. -```bash -yarn global add configfile@latest +`settings.json` lists the files of the module: + +```json +{ + "files": [ + { "source_path": "zshrc", "target_path": "~/.zshrc", "deploy": "global" }, + { "source_path": "editorconfig", "target_path": ".editorconfig", "deploy": "local" }, + { "source_path": "old-aliases", "target_path": "~/.aliases", "deploy": "none" } + ] +} ``` +| Key | Description | +| --- | --- | +| `source_path` | Path of the file (or folder), relative to the module folder. | +| `target_path` | Where the file is deployed. `~` is your home folder. A relative path is relative to your home folder for global files (`.zshrc` is `~/.zshrc`) and to the current folder for local files. A target that would replace your home folder, the current folder, the dotfiles repository or one of their parents, or that is inside the repository, is refused. | +| `deploy` | `"global"`: the file is **symlinked** by `configfile modules deploy`. `"local"`: the file is **copied** by `configfile modules deploy --local`, typically into a project folder. `"none"`: the file is **never deployed**, which keeps it in the repository for later. | +| `global` | **Deprecated**, removed in 2.0: older spelling of `deploy`. `true` is `"global"`, `false` is `"local"`. It still works in 1.x, with a warning. Use one or the other, not both. | + +An entry without `deploy` or `global` is not deployed, and `modules deploy` warns about it. + +When a global file is deployed and something else already exists at its target (a file, a folder or another link), it is moved to `.old` (or `.old.1`, …). A link that already points to the right file is left as is, so deploying twice is safe. + +When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. + +*configfile* records the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links (and the local copies that are still identical to the repository) and moves the most recent backup *configfile* made back in place. Other files, including `.old` files you made yourself, are left untouched. + +### Scripts + +Every file of `scripts/`, and every folder of `scripts/` (or symbolic link to a folder) containing an `index` file (`index`, `index.sh`, …), is a **script**. Hidden files are ignored. To only use some extensions, set `script_extensions` in the [configuration](#configuration). + +A script's name is its file name up to the first dot, or its folder name, with the same rules as module names: `scripts/setup.sh` and `scripts/setup.macos.py` are both named `setup` (only the first one, alphabetically, is used, with a warning). + +Scripts can be written in any language: + +- a script with a shebang line (such as `#!/usr/bin/env python3`) is run directly when it is executable, and with that interpreter otherwise; +- a `.js` (or `.mjs`, `.cjs`) or `.sh` script without shebang line is run with `node` or `sh`; +- any other executable file (such as a compiled program) is run directly. + +*configfile* never changes the permissions of your files. Scripts run in the current folder, their output is not modified (the messages of *configfile* go to stderr), and their exit code is forwarded. + ## Usage -- `configfile init` or `configfile i`: Initialize *configfile* on the current user session. - - `-f, --force` force current configuration to be overwritten. -- `configfile modules list` or `configfile m l`: Display a list of all modules available via *Configfile*. -- `configfile modules deploy [moduleName...]` or `configfile m d [moduleName...]`: Deploy the configuration files for the given module name. - - `-l, --local` deploy authorized file to the current directory. -- `configfile scripts` or `configfile s`: Display a list of all scripts available via *Configfile*. -- `configfile scripts run ` or `configfile s r `: Execute the script identifying by the given script name. +- `configfile init` (`i`): clone your dotfiles repository and save its location in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. + - `-f, --force`: overwrite an existing configuration without asking. + - `--repo ` and `--folder `: answer the questions from the command line, for non-interactive setups. +- `configfile modules list` (`m l`, or just `configfile modules`): list available modules. +- `configfile modules status [modules...]` (`m st`): show whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. + - `-l, --local`: check the local files, in the current folder. +- `configfile modules deploy [modules...]` (`m d`): deploy the global files of the given modules. Without module names, asks to deploy all modules. + - `-l, --local`: copy the local files of the modules instead. + - `-a, --all`: deploy every module without asking. + - `-f, --force`: replace existing local files without asking (they are moved to `.old`). + - `-n, --dry-run`: show what would be done, without changing anything. +- `configfile modules undeploy [modules...]` (`m u`): remove the deployed global files of the given modules and restore their backups. Without module names, asks to undeploy all modules. + - `-l, --local`, `-a, --all` and `-n, --dry-run`: as for `deploy`. +- `configfile scripts list` (`s l`, or just `configfile scripts`): list available scripts. +- `configfile scripts run [-- args...]` (`s r`): run a script. Arguments after `--` are passed to the script. +- `configfile update` (`u`): pull the latest version of your dotfiles repository (`git pull --ff-only`). Global files are symbolic links, so they are up to date right away; run `modules deploy` for new files, and `modules deploy --local` to refresh local copies. + +*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. + +### Configuration + +*configfile* keeps its configuration in `~/.configfilerc`, and its working files (the record of backups) in the `~/.configfile/` folder. + +`~/.configfilerc` is a JSON file: + +```json +{ + "repo_url": "git@github.com:me/dotfiles.git", + "folder_path": "/Users/me/.dotfiles", + "script_extensions": [".js", ".sh", ""] +} +``` + +`folder_path` may start with `~`; a relative path is relative to your home folder. `script_extensions` is optional: without it, every file of `scripts/` is a script. With it, only files with one of these extensions are; the dot may be omitted (`"py"`), and `""` means files without extension. + +## Upgrading from 0.3 + +- Node.js 22.13 or later is required, on macOS or Linux. Install again with `npm install --global configfile`. +- `~/.configfilerc`, the repository layout and `settings.json` work as before. Files deployed by 0.3 are recognised as deployed. +- `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. +- A **relative** `target_path` of a global file is now relative to your home folder, not to the folder you run *configfile* from. Targets starting with `~/` or `/` are not affected. +- Scripts keep their names (up to the first dot) and every file of `scripts/` is still a script. They are no longer made executable by *configfile*: a script needs a shebang line, a `.js`/`.sh` extension, or to be executable. +- Targets inside the dotfiles repository, or containing it, are now refused. +- `modules undeploy` only restores backups made by 1.0 or later (recorded in `~/.configfile/state.json`); `.old` files made by 0.3 stay where they are. +- Commands now exit with a non-zero code on failure. ## Contribution -Contributions to the source code of *Configfile* are welcomed and greatly appreciated. For help on how to contribute in this project, please refer to [How to contribute to Configfile](https://github.com/Mindsers/configfile/blob/develop/CONTRIBUTING.md). +Contributions to the source code of *configfile* are welcome and greatly appreciated. For help on how to contribute to this project, please refer to [How to contribute to Configfile](https://github.com/mindsers/configfile/blob/develop/CONTRIBUTING.md). ## Support -*Configfile* is licensed under an Apache-2.0 license, which means that it's a completely free open source software. Unfortunately, *Configfile* doesn't make itself. Version 1.0.0 is the next step, which will result in many late, beer-filled nights of development. +*configfile* is licensed under an Apache-2.0 license, which means that it's a completely free open source software. Unfortunately, *configfile* doesn't make itself. -If you're using *Configfile* and want to support the development, you now have the chance! Go on my [Patreon page](https://www.patreon.com/mindsers) and become my joyful patron!! +If you're using *configfile* and want to support the development, you now have the chance! Go on my [Patreon page](https://www.patreon.com/mindsers) and become my joyful patron!! [![Become a Patron!](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/bePatron?u=9715649) -For help on how to support Configfile, please refer to [The awesome people who support Configfile](https://github.com/Mindsers/configfile/blob/develop/SPONSORS.md). - - +For help on how to support Configfile, please refer to [The awesome people who support Configfile](https://github.com/mindsers/configfile/blob/develop/SPONSORS.md). ## License diff --git a/bin/configfile-modules.js b/bin/configfile-modules.js deleted file mode 100644 index 52ea5bac..00000000 --- a/bin/configfile-modules.js +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env node - -const { - FileService, - TermApplication, - ListModulesCommand, - DeployModuleCommand, - DeployService, - ConfigService, - OPTION_PATH_FILE_TOKEN, - getOptionsFilePath, - getPackageData, - MessageService -} = require('../src') - -;(() => { - const cli = TermApplication.createInstance() - const pkg = getPackageData() - - cli.version = pkg.version - cli.description = 'Configuration modules manager.' - - cli.register(ListModulesCommand, [FileService, MessageService]) - cli.register(DeployModuleCommand, [FileService, DeployService, MessageService]) - - cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) - cli.provide(FileService, [ConfigService, MessageService]) - cli.provide(DeployService, [MessageService]) - cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) - - cli.start() -})() diff --git a/bin/configfile-scripts.js b/bin/configfile-scripts.js deleted file mode 100644 index 8ea4a319..00000000 --- a/bin/configfile-scripts.js +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env node - -const { - FileService, - ExecService, - TermApplication, - ListScriptsCommand, - RunScriptCommand, - ConfigService, - OPTION_PATH_FILE_TOKEN, - getOptionsFilePath, - getPackageData, - MessageService -} = require('../src') - -;(() => { - const cli = TermApplication.createInstance() - const pkg = getPackageData() - - cli.version = pkg.version - cli.description = 'Custom scripts manager.' - - cli.register(RunScriptCommand, [ExecService, FileService, MessageService]) - cli.register(ListScriptsCommand, [FileService, MessageService]) - - cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) - cli.provide(FileService, [ConfigService, MessageService]) - cli.provide(ExecService) - cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) - - cli.start() -})() diff --git a/bin/configfile.js b/bin/configfile.js deleted file mode 100755 index 28d40b85..00000000 --- a/bin/configfile.js +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env node -const { LoggerService } = require('yabf') -const { - TermApplication, - Command, - InitCommand, - ConfigService, - OPTION_PATH_FILE_TOKEN, - getOptionsFilePath, - getPackageData, - MessageService -} = require('../src'); - -(() => { - const cli = TermApplication.createInstance() - const pkg = getPackageData() - - cli.version = pkg.version - cli.description = 'Configuration files manager.' - - cli.provide({ identity: OPTION_PATH_FILE_TOKEN, useValue: getOptionsFilePath() }) - - cli.provide(ConfigService, [OPTION_PATH_FILE_TOKEN]) - - cli.register(InitCommand, [ConfigService, LoggerService, MessageService]) - cli.register(class extends Command { // modules namespace - get commandName() { - return 'modules' - } - - get alias() { - return 'm' - } - - get description() { - return 'work with modules available.' - } - }) - - cli.register(class extends Command { // scripts namespace - get commandName() { - return 'scripts' - } - - get alias() { - return 's' - } - - get description() { - return 'work with custom scripts available.' - } - }) - - cli.start() -})() diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..95c1cb1a --- /dev/null +++ b/biome.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.5.14/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100 + }, + "linter": { + "enabled": true, + "rules": { + "preset": "recommended", + "nursery": { + "noFloatingPromises": "error", + "noMisusedPromises": "error" + }, + "correctness": { + "useImportExtensions": { + "level": "error", + "options": { + "forceJsExtensions": true + } + } + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "semicolons": "asNeeded", + "arrowParentheses": "asNeeded" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/docs/home.md b/docs/home.md index 0a708454..105b8eae 100644 --- a/docs/home.md +++ b/docs/home.md @@ -1,41 +1,49 @@ # Configfile -Configfile is a command line interface application to help developer manages their development setup. +Configfile is a command line application that helps developers manage their development setup from a dotfiles git repository. ## Getting Started To install Configfile: ```bash -npm install -g configfile@latest -# or -yarn global add configfile@latest +npm install --global configfile ``` +macOS or Linux, Node.js 22.13 or later and git are required. + Generating first configuration: ```bash configfile init ``` -It is an interactive command. Answer questions. +It asks for your repository URL and where to clone it. To set it up without questions (in a script, for example): -### Running unit tests +```bash +configfile init --repo git@github.com:me/dotfiles.git --folder ~/.dotfiles +``` -Unit test will be available via: +### Running unit tests ```bash -yarn test +pnpm install +pnpm test ``` ### Additional commands -- [configfile modules list]() -- [configfile modules deploy]() -- [configfile scripts list]() -- [configfile scripts run]() +- [configfile modules list](../README.md#usage) +- [configfile modules status](../README.md#usage) +- [configfile modules deploy](../README.md#usage) +- [configfile modules undeploy](../README.md#usage) +- [configfile scripts list](../README.md#usage) +- [configfile scripts run](../README.md#usage) +- [configfile update](../README.md#usage) ## Configfiles Configuration -- [Data folder structure]() -- [Module settings]() +- [Data folder structure](../README.md#data-storage) +- [Module settings](../README.md#modules) +- [Scripts](../README.md#scripts) +- [~/.configfilerc](../README.md#configuration) diff --git a/package.json b/package.json index 05aa38c7..af8768d2 100644 --- a/package.json +++ b/package.json @@ -2,41 +2,56 @@ "name": "configfile", "version": "0.3.1", "description": "Personal config files manager", - "main": "index.js", - "repository": "github.com:Mindsers/configfile.git", + "keywords": [ + "dotfiles", + "config", + "cli", + "symlink" + ], + "homepage": "https://github.com/mindsers/configfile#readme", + "bugs": "https://github.com/mindsers/configfile/issues", + "repository": { + "type": "git", + "url": "git+https://github.com/mindsers/configfile.git" + }, "author": "Mindsers ", "license": "Apache-2.0", - "config": { - "optionsFilePath": "~/.configfile" - }, + "type": "module", "bin": { - "configfile": "./bin/configfile.js" + "configfile": "./dist/cli.js" + }, + "files": [ + "dist" + ], + "engines": { + "node": ">=22.13.0" }, + "os": [ + "darwin", + "linux" + ], + "packageManager": "pnpm@12.6.0", "scripts": { - "test:unit:coverage": "nyc yarn test:unit", - "test:unit": "ava tests/**/*.js", - "test:lint": "eslint bin src tests", - "test": "yarn test:lint && yarn test:unit:coverage" + "build": "tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "lint": "biome check .", + "format": "biome check --write .", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "check": "pnpm lint && pnpm typecheck && pnpm test", + "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"", + "prepack": "node --run clean && tsc -p tsconfig.build.json" }, "dependencies": { - "chalk": "4.1.0", - "commander": "7.0.0", - "esm": "3.2.25", - "gift": "0.10.2", - "inquirer": "7.3.3", - "yabf": "2.1.0" + "@inquirer/prompts": "^8.7.2", + "commander": "^15.0.0" }, "devDependencies": { - "@types/node": "11.15.44", - "ava": "3.15.0", - "eslint": "7.18.0", - "eslint-config-standard": "16.0.2", - "eslint-plugin-import": "2.22.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "4.2.1", - "eslint-plugin-standard": "4.1.0", - "nyc": "15.1.0", - "rimraf": "3.0.2", - "sinon": "9.2.3" + "@biomejs/biome": "2.5.14", + "@types/node": "22.20.4", + "@vitest/coverage-v8": "5.0.2", + "typescript": "7.0.2", + "vitest": "5.0.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..1ca34407 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1536 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.6.0 + version: 12.6.0 + +packages: + + '@pnpm/exe.android-arm64@12.6.0': + resolution: {integrity: sha512-kviIHft9h02q+7N2In7tSL9T/HRUSGwYmU74YPtsWU5ee7vgqPyC0JT6RRX6miW+NxX1CvHgQxg69qq1qTLJYQ==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.6.0': + resolution: {integrity: sha512-CT8aJKLq2mtZFE71pr4E5Z2xHL8uGnRGr+NclDqsXlVF4SVcQ2QAs14mWi0C8gjT4hbmi+Q0lJRRIkMAWfjjng==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.6.0': + resolution: {integrity: sha512-rafpVkjzugKBMxSvGQd5wK1x5eOTkD/+lcJIFHeQhvd+BJ8kDisOOvwhQDrpGd4vd2Fx+hhW0P2Ptt638OlhFg==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.6.0': + resolution: {integrity: sha512-72Jpuv1m24gI8zUNcaylYpBWEhBzz1VPhnDIU2GYM2eRP+KsOqVLwV78i+JrihI39zY2NNXmaN4eAKX1inpaDQ==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.6.0': + resolution: {integrity: sha512-LON4QgNy1w/XF4uySZIyC/5hEB0oGdelXsY9tSKqstER+2j2X2oHz67skD11RRd/HWFRtMr64shQZ4I9ZoZ0zg==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.6.0': + resolution: {integrity: sha512-BdDpX+DeaMUc5x6WNcE6FkmFy36NwrBbBvwsZU737Zt3u1fTY+iKFPchjEQNCM4rT6q6xvF2oN3ZwExGsJCkxQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.6.0': + resolution: {integrity: sha512-8h2sNoIhHDpHDYqZZCh9PXr6krqW10btb0GHVGuw710muDHlFAHMtUG2ogmaHge6zJG1xgY4Y7mwX5g/LWvrYg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.6.0': + resolution: {integrity: sha512-ld6xgcEhFCFrsVsJhbmdmR714PnsEspO/Ij8w0/D7OSiz2hYGu3fZd5tKRxOI5m6H6Gl0/RRFAPncTHbsgXVjQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.6.0': + resolution: {integrity: sha512-HIbImydoC3J8NFt+8MXfhTCf5rO6NjCMyinSAHac0VmV8uCHw+kbQkyAzxV84rzz9ZOzmBOnj0b1N461UIYGsw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.6.0': + resolution: {integrity: sha512-DjSqT7+BZ/lWcDHwNMuzsRVfyxUimh+D54Xw4tSWbdVVQhtWtNMUyI93LVnwCmsoEpar2gC3SFeAgywx37svKQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.6.0': + resolution: {integrity: sha512-31lKeGPmRE6xfV6I3VjaEGVFRei14pl/zgoFDK4w+UkbJqOuNl2Ht3O1GuqNIg3Gl14qTEb4kZRAYFHXifDx9A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.6.0': + resolution: {integrity: sha512-qFWBneHJAJ73W4whtbaFOL1M/7DBC6ILHXuxc7ZPtEhfPuT1zeZiGrmKHoMAfJA+mcm6xhOFljqVTUS+00Jabw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.6.0': + resolution: {integrity: sha512-OhfefXEEykZlslSUhR8PPRe6MVPV3Oink/dVfIecE5velpc7j80cZYsHlaDrtRDcm3TPwQHkaRW1SJ1efX9oFg==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.6.0': + resolution: {integrity: sha512-L2tuyrD2+Imgxs3VK/ST/2L3xD6vDP0ktJQxM0TaGw7TbAQEMq+RMc8iK6Ew7Id579uzjJe8jSfJID2ZGsOHCA==} + cpu: [x64] + os: [win32] + + pnpm@12.6.0: + resolution: {integrity: sha512-PvaPlRyxEawgS0paFvCy3fDaVqluBBPoHYVdnwtV75JnFHCQKOHNAMQFwsX7e56OxNxGd3yAXQNzwvL/AP0g7A==} + engines: {node: '>=18.*'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.6.0': + optional: true + + '@pnpm/exe.android-x64@12.6.0': + optional: true + + '@pnpm/exe.darwin-arm64@12.6.0': + optional: true + + '@pnpm/exe.darwin-x64@12.6.0': + optional: true + + '@pnpm/exe.freebsd-x64@12.6.0': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.6.0': + optional: true + + '@pnpm/exe.linux-arm64@12.6.0': + optional: true + + '@pnpm/exe.linux-ppc64@12.6.0': + optional: true + + '@pnpm/exe.linux-riscv64@12.6.0': + optional: true + + '@pnpm/exe.linux-s390x@12.6.0': + optional: true + + '@pnpm/exe.linux-x64-musl@12.6.0': + optional: true + + '@pnpm/exe.linux-x64@12.6.0': + optional: true + + '@pnpm/exe.win32-arm64@12.6.0': + optional: true + + '@pnpm/exe.win32-x64@12.6.0': + optional: true + + pnpm@12.6.0: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.6.0 + '@pnpm/exe.android-x64': 12.6.0 + '@pnpm/exe.darwin-arm64': 12.6.0 + '@pnpm/exe.darwin-x64': 12.6.0 + '@pnpm/exe.freebsd-x64': 12.6.0 + '@pnpm/exe.linux-arm64': 12.6.0 + '@pnpm/exe.linux-arm64-musl': 12.6.0 + '@pnpm/exe.linux-ppc64': 12.6.0 + '@pnpm/exe.linux-riscv64': 12.6.0 + '@pnpm/exe.linux-s390x': 12.6.0 + '@pnpm/exe.linux-x64': 12.6.0 + '@pnpm/exe.linux-x64-musl': 12.6.0 + '@pnpm/exe.win32-arm64': 12.6.0 + '@pnpm/exe.win32-x64': 12.6.0 + +--- +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@inquirer/prompts': + specifier: ^8.7.2 + version: 8.7.2(@types/node@22.20.4) + commander: + specifier: ^15.0.0 + version: 15.0.0 + devDependencies: + '@biomejs/biome': + specifier: 2.5.14 + version: 2.5.14 + '@types/node': + specifier: 22.20.4 + version: 22.20.4 + '@vitest/coverage-v8': + specifier: 5.0.2 + version: 5.0.2(vitest@5.0.2) + typescript: + specifier: 7.0.2 + version: 7.0.2 + vitest: + specifier: 5.0.2 + version: 5.0.2(@types/node@22.20.4)(@vitest/coverage-v8@5.0.2)(vite@8.3.1(@types/node@22.20.4)) + +packages: + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@biomejs/biome@2.5.14': + resolution: {integrity: sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.5.14': + resolution: {integrity: sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.5.14': + resolution: {integrity: sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.5.14': + resolution: {integrity: sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.5.14': + resolution: {integrity: sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.5.14': + resolution: {integrity: sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.5.14': + resolution: {integrity: sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.5.14': + resolution: {integrity: sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.5.14': + resolution: {integrity: sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@inquirer/ansi@2.0.8': + resolution: {integrity: sha512-WpQM+Ti6Z40EFwwt+uL2p4UabT+W179zHp6HhLVOzfbwnVn05IPO/eXIZXGNqcT1jbQ15SujNLzQ39k4QPPxBQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/checkbox@5.2.5': + resolution: {integrity: sha512-bRt8J8m+Fot9CXv+zNQGXUq2ET0MggR1fPz7v6edN6MFYmsbfGnMmkmWZJEegMKqrAC8ej/o1sqisHZXZJMAfQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@6.3.2': + resolution: {integrity: sha512-Xvr/0HggjddPtGppuqVmxhTw+Hr8PvsZ/k0HmOEaAqQEt80OITNkFWnsdNmyT0/eM4Ab+iJLx2R8rctlEyfSVg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@12.0.3': + resolution: {integrity: sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@5.3.3': + resolution: {integrity: sha512-YsKkS2q63IiLtaDK/9nqzdComN97SDQrmKiyNggN+ceP4ty+Z6VwyTz3FpjeUWeW1Efss2xHFKCC9sx7hnrsxg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@5.1.5': + resolution: {integrity: sha512-uHuXLmXW+TtIfT/9vSBotypAkqn1n34Ul+CLGPos/xANyO4Ff5xZzkYhbKR4NEcfVK4a9mHQOpwVZzluSHFRGw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@3.0.5': + resolution: {integrity: sha512-f3QQJRIX5ZEneBHNUIuPjmbdzHnmRFJA8r2dkcb8q+OM5Uv5KtnuAttQumnrjcBVBM3mcTX1CkmtAkU58VRZxg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@2.0.9': + resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/input@5.1.6': + resolution: {integrity: sha512-HtcJhB2QFVXbLuJ5S3syhNbTUVxYvwqV4VRBDkQceBloC9bmTViUoRFP5PbSaDZb3HzfPmpuU/gG4ybVBz4FHA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@4.2.3': + resolution: {integrity: sha512-6Yuwh1NGSbu1Lo4N1EWjXs1jKRntLg/ZCwhmeorEHde90v1XxAozdbd4Iu30eOQLW+6h1hp2O9ujNfLSbTPJnA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@5.2.2': + resolution: {integrity: sha512-W9zYdyzogK+6110mqwaSJWCBu2yA5Q/OfnGSjjZB1bNpHlmUozXxTl0+QOZBNeVd6Qo81/qT75gW05gLAtITxw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@8.7.2': + resolution: {integrity: sha512-QoRB4wFIjgH5iOhSjoIKMkTvSHDuV+O3OITlIqAYO0oK5x364GJILXiMBvlPiE+klg7Xx9tq5XVqQHcGUDYYPA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@5.3.5': + resolution: {integrity: sha512-1oHky1ONfCOwNrnkQGDE1oaSij/3fI6HFMSf2H/WsGO2lEyDX9My82iggITSy9ddSZ8yk8j9v41OI0fVoSIoaA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@4.3.3': + resolution: {integrity: sha512-fyuIU1Nbpvwlikjg3gXwJFDI11+EFjqQ7P+iByfmivIKQ1vmaykNrD/vy5unHuUqUpsOsnvJ25//tPF7E/RBRA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@5.2.5': + resolution: {integrity: sha512-9kc15hr8r/kI+3DO/xLog5nOzTz1jqsHXa6JBFzmQKhkoJ8Slda1I1L/uD8ZSZ9tF1yp79wwXe7mclvX1rqR2Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@4.1.1': + resolution: {integrity: sha512-yJoHYrMnxIsJZCY+0Vb66Dy3he3kL3e2wOBKhoSwWWAzZAY82emlxwgprCtp6yRixvNRNq9ztfRWQYPNr3Go7A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@oxc-project/types@0.151.0': + resolution: {integrity: sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==} + + '@rolldown/binding-android-arm-eabi@1.2.11': + resolution: {integrity: sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.11': + resolution: {integrity: sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.11': + resolution: {integrity: sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.11': + resolution: {integrity: sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.11': + resolution: {integrity: sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.11': + resolution: {integrity: sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.11': + resolution: {integrity: sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.11': + resolution: {integrity: sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.11': + resolution: {integrity: sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.11': + resolution: {integrity: sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.11': + resolution: {integrity: sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.11': + resolution: {integrity: sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.11': + resolution: {integrity: sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.11': + resolution: {integrity: sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.11': + resolution: {integrity: sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/node@22.20.4': + resolution: {integrity: sha512-zJRE40jpHtKqE/C4fgHrAKQLJuSpzEnP9ff9Y7YtoR3Wd2pwqzlekDeEuUQXjRd+QCYnVnNwuJYmhdk9XV8gvA==} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@vitest/coverage-v8@5.0.2': + resolution: {integrity: sha512-3ffHBEi8DOOBLwIGBhOBZbRfYFYWjMUuxZicONdhuFEFEG5AVsMOSrVeuROskqnqpbOmEJwxM2eTVZ9N3a1t+A==} + peerDependencies: + '@vitest/browser': 5.0.2 + vitest: 5.0.2 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/istanbul-lib-coverage@1.0.2': + resolution: {integrity: sha512-9J/JMwOf9AoJhAywhrn7ScKTL38hsWQP/qPG60OtaAFcQ5OXPwKsxZFlbnuCKmZ61m8/lGgHYnFpdyQZUvG/iA==} + engines: {node: '>=22'} + + '@vitest/istanbul-lib-report@1.0.2': + resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==} + engines: {node: '>=22'} + + '@vitest/mocker@5.0.2': + resolution: {integrity: sha512-Z5FS00Q1SJHkB35xATsmWGdQ5WA1/0MV3CDjqyv7GavHv1OfOj145MNfHOlHk7QLes21dKFDHr8EO2zvL+9WGA==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/spy@5.0.2': + resolution: {integrity: sha512-Ijc7T1nT9efNb5LxvjaBrEqw3f/QwUv5EE0nKqZxgqsaV/FxAAZ8baGylA8X/Z2oS4Lp+K74Jr6dTJsDKxJDeg==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@1.0.7: + resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + magic-string@1.4.2: + resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} + + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} + + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} + + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + + rolldown@1.2.11: + resolution: {integrity: sha512-qpSwIyz0jHQq5qXBTNxFmE6664rJ7O+4TvPFOiOaBSrz8IOHc1koKKSqTM2H6u1UG1+TveuC6vaDHKXFOvb1Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + tinybench@6.2.0: + resolution: {integrity: sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==} + engines: {node: '>=20.0.0'} + + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + engines: {node: '>=14.0.0'} + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + vite@8.3.1: + resolution: {integrity: sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@5.0.2: + resolution: {integrity: sha512-7MQrx9pDv5aHiUcovIb/70Ys3tgtkUVgCtledvKdCmEO+/1Dicq5ZqoSxOW034m03oqC+oHOKui2dM6qtMLoJg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.2 + '@vitest/browser-preview': 5.0.2 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.2 + '@vitest/coverage-v8': 5.0.2 + '@vitest/ui': 5.0.2 + happy-dom: '*' + jsdom: '*' + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + why-is-node-running@3.2.2: + resolution: {integrity: sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A==} + engines: {node: '>=20.11'} + hasBin: true + +snapshots: + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bcoe/v8-coverage@1.0.2': {} + + '@biomejs/biome@2.5.14': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.5.14 + '@biomejs/cli-darwin-x64': 2.5.14 + '@biomejs/cli-linux-arm64': 2.5.14 + '@biomejs/cli-linux-arm64-musl': 2.5.14 + '@biomejs/cli-linux-x64': 2.5.14 + '@biomejs/cli-linux-x64-musl': 2.5.14 + '@biomejs/cli-win32-arm64': 2.5.14 + '@biomejs/cli-win32-x64': 2.5.14 + + '@biomejs/cli-darwin-arm64@2.5.14': + optional: true + + '@biomejs/cli-darwin-x64@2.5.14': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.5.14': + optional: true + + '@biomejs/cli-linux-arm64@2.5.14': + optional: true + + '@biomejs/cli-linux-x64-musl@2.5.14': + optional: true + + '@biomejs/cli-linux-x64@2.5.14': + optional: true + + '@biomejs/cli-win32-arm64@2.5.14': + optional: true + + '@biomejs/cli-win32-x64@2.5.14': + optional: true + + '@inquirer/ansi@2.0.8': {} + + '@inquirer/checkbox@5.2.5(@types/node@22.20.4)': + dependencies: + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/confirm@6.3.2(@types/node@22.20.4)': + dependencies: + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/core@12.0.3(@types/node@22.20.4)': + dependencies: + '@inquirer/ansi': 2.0.8 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@22.20.4) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/editor@5.3.3(@types/node@22.20.4)': + dependencies: + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/external-editor': 3.0.5(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/expand@5.1.5(@types/node@22.20.4)': + dependencies: + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/external-editor@3.0.5(@types/node@22.20.4)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/figures@2.0.9': {} + + '@inquirer/input@5.1.6(@types/node@22.20.4)': + dependencies: + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/number@4.2.3(@types/node@22.20.4)': + dependencies: + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/password@5.2.2(@types/node@22.20.4)': + dependencies: + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/prompts@8.7.2(@types/node@22.20.4)': + dependencies: + '@inquirer/checkbox': 5.2.5(@types/node@22.20.4) + '@inquirer/confirm': 6.3.2(@types/node@22.20.4) + '@inquirer/editor': 5.3.3(@types/node@22.20.4) + '@inquirer/expand': 5.1.5(@types/node@22.20.4) + '@inquirer/input': 5.1.6(@types/node@22.20.4) + '@inquirer/number': 4.2.3(@types/node@22.20.4) + '@inquirer/password': 5.2.2(@types/node@22.20.4) + '@inquirer/rawlist': 5.3.5(@types/node@22.20.4) + '@inquirer/search': 4.3.3(@types/node@22.20.4) + '@inquirer/select': 5.2.5(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/rawlist@5.3.5(@types/node@22.20.4)': + dependencies: + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/search@4.3.3(@types/node@22.20.4)': + dependencies: + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/select@5.2.5(@types/node@22.20.4)': + dependencies: + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@22.20.4) + optionalDependencies: + '@types/node': 22.20.4 + + '@inquirer/type@4.1.1(@types/node@22.20.4)': + optionalDependencies: + '@types/node': 22.20.4 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@oxc-project/types@0.151.0': {} + + '@rolldown/binding-android-arm-eabi@1.2.11': + optional: true + + '@rolldown/binding-android-arm64@1.2.11': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.11': + optional: true + + '@rolldown/binding-darwin-x64@1.2.11': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.11': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.11': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.11': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.11': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.11': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.11': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.11': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/node@22.20.4': + dependencies: + undici-types: 6.21.0 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@vitest/coverage-v8@5.0.2(vitest@5.0.2)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/istanbul-lib-coverage': 1.0.2 + '@vitest/istanbul-lib-report': 1.0.2 + ast-v8-to-istanbul: 1.0.7 + magicast: 0.5.5 + obug: 2.2.1 + std-env: 4.2.0 + tinyrainbow: 3.1.1 + vitest: 5.0.2(@types/node@22.20.4)(@vitest/coverage-v8@5.0.2)(vite@8.3.1(@types/node@22.20.4)) + + '@vitest/istanbul-lib-coverage@1.0.2': {} + + '@vitest/istanbul-lib-report@1.0.2': + dependencies: + '@vitest/istanbul-lib-coverage': 1.0.2 + + '@vitest/mocker@5.0.2(vite@8.3.1(@types/node@22.20.4))': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.2 + estree-walker: 3.0.3 + magic-string: 1.4.2 + optionalDependencies: + vite: 8.3.1(@types/node@22.20.4) + + '@vitest/spy@5.0.2': {} + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.7: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + chai@6.2.2: {} + + chardet@2.2.0: {} + + cli-width@4.1.0: {} + + commander@15.0.0: {} + + detect-libc@2.1.2: {} + + es-module-lexer@2.3.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + expect-type@1.4.0: {} + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + fsevents@2.3.3: + optional: true + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + js-tokens@10.0.0: {} + + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + magic-string@1.4.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + magicast@0.5.5: + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 + + mute-stream@3.0.0: {} + + nanoid@3.3.19: {} + + obug@2.2.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.7: {} + + postcss@8.5.28: + dependencies: + nanoid: 3.3.19 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + rolldown@1.2.11: + dependencies: + '@oxc-project/types': 0.151.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.11 + '@rolldown/binding-android-arm64': 1.2.11 + '@rolldown/binding-darwin-arm64': 1.2.11 + '@rolldown/binding-darwin-x64': 1.2.11 + '@rolldown/binding-freebsd-x64': 1.2.11 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.11 + '@rolldown/binding-linux-arm64-gnu': 1.2.11 + '@rolldown/binding-linux-arm64-musl': 1.2.11 + '@rolldown/binding-linux-ppc64-gnu': 1.2.11 + '@rolldown/binding-linux-s390x-gnu': 1.2.11 + '@rolldown/binding-linux-x64-gnu': 1.2.11 + '@rolldown/binding-linux-x64-musl': 1.2.11 + '@rolldown/binding-openharmony-arm64': 1.2.11 + '@rolldown/binding-win32-arm64-msvc': 1.2.11 + '@rolldown/binding-win32-x64-msvc': 1.2.11 + + safer-buffer@2.1.2: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + std-env@4.2.0: {} + + tinybench@6.2.0: {} + + tinyexec@1.3.1: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinyrainbow@3.1.1: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + undici-types@6.21.0: {} + + vite@8.3.1(@types/node@22.20.4): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.28 + rolldown: 1.2.11 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.20.4 + fsevents: 2.3.3 + + vitest@5.0.2(@types/node@22.20.4)(@vitest/coverage-v8@5.0.2)(vite@8.3.1(@types/node@22.20.4)): + dependencies: + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.2(vite@8.3.1(@types/node@22.20.4)) + chai: 6.2.2 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 1.4.2 + obug: 2.2.1 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 6.2.0 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + vite: 8.3.1(@types/node@22.20.4) + why-is-node-running: 3.2.2 + optionalDependencies: + '@types/node': 22.20.4 + '@vitest/coverage-v8': 5.0.2(vitest@5.0.2) + transitivePeerDependencies: + - msw + + why-is-node-running@3.2.2: {} diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 00000000..99236aa7 --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,13 @@ +#!/usr/bin/env node +import os from 'node:os' + +import { Output } from './output.js' +import { main } from './program.js' +import { interactivePrompts, nonInteractivePrompts } from './prompts.js' + +process.exitCode = await main(process.argv.slice(2), { + home: os.homedir(), + cwd: process.cwd(), + output: new Output(process.stdout, process.stderr), + prompts: process.stdin.isTTY ? interactivePrompts : nonInteractivePrompts, +}) diff --git a/src/commands/index.js b/src/commands/index.js deleted file mode 100644 index 55d93390..00000000 --- a/src/commands/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from './init' -export * from './modules' -export * from './scripts' diff --git a/src/commands/init.ts b/src/commands/init.ts new file mode 100644 index 00000000..3800c229 --- /dev/null +++ b/src/commands/init.ts @@ -0,0 +1,133 @@ +import { existsSync } from 'node:fs' +import { lstat, mkdir, readdir, stat } from 'node:fs/promises' +import path from 'node:path' + +import type { Command } from 'commander' + +import { ConfigStore } from '../config.js' +import type { Context } from '../context.js' +import { CliError } from '../errors.js' +import { resolveUserPath } from '../paths.js' +import { gitClone } from '../process.js' + +const DEFAULT_FOLDER = '~/.dotfiles' + +interface InitOptions { + force?: boolean + repo?: string + folder?: string +} + +export function registerInitCommand(program: Command, ctx: Context): void { + program + .command('init') + .alias('i') + .description('clone your dotfiles repository and save its location') + .option('-f, --force', 'overwrite the existing configuration without asking') + .option('--repo ', 'dotfiles repository URL (skips the question)') + .option('--folder ', 'where to clone the repository (skips the question)') + .action((options: InitOptions) => init(options, ctx)) +} + +async function init(options: InitOptions, ctx: Context): Promise { + const { output, prompts } = ctx + const store = new ConfigStore(ctx.home) + const previous = await store.readPartial() + + if (!prompts.interactive) { + const missing = [ + store.exists() && options.force !== true && '--force (a configuration already exists)', + options.repo == null && '--repo ', + options.folder == null && '--folder ', + ].filter(Boolean) + if (missing.length > 0) { + throw new CliError( + `Not running in an interactive terminal. Also pass: ${missing.join(', ')}.`, + ) + } + } + + if (store.exists() && options.force !== true) { + const overwrite = await prompts.confirm({ + message: `A configuration already exists (${store.path}). Overwrite it?`, + default: false, + }) + if (!overwrite) { + output.info('Nothing changed.') + return + } + } + + const repoUrl = ( + options.repo ?? + (await prompts.input({ + message: 'Dotfiles repository URL:', + required: true, + ...(previous.repoUrl != null && { default: previous.repoUrl }), + })) + ).trim() + if (repoUrl === '') throw new CliError('A repository URL is required.') + + const folderInput = + options.folder ?? + (await prompts.input({ + message: 'Local folder for the repository:', + required: true, + default: previous.folderPath ?? DEFAULT_FOLDER, + })) + const folderPath = resolveUserPath(folderInput.trim(), ctx) + + switch (await inspectFolder(folderPath)) { + case 'not-a-directory': + throw new CliError(`${folderPath} exists and is not a folder.`) + case 'not-empty': + throw new CliError( + `${folderPath} is not empty and is not a git repository. Choose another folder.`, + ) + case 'git-repository': + output.info(`${folderPath} already contains a git repository. It is used as is.`) + break + case 'missing': + case 'empty': + await mkdir(folderPath, { recursive: true }).catch(error => { + throw new CliError(`Cannot create ${folderPath}: ${(error as Error).message}`) + }) + output.info(`Cloning ${repoUrl} into ${folderPath}…`) + await gitClone(repoUrl, folderPath, ctx) + break + } + + try { + await store.write({ repoUrl, folderPath }) + } catch (error) { + throw new CliError( + `${(error as Error).message} The repository is in ${folderPath}: fix the problem and run ` + + '"configfile init" again, it will reuse it.', + ) + } + output.success(`configfile is ready. Configuration saved to ${store.path}.`) +} + +async function inspectFolder(folderPath: string) { + const fail = (error: unknown): never => { + throw new CliError(`Cannot use ${folderPath}: ${(error as Error).message}`) + } + + const link = await lstat(folderPath).catch(error => { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null + return fail(error) + }) + if (link == null) return 'missing' + + const stats = await stat(folderPath).catch(error => { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + throw new CliError(`${folderPath} is a broken symbolic link.`) + } + return fail(error) + }) + + if (!stats.isDirectory()) return 'not-a-directory' + if (existsSync(path.join(folderPath, '.git'))) return 'git-repository' + if ((await readdir(folderPath).catch(fail)).length > 0) return 'not-empty' + return 'empty' +} diff --git a/src/commands/init/index.js b/src/commands/init/index.js deleted file mode 100644 index 88f77fce..00000000 --- a/src/commands/init/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './init.command' diff --git a/src/commands/init/init-stop-by-user.error.js b/src/commands/init/init-stop-by-user.error.js deleted file mode 100644 index 29438c94..00000000 --- a/src/commands/init/init-stop-by-user.error.js +++ /dev/null @@ -1,5 +0,0 @@ -export class InitStopedByUser extends Error { - constructor(message = 'User stop the init phase.') { - super(message) - } -} diff --git a/src/commands/init/init.command.js b/src/commands/init/init.command.js deleted file mode 100644 index a74f705e..00000000 --- a/src/commands/init/init.command.js +++ /dev/null @@ -1,167 +0,0 @@ -import inquirer from 'inquirer' -import fs from 'fs' -import path from 'path' - -import { Command } from '../../core/command' -import { FsUtils, GitUtils } from '../../shared/utils' -import { FileNotDirectory, FolderNotEmpty } from '../../shared/errors' - -import { InitStopedByUser } from './init-stop-by-user.error' - -export class InitCommand extends Command { - get commandName() { - return 'init' - } - - get alias() { - return 'i' - } - - get description() { - return 'activate configfiles on user session.' - } - - get options() { - return [ - ['-f, --force', 'force parameters file overwrite.'] - ] - } - - constructor(configService, loggerService, messageService) { - super() - - this.configService = configService - this.loggerService = loggerService - this.messageService = messageService - - this.log = this.loggerService.registerScope('configfile:cmd:init') - } - - async run(options) { - this.log('Init command started') - - try { - await this._getUserData(options) - } catch (error) { - this.log('Error in _getUserData') - - if (error instanceof InitStopedByUser) { - this.log('Error is an instance of InitStopedByUser') - this.messageService.printError(error.message) - return - } - } - - try { - this._checkFileSystem() - } catch (error) { - this.log('Error in _checkFileSystem') - - if (error instanceof FolderNotEmpty) { - this.log('Error is an instance of FolderNotEmpty') - this.messageService.printError(error.message) - return - } - - if (error instanceof FileNotDirectory) { - this.log('Error is an instance of FileNotDirectory') - this.messageService.printError(error.message) - return - } - } - - this._cloneGitRepo() - } - - async _getUserData(commandOptions) { - this.log('Start asking people informations for installing configuration file') - const userForceOverwrite = commandOptions.force || false - - const questions = [ - { - name: 'overwrite_file', - message: 'A configuration file already exist. Do you want to continue ?', - type: 'confirm', - when: () => this.configService.configFileExist() && !userForceOverwrite - }, - { - name: 'repo_url', - message: 'Repository url:', - type: 'input', - validate: url => GitUtils.isGitUrl(url), - default: () => { - if (this.configService.configFileExist()) { - return this.configService.repoUrl - } - }, - when: data => !this.configService.configFileExist() || data.overwrite_file || userForceOverwrite - }, - { - name: 'folder_path', - message: 'Folder path:', - type: 'input', - validate: path => FsUtils.isFilePath(path), - default: () => { - if (this.configService.configFileExist()) { - return this.configService.folderPath - } - }, - when: data => !this.configService.configFileExist() || data.overwrite_file || userForceOverwrite - } - ] - - const { repo_url: REPO_URL = null, folder_path: FOLDER_PATH, overwrite_file: OVERWRITE_FILE = true } = await inquirer.prompt(questions) - - if (!OVERWRITE_FILE) { - this.log('User stop the command execution. A file already exist. No override allowed.') - throw new InitStopedByUser('You stopped the command. Nothing has be made.') - } - - let folderPath = FOLDER_PATH.replace('~', process.env.HOME) - folderPath = path.resolve(folderPath) - - this.log('Save validated user answers in config service') - this.configService.repoUrl = REPO_URL - this.configService.folderPath = folderPath - } - - _checkFileSystem() { - this.log('Check file system - Start') - - const folderPath = this.configService.folderPath - if (!FsUtils.fileExist(folderPath)) { - this.log(`Folder ${folderPath} doesn't exist.`) - this.messageService.printInfo('Folder does not exist. It will be created.') - fs.mkdirSync(folderPath) - } - - const isDirectory = fs.statSync(folderPath).isDirectory() - if (!isDirectory) { - this.log(`Folder ${folderPath} is not a folder.`) - throw new FileNotDirectory() - } - - const folderIsEmpty = fs.readdirSync(folderPath).length < 1 - if (!folderIsEmpty) { - this.log(`Folder ${folderPath} isn't empty.`) - throw new FolderNotEmpty() - } - } - - async _cloneGitRepo() { - this.log(`Clone git repo - Start`) - if (this.configService.repoUrl == null) { - this.log(`No URL provided to allow to clone the repo`) - this.messageService.printWarn('Unable to cloned git repository. Need repository URL.') - return - } - - try { - await GitUtils.clone(this.configService.repoUrl, this.configService.folderPath) - this.messageService.printInfo('Git repository cloned successuly.') - } catch (error) { - this.log(error.message) - throw error - } - } -} diff --git a/src/commands/modules.ts b/src/commands/modules.ts new file mode 100644 index 00000000..5be0fad6 --- /dev/null +++ b/src/commands/modules.ts @@ -0,0 +1,499 @@ +import type { Command } from 'commander' + +import { ConfigStore } from '../config.js' +import type { Context } from '../context.js' +import { + assertSafeTarget, + assertSourceExists, + type DeployDecision, + type DeployResult, + decideDeploy, + decideUndeploy, + deployFile, + inspectFile, + type KeptState, + nextBackupPath, + type TargetState, + type UndeployResult, + undeployFile, +} from '../deploy.js' +import { CliError } from '../errors.js' +import { plural } from '../output.js' +import { listModules, type Module, type ModuleFile } from '../repository.js' +import { BackupRecord } from '../state.js' + +type Strategy = ModuleFile['strategy'] +type UsableModule = Extract + +/** Command-line options, as commander gives them. */ +interface RawOptions { + local?: boolean + all?: boolean + force?: boolean + dryRun?: boolean +} + +/** Options once normalized at the command boundary. */ +interface Options { + strategy: Strategy + all: boolean + force: boolean + dryRun: boolean +} + +function normalize(options: RawOptions): Options { + return { + strategy: options.local === true ? 'local' : 'global', + all: options.all === true, + force: options.force === true, + dryRun: options.dryRun === true, + } +} + +export function registerModulesCommand(program: Command, ctx: Context): void { + const modules = program + .command('modules') + .alias('m') + .description('work with the modules of your dotfiles repository') + + modules + .command('list', { isDefault: true }) + .alias('l') + .description('list available modules') + .action(() => list(ctx)) + + modules + .command('status') + .alias('st') + .argument('[modules...]', 'modules to check (all when omitted)') + .description('show whether the files of the modules are deployed') + .option('-l, --local', 'check the local files of the modules, in the current folder') + .action((names: string[], options: RawOptions) => status(names, normalize(options), ctx)) + + modules + .command('deploy') + .alias('d') + .argument('[modules...]', 'modules to deploy (use --all, or answer a question, when omitted)') + .description('deploy the files of one or more modules') + .option('-l, --local', 'copy the local files of the modules instead of linking global files') + .option('-a, --all', 'deploy every module without asking') + .option('-f, --force', 'replace existing local files without asking (they are moved to .old)') + .option('-n, --dry-run', 'show what would be done, without changing anything') + .action((names: string[], options: RawOptions) => deploy(names, normalize(options), ctx)) + + modules + .command('undeploy') + .alias('u') + .argument('[modules...]', 'modules to undeploy (use --all, or answer a question, when omitted)') + .description('remove the deployed files of one or more modules and restore their backups') + .option('-l, --local', 'remove the local copies of the modules instead of global links') + .option('-a, --all', 'undeploy every module without asking') + .option('-n, --dry-run', 'show what would be done, without changing anything') + .action((names: string[], options: RawOptions) => undeploy(names, normalize(options), ctx)) +} + +async function loadModules(ctx: Context): Promise { + const config = await new ConfigStore(ctx.home).read() + + return listModules(config.folderPath, { + home: ctx.home, + cwd: ctx.cwd, + warn: message => ctx.output.warn(message), + }) +} + +async function list(ctx: Context): Promise { + const modules = await loadModules(ctx) + + if (modules.length === 0) { + ctx.output.info('No module found.') + return + } + + ctx.output.print(`${plural(modules.length, 'module')} found.`) + for (const module of modules) { + ctx.output.print(`- ${module.name}${module.error == null ? '' : ` (ignored: ${module.error})`}`) + } + for (const module of modules) reportSettings(module, ctx) +} + +async function status(names: string[], options: Options, ctx: Context): Promise { + const { output } = ctx + const modules = await loadModules(ctx) + const selected = names.length === 0 ? modules : pickModules(modules, names) + + if (selected.length === 0) { + output.info('No module found.') + return + } + + for (const module of selected) { + output.print(`${module.name}:`) + + if (module.error != null) { + output.print(` ignored: ${module.error}`) + continue + } + reportSettings(module, ctx) + + const files = module.files.filter(file => file.strategy === options.strategy) + for (const file of files) { + let state: string + try { + state = describeState(await inspectFile(file)) + } catch (error) { + state = `cannot be checked: ${(error as Error).message}` + } + output.print(` ${file.target} (${state})`) + } + for (const source of module.undecided) { + output.print(` ${source} (no deployment strategy)`) + } + if (files.length === 0 && module.undecided.length === 0) { + output.print(` no ${options.strategy} file`) + } + } +} + +async function deploy(names: string[], options: Options, ctx: Context): Promise { + const { output, prompts } = ctx + const run = await prepare('deploy', names, options, ctx) + if (run == null) return + + const { files, record } = run + let failures = run.failures + const reportError = (file: ModuleFile, error: unknown) => { + failures++ + reportFileError(file, error, ctx) + } + + if (options.dryRun) { + let wouldSkip = 0 + for (const file of files) { + try { + const decision = await planDeploy(file, options) + if (decision.action === 'conflict' && !prompts.interactive) wouldSkip++ + output.print( + `- ${file.target} (${describePlannedDeploy(file, decision, prompts.interactive)})`, + ) + } catch (error) { + reportError(file, error) + } + } + finish(failures, skippedProblems(wouldSkip, prompts.interactive), 'Dry run finished.', ctx) + return + } + + const conflicts: ModuleFile[] = [] + for (const file of files) { + try { + const result = await deployFile(file, { force: options.force, record }) + if (result.status === 'conflict') { + conflicts.push(file) + } else { + output.print(`- ${file.target} ${describeDeploy(result)}`) + } + } catch (error) { + reportError(file, error) + } + } + + // Asked once everything else is deployed, so an answer never blocks other files. + let skipped = 0 + for (const file of conflicts) { + const replace = + prompts.interactive && + (await prompts.confirm({ + message: `${file.target} already exists. Replace it (the current one is moved to .old)?`, + default: false, + })) + + if (!replace) { + skipped++ + output.print(`- ${file.target} (already exists, skipped)`) + continue + } + + try { + const result = await deployFile(file, { force: true, record }) + if (result.status === 'conflict') { + throw new CliError('the target still exists after being moved aside.') + } + output.print(`- ${file.target} ${describeDeploy(result)}`) + } catch (error) { + reportError(file, error) + } + } + + finish(failures, skippedProblems(skipped, prompts.interactive), 'Deployment finished.', ctx) +} + +async function undeploy(names: string[], options: Options, ctx: Context): Promise { + const { output } = ctx + const run = await prepare('undeploy', names, options, ctx) + if (run == null) return + + const { files, record } = run + let failures = run.failures + + for (const file of files) { + try { + const line = options.dryRun + ? `(${await planUndeploy(file, record)})` + : describeUndeploy(await undeployFile(file, { record })) + output.print(`- ${file.target} ${line}`) + } catch (error) { + failures++ + reportFileError(file, error, ctx) + } + } + + finish(failures, [], options.dryRun ? 'Dry run finished.' : 'Undeployment finished.', ctx) +} + +/** + * Selects the modules and files a deploy or undeploy works on, and reports + * modules and settings entries that are skipped (they count as failures). + * Returns `null` when there is nothing to do. + */ +async function prepare( + verb: 'deploy' | 'undeploy', + names: string[], + options: Options, + ctx: Context, +): Promise<{ files: ModuleFile[]; failures: number; record: BackupRecord } | null> { + const { output } = ctx + const selected = await selectModules(verb, await loadModules(ctx), names, options, ctx) + if (selected.length === 0) return null + + let failures = 0 + const usable: UsableModule[] = [] + for (const module of selected) { + if (module.error != null) { + failures++ + output.error(`Module "${module.name}" was not ${verb}ed: ${module.error}.`) + continue + } + + usable.push(module) + failures += module.invalidEntries.length + reportSettings(module, ctx) + for (const source of module.undecided) { + output.warn( + `${module.name}: "${source}" was not ${verb}ed because no deployment strategy is defined. ` + + 'Set "deploy" to "global", "local" or "none" in settings.json.', + ) + } + } + + const files = usable + .flatMap(module => module.files) + .filter(file => file.strategy === options.strategy) + const moduleNames = usable.map(module => module.name).join(', ') + + if (files.length === 0) { + if (failures > 0) + throw new CliError( + `Nothing could be ${verb}ed. ${plural(failures, 'module or settings entry')} failed.`, + ) + output.info(`No ${options.strategy} file to ${verb} in ${moduleNames}.`) + return null + } + + const action = verb === 'deploy' ? 'Deploying' : 'Undeploying' + output.info( + options.dryRun + ? `Dry run, nothing is changed. ${action} ${moduleNames} would do:` + : `${action} ${moduleNames}…`, + ) + return { files, failures, record: await BackupRecord.load(ctx.home) } +} + +async function selectModules( + verb: 'deploy' | 'undeploy', + modules: Module[], + names: string[], + options: Options, + ctx: Context, +): Promise { + if (names.length > 0) { + if (options.all) { + throw new CliError('Give module names or --all, not both.') + } + + const selected = pickModules(modules, names) + const broken = selected.find(module => module.error != null) + if (broken?.error != null) { + throw new CliError(`Module "${broken.name}" cannot be ${verb}ed: ${broken.error}.`) + } + return selected + } + + if (modules.length === 0) { + ctx.output.info('No module found.') + return [] + } + + if (options.all) return modules + + if (!ctx.prompts.interactive) { + throw new CliError(`No module given. Pass module names, or --all to ${verb} every module.`) + } + + const confirmed = await ctx.prompts.confirm({ + message: `No module given. ${verb === 'deploy' ? 'Deploy' : 'Undeploy'} all available modules?`, + default: false, + }) + if (!confirmed) { + ctx.output.info(`Nothing ${verb}ed.`) + return [] + } + + return modules +} + +/** The modules named on the command line, in repository order. Fails on unknown names. */ +function pickModules(modules: Module[], names: string[]): Module[] { + const unknown = names.filter(name => !modules.some(module => module.name === name)) + if (unknown.length > 0) { + throw new CliError( + `Unknown module${unknown.length === 1 ? '' : 's'}: ${unknown.join(', ')}. ` + + 'Run "configfile modules list" to see available modules.', + ) + } + return modules.filter(module => names.includes(module.name)) +} + +/** Invalid entries are errors (the file is not deployed), deprecations are warnings. */ +function reportSettings(module: Module, ctx: Context): void { + if (module.error != null) return + for (const problem of module.invalidEntries) { + ctx.output.error(`${module.name}: ${problem}.`) + } + for (const deprecation of module.deprecations) { + ctx.output.warn(`${module.name}: ${deprecation}.`) + } +} + +function skippedProblems(skipped: number, interactive: boolean): string[] { + return !interactive && skipped > 0 + ? [`${plural(skipped, 'file')} already existed. Use --force to replace them.`] + : [] +} + +function finish(failures: number, problems: string[], success: string, ctx: Context): void { + if (failures > 0) { + problems.push(`${plural(failures, 'file, module or settings entry')} failed.`) + } + if (problems.length > 0) { + throw new CliError(problems.join(' ')) + } + ctx.output.success(success) +} + +function reportFileError(file: ModuleFile, error: unknown, ctx: Context): void { + ctx.output.error(`${file.target}: ${(error as Error).message}`) + if (!(error instanceof CliError) && process.env.DEBUG != null) { + ctx.output.stderr.write(`${(error as Error).stack}\n`) + } +} + +/** What deploying would do, with the same checks as a real deployment. */ +async function planDeploy(file: ModuleFile, options: Options): Promise { + await assertSourceExists(file) + await assertSafeTarget(file) + return decideDeploy(await inspectFile(file), { force: options.force }) +} + +async function planUndeploy(file: ModuleFile, record: BackupRecord): Promise { + await assertSafeTarget(file) + const decision = decideUndeploy(await inspectFile(file)) + + switch (decision.action) { + case 'not-deployed': + return 'not deployed' + case 'keep': + return `would be kept: ${describeKept(decision.state)}` + case 'remove': { + const backup = await record.latest(file.target) + if (backup == null) return 'would be removed' + if (!backup.exists) return `would be removed; its backup ${backup.path} no longer exists` + return `would be removed, ${backup.path} restored` + } + } +} + +function describePlannedDeploy( + file: ModuleFile, + decision: DeployDecision, + interactive: boolean, +): string { + switch (decision.action) { + case 'create': + return `would be ${file.strategy === 'global' ? 'linked' : 'copied'}` + case 'up-to-date': + return 'already up to date' + case 'replace': + return decision.what === 'copy' + ? `would be replaced, the existing one moved to ${nextBackupPath(file.target)}` + : `would be linked, the existing ${decision.what} moved to ${nextBackupPath(file.target)}` + case 'conflict': + return interactive + ? 'already exists: you would be asked whether to replace it' + : 'already exists: would be skipped (use --force to replace it)' + } +} + +function describeState(state: TargetState): string { + switch (state.kind) { + case 'missing': + return 'not deployed' + case 'deployed': + return 'deployed' + case 'modified': + return 'differs from the repository' + case 'occupied': + return `not deployed: a ${state.what} is in the way` + case 'source-missing': + return state.ours + ? 'deployed, but its source is missing from the repository' + : 'its source is missing from the repository' + } +} + +function describeKept(state: KeptState): string { + switch (state.kind) { + case 'occupied': + return `the ${state.what} there was not deployed by configfile` + case 'modified': + return 'it differs from the repository (modified since it was copied?)' + case 'source-missing': + return 'its source is missing from the repository, so it cannot be compared' + } +} + +function describeDeploy(result: Exclude): string { + switch (result.status) { + case 'deployed': + return '(deployed)' + case 'up-to-date': + return '(already up to date)' + case 'backed-up': + return `(deployed, previous file moved to ${result.backup})` + } +} + +function describeUndeploy(result: UndeployResult): string { + switch (result.status) { + case 'removed': + if (result.restored != null) return `(removed, ${result.restored} restored)` + if (result.missingBackup != null) { + return `(removed; its backup ${result.missingBackup} no longer exists, nothing restored)` + } + return '(removed)' + case 'not-deployed': + return '(not deployed)' + case 'kept': + return `(kept: ${describeKept(result.state)})` + } +} diff --git a/src/commands/modules/deploy-stop-by-user.error.js b/src/commands/modules/deploy-stop-by-user.error.js deleted file mode 100644 index 9cb987dc..00000000 --- a/src/commands/modules/deploy-stop-by-user.error.js +++ /dev/null @@ -1,5 +0,0 @@ -export class DeployStopedByUser extends Error { - constructor(message = 'User stop the deployment phase.') { - super(message) - } -} diff --git a/src/commands/modules/deploy.command.js b/src/commands/modules/deploy.command.js deleted file mode 100644 index ee276b5e..00000000 --- a/src/commands/modules/deploy.command.js +++ /dev/null @@ -1,120 +0,0 @@ -import inquirer from 'inquirer' - -import { Command } from '../../core' -import { ConfigurationFileNotExist, TargetFileAlreadyExist } from '../../shared/errors' - -import { DeployStopedByUser } from './deploy-stop-by-user.error' - -export class DeployModuleCommand extends Command { - get commandName() { - return 'deploy [modules...]' - } - - get alias() { - return 'd' - } - - get description() { - return 'deploy configuration files.' - } - - get options() { - return [ - ['-l, --local', 'deploy only local files of the module(s) in the current folder'] - ] - } - - constructor(fileService, deployService, messageService) { - super() - - this.fileService = fileService - this.deployService = deployService - this.messageService = messageService - } - - async run(modules, options) { - const localDeployment = options.local || false - let modulesToDeploy = modules - - try { - modulesToDeploy = await this._getModuleListToDeploy(modules) - } catch (error) { - if (error instanceof ConfigurationFileNotExist) { - this.messageService.printError('No configuration file. You need to run the init command before.') - return - } - - if (error instanceof DeployStopedByUser) { - this.messageService.print(`${error.message} No modules to deploy.`) - return - } - } - - this.messageService.printInfo(`Deployment (${modulesToDeploy.join(', ')}) start.`) - await this._deployModules(modulesToDeploy, localDeployment) - this.messageService.printSuccess(`Deployment task is finished.`) - } - - async _deployModules(modulesToDeploy, localDeployment) { - const files = this.fileService.modules - .filter(element => modulesToDeploy.includes(element.module)) - .reduce((files, element) => { - for (const file of element.files) { - files.push(file) - } - return files - }, []) - .filter(element => element.global === !localDeployment) - - const failedFiles = [] - for (const file of files) { - try { - if (file.global) { - await this.deployService.deployGlobalFile(file) - continue - } - - await this.deployService.deployLocalFile(file) - } catch (error) { - if (error instanceof TargetFileAlreadyExist) { - failedFiles.push(file) - return - } - - throw error - } - } - - for (const file of failedFiles) { - const { overwrite_file: overwriteFile } = await inquirer.prompt([{ - name: 'overwrite_file', - message: `File ${file.target} already exist. Do you want to overwrite it ?`, - type: 'confirm', - default: false - }]) - - if (overwriteFile) { - await this.fileService.deployLocalFile(file, true) - } - } - } - - async _getModuleListToDeploy(modules = []) { - if (modules.length <= 0) { - const { all_module: deployAllModule } = await inquirer.prompt([{ - type: 'confirm', - message: 'No modules was passed in parameter. Do you want to deploy all available modules ?', - name: 'all_module', - default: false - }]) - - if (!deployAllModule) { - throw new DeployStopedByUser() - } - - return this.fileService.modules.map(el => el.module) - } - - return modules - } -} diff --git a/src/commands/modules/index.js b/src/commands/modules/index.js deleted file mode 100644 index b0db02f0..00000000 --- a/src/commands/modules/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './deploy.command' -export * from './list.command' diff --git a/src/commands/modules/list.command.js b/src/commands/modules/list.command.js deleted file mode 100644 index 3314141e..00000000 --- a/src/commands/modules/list.command.js +++ /dev/null @@ -1,48 +0,0 @@ -import { Command } from '../../core/command' -import { ConfigurationFileNotExist } from '../../shared/errors' - -export class ListModulesCommand extends Command { - get commandName() { - return 'list' - } - - get alias() { - return 'l' - } - - get description() { - return 'list all modules available.' - } - - constructor(fileService, messageService) { - super() - - this.fileService = fileService - this.messageService = messageService - } - - run() { - let modules = [] - - try { - modules = this.fileService.modules - } catch (e) { - if (e instanceof ConfigurationFileNotExist) { - this.messageService.print('Unable to load modules without knowing where are stored the data.') - this.messageService.printError('No configuration file. You need to run the init command before.') - return - } - } - - if (modules.length < 1) { - this.messageService.printInfo('No module found.') - return - } - - this.messageService.print(`${modules.length} module(s) found.`) - - for (const { module: name } of modules) { - this.messageService.print(`- ${name}`) - } - } -} diff --git a/src/commands/scripts.ts b/src/commands/scripts.ts new file mode 100644 index 00000000..d6cb49dc --- /dev/null +++ b/src/commands/scripts.ts @@ -0,0 +1,73 @@ +import type { Command } from 'commander' + +import { ConfigStore } from '../config.js' +import type { Context } from '../context.js' +import { CliError } from '../errors.js' +import { plural } from '../output.js' +import { runScript } from '../process.js' +import { listScripts, type Script } from '../repository.js' + +export function registerScriptsCommand(program: Command, ctx: Context): void { + const scripts = program + .command('scripts') + .alias('s') + .description('work with the scripts of your dotfiles repository') + + scripts + .command('list', { isDefault: true }) + .alias('l') + .description('list available scripts') + .action(() => list(ctx)) + + scripts + .command('run') + .alias('r') + .argument('', 'script to run') + .argument('[args...]', 'arguments passed to the script (put them after "--")') + .description('run a script') + .action((name: string, args: string[]) => run(name, args, ctx)) +} + +async function loadScripts(ctx: Context): Promise { + const config = await new ConfigStore(ctx.home).read() + + return listScripts(config.folderPath, config.scriptExtensions, { + warn: message => ctx.output.warn(message), + }) +} + +async function list(ctx: Context): Promise { + const scripts = await loadScripts(ctx) + + if (scripts.length === 0) { + ctx.output.info('No script found.') + return + } + + ctx.output.print(`${plural(scripts.length, 'script')} found.`) + for (const script of scripts) { + ctx.output.print(`- ${script.name}`) + } +} + +async function run(name: string, args: string[], ctx: Context): Promise { + const script = (await loadScripts(ctx)).find(candidate => candidate.name === name) + + if (script == null) { + throw new CliError( + `Script "${name}" not found. Run "configfile scripts list" to see available scripts.`, + ) + } + + // stdout belongs to the script, so that its output can be piped or redirected. + const output = ctx.output.toStderr() + + output.info(`Running "${name}"…`) + const code = await runScript(script, args, ctx) + + if (code !== 0) { + throw new CliError(`Script "${name}" exited with code ${code}.`, code) + } + + output.success(`Script "${name}" finished.`) +} diff --git a/src/commands/scripts/index.js b/src/commands/scripts/index.js deleted file mode 100644 index 37a7786e..00000000 --- a/src/commands/scripts/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './list.command' -export * from './run.command' diff --git a/src/commands/scripts/list.command.js b/src/commands/scripts/list.command.js deleted file mode 100644 index 3f0c8620..00000000 --- a/src/commands/scripts/list.command.js +++ /dev/null @@ -1,48 +0,0 @@ -import { Command } from '../../core' -import { ConfigurationFileNotExist } from '../../shared/errors' - -export class ListScriptsCommand extends Command { - get commandName() { - return 'list' - } - - get alias() { - return 'l' - } - - get description() { - return 'list all custom configuration scripts available.' - } - - constructor(fileService, messageService) { - super() - - this.fileService = fileService - this.messageService = messageService - } - - run() { - let scripts = [] - - try { - scripts = this.fileService.scripts - } catch (e) { - if (e instanceof ConfigurationFileNotExist) { - this.messageService.print('Unable to load scripts without knowing where are stored the data.') - this.messageService.printError('No configuration file. You need to run the init command before.') - return - } - } - - if (scripts.length < 1) { - this.messageService.printInfo('No scripts found.') - return - } - - this.messageService.print(`${scripts.length} script(s) found.`) - - for (const { script } of scripts) { - this.messageService.print(`- ${script}`) - } - } -} diff --git a/src/commands/scripts/run.command.js b/src/commands/scripts/run.command.js deleted file mode 100644 index c44b7252..00000000 --- a/src/commands/scripts/run.command.js +++ /dev/null @@ -1,53 +0,0 @@ -import { Command } from '../../core' -import { ConfigurationFileNotExist, BadScriptPermission, ScriptNotExist } from '../../shared/errors' - -export class RunScriptCommand extends Command { - get commandName() { - return 'run ' - } - - get alias() { - return 'r' - } - - get description() { - return 'run custom configuration scripts.' - } - - constructor(execService, fileService, messageService) { - super() - - this.fileService = fileService - this.execService = execService - this.messageService = messageService - } - - async run(scriptName) { - this.messageService.printInfo(`Running "${scriptName}" script.`) - - const script = this.fileService.scriptByName(scriptName) - - try { - await this.execService.runScript(script) - - this.messageService.printSuccess(`"${scriptName}" script execution is finished.`) - } catch (error) { - if (error instanceof ConfigurationFileNotExist) { - this.messageService.printError('No configuration file. You need to run the init command before.') - return - } - - if (error instanceof ScriptNotExist) { - this.messageService.printError(error.message) - return - } - - if (error instanceof BadScriptPermission) { - this.messageService.printError('Fail', error.message) - return - } - - throw error - } - } -} diff --git a/src/commands/update.ts b/src/commands/update.ts new file mode 100644 index 00000000..e4e8f487 --- /dev/null +++ b/src/commands/update.ts @@ -0,0 +1,37 @@ +import { lstat } from 'node:fs/promises' +import path from 'node:path' + +import type { Command } from 'commander' + +import { ConfigStore } from '../config.js' +import type { Context } from '../context.js' +import { CliError } from '../errors.js' +import { gitPull } from '../process.js' + +export function registerUpdateCommand(program: Command, ctx: Context): void { + program + .command('update') + .alias('u') + .description('pull the latest version of your dotfiles repository') + .action(() => update(ctx)) +} + +async function update(ctx: Context): Promise { + const { folderPath } = await new ConfigStore(ctx.home).read() + + try { + await lstat(path.join(folderPath, '.git')) + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + throw new CliError(`${folderPath} is not a git repository. Run "configfile init".`) + } + throw new CliError(`Cannot read ${folderPath}: ${(error as Error).message}`) + } + + ctx.output.info(`Updating ${folderPath}…`) + await gitPull(folderPath) + ctx.output.success( + 'Dotfiles updated. Global files are symbolic links, so they are already up to date; ' + + 'run "configfile modules deploy" for new files.', + ) +} diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 00000000..282ede3a --- /dev/null +++ b/src/config.ts @@ -0,0 +1,137 @@ +import { existsSync } from 'node:fs' +import { readFile, writeFile } from 'node:fs/promises' +import path from 'node:path' + +import { CliError, NotInitializedError } from './errors.js' +import { resolveUserPath } from './paths.js' + +export interface Config { + /** URL of the dotfiles git repository. */ + readonly repoUrl: string | null + /** Absolute path of the local clone of the dotfiles repository. */ + readonly folderPath: string + /** + * File extensions recognised as scripts, with their dot (`''` means "no + * extension"), or `null` when every file of `scripts/` is a script. + */ + readonly scriptExtensions: readonly string[] | null +} + +/** On-disk shape of `~/.configfilerc`. Unknown keys are preserved on write. */ +interface RawConfig { + repo_url?: unknown + folder_path?: unknown + script_extensions?: unknown + [key: string]: unknown +} + +/** The file exists and is readable, but its content is not a valid configuration. */ +class InvalidConfigError extends CliError { + override name = 'InvalidConfigError' +} + +export class ConfigStore { + readonly path: string + readonly #home: string + + constructor(home: string) { + this.#home = home + this.path = path.join(home, '.configfilerc') + } + + exists(): boolean { + return existsSync(this.path) + } + + async read(): Promise { + const raw = await this.#readRaw() + + if (raw == null) { + throw new NotInitializedError(this.path) + } + + if (typeof raw.folder_path !== 'string' || raw.folder_path.trim() === '') { + throw new InvalidConfigError( + `Invalid configuration in ${this.path}: "folder_path" is missing.`, + ) + } + + return { + repoUrl: typeof raw.repo_url === 'string' ? raw.repo_url : null, + // Hand-edited values such as "~/dotfiles" must not depend on the current folder. + folderPath: resolveUserPath(raw.folder_path.trim(), { home: this.#home, cwd: this.#home }), + scriptExtensions: this.#readExtensions(raw.script_extensions), + } + } + + /** Reads the stored values without validating them, for use as prompt defaults. */ + async readPartial(): Promise<{ repoUrl?: string; folderPath?: string }> { + const raw = await this.#readRaw().catch(ignoreInvalid) + const partial: { repoUrl?: string; folderPath?: string } = {} + + if (typeof raw?.repo_url === 'string') partial.repoUrl = raw.repo_url + if (typeof raw?.folder_path === 'string') partial.folderPath = raw.folder_path + + return partial + } + + /** Saves the configuration. Unknown keys of a valid existing file are kept. */ + async write(config: { repoUrl: string; folderPath: string }): Promise { + const previous = (await this.#readRaw().catch(ignoreInvalid)) ?? {} + const next: RawConfig = { + ...previous, + repo_url: config.repoUrl, + folder_path: config.folderPath, + } + + try { + await writeFile(this.path, `${JSON.stringify(next, null, 2)}\n`) + } catch (error) { + throw new CliError( + `Cannot save the configuration to ${this.path}: ${(error as Error).message}`, + ) + } + } + + #readExtensions(value: unknown): readonly string[] | null { + if (value === undefined || value === null) return null + + if (!Array.isArray(value) || !value.every(ext => typeof ext === 'string')) { + throw new InvalidConfigError( + `Invalid configuration in ${this.path}: "script_extensions" must be a list of strings, such as [".sh", ".py", ""].`, + ) + } + + // Accept "py" as well as ".py". + return value.map(ext => (ext === '' || ext.startsWith('.') ? ext : `.${ext}`)) + } + + async #readRaw(): Promise { + let content: string + try { + content = await readFile(this.path, 'utf8') + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null + throw new CliError(`Cannot read ${this.path}: ${(error as Error).message}`) + } + + let data: unknown + try { + data = JSON.parse(content) + } catch (error) { + throw new InvalidConfigError( + `Invalid configuration in ${this.path}: not valid JSON (${(error as Error).message}).`, + ) + } + + if (data == null || typeof data !== 'object' || Array.isArray(data)) { + throw new InvalidConfigError(`Invalid configuration in ${this.path}: not a JSON object.`) + } + return data as RawConfig + } +} + +function ignoreInvalid(error: unknown): null { + if (error instanceof InvalidConfigError) return null + throw error +} diff --git a/src/context.ts b/src/context.ts new file mode 100644 index 00000000..92596bf6 --- /dev/null +++ b/src/context.ts @@ -0,0 +1,16 @@ +import type { Output } from './output.js' + +export interface Prompts { + /** `false` when questions cannot be asked (stdin is not a terminal). */ + readonly interactive: boolean + confirm(options: { message: string; default?: boolean }): Promise + input(options: { message: string; default?: string; required?: boolean }): Promise +} + +/** Everything a command needs from the outside world, injected for testability. */ +export interface Context { + readonly home: string + readonly cwd: string + readonly output: Output + readonly prompts: Prompts +} diff --git a/src/core/command.js b/src/core/command.js deleted file mode 100644 index 57b2fa5f..00000000 --- a/src/core/command.js +++ /dev/null @@ -1,19 +0,0 @@ -export class Command { - get alias() { - return null - } - - get commandName() { - return null - } - - get description() { - return '' - } - - get options() { - return [] - } - - // optional run() method which contains the action logic -} diff --git a/src/core/index.js b/src/core/index.js deleted file mode 100644 index 29c35ffc..00000000 --- a/src/core/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './term-application' -export * from './command' diff --git a/src/core/term-application.js b/src/core/term-application.js deleted file mode 100644 index 43ed9161..00000000 --- a/src/core/term-application.js +++ /dev/null @@ -1,106 +0,0 @@ -import { AbstractApplication, LoggerService } from 'yabf' -import program from 'commander' - -import { MessageService } from '../services' - -import { Command } from './command' - -export class TermApplication extends AbstractApplication { - get version() { - return this._version || '0.0.0' - } - - set version(semanticVersion) { - this._version = semanticVersion - } - - get description() { - return this._desc - } - - set description(text) { - this._desc = text - } - - constructor(injector, messageService, loggerService) { - super(injector) - - this.messageService = messageService - this.loggerService = loggerService - - this.log = this.loggerService.registerScope('configfile:app') - } - - buildInstructions() { - return [ - { provide: TermApplication, dependencies: [MessageService, LoggerService] }, - { provide: MessageService, dependencies: [] } - ] - } - - register(command, deps = []) { - this.log(`Register new command ${command.prototype.constructor.name}`) - - if (!(command.prototype instanceof Command)) { - this.log(`${command} is not a valid command`) - return null - } - - this.commands = [command, ...(this.commands || [])] - this.injectorService.provide(command, deps, false) - } - - start() { - if (!Array.isArray(this.commands) || this.commands.length < 1) { - this.log(`No command found in Term Application`) - this.messageService.printError('Application failed to initialize') - return - } - - program - .version(this.version) - .description(this.description) - - for (const commandClass of this.commands) { - const controller = this.injectorService.get(commandClass) - - let command = program.command(controller.commandName) - - if (controller.alias != null) { - command = command.alias(controller.alias) - } - - if (controller.alias != null && controller.description.length > 0) { - command = command.description(controller.description) - } - - if (Array.isArray(controller.options)) { - for (const [option, optionDesc] of controller.options) { - command = command.option(option, optionDesc) - } - } - - if ('run' in controller && typeof controller.run === 'function') { - const action = controller.run.bind(controller) - const wrappedAction = this._wrapActions(action) - - command.action(wrappedAction) - } - } - - this.log(`Program start`) - this.log(`Program launched with ${JSON.stringify(process.argv)}`) - program.parse(process.argv) - } - - _wrapActions(action) { - return (...args) => { - try { - action(...args) - } catch (error) { - this.log(`Program failed by error : ${error.message}`) - this.messageService.printError('Fail', 'An error occured.') - } - } - } -} diff --git a/src/deploy.ts b/src/deploy.ts new file mode 100644 index 00000000..f8240ec3 --- /dev/null +++ b/src/deploy.ts @@ -0,0 +1,348 @@ +import { lstatSync } from 'node:fs' +import { + cp, + lstat, + mkdir, + readdir, + readFile, + readlink, + realpath, + rename, + rm, + stat, + symlink, +} from 'node:fs/promises' +import path from 'node:path' + +import { CliError } from './errors.js' +import { contains, type ModuleFile } from './repository.js' +import type { BackupRecord } from './state.js' + +/** What is currently at the target of a module file. */ +export type TargetState = + | { kind: 'missing' } + /** Global: the link to the source. Local: a copy identical to the source. */ + | { kind: 'deployed' } + /** Local only: a file or folder that differs from the source. */ + | { kind: 'modified' } + /** Global only: something that is not the link to the source. */ + | { kind: 'occupied'; what: 'file' | 'folder' | 'link' } + /** + * Something is at the target but the source is missing from the repository. + * `ours`: it is the link configfile made (global files only). + */ + | { kind: 'source-missing'; ours: boolean } + +/** A target left in place by `undeploy`, and why. */ +export type KeptState = Extract + +export type DeployDecision = + | { action: 'up-to-date' } + | { action: 'create' } + /** Move what is at the target aside, then deploy. */ + | { action: 'replace'; what: 'file' | 'folder' | 'link' | 'copy' } + /** Local only, without `force`: the target exists and differs from the source. */ + | { action: 'conflict' } + +export type UndeployDecision = + | { action: 'remove' } + | { action: 'not-deployed' } + | { action: 'keep'; state: KeptState } + +export type DeployResult = + | { status: 'deployed' } + | { status: 'up-to-date' } + | { status: 'backed-up'; backup: string } + | { status: 'conflict' } + +export type UndeployResult = + /** `missingBackup`: a recorded backup that was deleted since, so nothing could be restored. */ + | { status: 'removed'; restored: string | null; missingBackup: string | null } + | { status: 'not-deployed' } + | { status: 'kept'; state: KeptState } + +/** The single place deciding what deploying a file does; dry runs use it too. */ +export function decideDeploy(state: TargetState, { force }: { force: boolean }): DeployDecision { + switch (state.kind) { + case 'missing': + return { action: 'create' } + case 'deployed': + return { action: 'up-to-date' } + case 'occupied': + return { action: 'replace', what: state.what } + case 'modified': + return force ? { action: 'replace', what: 'copy' } : { action: 'conflict' } + case 'source-missing': + // Deploying checks the source first, so this only happens in a race. + throw new CliError('the source file is missing from the repository.') + } +} + +/** The single place deciding what undeploying a file does; dry runs use it too. */ +export function decideUndeploy(state: TargetState): UndeployDecision { + switch (state.kind) { + case 'missing': + return { action: 'not-deployed' } + case 'deployed': + return { action: 'remove' } + case 'source-missing': + return state.ours ? { action: 'remove' } : { action: 'keep', state } + case 'occupied': + case 'modified': + return { action: 'keep', state } + } +} + +export async function inspectFile(file: ModuleFile): Promise { + const existing = await lstatOrNull(file.target) + if (existing == null) return { kind: 'missing' } + + const pointsToSource = + existing.isSymbolicLink() && + path.resolve(path.dirname(file.target), await readlink(file.target)) === file.source + + if ((await lstatOrNull(file.source)) == null) { + return { kind: 'source-missing', ours: file.strategy === 'global' && pointsToSource } + } + + if (file.strategy === 'local') { + return (await sameContent(file.source, file.target)) + ? { kind: 'deployed' } + : { kind: 'modified' } + } + + if (pointsToSource) return { kind: 'deployed' } + if (existing.isSymbolicLink()) return { kind: 'occupied', what: 'link' } + return { kind: 'occupied', what: existing.isDirectory() ? 'folder' : 'file' } +} + +/** + * Deploys a file: global files are symlinked, local files are copied. + * + * Anything already at the target that is not the deployed file is moved aside + * to `.old` (or `.old.1`, …) and recorded, so that `undeployFile` can + * restore it. For local files this only happens with `force`; otherwise a + * `conflict` is returned. + */ +export async function deployFile( + file: ModuleFile, + { force = false, record }: { force?: boolean; record: BackupRecord }, +): Promise { + await assertSourceExists(file) + await assertSafeTarget(file) + + const decision = decideDeploy(await inspectFile(file), { force }) + if (decision.action === 'up-to-date') return { status: 'up-to-date' } + if (decision.action === 'conflict') return { status: 'conflict' } + + await mkdir(path.dirname(file.target), { recursive: true }) + + let backup: string | null = null + if (decision.action === 'replace') { + backup = nextBackupPath(file.target) + await rename(file.target, backup) + try { + await record.add(file.target, backup) + } catch (error) { + // Without a record, undeploy could not restore it: put it back and stop. + await rename(backup, file.target).catch(() => { + throw new CliError(`${(error as Error).message} The previous file is in ${backup}.`) + }) + throw error + } + } + + try { + if (file.strategy === 'global') { + await symlink(file.source, file.target) + } else { + // verbatimSymlinks: links inside a copied folder stay identical to the source. + await cp(file.source, file.target, { + recursive: true, + errorOnExist: true, + force: false, + verbatimSymlinks: true, + }) + } + } catch (error) { + throw await undoFailedDeploy(file.target, backup, record, error) + } + + return backup == null ? { status: 'deployed' } : { status: 'backed-up', backup } +} + +/** + * Removes a deployed file (the link, or a copy that was not modified since), + * then puts back the most recent backup configfile made of it, if any. Other + * `.old` files are never touched. + */ +export async function undeployFile( + file: ModuleFile, + { record }: { record: BackupRecord }, +): Promise { + await assertSafeTarget(file) + + const decision = decideUndeploy(await inspectFile(file)) + if (decision.action === 'not-deployed') return { status: 'not-deployed' } + if (decision.action === 'keep') return { status: 'kept', state: decision.state } + + // Checked before removing anything, so a problem never leaves the target empty. + const backup = await record.latest(file.target) + + await rm(file.target, { recursive: true }) + + if (backup == null) return { status: 'removed', restored: null, missingBackup: null } + if (!backup.exists) { + await record.remove(file.target, backup.path) + return { status: 'removed', restored: null, missingBackup: backup.path } + } + + try { + await rename(backup.path, file.target) + } catch (error) { + throw new CliError( + `${file.target} was removed, but its backup ${backup.path} could not be put back: ` + + `${(error as Error).message}`, + ) + } + await record.remove(file.target, backup.path) + + return { status: 'removed', restored: backup.path, missingBackup: null } +} + +/** The name the next backup of `target` will get. */ +export function nextBackupPath(target: string): string { + // lstat (not exists) so that a broken symlink also counts as taken. + const taken = (candidate: string) => lstatSync(candidate, { throwIfNoEntry: false }) != null + + let backup = `${target}.old` + for (let i = 1; taken(backup); i++) { + backup = `${target}.old.${i}` + } + return backup +} + +/** Fails with a readable message when the source of `file` is missing or unreadable. */ +export async function assertSourceExists(file: ModuleFile): Promise { + try { + await stat(file.source) + } catch (error) { + const code = (error as NodeJS.ErrnoException).code + throw new CliError( + code === 'ENOENT' + ? `Source file ${file.source} does not exist.` + : `Cannot read source file ${file.source}: ${(error as Error).message}`, + ) + } +} + +/** + * Refuses targets that are, through symbolic links, inside the repository or + * one of its parents (settings are checked on paths as written; this checks + * where they really lead). The target itself is not followed: it may be the + * deployed link. + */ +export async function assertSafeTarget(file: ModuleFile): Promise { + const repository = await realpath(file.repository) + const target = path.join( + await realpathOfExisting(path.dirname(file.target)), + path.basename(file.target), + ) + + if (contains(repository, target) || contains(target, repository)) { + throw new CliError( + `the target leads into the dotfiles repository (${repository}) through a symbolic link. ` + + 'Deploying there would change the repository itself.', + ) + } +} + +/** Real path of `target`, or of its closest existing parent followed by the rest. */ +async function realpathOfExisting(target: string): Promise { + try { + return await realpath(target) + } catch (error) { + const parent = path.dirname(target) + if ((error as NodeJS.ErrnoException).code !== 'ENOENT' || parent === target) throw error + return path.join(await realpathOfExisting(parent), path.basename(target)) + } +} + +/** + * After a failed deployment: removes what was partly created at the target and + * puts the backup back. Explains where things are when that is not possible. + */ +async function undoFailedDeploy( + target: string, + backup: string | null, + record: BackupRecord, + error: unknown, +): Promise { + const reason = (error as Error).message + + // EEXIST: something else created the target meanwhile; it is not ours to remove. + if ((error as NodeJS.ErrnoException).code !== 'EEXIST') { + try { + await rm(target, { recursive: true, force: true }) + } catch (cleanupError) { + return new CliError( + `${reason} A partial copy was left at ${target} (${(cleanupError as Error).message})` + + (backup == null ? '.' : `; the previous file is in ${backup}.`), + ) + } + } + + if (backup == null) return new CliError(reason) + + try { + await rename(backup, target) + await record.remove(target, backup) + return new CliError(reason) + } catch (restoreError) { + return new CliError( + `${reason} The previous file is in ${backup} (it could not be put back: ` + + `${(restoreError as Error).message}).`, + ) + } +} + +/** Compares files, folders (recursively) and symlinks without following links. */ +async function sameContent(a: string, b: string): Promise { + const [statsA, statsB] = await Promise.all([lstatOrNull(a), lstatOrNull(b)]) + if (statsA == null || statsB == null) return false + + if (statsA.isSymbolicLink() || statsB.isSymbolicLink()) { + return ( + statsA.isSymbolicLink() && + statsB.isSymbolicLink() && + (await readlink(a)) === (await readlink(b)) + ) + } + + if (statsA.isDirectory() && statsB.isDirectory()) { + const [namesA, namesB] = await Promise.all([readdir(a), readdir(b)]) + namesA.sort() + namesB.sort() + if (namesA.length !== namesB.length || namesA.some((name, i) => name !== namesB[i])) { + return false + } + for (const name of namesA) { + if (!(await sameContent(path.join(a, name), path.join(b, name)))) return false + } + return true + } + + if (statsA.isFile() && statsB.isFile()) { + return statsA.size === statsB.size && (await readFile(a)).equals(await readFile(b)) + } + return false +} + +async function lstatOrNull(target: string) { + try { + return await lstat(target) + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null + throw error + } +} diff --git a/src/errors.ts b/src/errors.ts new file mode 100644 index 00000000..99dda623 --- /dev/null +++ b/src/errors.ts @@ -0,0 +1,27 @@ +/** + * An expected failure that should be reported to the user as a plain message + * (no stack trace) and end the process with `exitCode`. + */ +export class CliError extends Error { + override name = 'CliError' + /** Always 1–255: an error must never end the process with success. */ + readonly exitCode: number + + constructor(message: string, exitCode = 1) { + super(message) + this.exitCode = Number.isInteger(exitCode) && exitCode > 0 && exitCode < 256 ? exitCode : 1 + } +} + +export class NotInitializedError extends CliError { + override name = 'NotInitializedError' + + constructor(configPath: string) { + super(`No configuration found at ${configPath}. Run "configfile init" first.`) + } +} + +/** Thrown by @inquirer/prompts when the user presses Ctrl+C. */ +export function isPromptExit(error: unknown): boolean { + return error instanceof Error && error.name === 'ExitPromptError' +} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index eeeb7bb4..00000000 --- a/src/index.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict' - -require = require('esm')(module) // eslint-disable-line no-global-assign -module.exports = require('./main.js') diff --git a/src/main.js b/src/main.js deleted file mode 100644 index a06bccbe..00000000 --- a/src/main.js +++ /dev/null @@ -1,7 +0,0 @@ -export * from './core' -export * from './commands' -export * from './services' - -export * from './shared/utils' -export * from './shared/config' -export * from './shared/errors' diff --git a/src/output.ts b/src/output.ts new file mode 100644 index 00000000..e932cf21 --- /dev/null +++ b/src/output.ts @@ -0,0 +1,58 @@ +import { styleText } from 'node:util' + +type Style = Parameters[0] + +/** + * User-facing messages. Informational output goes to stdout, warnings and + * errors to stderr. Colors follow Node's detection for each stream: TTY, + * NO_COLOR, NODE_DISABLE_COLORS and FORCE_COLOR. + */ +export class Output { + constructor( + readonly stdout: NodeJS.WritableStream, + readonly stderr: NodeJS.WritableStream, + ) {} + + /** Same messages, all on stderr: for commands whose stdout belongs to someone else. */ + toStderr(): Output { + return new Output(this.stderr, this.stderr) + } + + print(message: string): void { + this.stdout.write(`${message}\n`) + } + + info(message: string): void { + this.#write(this.stdout, 'Info', ['bgCyan', 'black'], 'cyan', message) + } + + success(message: string): void { + this.#write(this.stdout, 'Done', ['bgGreen', 'black'], 'green', message) + } + + warn(message: string): void { + this.#write(this.stderr, 'Warn', ['bgYellow', 'black'], 'yellow', message) + } + + error(message: string): void { + this.#write(this.stderr, 'Error', ['bgRed', 'black'], 'red', message) + } + + #write( + stream: NodeJS.WritableStream, + label: string, + labelStyle: Style, + textStyle: Style, + message: string, + ): void { + const style = (format: Style, text: string) => + styleText(format, text, { stream: stream as NodeJS.WriteStream }) + + stream.write(`${style(labelStyle, ` ${label} `)} ${style(textStyle, message)}\n`) + } +} + +/** `plural(1, 'file')` → "1 file", `plural(2, 'file')` → "2 files". */ +export function plural(count: number, noun: string): string { + return `${count} ${noun}${count === 1 ? '' : 's'}` +} diff --git a/src/paths.ts b/src/paths.ts new file mode 100644 index 00000000..6076df55 --- /dev/null +++ b/src/paths.ts @@ -0,0 +1,19 @@ +import path from 'node:path' + +/** Expands a leading `~` to `home`, then resolves the result against `cwd`. */ +export function resolveUserPath( + input: string, + { home, cwd }: { home: string; cwd: string }, +): string { + const expanded = input === '~' || input.startsWith('~/') ? path.join(home, input.slice(1)) : input + + return path.resolve(cwd, expanded) +} + +/** Turns a file or folder name into a command-line friendly identifier. */ +export function slugify(name: string): string { + return name + .toLowerCase() + .replace(/ /g, '-') + .replace(/[^\w-]+/g, '') +} diff --git a/src/process.ts b/src/process.ts new file mode 100644 index 00000000..c5c0cf77 --- /dev/null +++ b/src/process.ts @@ -0,0 +1,183 @@ +import { spawn } from 'node:child_process' +import { constants } from 'node:fs' +import { access, open } from 'node:fs/promises' +import { constants as osConstants } from 'node:os' +import path from 'node:path' + +import { CliError } from './errors.js' +import type { Script } from './repository.js' + +/** + * Runs a command with inherited stdio and resolves with its exit code. + * + * While it runs, Ctrl+C and Ctrl+\ are left to the child (the terminal sends + * them to both processes) and SIGTERM / SIGHUP are forwarded to it, so the + * child is not left running when configfile is asked to stop, and its own exit + * code is reported. (Nothing can be done if configfile is killed with SIGKILL.) + */ +export function run(command: string, args: string[], { cwd }: { cwd: string }): Promise { + return new Promise((resolve, reject) => { + const child = spawn(command, args, { cwd, stdio: 'inherit' }) + + const ignore = () => {} + const forward = (signal: NodeJS.Signals) => child.kill(signal) + const handlers: [NodeJS.Signals, (signal: NodeJS.Signals) => void][] = [ + ['SIGINT', ignore], + ['SIGQUIT', ignore], + ['SIGTERM', forward], + ['SIGHUP', forward], + ] + for (const [signal, handler] of handlers) process.on(signal, handler) + const cleanup = () => { + for (const [signal, handler] of handlers) process.off(signal, handler) + } + + child.once('error', error => { + cleanup() + reject(error) + }) + child.once('close', (code, signal) => { + cleanup() + if (code != null) { + resolve(code) + return + } + // Shell convention for a process killed by a signal. + const signalNumber = signal == null ? 0 : (osConstants.signals[signal] ?? 0) + resolve(128 + signalNumber) + }) + }) +} + +/** Used for scripts that have no shebang line. */ +const INTERPRETERS: Record = { + '.js': process.execPath, + '.mjs': process.execPath, + '.cjs': process.execPath, + '.sh': 'sh', +} + +/** + * Runs a script and resolves with its exit code. The file mode is never + * modified, so the dotfiles repository stays clean: + * - a script with a shebang line (`#!/usr/bin/env python3`) is run directly + * when executable, otherwise with that interpreter (arguments of the + * shebang line are split on spaces); + * - a `.js` or `.sh` script without shebang line is run with node or sh; + * - any other executable file (such as a compiled program) is run directly. + */ +export async function runScript( + script: Script, + args: string[], + { cwd }: { cwd: string }, +): Promise { + const executable = await isExecutable(script.path) + const shebang = await readShebang(script) + + const launch = async (command: string, commandArgs: string[]) => { + try { + return await run(command, commandArgs, { cwd }) + } catch (error) { + throw launchError(script, shebang?.[0], error) + } + } + + if (shebang != null) { + if (executable) return launch(script.path, args) + + const [interpreter, ...interpreterArgs] = shebang + return launch(interpreter, [...interpreterArgs, script.path, ...args]) + } + + const interpreter = INTERPRETERS[path.extname(script.path)] + if (interpreter != null) return launch(interpreter, [script.path, ...args]) + if (executable) return launch(script.path, args) + + throw new CliError( + `Script "${script.name}" has no shebang line (such as "#!/bin/sh") and is not executable. ` + + `Add one, or run: chmod +x "${script.path}"`, + ) +} + +function launchError(script: Script, interpreter: string | undefined, error: unknown): CliError { + switch ((error as NodeJS.ErrnoException).code) { + case 'ENOENT': + return new CliError( + interpreter == null + ? `Cannot run script "${script.name}": a program it needs is not installed.` + : `Interpreter "${interpreter}" of script "${script.name}" not found.`, + ) + case 'ENOEXEC': + return new CliError( + `Script "${script.name}" cannot be executed. Add a shebang line (such as "#!/bin/sh").`, + ) + case 'EACCES': + return new CliError( + `Permission denied when running script "${script.name}" (${script.path}).`, + ) + default: + return new CliError(`Cannot run script "${script.name}": ${(error as Error).message}`) + } +} + +/** Returns the interpreter and its arguments from a `#!` first line, if any. */ +async function readShebang(script: Script): Promise<[string, ...string[]] | null> { + let handle: Awaited> + try { + handle = await open(script.path, 'r') + } catch (error) { + throw new CliError(`Cannot read script "${script.name}": ${(error as Error).message}`) + } + + try { + const buffer = Buffer.alloc(512) + const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0) + const [firstLine = ''] = buffer.toString('utf8', 0, bytesRead).split(/\r?\n/) + + if (!firstLine.startsWith('#!')) return null + + const [interpreter, ...interpreterArgs] = firstLine.slice(2).trim().split(/\s+/) + return interpreter ? [interpreter, ...interpreterArgs] : null + } finally { + await handle.close() + } +} + +async function isExecutable(file: string): Promise { + try { + await access(file, constants.X_OK) + return true + } catch { + return false + } +} + +/** Clones `url` into `folder` with the user's own git (credentials, SSH agent…). */ +export async function gitClone( + url: string, + folder: string, + { cwd }: { cwd: string }, +): Promise { + await git(['clone', '--', url, folder], { cwd }, 'git clone') +} + +/** Fast-forwards the repository in `folder` to its upstream branch. */ +export async function gitPull(folder: string): Promise { + await git(['pull', '--ff-only'], { cwd: folder }, 'git pull') +} + +async function git(args: string[], { cwd }: { cwd: string }, label: string): Promise { + let code: number + try { + code = await run('git', args, { cwd }) + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + throw new CliError('git is not installed or not in PATH.') + } + throw error + } + + if (code !== 0) { + throw new CliError(`${label} failed (exit code ${code}).`, code) + } +} diff --git a/src/program.ts b/src/program.ts new file mode 100644 index 00000000..96ec3cc4 --- /dev/null +++ b/src/program.ts @@ -0,0 +1,65 @@ +import { readFileSync } from 'node:fs' + +import { Command, CommanderError } from 'commander' + +import { registerInitCommand } from './commands/init.js' +import { registerModulesCommand } from './commands/modules.js' +import { registerScriptsCommand } from './commands/scripts.js' +import { registerUpdateCommand } from './commands/update.js' +import type { Context } from './context.js' +import { CliError, isPromptExit } from './errors.js' + +const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { + version: string +} + +export function buildProgram(ctx: Context): Command { + // showHelpAfterError, exitOverride and configureOutput are copied to + // subcommands when they are created, so they are set before registering them. + const program = new Command('configfile') + .description('Manage your configuration files from a dotfiles git repository.') + .version(pkg.version) + .showHelpAfterError('(add --help for additional information)') + .exitOverride() + .configureOutput({ + writeOut: text => ctx.output.stdout.write(text), + writeErr: text => ctx.output.stderr.write(text), + }) + + registerInitCommand(program, ctx) + registerModulesCommand(program, ctx) + registerScriptsCommand(program, ctx) + registerUpdateCommand(program, ctx) + + return program +} + +/** Runs the CLI with user arguments (no `node` / script path) and returns the exit code. */ +export async function main(args: string[], ctx: Context): Promise { + try { + await buildProgram(ctx).parseAsync(args, { from: 'user' }) + return 0 + } catch (error) { + // Help, version and usage errors: commander already printed the message. + if (error instanceof CommanderError) return error.exitCode + + if (error instanceof CliError) { + ctx.output.error(error.message) + return error.exitCode + } + + if (isPromptExit(error)) { + ctx.output.print('') + ctx.output.info('Cancelled.') + return 130 + } + + ctx.output.error(`Unexpected error: ${(error as Error).message ?? String(error)}`) + if (process.env.DEBUG != null) { + ctx.output.stderr.write(`${(error as Error).stack}\n`) + } else { + ctx.output.stderr.write('Run again with DEBUG=1 for details.\n') + } + return 1 + } +} diff --git a/src/prompts.ts b/src/prompts.ts new file mode 100644 index 00000000..94074906 --- /dev/null +++ b/src/prompts.ts @@ -0,0 +1,23 @@ +import { confirm, input } from '@inquirer/prompts' + +import type { Prompts } from './context.js' +import { CliError } from './errors.js' + +export const interactivePrompts: Prompts = { interactive: true, confirm, input } + +/** + * Used when stdin is not a terminal. Commands check `interactive` to offer + * specific options; this is the fallback so nothing hangs or garbles output. + */ +export const nonInteractivePrompts: Prompts = { + interactive: false, + confirm: ({ message }) => Promise.reject(notInteractive(message)), + input: ({ message }) => Promise.reject(notInteractive(message)), +} + +function notInteractive(question: string): CliError { + return new CliError( + `Cannot ask "${question}" without an interactive terminal. ` + + 'Pass the answer as arguments or options instead (see --help).', + ) +} diff --git a/src/repository.ts b/src/repository.ts new file mode 100644 index 00000000..ce0c63d6 --- /dev/null +++ b/src/repository.ts @@ -0,0 +1,362 @@ +import type { Dirent, Stats } from 'node:fs' +import { readdir, readFile, stat } from 'node:fs/promises' +import path from 'node:path' + +import type { Context } from './context.js' +import { CliError } from './errors.js' +import { resolveUserPath, slugify } from './paths.js' + +export interface ModuleFile { + /** Absolute path of the file inside the dotfiles repository. */ + readonly source: string + /** Absolute path where the file is deployed. Never inside the repository. */ + readonly target: string + /** `global`: symlinked by a regular deploy. `local`: copied by `deploy --local`. */ + readonly strategy: 'global' | 'local' + /** Absolute path of the dotfiles repository the file comes from. */ + readonly repository: string +} + +interface ModuleBase { + readonly name: string + readonly path: string +} + +export type Module = ModuleBase & + ( + | { + readonly error: null + /** Files to deploy. `"deploy": "none"`, invalid and undecided entries are left out. */ + readonly files: readonly ModuleFile[] + /** `source_path` of entries that define no deployment strategy (not deployed). */ + readonly undecided: readonly string[] + /** Why some entries of settings.json are ignored. */ + readonly invalidEntries: readonly string[] + /** Deprecated settings used by the module. */ + readonly deprecations: readonly string[] + } + | { + /** Why settings.json could not be used. Such a module has no files. */ + readonly error: string + } + ) + +export interface Script { + readonly name: string + /** Path relative to the `scripts/` folder. */ + readonly file: string + readonly path: string +} + +type Environment = Pick & { warn(message: string): void } + +/** + * Reads the modules of a dotfiles repository: every folder of `files/` + * (symlinks to folders included) that contains a `settings.json`. + */ +export async function listModules(folderPath: string, env: Environment): Promise { + const filesDir = path.join(folderPath, 'files') + const modules: Module[] = [] + + for (const entry of await readDirOrFail(filesDir)) { + if (entry.name.startsWith('.')) continue + + const modulePath = path.join(filesDir, entry.name) + const stats = await statEntry(entry, modulePath, env) + if (!stats?.isDirectory()) continue + + const settingsPath = path.join(modulePath, 'settings.json') + const settingsStats = await stat(settingsPath).catch(errorCode) + if (settingsStats === 'ENOENT') continue + + const name = slugify(entry.name) + if (!isUsableName(name, entry.name, modules, 'module', env)) continue + + if (typeof settingsStats === 'string') { + modules.push({ + name, + path: modulePath, + error: `settings.json cannot be read (${settingsStats})`, + }) + continue + } + + modules.push({ + name, + path: modulePath, + ...(await readModuleFiles(modulePath, settingsPath, folderPath, env)), + }) + } + + return modules +} + +const DEPLOY_STRATEGIES = ['global', 'local', 'none'] as const +type DeployStrategy = (typeof DEPLOY_STRATEGIES)[number] + +/** + * Reads `"deploy": "global" | "local" | "none"`, or its older spelling + * `"global": true | false`. + */ +function readStrategy(entry: Record): DeployStrategy | 'unset' | 'invalid' { + const { deploy, global } = entry + + if (deploy !== undefined) { + if (global !== undefined) return 'invalid' + return DEPLOY_STRATEGIES.find(strategy => strategy === deploy) ?? 'invalid' + } + if (global === undefined) return 'unset' + if (typeof global !== 'boolean') return 'invalid' + return global ? 'global' : 'local' +} + +type ModuleContent = Exclude + +async function readModuleFiles( + modulePath: string, + settingsPath: string, + repository: string, + env: Environment, +): Promise | { error: string }> { + let settings: unknown + try { + settings = JSON.parse(await readFile(settingsPath, 'utf8')) + } catch (error) { + return { error: `settings.json is not valid JSON (${(error as Error).message})` } + } + + const entries: unknown = (settings as { files?: unknown } | null)?.files + if (!Array.isArray(entries)) { + return { error: 'settings.json has no "files" list' } + } + + const files: ModuleFile[] = [] + const undecided: string[] = [] + const invalidEntries: string[] = [] + let usesLegacyKey = false + + for (const [index, entry] of (entries as unknown[]).entries()) { + const invalid = (reason: string) => + invalidEntries.push(`entry #${index + 1} is ignored: ${reason}`) + + if (entry == null || typeof entry !== 'object' || Array.isArray(entry)) { + invalid('it is not an object') + continue + } + + const fields = entry as Record + const { source_path: source, target_path: target } = fields + const strategy = readStrategy(fields) + if (typeof fields.global === 'boolean' && fields.deploy === undefined) usesLegacyKey = true + + if (strategy === 'none') continue + if (typeof source !== 'string' || source.trim() === '') { + invalid('"source_path" is missing') + continue + } + + switch (strategy) { + case 'invalid': + invalid('use "deploy": "global", "local" or "none" (or "global": true or false, not both)') + continue + case 'unset': + undecided.push(source) + continue + } + + if (typeof target !== 'string' || target.trim() === '') { + invalid('"target_path" is missing') + continue + } + + // Global files belong to the user's home; local files to the current folder. + const resolvedTarget = resolveUserPath(target.trim(), { + home: env.home, + cwd: strategy === 'global' ? env.home : env.cwd, + }) + + const problem = unsafeTarget(resolvedTarget, { ...env, repository }) + if (problem != null) { + invalid(`"target_path" (${target}) ${problem}`) + continue + } + + files.push({ + source: path.resolve(modulePath, source), + target: resolvedTarget, + strategy, + repository, + }) + } + + const deprecations = usesLegacyKey + ? [ + '"global": true | false is deprecated and will stop working in 2.0. ' + + 'Use "deploy": "global" | "local" instead', + ] + : [] + + return { error: null, files, undecided, invalidEntries, deprecations } +} + +/** + * Why deploying to `target` could destroy something important, or `null`. + * Deploying moves whatever is at the target aside, so the target must not be + * the home folder, the current folder, the repository, one of their parents, + * or anything inside the repository. + */ +export function unsafeTarget( + target: string, + { home, cwd, repository }: { home: string; cwd: string; repository: string }, +): string | null { + for (const [folder, label] of [ + [home, 'the home folder'], + [cwd, 'the current folder'], + [repository, 'the dotfiles repository'], + ] as const) { + if (contains(target, folder)) return `would replace ${label} (${folder})` + } + if (contains(repository, target)) return `is inside the dotfiles repository (${repository})` + return null +} + +/** + * Reads the scripts of a dotfiles repository: every file of `scripts/`, and + * every folder of `scripts/` (symlinks included) containing an `index` file. + * Hidden files are ignored. When `extensions` is set, only files with one of + * these extensions count (`''` means "no extension"). + * + * A script is named after its file name up to the first dot: `setup.macos.sh` + * is the `setup` script. + */ +export async function listScripts( + folderPath: string, + extensions: readonly string[] | null, + env: Pick, +): Promise { + const scriptsDir = path.join(folderPath, 'scripts') + const scripts: Script[] = [] + const allowed = (name: string) => extensions == null || extensions.includes(path.extname(name)) + + for (const entry of await readDirOrFail(scriptsDir)) { + if (entry.name.startsWith('.')) continue + + const stats = await statEntry(entry, path.join(scriptsDir, entry.name), env) + if (stats == null) continue + + let file: string | undefined + if (stats.isDirectory()) { + file = await findIndex(scriptsDir, entry.name, allowed, env) + } else if (stats.isFile() && allowed(entry.name)) { + file = entry.name + } + if (file == null) continue + + const [baseName = ''] = entry.name.split('.') + const name = slugify(baseName) + if (!isUsableName(name, file, scripts, 'script', env)) continue + + scripts.push({ name, file, path: path.join(scriptsDir, file) }) + } + + return scripts +} + +/** The `index` file of a script folder (`index`, `index.sh`, …), relative to `scriptsDir`. */ +async function findIndex( + scriptsDir: string, + folder: string, + allowed: (name: string) => boolean, + env: Pick, +): Promise { + let names: string[] + try { + names = await readdir(path.join(scriptsDir, folder)) + } catch (error) { + env.warn(`Script folder ${path.join(scriptsDir, folder)} cannot be read (${errorCode(error)}).`) + return undefined + } + + for (const name of names.sort()) { + if (name !== 'index' && !name.startsWith('index.')) continue + if (!allowed(name)) continue + if ((await stat(path.join(scriptsDir, folder, name)).catch(() => null))?.isFile()) { + return path.join(folder, name) + } + } + return undefined +} + +/** Follows symlinks. Returns `null` (with a warning) when the link cannot be followed. */ +async function statEntry(entry: Dirent, fullPath: string, env: Pick) { + if (!entry.isSymbolicLink()) { + return { isDirectory: () => entry.isDirectory(), isFile: () => entry.isFile() } + } + + const stats: Stats | string = await stat(fullPath).catch(errorCode) + if (typeof stats === 'string') { + const reason = stats === 'ENOENT' ? 'is a broken symbolic link' : `cannot be read (${stats})` + env.warn(`${fullPath} ${reason}. It is ignored.`) + return null + } + return stats +} + +/** Rejects empty names and names already taken, with a warning. */ +function isUsableName( + name: string, + source: string, + existing: readonly { name: string }[], + kind: 'module' | 'script', + env: Pick, +): boolean { + if (name === '') { + env.warn( + `"${source}" has no usable ${kind} name (ASCII letters, digits, "_" or "-"). It is ignored.`, + ) + return false + } + if (existing.some(other => other.name === name)) { + env.warn(`"${source}" is ignored: another ${kind} is already named "${name}".`) + return false + } + return true +} + +/** Whether `child` is `parent` or inside it (paths are compared as text). */ +export function contains(parent: string, child: string): boolean { + const relative = path.relative(parent, child) + return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative)) +} + +function errorCode(error: unknown): string { + return (error as NodeJS.ErrnoException).code ?? (error as Error).message +} + +/** Sorted entries of `dir`. A missing subfolder means "nothing there"; a missing repository is an error. */ +async function readDirOrFail(dir: string): Promise { + let entries: Dirent[] + try { + entries = await readdir(dir, { withFileTypes: true }) + } catch (error) { + const code = (error as NodeJS.ErrnoException).code + const repository = path.dirname(dir) + + if (code === 'ENOENT') { + const repositoryStats = await stat(repository).catch(() => null) + if (repositoryStats == null) { + throw new CliError(`Dotfiles folder ${repository} does not exist. Run "configfile init".`) + } + if (!repositoryStats.isDirectory()) { + throw new CliError(`Dotfiles folder ${repository} is not a folder. Run "configfile init".`) + } + return [] + } + if (code === 'ENOTDIR') { + throw new CliError(`${dir} is not a folder.`) + } + throw new CliError(`Cannot read ${dir}: ${(error as Error).message}`) + } + + return entries.sort((a, b) => a.name.localeCompare(b.name)) +} diff --git a/src/services/config.service.js b/src/services/config.service.js deleted file mode 100644 index ec34e427..00000000 --- a/src/services/config.service.js +++ /dev/null @@ -1,87 +0,0 @@ -import fs from 'fs' - -import { ConfigurationFileNotExist } from '../shared/errors' -import { FsUtils } from '../shared/utils' - -export class ConfigService { - get repoUrl() { - return this.getConfig('repo_url') - } - - set repoUrl(url) { - this.setConfig('repo_url', url) - } - - get folderPath() { - return this.getConfig('folder_path') - } - - set folderPath(path) { - this.setConfig('folder_path', path) - } - - get scriptExtension() { - const extentions = this.getConfig('script_extensions') - - if (extentions === null) { - return ['.js', '.sh', ''] - } - - return extentions - } - - set scriptExtension(extentions) { - if (Array.isArray(extentions)) { - this.setConfig('script_extensions', extentions) - } - } - - constructor(configPath = `${process.env.HOME}/.configfile`) { - this.configPath = `${configPath}rc` - this.configFolderPath = `${configPath}` - - if (!FsUtils.fileExist(this.configFolderPath)) { - fs.mkdirSync(this.configFolderPath) - } - } - - configFileExist() { - return FsUtils.fileExist(this.configPath) - } - - configData() { - if (!this.configFileExist()) { - throw new ConfigurationFileNotExist() - } - - return JSON.parse(fs.readFileSync(this.configPath)) - } - - getConfig(key) { - const configData = this.configData() - - if (key in configData) { - return configData[key] - } - - return null - } - - setConfig(key, value) { - let configData = null - - try { - configData = this.configData() - } catch (e) { - if (!(e instanceof ConfigurationFileNotExist)) { - throw e - } - - configData = {} - } - - configData[key] = value - - fs.writeFileSync(this.configPath, JSON.stringify(configData, null, 4)) - } -} diff --git a/src/services/deploy.service.js b/src/services/deploy.service.js deleted file mode 100644 index b9981116..00000000 --- a/src/services/deploy.service.js +++ /dev/null @@ -1,86 +0,0 @@ -import path from 'path' - -import { FsUtils } from '../shared/utils' -import { TargetFileAlreadyExist } from '../shared/errors' - -export class DeployService { - constructor(messageService) { - this.messageService = messageService - } - - async deployLocalFile({ source, target, global: isGlobalFile }, force = false) { - if (isGlobalFile) { - throw new TypeError('Unable to deploy global file as a local one.') - } - - const dirname = path.dirname(target) - if (!FsUtils.fileExist(dirname)) { - await FsUtils.mkdirp(dirname) - } - - let fileStats - try { - fileStats = await FsUtils.lstat(target) - } catch (error) { - if (error.code !== 'ENOENT') { - throw error - } - - fileStats = null // No file exist at target. No stats data to provide - } - - if (fileStats != null && force === false) { - throw new TargetFileAlreadyExist(target) - } - - try { - return await FsUtils.copyFile(source, target) - } catch (error) { - if (error.code !== 'EEXIST') { - throw error - } - - this.messageService.printWarning(`Unable to make a local copy ("${source}" => "${target}").`) - } - } - - async deployGlobalFile({ source, target, global: isGlobalFile }) { - if (!isGlobalFile) { - throw new TypeError('Unable to deploy local file as a global one.') - } - - const dirname = path.dirname(target) - if (!FsUtils.fileExist(dirname)) { - await FsUtils.mkdirp(dirname) - } - - try { - const targetStat = await FsUtils.lstat(target) - if (targetStat.isSymbolicLink()) { - const linkSource = await FsUtils.readlink(target) - - if (linkSource === source) { - await FsUtils.unlink(target) - } - } - - if (targetStat.isFile() || targetStat.isDirectory()) { - await FsUtils.rename(target, `${target}.old`) - } - } catch (error) { - if (error.code !== 'ENOENT') { // No file exist at file.target - throw error - } - } - - try { - await FsUtils.symlink(source, target) - } catch (error) { - if (error.code !== 'EEXIST') { - throw error - } - - this.messageService.printWarning(`Unable to link "${source}" => "${target}".`) - } - } -} diff --git a/src/services/exec.service.js b/src/services/exec.service.js deleted file mode 100644 index 0c870aeb..00000000 --- a/src/services/exec.service.js +++ /dev/null @@ -1,22 +0,0 @@ -import { FsUtils, ProcessUtils } from '../shared/utils' -import { ScriptNotExist, BadScriptPermission } from '../shared/errors' - -export class ExecService { - async runScript(script) { - if (script == null) { - throw new ScriptNotExist(script.script) - } - - await FsUtils.chmod(script.path, '0700') - - try { - return await ProcessUtils.spawn(script.path) - } catch (error) { - if (error.code === 'EACCES') { - throw new BadScriptPermission(script.script) - } - - throw error - } - } -} diff --git a/src/services/file.service.js b/src/services/file.service.js deleted file mode 100644 index 528cad92..00000000 --- a/src/services/file.service.js +++ /dev/null @@ -1,126 +0,0 @@ -import fs from 'fs' -import path from 'path' - -import { FsUtils } from '../shared/utils' - -export class FileService { - get scripts() { - if (this._scripts.length < 1) { - this._scripts = this.getScripts() - } - - return this._scripts - } - - get modules() { - if (this._modules.length < 1) { - this._modules = this.getModules() - } - - return this._modules - } - - constructor(configService, messageService) { - this.configService = configService - this.messageService = messageService - - this._modules = [] - this._scripts = [] - } - - scriptByName(scriptName) { - return this.scripts - .filter(({ script: name }) => name === scriptName) - .shift() - } - - getScripts() { - const folderContent = fs.readdirSync(path.join(this.configService.folderPath, 'scripts')) - const authorizedExtensions = this.configService.scriptExtension - - return folderContent - .map(element => { - const elementPath = path.join(this.configService.folderPath, 'scripts', element) - const stats = fs.statSync(elementPath) - - if (!stats.isDirectory()) { - return element - } - - for (const ext of authorizedExtensions) { - const filePath = path.join(elementPath, `index${ext}`) - if (FsUtils.fileExist(filePath)) { - return `${element}/index${ext}` - } - } - }) - .filter(element => { - const hasAuthorizedExtension = item => authorizedExtensions - .map(ext => item.includes(ext)) - .filter(el => el === true) - .length > 0 - - return element != null && hasAuthorizedExtension(element) - }) - .map(element => { - const [scriptPath] = element.split('.') - const [scriptName] = scriptPath.split('/') - const scriptSlug = scriptName - .toLowerCase() - .replace(/ /g, '-') - .replace(/[^\w-]+/g, '') - - return { - script: scriptSlug, - file: element, - path: path.join(this.configService.folderPath, 'scripts', element) - } - }) - } - - getModules() { - const folderContent = fs.readdirSync(path.join(this.configService.folderPath, 'files')) - - return folderContent - .map(element => { - const moduleSlug = element - .toLowerCase() - .replace(/ /g, '-') - .replace(/[^\w-]+/g, '') - - return { - module: moduleSlug, - path: path.join(this.configService.folderPath, 'files', element), - settingsPath: path.join(this.configService.folderPath, 'files', element, 'settings.json') - } - }) - .filter(({ path }) => fs.statSync(path).isDirectory()) - .filter(({ settingsPath: path }) => FsUtils.fileExist(path)) - .map(element => { - const path = element.settingsPath - const name = element.module - - try { - const file = fs.readFileSync(path) - const data = JSON.parse(file) - - element.files = data.files - } catch (e) { - this.messageService.printWarning(`Unable to load settings file for "${name}" module.`) - element.files = [] - } - - return element - }) - .map(element => { - element.files = element.files - .map(file => ({ - source: path.resolve(element.path, file['source_path']), - target: path.resolve(file['target_path'].replace('~', process.env.HOME)), - global: file.global - })) - - return element - }) - } -} diff --git a/src/services/index.js b/src/services/index.js deleted file mode 100644 index 4a29c5d1..00000000 --- a/src/services/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export * from './config.service' -export * from './deploy.service' -export * from './exec.service' -export * from './file.service' -export * from './message.service' diff --git a/src/services/message.service.js b/src/services/message.service.js deleted file mode 100644 index e260d67d..00000000 --- a/src/services/message.service.js +++ /dev/null @@ -1,78 +0,0 @@ -import color from 'chalk' - -export class MessageService { - constructor() { - this.stdout = process.stdout - this.stderr = process.stderr - } - - printError(...args) { - const buildText = this._useBuilder( - t => color.bgRed(color.black(t)), - t => color.red(t), - 'Abort' - ) - - this.stdout.write(buildText(...args)) - } - - printWarning(...args) { - const buildText = this._useBuilder( - t => color.bgYellow(color.black(t)), - t => color.yellow(t), - 'Warn' - ) - - this.stdout.write(buildText(...args)) - } - - printInfo(...args) { - const buildText = this._useBuilder( - t => color.bgCyan(color.black(t)), - t => color.cyan(t), - 'Info' - ) - - this.stdout.write(buildText(...args)) - } - - printSuccess(...args) { - const buildText = this._useBuilder( - t => color.bgGreen(color.black(t)), - t => color.green(t), - 'Done' - ) - - this.stdout.write(buildText(...args)) - } - - print(...args) { - const buildText = this._useBuilder( - t => color.bgWhite(color.black(t)), - t => color.gray(t) - ) - - this.stdout.write(buildText(...args)) - } - - printEmptyLine() { - this.print('') - } - - _useBuilder(stylePrefix, styleText, defaultPrefix) { - return (prefix, ...texts) => { - let fullText = `${styleText(prefix)}\n` - - if (defaultPrefix != null) { - fullText = `${stylePrefix(` ${defaultPrefix} `)} ${fullText}` - } - - if (texts.length > 0) { - const styledPrefix = stylePrefix(` ${prefix} `) - fullText = `${styledPrefix} ${styleText(texts.join(' '))}\n` - } - - return fullText - } - } -} diff --git a/src/shared/config.js b/src/shared/config.js deleted file mode 100644 index 8149f86f..00000000 --- a/src/shared/config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { InjectionToken } from 'yabf' - -export const OPTION_PATH_FILE_TOKEN = new InjectionToken() diff --git a/src/shared/errors/bad-script-permission.error.js b/src/shared/errors/bad-script-permission.error.js deleted file mode 100644 index 6d2982d6..00000000 --- a/src/shared/errors/bad-script-permission.error.js +++ /dev/null @@ -1,7 +0,0 @@ -export class BadScriptPermission extends Error { - constructor(scriptName, message = `Bad permission on "${scriptName}" script.`) { - super(message) - - this.scriptName = scriptName - } -} diff --git a/src/shared/errors/config-file-not-exist.error.js b/src/shared/errors/config-file-not-exist.error.js deleted file mode 100644 index a7347400..00000000 --- a/src/shared/errors/config-file-not-exist.error.js +++ /dev/null @@ -1,5 +0,0 @@ -export class ConfigurationFileNotExist extends Error { - constructor(message = 'No configuration file found. You need to run the init command to create it.') { - super(message) - } -} diff --git a/src/shared/errors/file-not-directory.error.js b/src/shared/errors/file-not-directory.error.js deleted file mode 100644 index d457e11a..00000000 --- a/src/shared/errors/file-not-directory.error.js +++ /dev/null @@ -1,5 +0,0 @@ -export class FileNotDirectory extends Error { - constructor(message = `Path doesn't corresponding to a folder.`) { - super(message) - } -} diff --git a/src/shared/errors/folder-not-empty.error.js b/src/shared/errors/folder-not-empty.error.js deleted file mode 100644 index 555954d3..00000000 --- a/src/shared/errors/folder-not-empty.error.js +++ /dev/null @@ -1,5 +0,0 @@ -export class FolderNotEmpty extends Error { - constructor(message = 'Folder is not empty.') { - super(message) - } -} diff --git a/src/shared/errors/index.js b/src/shared/errors/index.js deleted file mode 100644 index 50af9ecb..00000000 --- a/src/shared/errors/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export * from './file-not-directory.error' -export * from './folder-not-empty.error' -export * from './bad-script-permission.error' -export * from './config-file-not-exist.error' -export * from './script-not-exist.error' -export * from './target-file-already-exist.error' diff --git a/src/shared/errors/script-not-exist.error.js b/src/shared/errors/script-not-exist.error.js deleted file mode 100644 index ba091100..00000000 --- a/src/shared/errors/script-not-exist.error.js +++ /dev/null @@ -1,7 +0,0 @@ -export class ScriptNotExist extends Error { - constructor(scriptName, message = `Script "${scriptName}" doesn't exist.`) { - super(message) - - this.scriptName = scriptName - } -} diff --git a/src/shared/errors/target-file-already-exist.error.js b/src/shared/errors/target-file-already-exist.error.js deleted file mode 100644 index ecbb0bbd..00000000 --- a/src/shared/errors/target-file-already-exist.error.js +++ /dev/null @@ -1,7 +0,0 @@ -export class TargetFileAlreadyExist extends Error { - constructor(filename, message = `Target file "${filename}" already exist.`) { - super(message) - - this.filename = filename - } -} diff --git a/src/shared/utils/fs.utils.js b/src/shared/utils/fs.utils.js deleted file mode 100644 index 99222803..00000000 --- a/src/shared/utils/fs.utils.js +++ /dev/null @@ -1,86 +0,0 @@ -import fs from 'fs' -import util from 'util' -import path from 'path' - -const PATH_REGEX = /^(?:(?:~|\.{1,2})?\/)+(?:[a-zA-Z.\-_]+\/?)*$/ - -export class FsUtils { - static isFilePath(text) { - return PATH_REGEX.test(text) - } - - static get chmod() { - return util.promisify(fs.chmod) - } - - static get readFile() { - return util.promisify(fs.readFile) - } - - static get copyFile() { - return util.promisify(fs.copyFile) - } - - static get symlink() { - return util.promisify(fs.symlink) - } - - static get writeFile() { - return util.promisify(fs.writeFile) - } - - static get mkdir() { - return util.promisify(fs.mkdir) - } - - static get rename() { - return util.promisify(fs.rename) - } - - static get lstat() { - return util.promisify(fs.lstat) - } - - static get readlink() { - return util.promisify(fs.readlink) - } - - static get unlink() { - return util.promisify(fs.unlink) - } - - static fileExist(filename = '', followLink = true) { - try { - if (followLink) { - fs.accessSync(filename) - } else { - fs.lstatSync(filename) - } - } catch (e) { - return false - } - - return true - } - - static mkdirp(pathname = '') { - const pathParts = pathname.split('/') - - return pathParts.reduce((promise, part) => promise - .then(previousPath => { - const newPath = path.join(previousPath, part) - - if (FsUtils.fileExist(newPath)) { - return newPath - } - - return FsUtils.mkdir(newPath) - .catch(error => { - if (error.code !== 'EEXIST') { - throw new Error('dir_create_failed') - } - }) - .then(() => newPath) - }), Promise.resolve(pathname[0] === '/' ? '/' : '')) - } -} diff --git a/src/shared/utils/git.utils.js b/src/shared/utils/git.utils.js deleted file mode 100644 index 604bdaa5..00000000 --- a/src/shared/utils/git.utils.js +++ /dev/null @@ -1,22 +0,0 @@ -import git from 'gift' - -const URL_REGEX = /(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|#[-\d\w._]+?)$/ - -export class GitUtils { - static clone(repoUrl, repoPath) { - return new Promise((resolve, reject) => { - git.clone(repoUrl, repoPath, (error, repo) => { - if (error != null) { - reject(error) - return - } - - resolve(repo) - }) - }) - } - - static isGitUrl(text) { - return URL_REGEX.test(text) - } -} diff --git a/src/shared/utils/index.js b/src/shared/utils/index.js deleted file mode 100644 index 491360fd..00000000 --- a/src/shared/utils/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export * from './pakage.utils' -export * from './fs.utils' -export * from './git.utils' -export * from './process.utils' diff --git a/src/shared/utils/pakage.utils.js b/src/shared/utils/pakage.utils.js deleted file mode 100644 index 16f4e710..00000000 --- a/src/shared/utils/pakage.utils.js +++ /dev/null @@ -1,15 +0,0 @@ -const fs = require('fs') -const path = require('path') - -export function getPackageData() { - const filePath = path.join(__dirname, '../../../package.json') - const file = fs.readFileSync(filePath) - - return JSON.parse(file) -} - -export function getOptionsFilePath() { - const pkg = getPackageData() - - return pkg.config.optionsFilePath.replace('~', process.env.HOME) -} diff --git a/src/shared/utils/process.utils.js b/src/shared/utils/process.utils.js deleted file mode 100644 index 2da1e261..00000000 --- a/src/shared/utils/process.utils.js +++ /dev/null @@ -1,12 +0,0 @@ -import { spawn } from 'child_process' - -export class ProcessUtils { - static spawn(filename) { - return new Promise((resolve, reject) => { - const child = spawn(filename, [], { stdio: 'inherit' }) - - child.addListener('error', reject) - child.addListener('exit', resolve) - }) - } -} diff --git a/src/state.ts b/src/state.ts new file mode 100644 index 00000000..cd5700f9 --- /dev/null +++ b/src/state.ts @@ -0,0 +1,109 @@ +import { lstat, mkdir, readFile, rename, writeFile } from 'node:fs/promises' +import path from 'node:path' + +import { CliError } from './errors.js' + +/** On-disk shape of `~/.configfile/state.json`. Unknown keys are preserved. */ +interface RawState { + /** For each target, the backups configfile made of it, oldest first. */ + backups?: Record + [key: string]: unknown +} + +/** + * The backups (`.old`, …) configfile made when deploying, stored in + * `~/.configfile/state.json`. Undeploying only restores these, never a `.old` + * file created by someone else. + */ +export class BackupRecord { + readonly path: string + #state: RawState + + private constructor(filePath: string, state: RawState) { + this.path = filePath + this.#state = state + } + + static async load(home: string): Promise { + const filePath = path.join(home, '.configfile', 'state.json') + + let content: string + try { + content = await readFile(filePath, 'utf8') + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return new BackupRecord(filePath, {}) + throw new CliError(`Cannot read ${filePath}: ${(error as Error).message}`) + } + + let state: unknown + try { + state = JSON.parse(content) + } catch (error) { + throw new CliError(`${filePath} is not valid JSON (${(error as Error).message}).`) + } + const backups = (state as RawState | null)?.backups + const valid = + state != null && + typeof state === 'object' && + !Array.isArray(state) && + (backups === undefined || + (typeof backups === 'object' && + backups !== null && + Object.values(backups).every( + list => Array.isArray(list) && list.every(item => typeof item === 'string'), + ))) + if (!valid) { + throw new CliError(`${filePath} is not a valid configfile state file.`) + } + + return new BackupRecord(filePath, state as RawState) + } + + /** + * The most recent backup recorded for `target`. `exists` is `false` when the + * backup was deleted since; other errors are thrown, so nothing is removed + * before the backup is known to be usable. + */ + async latest(target: string): Promise<{ path: string; exists: boolean } | null> { + const backup = this.#state.backups?.[target]?.at(-1) + if (backup == null) return null + + try { + await lstat(backup) + return { path: backup, exists: true } + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { path: backup, exists: false } + throw new CliError(`Cannot check the backup ${backup}: ${(error as Error).message}`) + } + } + + async add(target: string, backup: string): Promise { + const backups = { ...this.#state.backups } + backups[target] = [...(backups[target] ?? []), backup] + await this.#save({ ...this.#state, backups }) + } + + async remove(target: string, backup: string): Promise { + const backups = { ...this.#state.backups } + const remaining = (backups[target] ?? []).filter(item => item !== backup) + if (remaining.length > 0) { + backups[target] = remaining + } else { + delete backups[target] + } + await this.#save({ ...this.#state, backups }) + } + + async #save(state: RawState): Promise { + // Written to a temporary file first, so an interruption never leaves a half-written record. + const temporary = `${this.path}.tmp` + try { + await mkdir(path.dirname(this.path), { recursive: true }) + await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`) + await rename(temporary, this.path) + } catch (error) { + throw new CliError(`Cannot save ${this.path}: ${(error as Error).message}`) + } + this.#state = state + } +} diff --git a/tests/commands.test.ts b/tests/commands.test.ts new file mode 100644 index 00000000..73cf1d77 --- /dev/null +++ b/tests/commands.test.ts @@ -0,0 +1,949 @@ +import { existsSync } from 'node:fs' +import { chmod, copyFile, lstat, mkdir, readFile, readlink, stat, symlink } from 'node:fs/promises' +import path from 'node:path' + +import { describe, expect, it } from 'vitest' + +import { createRemote, createSandbox, git, runCli, type Sandbox } from './helpers.js' + +async function withModule(sandbox: Sandbox) { + await sandbox.configure() + await sandbox.write('home/dotfiles/files/zsh/zshrc', 'zshrc') + await sandbox.write('home/dotfiles/files/zsh/a', 'repo a') + await sandbox.write('home/dotfiles/files/zsh/b', 'repo b') + await sandbox.write('home/dotfiles/files/zsh/parked', 'parked') + await sandbox.write('home/dotfiles/files/zsh/forgotten', 'forgotten') + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify({ + files: [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'a', target_path: 'a', deploy: 'local' }, + { source_path: 'b', target_path: 'b', deploy: 'local' }, + { source_path: 'parked', target_path: '~/.parked', deploy: 'none' }, + { source_path: 'forgotten', target_path: '~/.forgotten' }, + ], + }), + ) +} + +function exitPromptError() { + const error = new Error('User force closed the prompt') + error.name = 'ExitPromptError' + return error +} + +describe('without configuration', () => { + it.each([ + ['modules', 'list'], + ['modules', 'deploy', 'zsh'], + ['scripts', 'list'], + ['scripts', 'run', 'setup'], + ])('"%s %s" asks to run init and exits with 1', async (...args) => { + const sandbox = await createSandbox() + + const result = await runCli(sandbox, args) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Run "configfile init" first.') + expect(result.stdout).toBe('') + }) +}) + +describe('modules', () => { + it('lists modules, also as the default subcommand and through aliases', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + for (const args of [['modules', 'list'], ['modules'], ['m', 'l']]) { + const result = await runCli(sandbox, args) + expect(result).toMatchObject({ code: 0, stdout: '1 module found.\n- zsh\n' }) + } + }) + + it('links global files', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + expect(result.code).toBe(0) + expect(await readlink(path.join(sandbox.home, '.zshrc'))).toBe( + path.join(sandbox.repo, 'files/zsh/zshrc'), + ) + expect(existsSync(path.join(sandbox.cwd, 'a'))).toBe(false) + }) + + it('never deploys "deploy": "none" files, and warns about files without a strategy', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + for (const args of [ + ['modules', 'deploy', 'zsh'], + ['modules', 'deploy', '--local', 'zsh'], + ]) { + const result = await runCli(sandbox, args) + + expect(result.code).toBe(0) + expect(result.stderr).toContain( + 'zsh: "forgotten" was not deployed because no deployment strategy is defined.', + ) + expect(result.stderr).not.toContain('parked') + } + + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(true) + expect(existsSync(path.join(sandbox.cwd, 'a'))).toBe(true) + expect(existsSync(path.join(sandbox.home, '.parked'))).toBe(false) + expect(existsSync(path.join(sandbox.home, '.forgotten'))).toBe(false) + }) + + it('keeps deploying after a conflict and then asks about it', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('cwd/a', 'mine') + + const result = await runCli(sandbox, ['modules', 'deploy', '--local', 'zsh'], [false]) + + expect(result.code).toBe(0) + expect(result.asked).toEqual([ + `${path.join(sandbox.cwd, 'a')} already exists. Replace it (the current one is moved to .old)?`, + ]) + // The question comes after the other files are deployed. + expect(result.stdout.indexOf('/b (deployed)')).toBeGreaterThan(-1) + expect(result.stdout.indexOf('/b (deployed)')).toBeLessThan( + result.stdout.indexOf('/a (already exists, skipped)'), + ) + expect(await readFile(path.join(sandbox.cwd, 'a'), 'utf8')).toBe('mine') + expect(await readFile(path.join(sandbox.cwd, 'b'), 'utf8')).toBe('repo b') + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(false) + }) + + it('overwrites a conflicting local file when the user agrees', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('cwd/a', 'mine') + + const result = await runCli(sandbox, ['m', 'd', '-l', 'zsh'], [true]) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.cwd, 'a'), 'utf8')).toBe('repo a') + expect(await readFile(path.join(sandbox.cwd, 'a.old'), 'utf8')).toBe('mine') + }) + + it('replaces conflicting local files without asking with --force', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('cwd/a', 'mine') + + const result = await runCli(sandbox, ['modules', 'deploy', '-l', '--force', 'zsh']) + + expect(result).toMatchObject({ code: 0, asked: [] }) + expect(await readFile(path.join(sandbox.cwd, 'a'), 'utf8')).toBe('repo a') + expect(await readFile(path.join(sandbox.cwd, 'a.old'), 'utf8')).toBe('mine') + }) + + it('without a terminal, skips every conflict, deploys the rest and fails with a hint', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('cwd/a', 'mine') + await sandbox.write('cwd/b', 'mine too') + await sandbox.write('home/dotfiles/files/zsh/c', 'repo c') + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify({ + files: ['a', 'b', 'c'].map(name => ({ + source_path: name, + target_path: name, + deploy: 'local', + })), + }), + ) + + const result = await runCli(sandbox, ['m', 'd', '-l', 'zsh'], [], { interactive: false }) + + expect(result.code).toBe(1) + expect(result.stdout).toContain('/a (already exists, skipped)') + expect(result.stdout).toContain('/b (already exists, skipped)') + expect(result.stderr).toContain('2 files already existed. Use --force to replace them.') + expect(await readFile(path.join(sandbox.cwd, 'c'), 'utf8')).toBe('repo c') + expect(await readFile(path.join(sandbox.cwd, 'a'), 'utf8')).toBe('mine') + }) + + it('keeps deployed files when Ctrl+C is pressed at a conflict question', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('cwd/a', 'mine') + + const result = await runCli(sandbox, ['m', 'd', '-l', 'zsh'], [exitPromptError()]) + + expect(result.code).toBe(130) + expect(await readFile(path.join(sandbox.cwd, 'a'), 'utf8')).toBe('mine') + expect(await readFile(path.join(sandbox.cwd, 'b'), 'utf8')).toBe('repo b') + }) + + it('moves an existing file aside on first deploy, and is idempotent afterwards', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.zshrc', 'mine') + + const first = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + expect(first.code).toBe(0) + expect(first.stdout).toContain(`(deployed, previous file moved to ${sandbox.home}/.zshrc.old)`) + expect(await readFile(path.join(sandbox.home, '.zshrc.old'), 'utf8')).toBe('mine') + + const second = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + expect(second.code).toBe(0) + expect(second.stdout).toContain('.zshrc (already up to date)') + expect(existsSync(path.join(sandbox.home, '.zshrc.old.1'))).toBe(false) + }) + + it('deploys every module without asking with --all', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(result).toMatchObject({ code: 0, asked: [] }) + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(true) + expect((await runCli(sandbox, ['m', 'd', '--all', 'zsh'])).stderr).toContain('not both') + }) + + it('without a terminal and without module names, asks for names or --all', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + const result = await runCli(sandbox, ['modules', 'deploy'], [], { interactive: false }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Pass module names, or --all') + }) + + it('refuses to deploy a module whose settings.json is broken', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/dotfiles/files/broken/settings.json', '{') + + const listed = await runCli(sandbox, ['modules', 'list']) + expect(listed.stdout).toContain('- broken (ignored: settings.json is not valid JSON') + + const named = await runCli(sandbox, ['modules', 'deploy', 'broken']) + expect(named.code).toBe(1) + expect(named.stderr).toContain( + 'Module "broken" cannot be deployed: settings.json is not valid JSON', + ) + + const all = await runCli(sandbox, ['modules', 'deploy', '--all']) + expect(all.code).toBe(1) + expect(all.stderr).toContain('Module "broken" was not deployed') + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(true) + }) + + it('asks before deploying every module', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + const declined = await runCli(sandbox, ['modules', 'deploy'], [false]) + expect(declined).toMatchObject({ code: 0, asked: [expect.stringContaining('Deploy all')] }) + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(false) + + const accepted = await runCli(sandbox, ['modules', 'deploy'], [true]) + expect(accepted.code).toBe(0) + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(true) + }) + + it('rejects unknown modules before deploying anything', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh', 'nope']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Unknown module: nope') + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(false) + }) + + it('reports files that fail and exits with 1', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write( + 'home/dotfiles/files/broken/settings.json', + JSON.stringify({ files: [{ source_path: 'missing', target_path: '~/x', deploy: 'global' }] }), + ) + + const result = await runCli(sandbox, ['modules', 'deploy', 'broken']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('does not exist') + expect(result.stderr).toContain('1 file, module or settings entry failed.') + }) + + it('exits with 130 when a prompt is cancelled with Ctrl+C', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + const result = await runCli(sandbox, ['modules', 'deploy'], [exitPromptError()]) + + expect(result.code).toBe(130) + expect(result.stdout).toContain('Cancelled.') + }) +}) + +describe('modules status, dry run and undeploy', () => { + it('shows the state of each file', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + const before = await runCli(sandbox, ['modules', 'status']) + expect(before.code).toBe(0) + expect(before.stdout).toBe( + `zsh:\n ${sandbox.home}/.zshrc (not deployed)\n forgotten (no deployment strategy)\n`, + ) + + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + const after = await runCli(sandbox, ['m', 'st', 'zsh']) + expect(after.stdout).toContain(`${sandbox.home}/.zshrc (deployed)`) + + await sandbox.write('cwd/a', 'edited') + const local = await runCli(sandbox, ['modules', 'status', '--local']) + expect(local.stdout).toContain(`${sandbox.cwd}/a (differs from the repository)`) + expect(local.stdout).toContain(`${sandbox.cwd}/b (not deployed)`) + }) + + it('shows what a deployment would do without changing anything', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.zshrc', 'mine') + + const result = await runCli(sandbox, ['modules', 'deploy', '--dry-run', 'zsh']) + + expect(result.code).toBe(0) + expect(result.stdout).toContain( + `${sandbox.home}/.zshrc (would be linked, the existing file moved to ${sandbox.home}/.zshrc.old)`, + ) + expect(await readFile(path.join(sandbox.home, '.zshrc'), 'utf8')).toBe('mine') + + await sandbox.write('cwd/a', 'mine') + const local = await runCli(sandbox, ['m', 'd', '-n', '-l', 'zsh'], [], { interactive: false }) + expect(local.stdout).toContain( + '/a (already exists: would be skipped (use --force to replace it))', + ) + expect(local.stdout).toContain('/b (would be copied)') + expect(existsSync(path.join(sandbox.cwd, 'b'))).toBe(false) + }) + + it('undeploys: removes links, restores backups and keeps what it did not deploy', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.zshrc', 'mine') + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + const dryRun = await runCli(sandbox, ['modules', 'undeploy', '-n', 'zsh']) + expect(dryRun.stdout).toContain(`(would be removed, ${sandbox.home}/.zshrc.old restored)`) + expect((await lstat(path.join(sandbox.home, '.zshrc'))).isSymbolicLink()).toBe(true) + + const result = await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + expect(result.code).toBe(0) + expect(result.stdout).toContain(`(removed, ${sandbox.home}/.zshrc.old restored)`) + expect(await readFile(path.join(sandbox.home, '.zshrc'), 'utf8')).toBe('mine') + + const again = await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + expect(again.stdout).toContain('(kept: the file there was not deployed by configfile)') + expect(await readFile(path.join(sandbox.home, '.zshrc'), 'utf8')).toBe('mine') + }) + + it('undeploys local copies unless they were modified', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await runCli(sandbox, ['modules', 'deploy', '--local', 'zsh']) + await sandbox.write('cwd/a', 'edited') + + const result = await runCli(sandbox, ['m', 'u', '-l', 'zsh']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.cwd, 'a'), 'utf8')).toBe('edited') + expect(existsSync(path.join(sandbox.cwd, 'b'))).toBe(false) + }) + + it('asks before undeploying every module, and needs --all without a terminal', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + const declined = await runCli(sandbox, ['modules', 'undeploy'], [false]) + expect(declined).toMatchObject({ code: 0, asked: [expect.stringContaining('Undeploy all')] }) + + const nonInteractive = await runCli(sandbox, ['modules', 'undeploy'], [], { + interactive: false, + }) + expect(nonInteractive.stderr).toContain('or --all to undeploy every module') + + await runCli(sandbox, ['modules', 'undeploy', '--all']) + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(false) + }) + + it('only restores the backups it made, recorded in ~/.configfile/state.json', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.zshrc', 'mine') + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + const state = JSON.parse( + await readFile(path.join(sandbox.home, '.configfile/state.json'), 'utf8'), + ) + expect(state).toEqual({ + backups: { [path.join(sandbox.home, '.zshrc')]: [path.join(sandbox.home, '.zshrc.old')] }, + }) + + await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + // A .old file made by hand is left alone. + await sandbox.write('home/.zshrc.old', 'made by hand') + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + const result = await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + + expect(result.stdout).toContain( + `${sandbox.home}/.zshrc (removed, ${sandbox.home}/.zshrc.old.1 restored)`, + ) + expect(await readFile(path.join(sandbox.home, '.zshrc'), 'utf8')).toBe('mine') + expect(await readFile(path.join(sandbox.home, '.zshrc.old'), 'utf8')).toBe('made by hand') + }) + + it('fails when settings entries of the selected modules are invalid, after deploying the rest', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify({ + files: [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'a', deploy: 'global' }, + ], + }), + ) + await sandbox.write( + 'home/dotfiles/files/other/settings.json', + JSON.stringify({ files: [{ source_path: 'x', deploy: 'global' }] }), + ) + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('zsh: entry #2 is ignored: "target_path" is missing.') + expect(result.stderr).not.toContain('other:') + expect(result.stderr).toContain('1 file, module or settings entry failed.') + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(true) + }) + + it('gives a dry run the exit code of the real run', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('cwd/a', 'mine') + + const result = await runCli(sandbox, ['m', 'd', '-n', '-l', 'zsh'], [], { interactive: false }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('1 file already existed. Use --force to replace them.') + }) + + it.skipIf(process.getuid?.() === 0)( + 'keeps showing the status after a file that cannot be checked', + async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/a/f', 'f') + await sandbox.write( + 'home/dotfiles/files/a/settings.json', + JSON.stringify({ + files: [{ source_path: 'f', target_path: '~/locked/f', deploy: 'global' }], + }), + ) + await sandbox.write('home/dotfiles/files/b/g', 'g') + await sandbox.write( + 'home/dotfiles/files/b/settings.json', + JSON.stringify({ files: [{ source_path: 'g', target_path: '~/.g', deploy: 'global' }] }), + ) + await mkdir(path.join(sandbox.home, 'locked')) + await chmod(path.join(sandbox.home, 'locked'), 0o000) + + try { + const result = await runCli(sandbox, ['modules', 'status']) + + expect(result.code).toBe(0) + expect(result.stdout).toContain(`${sandbox.home}/locked/f (cannot be checked:`) + expect(result.stdout).toContain(`b:\n ${sandbox.home}/.g (not deployed)`) + } finally { + await chmod(path.join(sandbox.home, 'locked'), 0o755) + } + }, + ) + + it('warns about the deprecated "global" key', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify({ files: [{ source_path: 'zshrc', target_path: '~/.zshrc', global: true }] }), + ) + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + expect(result.code).toBe(0) + expect(result.stderr).toContain('"global": true | false is deprecated') + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(true) + }) +}) + +describe('scripts', () => { + async function withScripts(sandbox: Sandbox) { + await sandbox.configure() + await sandbox.write( + 'home/dotfiles/scripts/ok', + `#!/bin/sh\necho "$@" > "${sandbox.root}/ran"\n`, + 0o755, + ) + await sandbox.write('home/dotfiles/scripts/fail.sh', 'exit 3\n', 0o644) + await sandbox.write( + 'home/dotfiles/scripts/where.js', + `require('node:fs').writeFileSync(${JSON.stringify(`${sandbox.root}/cwd.txt`)}, process.cwd())\n`, + 0o644, + ) + await sandbox.write('home/dotfiles/scripts/plain', 'echo hi\n', 0o644) + } + + it('lists scripts, also as the default subcommand', async () => { + const sandbox = await createSandbox() + await withScripts(sandbox) + + for (const args of [['scripts', 'list'], ['scripts'], ['s', 'l']]) { + const result = await runCli(sandbox, args) + expect(result.stdout).toBe('4 scripts found.\n- fail\n- ok\n- plain\n- where\n') + } + }) + + it('runs an executable script with arguments given after --', async () => { + const sandbox = await createSandbox() + await withScripts(sandbox) + + const result = await runCli(sandbox, ['scripts', 'run', 'ok', '--', '--flag', 'value']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.root, 'ran'), 'utf8')).toBe('--flag value\n') + }) + + it('runs non-executable .js files with node, in the current folder', async () => { + const sandbox = await createSandbox() + await withScripts(sandbox) + + const result = await runCli(sandbox, ['s', 'r', 'where']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.root, 'cwd.txt'), 'utf8')).toBe(sandbox.cwd) + }) + + it('exits with the exit code of a failing script', async () => { + const sandbox = await createSandbox() + await withScripts(sandbox) + + const result = await runCli(sandbox, ['scripts', 'run', 'fail']) + + expect(result.code).toBe(3) + expect(result.stderr).toContain('Script "fail" exited with code 3.') + expect(result.stdout).not.toContain('Done') + }) + + it('runs a non-executable script with its shebang interpreter, without changing its mode', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + const script = await sandbox.write( + 'home/dotfiles/scripts/tool', + `#!/usr/bin/env node\nrequire('node:fs').writeFileSync(${JSON.stringify(`${sandbox.root}/args.json`)}, JSON.stringify(process.argv.slice(2)))\n`, + 0o644, + ) + + const result = await runCli(sandbox, ['scripts', 'run', 'tool', '--', 'a', 'b c']) + + expect(result.code).toBe(0) + expect(JSON.parse(await readFile(path.join(sandbox.root, 'args.json'), 'utf8'))).toEqual([ + 'a', + 'b c', + ]) + expect((await stat(script)).mode & 0o777).toBe(0o644) + }) + + it('reports a shebang interpreter that does not exist', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/tool', '#!/no/such/interpreter\n', 0o644) + + const result = await runCli(sandbox, ['scripts', 'run', 'tool']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + 'Interpreter "/no/such/interpreter" of script "tool" not found.', + ) + }) + + it('keeps stdout for the script output', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/quiet.sh', 'true\n') + + const result = await runCli(sandbox, ['scripts', 'run', 'quiet']) + + expect(result).toMatchObject({ code: 0, stdout: '' }) + expect(result.stderr).toContain('Script "quiet" finished.') + }) + + it('runs an executable program without shebang directly', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + const program = path.join(sandbox.repo, 'scripts', 'program') + await mkdir(path.dirname(program), { recursive: true }) + await copyFile('/usr/bin/true', program) + await chmod(program, 0o755) + + await expect(runCli(sandbox, ['scripts', 'run', 'program'])).resolves.toMatchObject({ code: 0 }) + }) + + it('runs an executable .sh script without shebang with sh', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write( + 'home/dotfiles/scripts/nosb.sh', + `echo ok > "${sandbox.root}/nosb"\n`, + 0o755, + ) + + const result = await runCli(sandbox, ['scripts', 'run', 'nosb']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.root, 'nosb'), 'utf8')).toBe('ok\n') + }) + + it('reports the missing interpreter of an executable script', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/tool', '#!/no/such/interpreter\n', 0o755) + + const result = await runCli(sandbox, ['scripts', 'run', 'tool']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + 'Interpreter "/no/such/interpreter" of script "tool" not found.', + ) + }) + + it('exits with 128 + signal when the script is killed', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/killed.sh', 'kill -TERM $$\n') + + const result = await runCli(sandbox, ['scripts', 'run', 'killed']) + + expect(result.code).toBe(143) + expect(result.stderr).toContain('exited with code 143') + }) + + it('passes arguments to .js and .sh scripts run through their interpreter', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + const script = await sandbox.write( + 'home/dotfiles/scripts/args.sh', + `echo "$@" > "${sandbox.root}/args"\n`, + 0o644, + ) + + await runCli(sandbox, ['scripts', 'run', 'args', '--', '-x', 'y']) + + expect(await readFile(path.join(sandbox.root, 'args'), 'utf8')).toBe('-x y\n') + expect((await stat(script)).mode & 0o777).toBe(0o644) + }) + + it('runs any file of scripts/, named up to the first dot, as 0.3 did', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write( + 'home/dotfiles/scripts/setup.macos.py', + `#!/usr/bin/env node\nrequire('node:fs').writeFileSync(${JSON.stringify(`${sandbox.root}/ran`)}, 'yes')\n`, + 0o644, + ) + + const list = await runCli(sandbox, ['scripts', 'list']) + expect(list.stdout).toBe('1 script found.\n- setup\n') + + const result = await runCli(sandbox, ['scripts', 'run', 'setup']) + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.root, 'ran'), 'utf8')).toBe('yes') + }) + + it('explains how to fix a non-executable script without extension', async () => { + const sandbox = await createSandbox() + await withScripts(sandbox) + + const result = await runCli(sandbox, ['scripts', 'run', 'plain']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('has no shebang line') + expect(result.stderr).toContain('chmod +x') + }) + + it('reports an unknown script', async () => { + const sandbox = await createSandbox() + await withScripts(sandbox) + + const result = await runCli(sandbox, ['scripts', 'run', 'nope']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Script "nope" not found.') + }) +}) + +describe('init', () => { + const withRemote = createRemote + + const readConfig = async (sandbox: Sandbox) => + JSON.parse(await readFile(path.join(sandbox.home, '.configfilerc'), 'utf8')) + + it('clones the repository and saves the configuration', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + + const result = await runCli(sandbox, ['init'], [remote, '~/dotfiles']) + + expect(result.code).toBe(0) + expect(existsSync(path.join(sandbox.repo, 'files/.gitkeep'))).toBe(true) + expect(await readConfig(sandbox)).toEqual({ repo_url: remote, folder_path: sandbox.repo }) + }) + + it('can run without prompts', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + + const result = await runCli(sandbox, ['init', '--repo', remote, '--folder', sandbox.repo]) + + expect(result).toMatchObject({ code: 0, asked: [] }) + expect(existsSync(path.join(sandbox.repo, '.git'))).toBe(true) + }) + + it('reuses an existing clone instead of failing', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + + const result = await runCli(sandbox, ['init', '--repo', 'unused', '--folder', remote]) + + expect(result.code).toBe(0) + expect(result.stdout).toContain('already contains a git repository') + expect((await readConfig(sandbox)).folder_path).toBe(remote) + }) + + it('does not save the configuration when the folder is not usable', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/something') + + const result = await runCli(sandbox, ['init', '--repo', 'x', '--folder', '~/dotfiles']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('is not empty') + expect(existsSync(path.join(sandbox.home, '.configfilerc'))).toBe(false) + }) + + it('does not save the configuration when the clone fails', async () => { + const sandbox = await createSandbox() + + const result = await runCli(sandbox, [ + 'init', + '--repo', + path.join(sandbox.root, 'no-such-repo'), + '--folder', + '~/dotfiles', + ]) + + expect(result.code).not.toBe(0) + expect(result.stderr).toContain('git clone failed') + expect(existsSync(path.join(sandbox.home, '.configfilerc'))).toBe(false) + }) + + it('overwrites an existing configuration with --force, without asking', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + await sandbox.configure({ repo_url: 'old' }) + + const result = await runCli( + sandbox, + ['init', '-f', '--repo', remote, '--folder', '~/dotfiles'], + [], + { interactive: false }, + ) + + expect(result).toMatchObject({ code: 0, asked: [] }) + expect((await readConfig(sandbox)).repo_url).toBe(remote) + }) + + it('offers the previous values when overwriting interactively', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + await sandbox.configure({ repo_url: 'old' }) + + const result = await runCli(sandbox, ['init'], [true, remote, '~/dotfiles']) + + expect(result.code).toBe(0) + expect(result.asked).toHaveLength(3) + expect((await readConfig(sandbox)).repo_url).toBe(remote) + }) + + it.each([ + [ + 'a file', + async (sandbox: Sandbox) => void (await sandbox.write('home/dotfiles', 'x')), + 'is not a folder', + ], + [ + 'a broken symlink', + async (sandbox: Sandbox) => symlink(path.join(sandbox.root, 'nowhere'), sandbox.repo), + 'is a broken symbolic link', + ], + ])('does not save the configuration when the folder is %s', async (_, prepare, message) => { + const sandbox = await createSandbox() + await prepare(sandbox) + + const result = await runCli(sandbox, ['init', '--repo', 'x', '--folder', '~/dotfiles']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain(message) + expect(existsSync(path.join(sandbox.home, '.configfilerc'))).toBe(false) + }) + + it('does not save the configuration when cancelled', async () => { + const sandbox = await createSandbox() + + const result = await runCli(sandbox, ['init'], ['url', exitPromptError()]) + + expect(result.code).toBe(130) + expect(existsSync(path.join(sandbox.home, '.configfilerc'))).toBe(false) + }) + + it.skipIf(process.getuid?.() === 0)( + 'explains how to recover when the configuration cannot be saved', + async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + const folder = path.join(sandbox.root, 'clone') + await chmod(sandbox.home, 0o555) + + try { + const result = await runCli(sandbox, ['init', '--repo', remote, '--folder', folder]) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Cannot save the configuration') + expect(result.stderr).toContain(`The repository is in ${folder}`) + expect(existsSync(path.join(folder, '.git'))).toBe(true) + } finally { + await chmod(sandbox.home, 0o755) + } + }, + ) + + it('asks before overwriting an existing configuration', async () => { + const sandbox = await createSandbox() + await sandbox.configure({ repo_url: 'kept' }) + + const result = await runCli(sandbox, ['init'], [false]) + + expect(result.code).toBe(0) + expect(result.stdout).toContain('Nothing changed.') + expect((await readConfig(sandbox)).repo_url).toBe('kept') + }) +}) + +describe('update', () => { + it('pulls the dotfiles repository', async () => { + const sandbox = await createSandbox() + const remote = await createRemote(sandbox) + git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) + await sandbox.configure() + + await sandbox.write('remote/files/new-file', 'new') + git(remote, 'add', '.') + git(remote, 'commit', '--quiet', '-m', 'second') + + const result = await runCli(sandbox, ['update']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.repo, 'files/new-file'), 'utf8')).toBe('new') + }) + + it('refuses to merge when the histories diverged (fast-forward only)', async () => { + const sandbox = await createSandbox() + const remote = await createRemote(sandbox) + git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) + await sandbox.configure() + await sandbox.write('remote/files/remote-change', 'remote') + git(remote, 'add', '.') + git(remote, 'commit', '--quiet', '-m', 'remote') + await sandbox.write('home/dotfiles/files/local-change', 'local') + git(sandbox.repo, 'add', '.') + git(sandbox.repo, 'commit', '--quiet', '-m', 'local') + + // Without --ff-only, this configuration would let git pull create a merge commit. + const gitConfig = { + GIT_CONFIG_COUNT: '3', + GIT_CONFIG_KEY_0: 'pull.rebase', + GIT_CONFIG_VALUE_0: 'false', + GIT_CONFIG_KEY_1: 'user.name', + GIT_CONFIG_VALUE_1: 'test', + GIT_CONFIG_KEY_2: 'user.email', + GIT_CONFIG_VALUE_2: 'test@example.com', + } + Object.assign(process.env, gitConfig) + try { + const result = await runCli(sandbox, ['update']) + + expect(result.code).not.toBe(0) + expect(result.stderr).toContain('git pull failed') + expect(existsSync(path.join(sandbox.repo, 'files/remote-change'))).toBe(false) + } finally { + for (const key of Object.keys(gitConfig)) delete process.env[key] + } + }) + + it('fails when the dotfiles folder is not a git repository', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/.gitkeep') + + const result = await runCli(sandbox, ['update']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('is not a git repository') + }) +}) + +describe('program', () => { + it('prints the version', async () => { + const sandbox = await createSandbox() + const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')) + + const result = await runCli(sandbox, ['--version']) + + expect(result).toMatchObject({ code: 0, stdout: `${pkg.version}\n` }) + }) + + it('reports unexpected errors without a stack trace', async () => { + const sandbox = await createSandbox() + + const result = await runCli(sandbox, ['init'], [new Error('boom')]) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Unexpected error: boom') + expect(result.stderr).toContain('DEBUG=1') + expect(result.stderr).not.toContain(' at ') + }) + + it('exits with 1 on an unknown command', async () => { + const sandbox = await createSandbox() + + const result = await runCli(sandbox, ['nope']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain("unknown command 'nope'") + }) +}) diff --git a/tests/config.test.ts b/tests/config.test.ts new file mode 100644 index 00000000..4c22c582 --- /dev/null +++ b/tests/config.test.ts @@ -0,0 +1,132 @@ +import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' + +import { describe, expect, it } from 'vitest' + +import { ConfigStore } from '../src/config.js' +import { CliError, NotInitializedError } from '../src/errors.js' +import { createSandbox } from './helpers.js' + +describe('ConfigStore', () => { + it('reports a missing configuration', async () => { + const { home } = await createSandbox() + const store = new ConfigStore(home) + + expect(store.exists()).toBe(false) + await expect(store.read()).rejects.toBeInstanceOf(NotInitializedError) + }) + + it('reads the snake_case file format; without script_extensions, every file is a script', async () => { + const sandbox = await createSandbox() + await sandbox.configure({ repo_url: 'git@example.com:me/dotfiles.git' }) + + await expect(new ConfigStore(sandbox.home).read()).resolves.toEqual({ + repoUrl: 'git@example.com:me/dotfiles.git', + folderPath: sandbox.repo, + scriptExtensions: null, + }) + }) + + it('reads custom script extensions', async () => { + const sandbox = await createSandbox() + await sandbox.configure({ script_extensions: ['.py'] }) + + const config = await new ConfigStore(sandbox.home).read() + expect(config.scriptExtensions).toEqual(['.py']) + }) + + it('writes the configuration and keeps unknown keys', async () => { + const sandbox = await createSandbox() + await sandbox.configure({ script_extensions: ['.py'], custom: 42 }) + const store = new ConfigStore(sandbox.home) + + await store.write({ repoUrl: 'https://example.com/dotfiles.git', folderPath: '/somewhere' }) + + expect(JSON.parse(await readFile(store.path, 'utf8'))).toEqual({ + repo_url: 'https://example.com/dotfiles.git', + folder_path: '/somewhere', + script_extensions: ['.py'], + custom: 42, + }) + }) + + it('rejects an invalid file with a readable error', async () => { + const { home } = await createSandbox() + const store = new ConfigStore(home) + await writeFile(store.path, '{ not json') + + await expect(store.read()).rejects.toThrow(CliError) + await expect(store.read()).rejects.toThrow(/not valid JSON \(.*position/) + + await writeFile(store.path, '[]') + await expect(store.read()).rejects.toThrow(/not a JSON object/) + }) + + it('reports an unreadable file with its path', async () => { + const { home } = await createSandbox() + const store = new ConfigStore(home) + await mkdir(store.path) + + await expect(store.read()).rejects.toThrow(CliError) + await expect(store.read()).rejects.toThrow(`Cannot read ${store.path}`) + }) + + it('resolves a hand-edited folder_path against the home folder', async () => { + const sandbox = await createSandbox() + + for (const folder of ['~/dotfiles', 'dotfiles']) { + await sandbox.configure({ folder_path: folder }) + const config = await new ConfigStore(sandbox.home).read() + expect(config.folderPath).toBe(sandbox.repo) + } + }) + + it('normalizes script extensions and rejects invalid ones', async () => { + const sandbox = await createSandbox() + const store = new ConfigStore(sandbox.home) + + await sandbox.configure({ script_extensions: ['py', '.rb', ''] }) + expect((await store.read()).scriptExtensions).toEqual(['.py', '.rb', '']) + + for (const invalid of ['.py', [1], 3]) { + await sandbox.configure({ script_extensions: invalid }) + await expect(store.read()).rejects.toThrow(/"script_extensions" must be a list of strings/) + } + }) + + it('rejects a configuration without folder_path', async () => { + const { home } = await createSandbox() + const store = new ConfigStore(home) + await writeFile(store.path, '{"repo_url": "x"}') + + await expect(store.read()).rejects.toThrow(/"folder_path" is missing/) + }) + + it('reads partial values for prompt defaults, even from an invalid file', async () => { + const { home } = await createSandbox() + const store = new ConfigStore(home) + + await expect(store.readPartial()).resolves.toEqual({}) + + await writeFile(store.path, '{"repo_url": "u"}') + await expect(store.readPartial()).resolves.toEqual({ repoUrl: 'u' }) + + await writeFile(store.path, 'garbage') + await expect(store.readPartial()).resolves.toEqual({}) + }) + + it('replaces an invalid file on write, but does not hide other errors', async () => { + const { home } = await createSandbox() + const store = new ConfigStore(home) + + await writeFile(store.path, 'garbage') + await store.write({ repoUrl: 'u', folderPath: '/f' }) + expect(JSON.parse(await readFile(store.path, 'utf8'))).toEqual({ + repo_url: 'u', + folder_path: '/f', + }) + + await rm(store.path) + await mkdir(store.path) + await expect(store.write({ repoUrl: 'u', folderPath: '/f' })).rejects.toThrow(/Cannot read/) + }) +}) diff --git a/tests/deploy.test.ts b/tests/deploy.test.ts new file mode 100644 index 00000000..916b17ad --- /dev/null +++ b/tests/deploy.test.ts @@ -0,0 +1,409 @@ +import { + chmod, + lstat, + mkdir, + readdir, + readFile, + readlink, + rm, + symlink, + writeFile, +} from 'node:fs/promises' +import path from 'node:path' + +import { describe, expect, it } from 'vitest' + +import { deployFile, inspectFile, undeployFile } from '../src/deploy.js' +import { CliError } from '../src/errors.js' +import type { ModuleFile } from '../src/repository.js' +import { BackupRecord } from '../src/state.js' +import { createSandbox, type Sandbox } from './helpers.js' + +const isRoot = process.getuid?.() === 0 + +async function setup() { + const sandbox = await createSandbox() + const source = await sandbox.write('home/dotfiles/files/zsh/zshrc', 'from repo') + const target = path.join(sandbox.home, 'config', '.zshrc') + const record = await BackupRecord.load(sandbox.home) + + const file = (strategy: 'global' | 'local', overrides: Partial = {}): ModuleFile => ({ + source, + target, + strategy, + repository: sandbox.repo, + ...overrides, + }) + + return { sandbox, source, target, record, file } +} + +async function folderModule(sandbox: Sandbox) { + await sandbox.write('home/dotfiles/files/vim/colors/theme.vim', 'theme') + await symlink('theme.vim', path.join(sandbox.repo, 'files/vim/colors/link.vim')) + return { + source: path.join(sandbox.repo, 'files/vim/colors'), + target: path.join(sandbox.cwd, 'colors'), + strategy: 'local', + repository: sandbox.repo, + } as const +} + +describe('deployFile (global)', () => { + it('creates a symlink and its parent folders', async () => { + const { source, target, record, file } = await setup() + + await expect(deployFile(file('global'), { record })).resolves.toEqual({ status: 'deployed' }) + expect(await readlink(target)).toBe(source) + }) + + it('does nothing when the link is already in place', async () => { + const { record, file } = await setup() + await deployFile(file('global'), { record }) + + await expect(deployFile(file('global'), { record })).resolves.toEqual({ status: 'up-to-date' }) + }) + + it('backs up an existing file without overwriting a previous backup, and records it', async () => { + const { sandbox, source, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + await sandbox.write('home/config/.zshrc.old', 'older') + + await expect(deployFile(file('global'), { record })).resolves.toEqual({ + status: 'backed-up', + backup: `${target}.old.1`, + }) + expect(await readFile(`${target}.old`, 'utf8')).toBe('older') + expect(await readFile(`${target}.old.1`, 'utf8')).toBe('mine') + expect(await readlink(target)).toBe(source) + await expect(record.latest(target)).resolves.toEqual({ path: `${target}.old.1`, exists: true }) + }) + + it('backs up a symlink that points somewhere else', async () => { + const { sandbox, target, record, file } = await setup() + await mkdir(path.dirname(target), { recursive: true }) + await symlink(path.join(sandbox.root, 'elsewhere'), target) + + const result = await deployFile(file('global'), { record }) + + expect(result).toEqual({ status: 'backed-up', backup: `${target}.old` }) + expect((await lstat(`${target}.old`)).isSymbolicLink()).toBe(true) + }) + + it('backs up a folder in the way, with its content', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc/inside', 'kept') + + await deployFile(file('global'), { record }) + + expect(await readFile(path.join(`${target}.old`, 'inside'), 'utf8')).toBe('kept') + }) + + it('recognises a relative symlink to the source as up to date', async () => { + const { source, target, record, file } = await setup() + await mkdir(path.dirname(target), { recursive: true }) + await symlink(path.relative(path.dirname(target), source), target) + + await expect(deployFile(file('global'), { record })).resolves.toEqual({ status: 'up-to-date' }) + }) + + it('does not reuse a backup name taken by a broken symlink', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + await symlink(path.join(sandbox.root, 'nowhere'), `${target}.old`) + + const result = await deployFile(file('global'), { record }) + + expect(result).toEqual({ status: 'backed-up', backup: `${target}.old.1` }) + expect(await readFile(`${target}.old.1`, 'utf8')).toBe('mine') + }) + + it('fails when the source does not exist', async () => { + const { sandbox, record, file } = await setup() + const source = path.join(sandbox.repo, 'missing') + + await expect(deployFile(file('global', { source }), { record })).rejects.toThrow(CliError) + }) + + it('refuses a target that leads into the repository through a symbolic link', async () => { + const { sandbox, record, file } = await setup() + // ~/.config/nvim is a link to a folder of the repository (deployed by another module). + await mkdir(path.join(sandbox.repo, 'files/nvim/nvim'), { recursive: true }) + await mkdir(path.join(sandbox.home, '.config'), { recursive: true }) + await symlink( + path.join(sandbox.repo, 'files/nvim/nvim'), + path.join(sandbox.home, '.config/nvim'), + ) + const target = path.join(sandbox.home, '.config/nvim/lua.vim') + + await expect(deployFile(file('global', { target }), { record })).rejects.toThrow( + /leads into the dotfiles repository/, + ) + expect(await readdir(path.join(sandbox.repo, 'files/nvim/nvim'))).toEqual([]) + }) +}) + +describe('deployFile (local)', () => { + it('copies the file', async () => { + const { target, record, file } = await setup() + + await expect(deployFile(file('local'), { record })).resolves.toEqual({ status: 'deployed' }) + expect(await readFile(target, 'utf8')).toBe('from repo') + expect((await lstat(target)).isSymbolicLink()).toBe(false) + }) + + it('reports an identical copy as up to date', async () => { + const { record, file } = await setup() + await deployFile(file('local'), { record }) + + await expect(deployFile(file('local'), { record })).resolves.toEqual({ status: 'up-to-date' }) + }) + + it('reports a conflict instead of overwriting', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + + await expect(deployFile(file('local'), { record })).resolves.toEqual({ status: 'conflict' }) + expect(await readFile(target, 'utf8')).toBe('mine') + }) + + it('moves the existing target aside when forced', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + + await expect(deployFile(file('local'), { force: true, record })).resolves.toEqual({ + status: 'backed-up', + backup: `${target}.old`, + }) + expect(await readFile(target, 'utf8')).toBe('from repo') + expect(await readFile(`${target}.old`, 'utf8')).toBe('mine') + }) + + it('replaces a folder instead of merging into it when forced', async () => { + const { sandbox, record } = await setup() + const colors = await folderModule(sandbox) + await sandbox.write('cwd/colors/theme.vim', 'old') + await sandbox.write('cwd/colors/stale.vim', 'stale') + + await deployFile(colors, { force: true, record }) + + expect((await readdir(colors.target)).sort()).toEqual(['link.vim', 'theme.vim']) + expect((await readdir(`${colors.target}.old`)).sort()).toEqual(['stale.vim', 'theme.vim']) + }) + + it('copies folders, keeping relative links as they are', async () => { + const { sandbox, record } = await setup() + const colors = await folderModule(sandbox) + + await deployFile(colors, { record }) + + expect(await readFile(path.join(colors.target, 'theme.vim'), 'utf8')).toBe('theme') + expect(await readlink(path.join(colors.target, 'link.vim'))).toBe('theme.vim') + await expect(inspectFile(colors)).resolves.toEqual({ kind: 'deployed' }) + }) + + it.skipIf(isRoot)( + 'removes a partial copy and puts the original back when the copy fails', + async () => { + const { sandbox, record } = await setup() + await sandbox.write('home/dotfiles/files/secret/folder/unreadable', 'x') + await chmod(path.join(sandbox.repo, 'files/secret/folder/unreadable'), 0o000) + await sandbox.write('cwd/folder/mine', 'mine') + const file = { + source: path.join(sandbox.repo, 'files/secret/folder'), + target: path.join(sandbox.cwd, 'folder'), + strategy: 'local', + repository: sandbox.repo, + } as const + + await expect(deployFile(file, { force: true, record })).rejects.toThrow(CliError) + + expect(await readdir(file.target)).toEqual(['mine']) + expect(await readdir(sandbox.cwd)).toEqual(['folder']) + await expect(record.latest(file.target)).resolves.toBeNull() + }, + ) + + it.skipIf(isRoot)('removes a partial copy when nothing was there before', async () => { + const { sandbox, record } = await setup() + await sandbox.write('home/dotfiles/files/secret/folder/unreadable', 'x') + await chmod(path.join(sandbox.repo, 'files/secret/folder/unreadable'), 0o000) + const file = { + source: path.join(sandbox.repo, 'files/secret/folder'), + target: path.join(sandbox.cwd, 'folder'), + strategy: 'local', + repository: sandbox.repo, + } as const + + await expect(deployFile(file, { record })).rejects.toThrow(CliError) + expect(await readdir(sandbox.cwd)).toEqual([]) + }) +}) + +describe('inspectFile', () => { + it('describes global targets', async () => { + const { sandbox, record, file } = await setup() + + await expect(inspectFile(file('global'))).resolves.toEqual({ kind: 'missing' }) + await sandbox.write('home/config/.zshrc', 'mine') + await expect(inspectFile(file('global'))).resolves.toEqual({ kind: 'occupied', what: 'file' }) + await deployFile(file('global'), { record }) + await expect(inspectFile(file('global'))).resolves.toEqual({ kind: 'deployed' }) + }) + + it.each([ + ['a file was added', (target: string) => rmAndWrite(path.join(target, 'extra.vim'), 'extra')], + [ + 'a file was replaced by a link', + async (target: string) => { + await rm(path.join(target, 'theme.vim')) + await symlink('link.vim', path.join(target, 'theme.vim')) + }, + ], + [ + 'a link was changed', + async (target: string) => { + await rm(path.join(target, 'link.vim')) + await symlink('elsewhere.vim', path.join(target, 'link.vim')) + }, + ], + ['a file was edited', (target: string) => rmAndWrite(path.join(target, 'theme.vim'), 'edited')], + ])('detects a modified folder copy: %s', async (_, modify) => { + const { sandbox, record } = await setup() + const colors = await folderModule(sandbox) + await deployFile(colors, { record }) + + await modify(colors.target) + + await expect(inspectFile(colors)).resolves.toEqual({ kind: 'modified' }) + await expect(undeployFile(colors, { record })).resolves.toMatchObject({ status: 'kept' }) + expect(await readdir(colors.target)).not.toEqual([]) + }) + + it('reports targets whose source disappeared from the repository', async () => { + const { source, record, file } = await setup() + await deployFile(file('global'), { record }) + await rm(source) + + await expect(inspectFile(file('global'))).resolves.toEqual({ + kind: 'source-missing', + ours: true, + }) + await expect(inspectFile(file('local'))).resolves.toEqual({ + kind: 'source-missing', + ours: false, + }) + }) +}) + +describe('undeployFile', () => { + it('removes the link and restores the backup configfile made', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + await deployFile(file('global'), { record }) + + await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + status: 'removed', + restored: `${target}.old`, + missingBackup: null, + }) + expect(await readFile(target, 'utf8')).toBe('mine') + await expect(record.latest(target)).resolves.toBeNull() + }) + + it('never restores a .old file configfile did not make', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc.old', 'made by hand') + await deployFile(file('global'), { record }) + + await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + status: 'removed', + restored: null, + missingBackup: null, + }) + expect(await readFile(`${target}.old`, 'utf8')).toBe('made by hand') + expect(await readdir(path.dirname(target))).toEqual(['.zshrc.old']) + }) + + it('reports a recorded backup that was deleted since', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + await deployFile(file('global'), { record }) + await rm(`${target}.old`) + + await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + status: 'removed', + restored: null, + missingBackup: `${target}.old`, + }) + }) + + it('removes a linked folder without touching the folder in the repository', async () => { + const { sandbox, record } = await setup() + await sandbox.write('home/dotfiles/files/nvim/nvim/init.lua', 'init') + const nvim = { + source: path.join(sandbox.repo, 'files/nvim/nvim'), + target: path.join(sandbox.home, '.config/nvim'), + strategy: 'global', + repository: sandbox.repo, + } as const + await deployFile(nvim, { record }) + + await expect(undeployFile(nvim, { record })).resolves.toMatchObject({ status: 'removed' }) + await expect(lstat(nvim.target)).rejects.toThrow() + expect(await readdir(nvim.source)).toEqual(['init.lua']) + }) + + it('keeps what configfile did not deploy, and modified copies', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + + await expect(undeployFile(file('global'), { record })).resolves.toMatchObject({ + status: 'kept', + }) + await expect(undeployFile(file('local'), { record })).resolves.toMatchObject({ status: 'kept' }) + expect(await readFile(target, 'utf8')).toBe('mine') + }) + + it('removes an unmodified local copy and restores the forced backup', async () => { + const { sandbox, target, record, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + await deployFile(file('local'), { force: true, record }) + + await expect(undeployFile(file('local'), { record })).resolves.toMatchObject({ + status: 'removed', + restored: `${target}.old`, + }) + expect(await readFile(target, 'utf8')).toBe('mine') + }) + + it('removes the link of a source that disappeared, but keeps a copy it cannot compare', async () => { + const { source, target, record, file } = await setup() + await deployFile(file('global'), { record }) + await rm(source) + + await expect(undeployFile(file('global'), { record })).resolves.toMatchObject({ + status: 'removed', + }) + + await rmAndWrite(target, 'a copy') + await expect(undeployFile(file('local'), { record })).resolves.toEqual({ + status: 'kept', + state: { kind: 'source-missing', ours: false }, + }) + }) + + it('reports files that are not deployed', async () => { + const { record, file } = await setup() + + await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + status: 'not-deployed', + }) + }) +}) + +async function rmAndWrite(target: string, content: string) { + await rm(target, { force: true }) + await mkdir(path.dirname(target), { recursive: true }) + await writeFile(target, content) +} diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts new file mode 100644 index 00000000..7a33f7d5 --- /dev/null +++ b/tests/e2e.test.ts @@ -0,0 +1,118 @@ +import { spawn, spawnSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' + +import { afterEach, describe, expect, it } from 'vitest' + +import { createSandbox, type Sandbox } from './helpers.js' + +// Built by tests/global-setup.ts before the test run. +const cli = fileURLToPath(new URL('../dist/cli.js', import.meta.url)) + +async function exec(args: string[]) { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/zsh/settings.json', '{"files": []}') + await sandbox.write('home/dotfiles/scripts/fail.sh', 'exit 4\n') + + const env: NodeJS.ProcessEnv = { ...process.env, HOME: sandbox.home, NO_COLOR: '1' } + // FORCE_COLOR (set by many CI and shells) would override NO_COLOR. + delete env.FORCE_COLOR + + const result = spawnSync(process.execPath, [cli, ...args], { + cwd: sandbox.cwd, + env, + encoding: 'utf8', + }) + + return { code: result.status, stdout: result.stdout, stderr: result.stderr } +} + +describe('built CLI', () => { + it('runs a command', async () => { + await expect(exec(['modules', 'list'])).resolves.toMatchObject({ + code: 0, + stdout: '1 module found.\n- zsh\n', + }) + }) + + it('forwards the exit code and writes errors to stderr without colors', async () => { + const result = await exec(['scripts', 'run', 'fail']) + + expect(result.code).toBe(4) + expect(result.stdout).toBe('') + expect(result.stderr).toBe( + ' Info Running "fail"…\n Error Script "fail" exited with code 4.\n', + ) + }) + + it('fails clearly instead of prompting when stdin is not a terminal', async () => { + const deployAll = await exec(['modules', 'deploy']) + expect(deployAll.code).toBe(1) + expect(deployAll.stderr).toContain('Pass module names, or --all') + + const init = await exec(['init']) + expect(init.code).toBe(1) + expect(init.stderr).toContain( + 'Also pass: --force (a configuration already exists), --repo ', + ) + }) + + describe('signals during scripts run', () => { + // Each test runs in its own process group, killed afterwards: if signal + // forwarding ever regresses, no script is left running on the machine. + const groups: number[] = [] + afterEach(() => { + for (const pid of groups.splice(0)) { + try { + process.kill(-pid, 'SIGKILL') + } catch { + // Already gone. + } + } + }) + + /** Starts a long-running script, sends `signal` to configfile only once it runs. */ + async function interrupt(sandbox: Sandbox, script: string, signal: NodeJS.Signals) { + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/long.sh', script) + + const child = spawn(process.execPath, [cli, 'scripts', 'run', 'long'], { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, + detached: true, + }) + if (child.pid != null) groups.push(child.pid) + + let stdout = '' + child.stdout.on('data', chunk => { + stdout += chunk + if (stdout.includes('ready')) child.kill(signal) + }) + + return new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(resolve => { + child.on('close', (code, closeSignal) => resolve({ code, signal: closeSignal })) + }) + } + + it('lets the script handle Ctrl+C and reports its exit code', async () => { + const sandbox = await createSandbox() + + // Only configfile receives SIGINT here; in a terminal the script gets it too. + const result = await interrupt(sandbox, 'echo ready\nsleep 0.3\nexit 5\n', 'SIGINT') + + expect(result).toEqual({ code: 5, signal: null }) + }) + + it('forwards SIGTERM to the script', async () => { + const sandbox = await createSandbox() + + const result = await interrupt( + sandbox, + "trap 'exit 7' TERM\necho ready\nwhile true; do sleep 0.05; done\n", + 'SIGTERM', + ) + + expect(result).toEqual({ code: 7, signal: null }) + }) + }) +}) diff --git a/tests/global-setup.ts b/tests/global-setup.ts new file mode 100644 index 00000000..8a27d0e0 --- /dev/null +++ b/tests/global-setup.ts @@ -0,0 +1,8 @@ +import { execFileSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' + +/** Builds dist/ once so the end-to-end tests run the real CLI. */ +export default function setup(): void { + const tsc = fileURLToPath(new URL('../node_modules/.bin/tsc', import.meta.url)) + execFileSync(tsc, ['-p', 'tsconfig.build.json'], { stdio: 'inherit' }) +} diff --git a/tests/helpers.ts b/tests/helpers.ts new file mode 100644 index 00000000..ad7223f3 --- /dev/null +++ b/tests/helpers.ts @@ -0,0 +1,169 @@ +import { execFileSync } from 'node:child_process' +import { chmod, mkdir, mkdtemp, realpath, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { Writable } from 'node:stream' + +import { afterEach } from 'vitest' + +import type { Context, Prompts } from '../src/context.js' +import { Output } from '../src/output.js' +import { main } from '../src/program.js' + +const sandboxes: string[] = [] + +afterEach(async () => { + await Promise.all(sandboxes.splice(0).map(dir => rm(dir, { recursive: true, force: true }))) +}) + +export interface Sandbox { + root: string + home: string + /** Default dotfiles repository location (not created until written to). */ + repo: string + cwd: string + /** Writes a file relative to the sandbox root, creating parent folders. */ + write(file: string, content?: string, mode?: number): Promise + /** Writes `~/.configfilerc` pointing at `repo`. */ + configure(extra?: Record): Promise +} + +export async function createSandbox(): Promise { + // realpath: on macOS the temp dir is a symlink, which would break path comparisons. + const root = await realpath(await mkdtemp(path.join(tmpdir(), 'configfile-test-'))) + sandboxes.push(root) + + const home = path.join(root, 'home') + const cwd = path.join(root, 'cwd') + await mkdir(home, { recursive: true }) + await mkdir(cwd, { recursive: true }) + + const sandbox: Sandbox = { + root, + home, + cwd, + repo: path.join(home, 'dotfiles'), + async write(file, content = '', mode) { + const target = path.join(root, file) + await mkdir(path.dirname(target), { recursive: true }) + await writeFile(target, content) + if (mode != null) await chmod(target, mode) + return target + }, + async configure(extra = {}) { + await writeFile( + path.join(home, '.configfilerc'), + JSON.stringify({ repo_url: null, folder_path: sandbox.repo, ...extra }), + ) + }, + } + + return sandbox +} + +class Capture extends Writable { + text = '' + + override _write(chunk: Buffer, _encoding: string, callback: () => void): void { + this.text += chunk.toString() + callback() + } +} + +export interface FakeContext extends Context { + stdout: Capture + stderr: Capture + /** Messages of the prompts that were shown, in order. */ + asked: string[] +} + +export interface CliOptions { + /** `false` simulates stdin not being a terminal. Defaults to `true`. */ + interactive?: boolean +} + +/** + * A context with captured output. `answers` are consumed in order by the + * prompts; an unexpected prompt rejects, so the command exits with code 1 and + * "Unexpected prompt: " on stderr. + */ +export function createContext( + sandbox: Sandbox, + answers: Array = [], + { interactive = true }: CliOptions = {}, +): FakeContext { + const stdout = new Capture() + const stderr = new Capture() + const asked: string[] = [] + const queue = [...answers] + + const answer = (message: string): Promise => { + asked.push(message) + if (queue.length === 0) { + return Promise.reject(new Error(`Unexpected prompt: ${message}`)) + } + const next = queue.shift() + return next instanceof Error ? Promise.reject(next) : Promise.resolve(next as T) + } + + const prompts: Prompts = { + interactive, + confirm: ({ message }) => answer(message), + input: ({ message }) => answer(message), + } + + return { + home: sandbox.home, + cwd: sandbox.cwd, + output: new Output(stdout, stderr), + prompts, + stdout, + stderr, + asked, + } +} + +/** Runs the CLI in-process and returns its exit code and output. */ +export async function runCli( + sandbox: Sandbox, + args: string[], + answers: Array = [], + options: CliOptions = {}, +) { + const ctx = createContext(sandbox, answers, options) + const code = await main(args, ctx) + + return { code, stdout: ctx.stdout.text, stderr: ctx.stderr.text, asked: ctx.asked } +} + +/** + * Runs git for test setup, independent of the developer's git configuration + * (vitest.config.ts also points GIT_CONFIG_GLOBAL to /dev/null). + */ +export function git(cwd: string, ...args: string[]): void { + execFileSync( + 'git', + [ + '-c', + 'user.name=test', + '-c', + 'user.email=test@example.com', + '-c', + 'commit.gpgsign=false', + '-c', + 'init.defaultBranch=main', + ...args, + ], + { cwd, stdio: 'ignore' }, + ) +} + +/** A git repository with one commit, in `/remote`, to clone from. */ +export async function createRemote(sandbox: Sandbox): Promise { + const remote = path.join(sandbox.root, 'remote') + await sandbox.write('remote/files/.gitkeep') + git(remote, 'init', '--quiet') + git(remote, 'add', '.') + git(remote, 'commit', '--quiet', '-m', 'first') + return remote +} diff --git a/tests/repository.test.ts b/tests/repository.test.ts new file mode 100644 index 00000000..b537a268 --- /dev/null +++ b/tests/repository.test.ts @@ -0,0 +1,370 @@ +import { chmod, mkdir, symlink } from 'node:fs/promises' +import path from 'node:path' + +import { describe, expect, it } from 'vitest' + +import { CliError } from '../src/errors.js' +import { listModules, listScripts, type Module } from '../src/repository.js' +import { createSandbox, type Sandbox } from './helpers.js' + +const settings = (files: unknown) => JSON.stringify({ files }) + +async function modulesOf(sandbox: Sandbox) { + const warnings: string[] = [] + const modules = await listModules(sandbox.repo, { + ...sandbox, + warn: message => warnings.push(message), + }) + return { modules, warnings } +} + +/** The module, which must have a usable settings.json. */ +function usable(module: Module | undefined) { + if (module == null || module.error != null) throw new Error(`unusable module: ${module?.error}`) + return module +} + +async function scriptsOf(sandbox: Sandbox, extensions: readonly string[] | null = null) { + const warnings: string[] = [] + const scripts = await listScripts(sandbox.repo, extensions, { + warn: message => warnings.push(message), + }) + return { scripts, warnings } +} + +describe('listModules', () => { + it('lists folders of files/ that have a settings.json, with slugified names', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/files/My Zsh/settings.json', settings([])) + await sandbox.write('home/dotfiles/files/git/settings.json', settings([])) + await sandbox.write('home/dotfiles/files/no-settings/file', '') + await sandbox.write('home/dotfiles/files/.hidden/settings.json', settings([])) + await sandbox.write('home/dotfiles/files/.DS_Store', '') + + const { modules } = await modulesOf(sandbox) + + expect(modules.map(module => module.name)).toEqual(['git', 'my-zsh']) + }) + + it('follows symlinks to module folders', async () => { + const sandbox = await createSandbox() + await sandbox.write('elsewhere/zsh/settings.json', settings([])) + await mkdir(path.join(sandbox.repo, 'files'), { recursive: true }) + await symlink(path.join(sandbox.root, 'elsewhere/zsh'), path.join(sandbox.repo, 'files/zsh')) + + const { modules } = await modulesOf(sandbox) + + expect(modules.map(module => module.name)).toEqual(['zsh']) + }) + + it('warns about broken symlinks, duplicate and empty names', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/files/Foo Bar/settings.json', settings([])) + await sandbox.write('home/dotfiles/files/foo-bar/settings.json', settings([])) + await sandbox.write('home/dotfiles/files/@@@/settings.json', settings([])) + await symlink(path.join(sandbox.root, 'nowhere'), path.join(sandbox.repo, 'files/broken')) + + const { modules, warnings } = await modulesOf(sandbox) + + expect(modules.map(module => module.name)).toEqual(['foo-bar']) + expect(warnings).toEqual([ + expect.stringContaining('"@@@" has no usable module name'), + expect.stringContaining('broken is a broken symbolic link'), + expect.stringContaining('another module is already named "foo-bar"'), + ]) + }) + + it('resolves source and target paths with their deployment strategy', async () => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + settings([ + { source_path: 'zshrc', target_path: '~/.zshrc', global: true }, + { source_path: 'local.env', target_path: '.env', global: false }, + { source_path: 'aliases', target_path: '~/.aliases', deploy: 'global' }, + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + { source_path: 'parked', target_path: '~/.parked', deploy: 'none' }, + { source_path: 'forgotten', target_path: '~/.forgotten' }, + ]), + ) + + const { modules, warnings } = await modulesOf(sandbox) + const zsh = usable(modules[0]) + const repository = sandbox.repo + + expect(zsh.files).toEqual([ + { + source: path.join(sandbox.repo, 'files/zsh/zshrc'), + target: path.join(sandbox.home, '.zshrc'), + strategy: 'global', + repository, + }, + { + source: path.join(sandbox.repo, 'files/zsh/local.env'), + target: path.join(sandbox.cwd, '.env'), + strategy: 'local', + repository, + }, + { + source: path.join(sandbox.repo, 'files/zsh/aliases'), + target: path.join(sandbox.home, '.aliases'), + strategy: 'global', + repository, + }, + { + source: path.join(sandbox.repo, 'files/zsh/editorconfig'), + target: path.join(sandbox.cwd, '.editorconfig'), + strategy: 'local', + repository, + }, + ]) + expect(zsh.undecided).toEqual(['forgotten']) + expect(zsh.invalidEntries).toEqual([]) + expect(zsh.deprecations).toEqual([ + '"global": true | false is deprecated and will stop working in 2.0. ' + + 'Use "deploy": "global" | "local" instead', + ]) + expect(warnings).toEqual([]) + }) + + it('resolves relative global targets against the home folder, local ones against the current folder', async () => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + settings([ + { source_path: 'zshrc', target_path: '.zshrc', deploy: 'global' }, + { source_path: 'env', target_path: '.env', deploy: 'local' }, + ]), + ) + + const { modules, warnings } = await modulesOf(sandbox) + + expect(usable(modules[0]).files.map(file => file.target)).toEqual([ + path.join(sandbox.home, '.zshrc'), + path.join(sandbox.cwd, '.env'), + ]) + expect(warnings).toEqual([]) + }) + + it.each([ + [{ deploy: 'symlink' }, 'use "deploy": "global", "local" or "none"'], + [{ global: 'yes' }, 'use "deploy": "global", "local" or "none"'], + [{ deploy: 'local', global: true }, 'not both'], + [{ deploy: 'global', source_path: '' }, '"source_path" is missing'], + [{ deploy: 'global', target_path: '' }, '"target_path" is missing'], + ])('reports an invalid entry: %o', async (entry, reason) => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + settings([{ source_path: 'zshrc', target_path: '~/.zshrc', ...entry }]), + ) + + const { modules } = await modulesOf(sandbox) + const zsh = usable(modules[0]) + + expect(zsh).toMatchObject({ files: [], undecided: [] }) + expect(zsh.invalidEntries).toEqual([expect.stringMatching(/^entry #1 is ignored: .+$/)]) + expect(zsh.invalidEntries[0]).toContain(reason) + }) + + it.each([ + ['~', 'global', 'would replace the home folder'], + ['..', 'global', 'would replace the home folder'], + ['/', 'global', 'would replace the home folder'], + ['.', 'local', 'would replace the current folder'], + ['~/dotfiles', 'global', 'would replace the dotfiles repository'], + ['~/dotfiles/files', 'global', 'is inside the dotfiles repository'], + ['~/dotfiles/files/zsh/zshrc', 'global', 'is inside the dotfiles repository'], + ])('refuses the dangerous target_path %s (%s)', async (target, deploy, reason) => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + settings([{ source_path: 'zshrc', target_path: target, deploy }]), + ) + + const { modules } = await modulesOf(sandbox) + const zsh = usable(modules[0]) + + expect(zsh.files).toEqual([]) + expect(zsh.invalidEntries[0]).toContain(reason) + }) + + it('refuses a target that contains the repository', async () => { + const sandbox = await createSandbox() + // The repository lives in ~/.config/dot and a module targets ~/.config. + await sandbox.write( + 'home/.config/dot/files/cfg/settings.json', + settings([{ source_path: 'config', target_path: '~/.config', deploy: 'global' }]), + ) + + const modules = await listModules(path.join(sandbox.home, '.config/dot'), { + ...sandbox, + warn: () => {}, + }) + + expect(usable(modules[0]).invalidEntries[0]).toContain('would replace the dotfiles repository') + }) + + it('refuses local targets inside the repository, when run from it', async () => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/app/settings.json', + settings([{ source_path: 'config.json', target_path: 'config.json', deploy: 'local' }]), + ) + + const modules = await listModules(sandbox.repo, { + ...sandbox, + cwd: path.join(sandbox.repo, 'files/app'), + warn: () => {}, + }) + + expect(usable(modules[0]).invalidEntries[0]).toContain('is inside the dotfiles repository') + }) + + it('keeps modules with an unusable settings.json, with the reason', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/files/broken/settings.json', '{') + await sandbox.write('home/dotfiles/files/nofiles/settings.json', '{}') + + const { modules, warnings } = await modulesOf(sandbox) + + expect(modules).toEqual([ + expect.objectContaining({ name: 'broken', error: expect.stringContaining('not valid JSON') }), + expect.objectContaining({ name: 'nofiles', error: 'settings.json has no "files" list' }), + ]) + expect(modules[0]).not.toHaveProperty('files') + expect(warnings).toEqual([]) + }) + + it('returns nothing when files/ does not exist', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/README.md') + + await expect(modulesOf(sandbox)).resolves.toMatchObject({ modules: [] }) + }) + + it('fails when the repository folder does not exist or is a file', async () => { + const sandbox = await createSandbox() + await expect(modulesOf(sandbox)).rejects.toThrow(/does not exist/) + + await sandbox.write('home/dotfiles', 'not a folder') + await expect(modulesOf(sandbox)).rejects.toThrow(CliError) + await expect(modulesOf(sandbox)).rejects.toThrow(/is not a folder/) + }) +}) + +describe('listScripts', () => { + it('lists every file by default, named up to the first dot (as in 0.3)', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/setup.sh') + await sandbox.write('home/dotfiles/scripts/install.macos.js') + await sandbox.write('home/dotfiles/scripts/bootstrap') + await sandbox.write('home/dotfiles/scripts/tool.py') + + const { scripts } = await scriptsOf(sandbox) + + expect(scripts.map(script => [script.name, script.file])).toEqual([ + ['bootstrap', 'bootstrap'], + ['install', 'install.macos.js'], + ['setup', 'setup.sh'], + ['tool', 'tool.py'], + ]) + }) + + it('only lists files with one of script_extensions when it is set', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/setup.sh') + await sandbox.write('home/dotfiles/scripts/bootstrap') + await sandbox.write('home/dotfiles/scripts/notes.shell.txt') + await sandbox.write('home/dotfiles/scripts/tool.py') + await sandbox.write('home/dotfiles/scripts/macos/index.sh') + await sandbox.write('home/dotfiles/scripts/linux/index.py') + + const { scripts } = await scriptsOf(sandbox, ['.sh', '']) + + expect(scripts.map(script => script.file)).toEqual([ + 'bootstrap', + path.join('macos', 'index.sh'), + 'setup.sh', + ]) + }) + + it('ignores hidden files', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/.DS_Store') + await sandbox.write('home/dotfiles/scripts/.env.sh') + + await expect(scriptsOf(sandbox)).resolves.toMatchObject({ scripts: [] }) + }) + + it('lists folders that contain an index script, also through symlinks', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/Mac OS/index.sh') + await sandbox.write('home/dotfiles/scripts/empty/README.md') + await sandbox.write('home/dotfiles/scripts/plain/index') + await sandbox.write('elsewhere/tools/index.sh') + await symlink( + path.join(sandbox.root, 'elsewhere/tools'), + path.join(sandbox.repo, 'scripts/tools'), + ) + + const { scripts } = await scriptsOf(sandbox) + + expect(scripts).toEqual([ + { + name: 'mac-os', + file: path.join('Mac OS', 'index.sh'), + path: path.join(sandbox.repo, 'scripts', 'Mac OS', 'index.sh'), + }, + { + name: 'plain', + file: path.join('plain', 'index'), + path: path.join(sandbox.repo, 'scripts', 'plain', 'index'), + }, + { + name: 'tools', + file: path.join('tools', 'index.sh'), + path: path.join(sandbox.repo, 'scripts', 'tools', 'index.sh'), + }, + ]) + }) + + it('keeps the first of two scripts with the same name and warns', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/dup.js') + await sandbox.write('home/dotfiles/scripts/dup.sh') + + const { scripts, warnings } = await scriptsOf(sandbox) + + expect(scripts.map(script => script.file)).toEqual(['dup.js']) + expect(warnings).toEqual(['"dup.sh" is ignored: another script is already named "dup".']) + }) + + it.skipIf(process.getuid?.() === 0)( + 'warns about a script folder that cannot be read', + async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/setup/index.sh') + await chmod(path.join(sandbox.repo, 'scripts/setup'), 0o000) + + try { + const { scripts, warnings } = await scriptsOf(sandbox) + + expect(scripts).toEqual([]) + expect(warnings[0]).toContain('cannot be read') + } finally { + await chmod(path.join(sandbox.repo, 'scripts/setup'), 0o755) + } + }, + ) + + it('respects custom extensions', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/tool.py') + await sandbox.write('home/dotfiles/scripts/setup.sh') + + const { scripts } = await scriptsOf(sandbox, ['.py']) + + expect(scripts.map(script => script.name)).toEqual(['tool']) + }) +}) diff --git a/tests/services/config/config-file-not-exist.error.js b/tests/services/config/config-file-not-exist.error.js deleted file mode 100644 index b1689c01..00000000 --- a/tests/services/config/config-file-not-exist.error.js +++ /dev/null @@ -1,15 +0,0 @@ -import test from 'ava' - -import { ConfigurationFileNotExist } from '../../../src/services/config' - -test('should have Error as parent.', t => { - const error = new ConfigurationFileNotExist() - - t.true(error instanceof Error) -}) - -test('should take error message as constructor parameter.', t => { - const error = new ConfigurationFileNotExist('"test" does not exist') - - t.is(error.message, '"test" does not exist') -}) diff --git a/tests/services/config/config.service.js b/tests/services/config/config.service.js deleted file mode 100644 index 4d9264c7..00000000 --- a/tests/services/config/config.service.js +++ /dev/null @@ -1,123 +0,0 @@ -import test, { beforeEach, afterEach } from 'ava' -import fs from 'fs' -import path from 'path' -import rimraf from 'rimraf' -import { spy } from 'sinon' - -import { ConfigService, ConfigurationFileNotExist } from '../../../src/services/config' -import { FsUtils } from '../../../src/shared/utils' - -const tmpData = path.join(__dirname, './env-config') -let configService - -beforeEach('init temp files for tests', t => { - fs.mkdirSync(tmpData) -}) - -beforeEach('init service', t => { - configService = new ConfigService(path.join(tmpData, 'configfile')) -}) - -afterEach.always('clean temp files', t => { - rimraf.sync(tmpData) -}) - -test('.configFileExist should return false when main configuration file does not exist', t => { - t.false(configService.configFileExist()) -}) - -test('.configFileExist should return true when main configuration file exist', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({})) - t.true(configService.configFileExist()) -}) - -test('.configData should return good data when main configuration file exist', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'repo_url': 'https://', 'folder_path': './' })) - t.deepEqual(configService.configData(), { 'folder_path': './', 'repo_url': 'https://' }) -}) - -test('.configData should throw an error when main configuration file exist', t => { - t.throws(() => configService.configData(), ConfigurationFileNotExist) -}) - -test('.scriptExtension should return default value when it is not specified in file', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({})) - t.deepEqual(configService.scriptExtension, ['.js', '.sh', '']) -}) - -test('.scriptExtension should return existing value', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'script_extensions': ['.sh', '.vb'] })) - t.deepEqual(configService.scriptExtension, ['.sh', '.vb']) -}) - -test('.scriptExtension should check is an array before update', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({})) - - spy(Array, 'isArray') - - configService.scriptExtension = 3 - t.not(configService.scriptExtension, 3) - t.true(Array.isArray.calledOnce) - - configService.scriptExtension = ['.ts'] - t.deepEqual(configService.scriptExtension, ['.ts']) - - Array.isArray.restore() -}) - -test('.folderPath should return existing value', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'folder_path': './test' })) - t.is(configService.folderPath, './test') -}) - -test('.folderPath should update value', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'folder_path': './test' })) - configService.folderPath = './coucou' - - const data = JSON.parse(fs.readFileSync(configService.configPath)) - t.is(data['folder_path'], './coucou') -}) - -test('.repoUrl should return existing value', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'repo_url': 'http://github.com' })) - t.is(configService.repoUrl, 'http://github.com') -}) - -test('.repoUrl should update value', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'repo_url': 'http://github.com' })) - configService.repoUrl = 'http://google.com' - - const data = JSON.parse(fs.readFileSync(configService.configPath)) - t.is(data['repo_url'], 'http://google.com') -}) - -test('.getConfig should return the value for the given key', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'key': 'value' })) - t.is(configService.getConfig('key'), 'value') -}) - -test('.getConfig should return null when the given key does not exist', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'notkey': 'value' })) - t.is(configService.getConfig('key'), null) -}) - -test('.setConfig should update value in file', t => { - fs.writeFileSync(configService.configPath, JSON.stringify({ 'notkey': 'value' })) - configService.setConfig('notkey', 'notvalue') - - const data = JSON.parse(fs.readFileSync(configService.configPath)) - t.is(data['notkey'], 'notvalue') -}) - -test('.setConfig should create file if not exist', t => { - if (!FsUtils.fileExist(configService.configPath)) { - configService.setConfig('key', 'krakow') - - const data = JSON.parse(fs.readFileSync(configService.configPath)) - t.is(data['key'], 'krakow') - - return - } - - t.fail(`File ${configService.configPath} should not exist.`) -}) diff --git a/tests/services/exec/bad-script-permission.error.js b/tests/services/exec/bad-script-permission.error.js deleted file mode 100644 index d2936b3c..00000000 --- a/tests/services/exec/bad-script-permission.error.js +++ /dev/null @@ -1,21 +0,0 @@ -import test from 'ava' - -import { BadScriptPermission } from '../../../src/services/exec/bad-script-permission.error' - -test('should have Error as parent.', t => { - const error = new BadScriptPermission() - - t.true(error instanceof Error) -}) - -test('should take error message as constructor parameter.', t => { - const error = new BadScriptPermission(null, '"test" does not exist') - - t.is(error.message, '"test" does not exist') -}) - -test('should provide scriptName attribute.', t => { - const error = new BadScriptPermission('testScript') - - t.is(error.scriptName, 'testScript') -}) diff --git a/tests/services/exec/exec.service.js b/tests/services/exec/exec.service.js deleted file mode 100644 index 2587178d..00000000 --- a/tests/services/exec/exec.service.js +++ /dev/null @@ -1,53 +0,0 @@ -import test, { beforeEach, afterEach } from 'ava' -import fs from 'fs' -import path from 'path' -import rimraf from 'rimraf' - -import { ExecService } from '../../../src/services/exec.service' -import { ScriptNotExist } from '../../../src/services/exec' - -const tmpData = path.join(__dirname, './env-file') - -let execService -let configService - -beforeEach('init temp files for tests', t => { - fs.mkdirSync(tmpData) - fs.mkdirSync(path.join(tmpData, 'scripts')) - fs.mkdirSync(path.join(tmpData, 'files')) - - fs.writeFileSync(path.join(tmpData, 'scripts/test1.sh'), '') - fs.writeFileSync(path.join(tmpData, 'scripts/test2.js'), '') - fs.writeFileSync(path.join(tmpData, 'scripts/test3'), '') - fs.writeFileSync(path.join(tmpData, 'scripts/"tEsts 28.js"'), '') - - fs.mkdirSync(path.join(tmpData, 'files/module1')) - fs.mkdirSync(path.join(tmpData, 'files/"module 2"')) - fs.mkdirSync(path.join(tmpData, 'files/badmodule')) - fs.writeFileSync(path.join(tmpData, 'files/"moDule 2"/settings.json'), '{"files":[{"source_path":"","target_path":""}]}') - fs.writeFileSync(path.join(tmpData, 'files/module1/settings.json'), '{"files":[]}') -}) - -beforeEach('init service', t => { - configService = { - folderPath: tmpData, - scriptExtension: ['.sh'] - } - execService = new ExecService(configService) -}) - -afterEach.always('clean temp files', t => { - rimraf.sync(tmpData) -}) - -test(`.runScript should throw ScriptNotExist when script name is invalid`, t => { - t.plan(1) - - return execService.runScript('zdjkqh') - .then(() => { - t.fail('Execution must failed when script name is invalid.') - }) - .catch(e => { - t.true(e instanceof ScriptNotExist) - }) -}) diff --git a/tests/services/exec/script-not-exist.error.js b/tests/services/exec/script-not-exist.error.js deleted file mode 100644 index ed936f51..00000000 --- a/tests/services/exec/script-not-exist.error.js +++ /dev/null @@ -1,21 +0,0 @@ -import test from 'ava' - -import { ScriptNotExist } from '../../../src/services/exec' - -test('should have Error as parent.', t => { - const error = new ScriptNotExist() - - t.true(error instanceof Error) -}) - -test('should take error message as constructor parameter.', t => { - const error = new ScriptNotExist(null, '"test" does not exist') - - t.is(error.message, '"test" does not exist') -}) - -test('should provide scriptName attribute.', t => { - const error = new ScriptNotExist('testScript') - - t.is(error.scriptName, 'testScript') -}) diff --git a/tests/services/file.service.js b/tests/services/file.service.js deleted file mode 100644 index d98d86e3..00000000 --- a/tests/services/file.service.js +++ /dev/null @@ -1,66 +0,0 @@ -import test, { beforeEach, afterEach } from 'ava' -import fs from 'fs' -import path from 'path' -import rimraf from 'rimraf' - -import { FileService } from '../../src' - -const tmpData = path.join(__dirname, './env-file') - -let fileService -let configService - -beforeEach('init temp files for tests', t => { - fs.mkdirSync(tmpData) - fs.mkdirSync(path.join(tmpData, 'scripts')) - fs.mkdirSync(path.join(tmpData, 'files')) - - fs.writeFileSync(path.join(tmpData, 'scripts/test1.sh'), '') - fs.writeFileSync(path.join(tmpData, 'scripts/test2.js'), '') - fs.writeFileSync(path.join(tmpData, 'scripts/test3'), '') - fs.writeFileSync(path.join(tmpData, 'scripts/"tEsts 28.js"'), '') - - fs.mkdirSync(path.join(tmpData, 'files/module1')) - fs.mkdirSync(path.join(tmpData, 'files/"module 2"')) - fs.mkdirSync(path.join(tmpData, 'files/badmodule')) - fs.writeFileSync(path.join(tmpData, 'files/"moDule 2"/settings.json'), '{"files":[{"source_path":"","target_path":""}]}') - fs.writeFileSync(path.join(tmpData, 'files/module1/settings.json'), '{"files":[]}') -}) - -beforeEach('init service', t => { - configService = { - folderPath: tmpData, - scriptExtension: ['.sh'] - } - fileService = new FileService(configService) -}) - -afterEach.always('clean temp files', t => { - rimraf.sync(tmpData) -}) - -test('.scripts should return name and path of valid scripts', t => { - t.deepEqual(fileService.scripts.map(el => el.script), ['test1']) - t.is(fileService.scripts.filter(el => ('path' in el)).length, 1) - - configService.scriptExtension = ['.js', '.sh', '.flg'] - t.deepEqual(fileService.scripts.map(el => el.script), ['tests-28', 'test1', 'test2']) - t.is(fileService.scripts.filter(el => ('path' in el)).length, 3) -}) - -test('.modules should return name and path of valid modules', t => { - t.deepEqual(fileService.modules.map(el => el.module), ['module-2', 'module1']) - t.is(fileService.modules.filter(el => ('path' in el)).length, 2) -}) - -test('.modules should return target and source of each file in modules', t => { - const modules = fileService.modules - - t.plan(modules.reduce((length, module) => { length += module.files.length; return length }, 0)) - - for (const module of modules) { - for (const file of module.files) { - t.is(('target' in file) && ('source' in file), true) - } - } -}) diff --git a/tests/shared/errors/file-not-directory.error.js b/tests/shared/errors/file-not-directory.error.js deleted file mode 100644 index 588d3f4e..00000000 --- a/tests/shared/errors/file-not-directory.error.js +++ /dev/null @@ -1,15 +0,0 @@ -import test from 'ava' - -import { FileNotDirectory } from '../../../src/shared/errors' - -test('should have Error as parent.', t => { - const error = new FileNotDirectory() - - t.true(error instanceof Error) -}) - -test('should take error message as constructor parameter.', t => { - const error = new FileNotDirectory('"test" does not exist') - - t.is(error.message, '"test" does not exist') -}) diff --git a/tests/shared/errors/folder-not-empty.error.js b/tests/shared/errors/folder-not-empty.error.js deleted file mode 100644 index fe69fe6b..00000000 --- a/tests/shared/errors/folder-not-empty.error.js +++ /dev/null @@ -1,15 +0,0 @@ -import test from 'ava' - -import { FolderNotEmpty } from '../../../src/shared/errors' - -test('should have Error as parent.', t => { - const error = new FolderNotEmpty() - - t.true(error instanceof Error) -}) - -test('should take error message as constructor parameter.', t => { - const error = new FolderNotEmpty('"test" does not exist') - - t.is(error.message, '"test" does not exist') -}) diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..81f6b955 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "noEmit": false + }, + "include": ["src/**/*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..f1372671 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "rootDir": ".", + "module": "nodenext", + "target": "es2023", + "lib": ["es2023"], + "types": ["node"], + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "noImplicitOverride": true, + "noFallthroughCasesInSwitch": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "moduleDetection": "force", + "skipLibCheck": true, + "noEmit": true + }, + "include": ["src/**/*.ts", "tests/**/*.ts", "vitest.config.ts"] +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..09dd24b2 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + include: ['tests/**/*.test.ts'], + globalSetup: ['tests/global-setup.ts'], + // Git run by tests and by the CLI under test ignores the developer's configuration. + env: { GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_NOSYSTEM: '1' }, + coverage: { + provider: 'v8', + include: ['src/**/*.ts'], + exclude: ['src/cli.ts'], + }, + }, +}) diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 206f4cc9..00000000 --- a/yarn.lock +++ /dev/null @@ -1,3610 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== - dependencies: - "@babel/highlight" "^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== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@^7.7.5": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" - integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.7" - "@babel/helpers" "^7.7.4" - "@babel/parser" "^7.7.7" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - convert-source-map "^1.7.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.7.4", "@babel/generator@^7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" - integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== - dependencies: - "@babel/types" "^7.7.4" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" - integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== - dependencies: - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-get-function-arity@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" - integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-split-export-declaration@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" - integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helpers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" - integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== - dependencies: - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.7.4", "@babel/parser@^7.7.5", "@babel/parser@^7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" - integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== - -"@babel/template@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" - integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/traverse@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" - integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@concordance/react@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" - integrity sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA== - dependencies: - arrify "^1.0.1" - -"@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.20" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" - integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== - dependencies: - "@nodelib/fs.scandir" "2.1.3" - fastq "^1.6.0" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6" - integrity sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" - integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz#b64b0faadfdd01a6dcf0c4dcdb78438d86fa7dbf" - integrity sha512-atR1J/jRXvQAb47gfzSK8zavXy7BcpnYq21ALon0U99etu99vsir0trzIO3wpeLtW+LLVY6X7EkfVTbjGSH8Ww== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/samsam@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.0.tgz#1d2f0743dc54bf13fe9d508baefacdffa25d4329" - integrity sha512-hXpcfx3aq+ETVBwPlRFICld5EnrkexXuXDwqUNhDdr5L8VjvMeSRwyOa0qL7XFmR+jVWR4rUZtnxlG7RX72sBg== - 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" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@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/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/node@11.15.44": - version "11.15.44" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.44.tgz#5c3463a489ddd6d1d9f6717dff84e15097b0b362" - integrity sha512-fHAcNn2FlzDMA9rV5KP73r1cMZdbommWic2foHAEWoa/LITi91AueHDsJpnqjBEJ7bYoT2WC+KN1RL0vsM20zA== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== - -acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== - -acorn-walk@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.0.0.tgz#56ae4c0f434a45fff4a125e7ea95fa9c98f67a16" - integrity sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA== - -acorn@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== - -acorn@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" - integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== - -aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^6.12.4: - version "6.12.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" - integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== - 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" - -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - -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@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" - integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== - dependencies: - type-fest "^0.5.2" - -ansi-regex@^4.1.0: - version "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-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" - integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -ansi-styles@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.1.0.tgz#d3ba8047b818293eaaa7978321dd61bff9842cfc" - integrity sha512-Qts4KCLKG+waHc9C4m07weIY8qyeixoS0h6RnbsNVD6Fw+pEZGW3vTyObL3WXpE09Mq4Oi7/lBEyLmOiLtlYWQ== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.0.0.tgz#675dbbb5ca1908fa90abe4e5b1c2e9b1f4080d99" - integrity sha512-6564t0m0fuQMnockqBv7wJxo9T5C2V9JpYXyNScfRDPVLusOQQhkpMGrFC17QbiolraQ1sMXX+Y5nJpjqozL4g== - -anymatch@~3.1.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" - -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" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" - -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.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -arrgv@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arrgv/-/arrgv-1.0.2.tgz#025ed55a6a433cad9b604f8112fc4292715a6ec0" - integrity sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -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== - -ava@3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.15.0.tgz#a239658ab1de8a29a243cc902e6b42e4574de2f0" - integrity sha512-HGAnk1SHPk4Sx6plFAUkzV/XC1j9+iQhOzt4vBly18/yo0AV8Oytx7mtJd/CR8igCJ5p160N/Oo/cNJi2uSeWA== - dependencies: - "@concordance/react" "^2.0.0" - acorn "^8.0.4" - acorn-walk "^8.0.0" - ansi-styles "^5.0.0" - arrgv "^1.0.2" - arrify "^2.0.1" - callsites "^3.1.0" - chalk "^4.1.0" - chokidar "^3.4.3" - chunkd "^2.0.1" - ci-info "^2.0.0" - ci-parallel-vars "^1.0.1" - clean-yaml-object "^0.1.0" - cli-cursor "^3.1.0" - cli-truncate "^2.1.0" - code-excerpt "^3.0.0" - common-path-prefix "^3.0.0" - concordance "^5.0.1" - convert-source-map "^1.7.0" - currently-unhandled "^0.4.1" - debug "^4.3.1" - del "^6.0.0" - emittery "^0.8.0" - equal-length "^1.0.0" - figures "^3.2.0" - globby "^11.0.1" - ignore-by-default "^2.0.0" - import-local "^3.0.2" - indent-string "^4.0.0" - is-error "^2.2.2" - is-plain-object "^5.0.0" - is-promise "^4.0.0" - lodash "^4.17.20" - matcher "^3.0.0" - md5-hex "^3.0.1" - mem "^8.0.0" - ms "^2.1.3" - ora "^5.2.0" - p-event "^4.2.0" - p-map "^4.0.0" - picomatch "^2.2.2" - pkg-conf "^3.1.0" - plur "^4.0.0" - pretty-ms "^7.0.1" - read-pkg "^5.2.0" - resolve-cwd "^3.0.0" - slash "^3.0.0" - source-map-support "^0.5.19" - stack-utils "^2.0.3" - strip-ansi "^6.0.0" - supertap "^2.0.0" - temp-dir "^2.0.0" - trim-off-newlines "^1.0.1" - update-notifier "^5.0.1" - write-file-atomic "^3.0.3" - yargs "^16.2.0" - -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= - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -bl@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" - integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blueimp-md5@^2.10.0: - version "2.11.1" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.11.1.tgz#b1f6b6218d13cdedbf5743f32b3023b2afefcbd3" - integrity sha512-4UiOAmql2XO0Sws07OVzYdCKK0K2Va5g6AVgYXoGhEQiKrdSOefjUCm1frPk6E+xiIOHRqaFg+TUGo7cClKg5g== - -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -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== - dependencies: - fill-range "^7.0.1" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -cacheable-request@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" - integrity sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q== - dependencies: - clone-response "^1.0.2" - get-stream "^4.0.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^1.0.1" - normalize-url "^3.1.0" - responselike "^1.0.2" - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - -callsites@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" - integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== - -callsites@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.0.tgz#0a110882cbeba41f72f99fcf918f4a0a92a13ebf" - integrity sha512-Y05ICatFYPAfykDIB7VdwSJ0LUl1yq/BwO2OpyGGLjiRe1fgzTwVypPiWnzkGFOVFHXrCXUNBl86bpjBhZWSJg== - -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== - -chalk@4.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== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -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== - -chokidar@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" - integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.1.2" - -chunkd@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920" - integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-parallel-vars@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz#e87ff0625ccf9d286985b29b4ada8485ca9ffbc2" - integrity sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -clean-yaml-object@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" - integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= - -cli-boxes@^2.2.0: - version "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@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" - integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.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-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= - dependencies: - mimic-response "^1.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -code-excerpt@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" - integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== - dependencies: - convert-to-spaces "^1.0.1" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.0.0.tgz#3e2bbfd8bb6724760980988fb5b22b7ee6b71ab2" - integrity sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concordance@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.1.tgz#7a248aca8b286125d1d76f77b03320acf3f4ac63" - integrity sha512-TbNtInKVElgEBnJ1v2Xg+MFX2lvFLbmlv3EuSC5wTfCwpB8kC3w3mffF6cKuUhkn475Ym1f1I4qmuXzx2+uXpw== - dependencies: - date-time "^3.1.0" - esutils "^2.0.3" - fast-diff "^1.2.0" - js-string-escape "^1.0.1" - lodash "^4.17.15" - md5-hex "^3.0.1" - semver "^7.3.2" - well-known-symbols "^2.0.0" - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-to-spaces@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= - -cross-spawn@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "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== - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -date-time@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" - integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== - dependencies: - time-zone "^1.0.0" - -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@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "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= - -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" - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -defer-to-connect@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" - integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== - -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" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -emittery@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== - dependencies: - once "^1.4.0" - -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" - -equal-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" - integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w= - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -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: - 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@^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== - -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== - -eslint-config-standard@16.0.2: - version "16.0.2" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz#71e91727ac7a203782d0a5ca4d1c462d14e234f6" - integrity sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw== - -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" - -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-es@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" - integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -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 "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" - -eslint-plugin-promise@4.2.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-standard@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== - -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.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.1.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-visitor-keys@^1.1.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-visitor-keys@^1.3.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: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== - -eslint@7.18.0: - version "7.18.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" - integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.3.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.2.0" - esutils "^2.0.2" - file-entry-cache "^6.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.20" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.4" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -esm@3.2.25: - version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" - integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== - -espree@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" - integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.3.0" - -espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -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 "^5.2.0" - -estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= - -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== - -estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= - -esutils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -external-editor@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -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: - 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== - -fast-diff@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" - integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - -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= - -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.6.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" - integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== - dependencies: - reusify "^1.0.0" - -figures@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" - integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" - integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.0" - pkg-dir "^4.1.0" - -find-up@^2.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@^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@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a" - integrity sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q== - dependencies: - locate-path "^5.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" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -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: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" - integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== - -flex-exec@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flex-exec/-/flex-exec-1.0.0.tgz#06974b68532839d2a12c32debcdb12378200fdf0" - integrity sha1-BpdLaFMoOdKhLDLevNsSN4IA/fA= - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -fromentries@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" - integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -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== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^4.0.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" - -gift@0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/gift/-/gift-0.10.2.tgz#4600efe8f284b51fcb01c3527b321e22b494e156" - integrity sha512-wC9aKnQpjfOTWX+JG4DPJkS89ux6sl8EN4hXhv/2vBoXCDTEz1JiTeGTSeuKYlCqIgUFM1JwPVym34Sys3hvzw== - dependencies: - flex-exec "^1.0.0" - underscore "^1.8.3" - -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - 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== - 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.1.4, glob@^7.1.6: - 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-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" - -globals@^11.1.0: - version "11.8.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" - integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== - -globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== - dependencies: - type-fest "^0.8.1" - -globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.15: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -graceful-fs@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -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-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.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasha@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.0.0.tgz#fdc3785caea03df29535fc8adb512c3d3a709004" - integrity sha512-PqWdhnQhq6tqD32hZv+l1e5mJHNSudjnaAzgAHfkGiU0ABN6lmbZF8abJIulQHbZ7oiHhP8yL6O910ICMc+5pw== - dependencies: - is-stream "^1.1.0" - type-fest "^0.3.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -iconv-lite@^0.4.24: - 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" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-by-default@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.0.0.tgz#537092018540640459569fe7c8c7a408af581146" - integrity sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA== - -ignore@^4.0.6: - version "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.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" - integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== - -ignore@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== - -import-fresh@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" - integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== - -inquirer@7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -irregular-plurals@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" - integrity sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -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-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - dependencies: - builtin-modules "^1.0.0" - -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.5: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -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= - -is-error@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" - integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "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.0, 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== - dependencies: - is-extglob "^2.1.1" - -is-installed-globally@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.1, is-path-inside@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - -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-promise@^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-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -is-regex@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" - integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== - dependencies: - has-symbols "^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-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -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== - dependencies: - has-symbols "^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-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-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -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-instrument@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz#53321a7970f076262fd3292c8f9b2e4ac544aae1" - integrity sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ== - dependencies: - "@babel/core" "^7.7.5" - "@babel/parser" "^7.7.5" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" - integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.0" - istanbul-lib-coverage "^3.0.0-alpha.1" - make-dir "^3.0.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^3.3.3" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -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== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.14.0: - 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" - -jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= - -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-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -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-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== - dependencies: - minimist "^1.2.0" - -just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" - integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.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" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-json-file@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.2.0.tgz#1553627a18bf7b08cd7ec232d63981239085a578" - integrity sha512-HvjIlM2Y/RDHk1X6i4sGgaMTrAsnNrgQCJtuf5PEhbOV6MCJuMVZLMdlJRE0JGLMkF7b6O5zs9LcDxKIUt9CbQ== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -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" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - -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@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - -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" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -make-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" - integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== - dependencies: - semver "^6.0.0" - -map-age-cleaner@^0.1.3: - 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" - -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - -md5-hex@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" - integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== - dependencies: - blueimp-md5 "^2.10.0" - -mem@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-8.0.0.tgz#b5e4b6d2d241c6296da05436173b4d0c7ae1f9ac" - integrity sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA== - dependencies: - map-age-cleaner "^0.1.3" - mimic-fn "^3.1.0" - -merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" - integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== - -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== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -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.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: - 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.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -nise@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" - integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^6.0.0" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -normalize-package-data@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -nyc@15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -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== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -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: - 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" - -ora@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.2.0.tgz#de10bfd2d15514384af45f3fa9d9b1aaf344fda1" - integrity sha512-+wG2v8TUU8EgzPHun1k/n45pXquQ9fHnbXVetl9rRgO6kjZszGGbraF3XPTIdgeA+s1lbRjSEftAnyT0w8ZMvQ== - dependencies: - bl "^4.0.3" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - log-symbols "^4.0.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -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@^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-event@^4.2.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-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.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== - 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= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -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.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== - -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -package-json@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.3.0.tgz#5ed793418b8322af7abfb985a19a20c2f40c2fb0" - integrity sha512-XO7WS3EEXd48vmW633Y97Mh9xuENFiOevI9G+ExfTG/k6xuY9cBd3fxkAoDMSEsNZXasaVJIJ1rD/n7GMf18bA== - dependencies: - got "^9.6.0" - registry-auth-token "^3.4.0" - registry-url "^5.0.0" - semver "^5.6.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -parse-ms@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" - integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.1.0: - 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.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= - dependencies: - isarray "0.0.1" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picomatch@^2.0.4, picomatch@^2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" - integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== - -picomatch@^2.2.1, picomatch@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pkg-conf@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" - integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== - dependencies: - find-up "^3.0.0" - load-json-file "^5.2.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -plur@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" - integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== - dependencies: - irregular-plurals "^3.2.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== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -pretty-ms@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" - integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== - dependencies: - parse-ms "^2.1.0" - -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -progress@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" - integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -rc@^1.1.6, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^3.4.0: - 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" - -readdirp@~3.5.0: - 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" - -regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== - -regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - -registry-auth-token@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= - dependencies: - es6-error "^4.0.1" - -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@^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== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.10.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== - dependencies: - path-parse "^1.0.6" - -resolve@^1.13.1, resolve@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.3.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" - integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== - dependencies: - 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@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -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== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" - integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== - dependencies: - glob "^7.1.3" - -run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" - -run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -rxjs@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" - integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -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== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - -semver@^5.6.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== - -semver@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" - integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== - -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.2.1, 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== - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -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@^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== - -signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -sinon@9.2.3: - version "9.2.3" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.3.tgz#f68ce414e843e2fd638703043c97f260697caa52" - integrity sha512-m+DyAWvqVHZtjnjX/nuShasykFeiZ+nPuEfD4G3gpvKGkXRhkF/6NSt2qN2FjZhfrcHXFzUzI+NLnk+42fnLEw== - dependencies: - "@sinonjs/commons" "^1.8.1" - "@sinonjs/fake-timers" "^6.0.1" - "@sinonjs/samsam" "^5.3.0" - diff "^4.0.2" - nise "^4.0.4" - supports-color "^7.1.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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -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 "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -source-map-support@^0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -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: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - -spdx-correct@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" - integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" - integrity sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -stack-utils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== - dependencies: - escape-string-regexp "^2.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.2.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== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" - integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^5.2.0" - -string.prototype.trimend@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - 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== - dependencies: - ansi-regex "^5.0.0" - -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-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.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" - integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== - -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: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supertap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supertap/-/supertap-2.0.0.tgz#8b587d6e14b8e885fa5183a9c45abf429feb9f7f" - integrity sha512-jRzcXlCeDYvKoZGA5oRhYyR3jUIYu0enkSxtmAgHRlD7HwrovTpH4bDSi0py9FtuA8si9cW/fKommJHuaoDHJA== - dependencies: - arrify "^2.0.1" - indent-string "^4.0.0" - js-yaml "^3.14.0" - serialize-error "^7.0.1" - strip-ansi "^6.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.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" - -table@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" - integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== - dependencies: - ajv "^6.12.4" - lodash "^4.17.20" - slice-ansi "^4.0.0" - string-width "^4.2.0" - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -time-zone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" - integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= - -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-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@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -trim-off-newlines@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= - -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -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-detect@4.0.8, 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.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.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -type-fest@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -underscore@^1.8.3: - version "1.13.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" - integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -update-notifier@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.0.1.tgz#1f92d45fb1f70b9e33880a72dd262bc12d22c20d" - integrity sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg== - dependencies: - boxen "^4.2.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.2" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.2" - semver-diff "^3.1.1" - 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== - dependencies: - punycode "^2.1.0" - -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" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.3: - 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.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== - -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" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -well-known-symbols@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" - integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^2.0.1: - 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" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -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== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.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" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.0.tgz#1b64dbbf77cb58fd09056963d63e62667ab4fb21" - integrity sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -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.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== - -yabf@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/yabf/-/yabf-2.1.0.tgz#b67325eb9f16f14921cfe75985b9948b5b1429fe" - integrity sha512-LmqXbL6JX8JHq5e3M2BnvijLvNHZToZseg5jbhs1ylHxHggPHFYRaFogBRBP2beyzsn4yTTmVUDb71AlJYEc6g== - -yargs-parser@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs@^15.0.2: - version "15.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3" - integrity sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^16.1.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" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" From e37f0bdd9c4dc8a3759886eea3350bd1f2c503c0 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 1 Oct 2026 09:03:01 +0200 Subject: [PATCH 319/341] fix: make deployments safe against hostile or broken input (#282) --- CHANGELOG.md | 13 +- README.md | 19 +- src/commands/init.ts | 22 +- src/commands/modules.ts | 171 +++++++---- src/config.ts | 6 +- src/deploy.ts | 609 ++++++++++++++++++++++++++------------- src/fsutil.ts | 110 +++++++ src/lock.ts | 78 +++++ src/output.ts | 27 +- src/paths.ts | 11 + src/repository.ts | 73 +++-- src/state.ts | 227 +++++++++++---- tests/commands.test.ts | 234 ++++++++++++++- tests/config.test.ts | 14 + tests/deploy.test.ts | 478 +++++++++++++++++++++--------- tests/e2e.test.ts | 46 +++ tests/lock.test.ts | 69 +++++ tests/repository.test.ts | 58 +++- 18 files changed, 1776 insertions(+), 489 deletions(-) create mode 100644 src/fsutil.ts create mode 100644 src/lock.ts create mode 100644 tests/lock.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 88f5491a..10a87aa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Added - Add new contributor to SPONSORS.md -- The `modules undeploy` command to remove deployed files and restore the saved versions - configfile made (recorded in `~/.configfile/`). +- The `modules undeploy` command to remove the files configfile deployed and restore the saved + versions it made (recorded in `~/.configfile/`). - The `modules status` command to see which files are deployed. - The `update` command to pull the latest version of the dotfiles repository. - A preview of the changes with `--dry-run` on `modules deploy` and `modules undeploy`. @@ -31,7 +31,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Files replaced by `modules deploy --local` are saved as `.old` files, like global files. - Configfile no longer makes scripts executable: scripts that are not executable run with the interpreter of their first line (`#!`), or with `node` or `sh` for `.js` and `.sh` files. -- Deploying refuses targets inside the dotfiles repository, or containing it. +- Deploying refuses targets inside the dotfiles repository or the module, targets containing + them, and configfile's own files, whatever the path used to reach them. +- A `source_path` must stay inside its module folder. +- Local copies follow symbolic links: a copy never points into the repository. +- `settings.json` files written for configfile 0.3.1 (a plain list) are deprecated; put the list + in a `"files"` key. +- `~/.configfilerc` is only readable by its owner. - `init` reuses a folder that already contains the repository. ### Fixed @@ -43,6 +49,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Stopping configfile while a script runs (for example with `kill`) could leave the script running. - Scripts could not read input from the terminal. +- Two configfile processes running at the same time could lose files. ## [0.3.1] - 2018-08-05 ### Fixed diff --git a/README.md b/README.md index 4cb708e5..6a627c9e 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,9 @@ Every folder of `files/` (or symbolic link to a folder) that contains a `setting | Key | Description | | --- | --- | -| `source_path` | Path of the file (or folder), relative to the module folder. | -| `target_path` | Where the file is deployed. `~` is your home folder. A relative path is relative to your home folder for global files (`.zshrc` is `~/.zshrc`) and to the current folder for local files. A target that would replace your home folder, the current folder, the dotfiles repository or one of their parents, or that is inside the repository, is refused. | -| `deploy` | `"global"`: the file is **symlinked** by `configfile modules deploy`. `"local"`: the file is **copied** by `configfile modules deploy --local`, typically into a project folder. `"none"`: the file is **never deployed**, which keeps it in the repository for later. | +| `source_path` | Path of the file (or folder), relative to the module folder. It must stay inside the module folder, symbolic links included. | +| `target_path` | Where the file is deployed. `~` is your home folder. A relative path is relative to your home folder for global files (`.zshrc` is `~/.zshrc`) and to the current folder for local files. Targets can be anywhere you can write, except: your home folder, the current folder, the dotfiles repository, the module folder, *configfile*'s own files (`~/.configfilerc`, `~/.configfile/`), one of their parents, or anything inside the repository. These are recognised whatever the path used to reach them (letter case, symbolic links). | +| `deploy` | `"global"`: the file is **symlinked** by `configfile modules deploy`. `"local"`: the file is **copied** by `configfile modules deploy --local`, typically into a project folder (symbolic links in the source are followed, so the copy never points into the repository). `"none"`: the file is **never deployed**, which keeps it in the repository for later. | | `global` | **Deprecated**, removed in 2.0: older spelling of `deploy`. `true` is `"global"`, `false` is `"local"`. It still works in 1.x, with a warning. Use one or the other, not both. | An entry without `deploy` or `global` is not deployed, and `modules deploy` warns about it. @@ -67,7 +67,11 @@ When a global file is deployed and something else already exists at its target ( When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. -*configfile* records the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links (and the local copies that are still identical to the repository) and moves the most recent backup *configfile* made back in place. Other files, including `.old` files you made yourself, are left untouched. +*configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links and the local copies *configfile* made (unless they were modified since), and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), local copies that were modified or saved again by an editor since, and `.old` files you made yourself. + +Only one *configfile* at a time changes files: a second one waits for the first to finish (the lock is `~/.configfile/lock`). + +> **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. ### Scripts @@ -123,12 +127,15 @@ Scripts can be written in any language: ## Upgrading from 0.3 - Node.js 22.13 or later is required, on macOS or Linux. Install again with `npm install --global configfile`. -- `~/.configfilerc`, the repository layout and `settings.json` work as before. Files deployed by 0.3 are recognised as deployed. +- `~/.configfilerc`, the repository layout and `settings.json` work as before, including `settings.json` files that are a plain list (the 0.3.1 format, deprecated: put the list in a `"files"` key). Links deployed by 0.3 are recognised as deployed. +- If you installed 0.3 with Yarn, remove it first: `yarn global remove configfile`. - `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. - A **relative** `target_path` of a global file is now relative to your home folder, not to the folder you run *configfile* from. Targets starting with `~/` or `/` are not affected. - Scripts keep their names (up to the first dot) and every file of `scripts/` is still a script. They are no longer made executable by *configfile*: a script needs a shebang line, a `.js`/`.sh` extension, or to be executable. - Targets inside the dotfiles repository, or containing it, are now refused. -- `modules undeploy` only restores backups made by 1.0 or later (recorded in `~/.configfile/state.json`); `.old` files made by 0.3 stay where they are. +- `modules undeploy` only removes what 1.0 or later deployed, and only restores backups it made (recorded in `~/.configfile/state.json`): local copies and `.old` files made by 0.3 stay where they are. +- A `source_path` must stay inside its module folder. +- With `script_extensions` set, only files with one of these extensions are scripts, and `""` means files without extension (0.3 matched any file containing the text). - Commands now exit with a non-zero code on failure. ## Contribution diff --git a/src/commands/init.ts b/src/commands/init.ts index 3800c229..4c73b802 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -67,6 +67,12 @@ async function init(options: InitOptions, ctx: Context): Promise { })) ).trim() if (repoUrl === '') throw new CliError('A repository URL is required.') + if (redactUrl(repoUrl) !== repoUrl) { + output.warn( + 'The repository URL contains credentials: they are saved in the configuration and in ' + + "git's settings. Prefer an SSH key or a git credential helper.", + ) + } const folderInput = options.folder ?? @@ -92,7 +98,7 @@ async function init(options: InitOptions, ctx: Context): Promise { await mkdir(folderPath, { recursive: true }).catch(error => { throw new CliError(`Cannot create ${folderPath}: ${(error as Error).message}`) }) - output.info(`Cloning ${repoUrl} into ${folderPath}…`) + output.info(`Cloning ${redactUrl(repoUrl)} into ${folderPath}…`) await gitClone(repoUrl, folderPath, ctx) break } @@ -131,3 +137,17 @@ async function inspectFolder(folderPath: string) { if ((await readdir(folderPath).catch(fail)).length > 0) return 'not-empty' return 'empty' } + +/** The URL with its password or token (`https://user:token@host/…`) hidden. */ +export function redactUrl(url: string): string { + let parsed: URL + try { + parsed = new URL(url) + } catch { + return url // Not a URL (for example git@host:repo.git or a local path). + } + if (parsed.password === '' && (parsed.username === '' || parsed.protocol === 'ssh:')) return url + parsed.username = parsed.username === '' ? '' : '***' + parsed.password = parsed.password === '' ? '' : '***' + return parsed.toString() +} diff --git a/src/commands/modules.ts b/src/commands/modules.ts index 5be0fad6..e7b7da45 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -3,24 +3,27 @@ import type { Command } from 'commander' import { ConfigStore } from '../config.js' import type { Context } from '../context.js' import { - assertSafeTarget, - assertSourceExists, + type BackupCheck, + type DeployContext, type DeployDecision, type DeployResult, - decideDeploy, - decideUndeploy, deployFile, + Guard, inspectFile, type KeptState, - nextBackupPath, + planDeploy, + planUndeploy, type TargetState, + type UndeployDecision, type UndeployResult, undeployFile, } from '../deploy.js' import { CliError } from '../errors.js' +import { messageOf } from '../fsutil.js' +import { withLock } from '../lock.js' import { plural } from '../output.js' import { listModules, type Module, type ModuleFile } from '../repository.js' -import { BackupRecord } from '../state.js' +import { DeploymentRecord } from '../state.js' type Strategy = ModuleFile['strategy'] type UsableModule = Extract @@ -127,6 +130,8 @@ async function status(names: string[], options: Options, ctx: Context): Promise< return } + // Read only: status never changes files or the record. + const record = await DeploymentRecord.load(ctx.home) for (const module of selected) { output.print(`${module.name}:`) @@ -140,9 +145,9 @@ async function status(names: string[], options: Options, ctx: Context): Promise< for (const file of files) { let state: string try { - state = describeState(await inspectFile(file)) + state = describeState(await inspectFile(file, record)) } catch (error) { - state = `cannot be checked: ${(error as Error).message}` + state = `cannot be checked: ${messageOf(error)}` } output.print(` ${file.target} (${state})`) } @@ -160,7 +165,7 @@ async function deploy(names: string[], options: Options, ctx: Context): Promise< const run = await prepare('deploy', names, options, ctx) if (run == null) return - const { files, record } = run + const { files } = run let failures = run.failures const reportError = (file: ModuleFile, error: unknown) => { failures++ @@ -168,10 +173,11 @@ async function deploy(names: string[], options: Options, ctx: Context): Promise< } if (options.dryRun) { + const context = await deployContext(ctx) let wouldSkip = 0 for (const file of files) { try { - const decision = await planDeploy(file, options) + const decision = await planDeploy(file, { ...context, force: options.force }) if (decision.action === 'conflict' && !prompts.interactive) wouldSkip++ output.print( `- ${file.target} (${describePlannedDeploy(file, decision, prompts.interactive)})`, @@ -184,10 +190,31 @@ async function deploy(names: string[], options: Options, ctx: Context): Promise< return } + await withLock(ctx.home, async () => { + const context = await deployContext(ctx) + await deployAll(files, options, context, ctx, failures) + }) +} + +/** Deploys `files` while the lock is held, then reports the outcome. */ +async function deployAll( + files: ModuleFile[], + options: Options, + context: DeployContext, + ctx: Context, + initialFailures: number, +): Promise { + const { output, prompts } = ctx + let failures = initialFailures + const reportError = (file: ModuleFile, error: unknown) => { + failures++ + reportFileError(file, error, ctx) + } + const conflicts: ModuleFile[] = [] for (const file of files) { try { - const result = await deployFile(file, { force: options.force, record }) + const result = await deployFile(file, { ...context, force: options.force }) if (result.status === 'conflict') { conflicts.push(file) } else { @@ -215,7 +242,7 @@ async function deploy(names: string[], options: Options, ctx: Context): Promise< } try { - const result = await deployFile(file, { force: true, record }) + const result = await deployFile(file, { ...context, force: true }) if (result.status === 'conflict') { throw new CliError('the target still exists after being moved aside.') } @@ -233,24 +260,39 @@ async function undeploy(names: string[], options: Options, ctx: Context): Promis const run = await prepare('undeploy', names, options, ctx) if (run == null) return - const { files, record } = run + const { files } = run let failures = run.failures - for (const file of files) { - try { - const line = options.dryRun - ? `(${await planUndeploy(file, record)})` - : describeUndeploy(await undeployFile(file, { record })) - output.print(`- ${file.target} ${line}`) - } catch (error) { - failures++ - reportFileError(file, error, ctx) + const undeployEach = async (context: DeployContext) => { + for (const file of files) { + try { + const line = options.dryRun + ? `(${describePlannedUndeploy(await planUndeploy(file, context))})` + : describeUndeploy(await undeployFile(file, context)) + output.print(`- ${file.target} ${line}`) + } catch (error) { + failures++ + reportFileError(file, error, ctx) + } } } + if (options.dryRun) { + await undeployEach(await deployContext(ctx)) + } else { + await withLock(ctx.home, async () => undeployEach(await deployContext(ctx))) + } finish(failures, [], options.dryRun ? 'Dry run finished.' : 'Undeployment finished.', ctx) } +/** Loads the record: call it after taking the lock when files are changed. */ +async function deployContext(ctx: Context): Promise { + return { + record: await DeploymentRecord.load(ctx.home), + guard: new Guard({ home: ctx.home, cwd: ctx.cwd }), + } +} + /** * Selects the modules and files a deploy or undeploy works on, and reports * modules and settings entries that are skipped (they count as failures). @@ -261,7 +303,7 @@ async function prepare( names: string[], options: Options, ctx: Context, -): Promise<{ files: ModuleFile[]; failures: number; record: BackupRecord } | null> { +): Promise<{ files: ModuleFile[]; failures: number } | null> { const { output } = ctx const selected = await selectModules(verb, await loadModules(ctx), names, options, ctx) if (selected.length === 0) return null @@ -306,7 +348,7 @@ async function prepare( ? `Dry run, nothing is changed. ${action} ${moduleNames} would do:` : `${action} ${moduleNames}…`, ) - return { files, failures, record: await BackupRecord.load(ctx.home) } + return { files, failures } } async function selectModules( @@ -398,31 +440,6 @@ function reportFileError(file: ModuleFile, error: unknown, ctx: Context): void { } } -/** What deploying would do, with the same checks as a real deployment. */ -async function planDeploy(file: ModuleFile, options: Options): Promise { - await assertSourceExists(file) - await assertSafeTarget(file) - return decideDeploy(await inspectFile(file), { force: options.force }) -} - -async function planUndeploy(file: ModuleFile, record: BackupRecord): Promise { - await assertSafeTarget(file) - const decision = decideUndeploy(await inspectFile(file)) - - switch (decision.action) { - case 'not-deployed': - return 'not deployed' - case 'keep': - return `would be kept: ${describeKept(decision.state)}` - case 'remove': { - const backup = await record.latest(file.target) - if (backup == null) return 'would be removed' - if (!backup.exists) return `would be removed; its backup ${backup.path} no longer exists` - return `would be removed, ${backup.path} restored` - } - } -} - function describePlannedDeploy( file: ModuleFile, decision: DeployDecision, @@ -435,8 +452,11 @@ function describePlannedDeploy( return 'already up to date' case 'replace': return decision.what === 'copy' - ? `would be replaced, the existing one moved to ${nextBackupPath(file.target)}` - : `would be linked, the existing ${decision.what} moved to ${nextBackupPath(file.target)}` + ? `would be replaced, the existing one moved to ${decision.backup}` + : `would be ${file.strategy === 'global' ? 'linked' : 'copied'}, the existing ` + + `${decision.what} moved to ${decision.backup}` + case 'refresh': + return 'would be linked again (it pointed to an old location of the repository)' case 'conflict': return interactive ? 'already exists: you would be asked whether to replace it' @@ -444,6 +464,17 @@ function describePlannedDeploy( } } +function describePlannedUndeploy(decision: UndeployDecision): string { + switch (decision.action) { + case 'not-deployed': + return 'not deployed' + case 'keep': + return `would be kept: ${describeKept(decision.state)}` + case 'remove': + return `would be removed${describeBackup(decision.backup, 'would be')}` + } +} + function describeState(state: TargetState): string { switch (state.kind) { case 'missing': @@ -451,8 +482,12 @@ function describeState(state: TargetState): string { case 'deployed': return 'deployed' case 'modified': - return 'differs from the repository' - case 'occupied': + return 'modified since it was copied' + case 'identical': + return 'identical to the repository, but not copied by configfile' + case 'stale': + return 'deployed, but linked to an old location of the repository: deploy it again' + case 'foreign': return `not deployed: a ${state.what} is in the way` case 'source-missing': return state.ours @@ -463,15 +498,30 @@ function describeState(state: TargetState): string { function describeKept(state: KeptState): string { switch (state.kind) { - case 'occupied': + case 'foreign': return `the ${state.what} there was not deployed by configfile` + case 'identical': + return 'it is identical to the repository, but configfile did not copy it' case 'modified': - return 'it differs from the repository (modified since it was copied?)' + return 'it was modified since it was copied' case 'source-missing': return 'its source is missing from the repository, so it cannot be compared' } } +/** `, restored` and its variants, for undeploy results and dry runs. */ +function describeBackup(backup: BackupCheck | null, tense: 'would be' | 'was'): string { + if (backup == null) return '' + switch (backup.status) { + case 'ok': + return tense === 'was' ? `, ${backup.path} restored` : `, ${backup.path} restored` + case 'missing': + return `; its backup ${backup.path} no longer exists, nothing ${tense} restored` + case 'changed': + return `; its backup ${backup.path} changed since it was made, so it ${tense === 'was' ? 'was' : 'would be'} not restored` + } +} + function describeDeploy(result: Exclude): string { switch (result.status) { case 'deployed': @@ -485,12 +535,11 @@ function describeDeploy(result: Exclude): function describeUndeploy(result: UndeployResult): string { switch (result.status) { - case 'removed': - if (result.restored != null) return `(removed, ${result.restored} restored)` - if (result.missingBackup != null) { - return `(removed; its backup ${result.missingBackup} no longer exists, nothing restored)` - } - return '(removed)' + case 'removed': { + const leftover = + result.leftover == null ? '' : `; the removed copy could not be deleted: ${result.leftover}` + return `(removed${describeBackup(result.backup, 'was')}${leftover})` + } case 'not-deployed': return '(not deployed)' case 'kept': diff --git a/src/config.ts b/src/config.ts index 282ede3a..598d6a5c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,8 +1,9 @@ import { existsSync } from 'node:fs' -import { readFile, writeFile } from 'node:fs/promises' +import { readFile } from 'node:fs/promises' import path from 'node:path' import { CliError, NotInitializedError } from './errors.js' +import { writeFileAtomic } from './fsutil.js' import { resolveUserPath } from './paths.js' export interface Config { @@ -85,7 +86,8 @@ export class ConfigStore { } try { - await writeFile(this.path, `${JSON.stringify(next, null, 2)}\n`) + // Readable by the user only: the repository URL may contain credentials. + await writeFileAtomic(this.path, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 }) } catch (error) { throw new CliError( `Cannot save the configuration to ${this.path}: ${(error as Error).message}`, diff --git a/src/deploy.ts b/src/deploy.ts index f8240ec3..88420fca 100644 --- a/src/deploy.ts +++ b/src/deploy.ts @@ -1,51 +1,63 @@ import { lstatSync } from 'node:fs' -import { - cp, - lstat, - mkdir, - readdir, - readFile, - readlink, - realpath, - rename, - rm, - stat, - symlink, -} from 'node:fs/promises' +import { cp, mkdir, open, readdir, readlink, realpath, rename, rm, symlink } from 'node:fs/promises' import path from 'node:path' import { CliError } from './errors.js' -import { contains, type ModuleFile } from './repository.js' -import type { BackupRecord } from './state.js' - -/** What is currently at the target of a module file. */ +import { + type Identity, + identityOf, + kindOf, + lstatOrNull, + messageOf, + realpathOfExisting, + removeTree, + sameIdentity, + siblingName, + statOrNull, +} from './fsutil.js' +import { configfilePaths, contains } from './paths.js' +import type { ModuleFile } from './repository.js' +import { type Backup, type DeploymentRecord, isBackupPathOf } from './state.js' + +/** What is currently at the target of a module file, and whose it is. */ export type TargetState = | { kind: 'missing' } - /** Global: the link to the source. Local: a copy identical to the source. */ - | { kind: 'deployed' } - /** Local only: a file or folder that differs from the source. */ - | { kind: 'modified' } - /** Global only: something that is not the link to the source. */ - | { kind: 'occupied'; what: 'file' | 'folder' | 'link' } /** - * Something is at the target but the source is missing from the repository. - * `ours`: it is the link configfile made (global files only). + * Global: a link to the source. Local: an unmodified copy configfile made. + * `recorded`: false for links made before 1.0 (adopted when deploying). */ + | { kind: 'deployed'; recorded: boolean } + /** Local: a copy configfile made, modified since. */ + | { kind: 'modified' } + /** Local: identical to the source, but not copied by configfile. */ + | { kind: 'identical' } + /** Global: the link configfile made, pointing to an old location of the source. */ + | { kind: 'stale' } + /** Something configfile did not put there. */ + | { kind: 'foreign'; what: 'file' | 'folder' | 'link' } + /** Something is there but the source is missing. `ours`: configfile put it there. */ | { kind: 'source-missing'; ours: boolean } -/** A target left in place by `undeploy`, and why. */ -export type KeptState = Extract - export type DeployDecision = | { action: 'up-to-date' } | { action: 'create' } - /** Move what is at the target aside, then deploy. */ - | { action: 'replace'; what: 'file' | 'folder' | 'link' | 'copy' } - /** Local only, without `force`: the target exists and differs from the source. */ + /** Move what is at the target aside (recorded as a backup), then deploy. */ + | { action: 'replace'; what: 'file' | 'folder' | 'link' | 'copy'; backup: string } + /** Replace configfile's own outdated link; nothing is backed up. */ + | { action: 'refresh' } + /** The target exists and differs; replaced only with `force`. */ | { action: 'conflict' } +export type KeptState = Extract< + TargetState, + { kind: 'modified' | 'identical' | 'foreign' | 'source-missing' } +> + +/** The backup undeploy would put back, and whether it can. */ +export type BackupCheck = { path: string; status: 'ok' | 'missing' | 'changed' } + export type UndeployDecision = - | { action: 'remove' } + | { action: 'remove'; backup: BackupCheck | null } | { action: 'not-deployed' } | { action: 'keep'; state: KeptState } @@ -56,158 +68,210 @@ export type DeployResult = | { status: 'conflict' } export type UndeployResult = - /** `missingBackup`: a recorded backup that was deleted since, so nothing could be restored. */ - | { status: 'removed'; restored: string | null; missingBackup: string | null } + | { + status: 'removed' + /** The backup that was checked (restored when its status is `ok`), or `null`. */ + backup: BackupCheck | null + /** A removed copy that could not be deleted, left at this path. */ + leftover: string | null + } | { status: 'not-deployed' } | { status: 'kept'; state: KeptState } -/** The single place deciding what deploying a file does; dry runs use it too. */ -export function decideDeploy(state: TargetState, { force }: { force: boolean }): DeployDecision { +/** What deploying and undeploying need besides the file itself. */ +export interface DeployContext { + readonly record: DeploymentRecord + readonly guard: Guard +} + +// --------------------------------------------------------------------------- +// Inspecting and deciding (shared by dry runs and real runs) + +export async function inspectFile( + file: ModuleFile, + record: DeploymentRecord, +): Promise { + const existing = await lstatOrNull(file.target) + if (existing == null) return { kind: 'missing' } + + const recorded = (await record.find(file.target))?.deployed + const recordedHere = sameIdentity(recorded?.identity, identityOf(existing)) + const pointsToSource = + existing.isSymbolicLink() && + path.resolve(path.dirname(file.target), await readlink(file.target)) === file.source + const sourceExists = (await lstatOrNull(file.source)) != null + + if (file.strategy === 'global') { + if (!sourceExists) return { kind: 'source-missing', ours: pointsToSource || recordedHere } + if (pointsToSource) return { kind: 'deployed', recorded: recordedHere } + // Our own link, to a source that no longer exists (the repository moved). + // A link to another existing source (another module) is not ours to replace. + const recordedSourceGone = + recorded != null && + recorded.source !== file.source && + (await lstatOrNull(recorded.source)) == null + if (recordedHere && existing.isSymbolicLink() && recordedSourceGone) return { kind: 'stale' } + return { kind: 'foreign', what: kindOf(existing) } + } + + if (!sourceExists) return { kind: 'source-missing', ours: false } + const same = await sameContent(file.source, file.target) + if (recordedHere) return same ? { kind: 'deployed', recorded: true } : { kind: 'modified' } + return same ? { kind: 'identical' } : { kind: 'foreign', what: kindOf(existing) } +} + +/** What deploying `file` would do. Runs every check a real deployment runs. */ +export async function planDeploy( + file: ModuleFile, + { force, record, guard }: DeployContext & { force: boolean }, +): Promise { + await assertUsableSource(file) + await guard.check(file) + + const state = await inspectFile(file, record) switch (state.kind) { case 'missing': return { action: 'create' } case 'deployed': + case 'identical': return { action: 'up-to-date' } - case 'occupied': - return { action: 'replace', what: state.what } + case 'stale': + return { action: 'refresh' } case 'modified': - return force ? { action: 'replace', what: 'copy' } : { action: 'conflict' } + return force + ? { action: 'replace', what: 'copy', backup: nextBackupPath(file.target) } + : { action: 'conflict' } + case 'foreign': + if (file.strategy === 'local' && !force) return { action: 'conflict' } + return { action: 'replace', what: state.what, backup: nextBackupPath(file.target) } case 'source-missing': - // Deploying checks the source first, so this only happens in a race. + // assertUsableSource checked the source: it disappeared meanwhile. throw new CliError('the source file is missing from the repository.') } } -/** The single place deciding what undeploying a file does; dry runs use it too. */ -export function decideUndeploy(state: TargetState): UndeployDecision { +/** What undeploying `file` would do. Runs every check a real undeployment runs. */ +export async function planUndeploy( + file: ModuleFile, + { record, guard }: DeployContext, +): Promise { + await guard.check(file) + + const state = await inspectFile(file, record) switch (state.kind) { case 'missing': return { action: 'not-deployed' } case 'deployed': - return { action: 'remove' } + case 'stale': + return { action: 'remove', backup: await checkLatestBackup(file.target, record) } case 'source-missing': - return state.ours ? { action: 'remove' } : { action: 'keep', state } - case 'occupied': + return state.ours && file.strategy === 'global' + ? { action: 'remove', backup: await checkLatestBackup(file.target, record) } + : { action: 'keep', state } case 'modified': + case 'identical': + case 'foreign': return { action: 'keep', state } } } -export async function inspectFile(file: ModuleFile): Promise { - const existing = await lstatOrNull(file.target) - if (existing == null) return { kind: 'missing' } - - const pointsToSource = - existing.isSymbolicLink() && - path.resolve(path.dirname(file.target), await readlink(file.target)) === file.source - - if ((await lstatOrNull(file.source)) == null) { - return { kind: 'source-missing', ours: file.strategy === 'global' && pointsToSource } - } - - if (file.strategy === 'local') { - return (await sameContent(file.source, file.target)) - ? { kind: 'deployed' } - : { kind: 'modified' } - } - - if (pointsToSource) return { kind: 'deployed' } - if (existing.isSymbolicLink()) return { kind: 'occupied', what: 'link' } - return { kind: 'occupied', what: existing.isDirectory() ? 'folder' : 'file' } -} +// --------------------------------------------------------------------------- +// Deploying and undeploying (callers hold the lock, see `withLock`) /** - * Deploys a file: global files are symlinked, local files are copied. + * Deploys a file: global files are symlinked, local files are copied (links + * followed, so the copy never points into the repository). * - * Anything already at the target that is not the deployed file is moved aside - * to `.old` (or `.old.1`, …) and recorded, so that `undeployFile` can - * restore it. For local files this only happens with `force`; otherwise a - * `conflict` is returned. + * Anything in the way that configfile did not put there is moved aside to + * `.old` (or `.old.1`, …) and recorded before it is moved, so that + * `undeployFile` can restore it. For local files this only happens with + * `force`; otherwise a `conflict` is returned. */ export async function deployFile( file: ModuleFile, - { force = false, record }: { force?: boolean; record: BackupRecord }, + context: DeployContext & { force?: boolean }, ): Promise { - await assertSourceExists(file) - await assertSafeTarget(file) + const { record } = context + const decision = await planDeploy(file, { ...context, force: context.force ?? false }) - const decision = decideDeploy(await inspectFile(file), { force }) - if (decision.action === 'up-to-date') return { status: 'up-to-date' } if (decision.action === 'conflict') return { status: 'conflict' } + if (decision.action === 'up-to-date') { + // Adopt links made before 1.0, so that undeploy knows they are ours. + const stats = await lstatOrNull(file.target) + const known = (await record.find(file.target))?.deployed + if (stats != null && !sameIdentity(known?.identity, identityOf(stats))) { + if (file.strategy === 'global') await recordDeployed(file, record) + } + return { status: 'up-to-date' } + } await mkdir(path.dirname(file.target), { recursive: true }) + if (decision.action === 'refresh') { + await rm(file.target) + } + let backup: string | null = null if (decision.action === 'replace') { - backup = nextBackupPath(file.target) - await rename(file.target, backup) - try { - await record.add(file.target, backup) - } catch (error) { - // Without a record, undeploy could not restore it: put it back and stop. - await rename(backup, file.target).catch(() => { - throw new CliError(`${(error as Error).message} The previous file is in ${backup}.`) - }) - throw error - } + backup = decision.backup + await moveAside(file.target, backup, record) } try { if (file.strategy === 'global') { await symlink(file.source, file.target) } else { - // verbatimSymlinks: links inside a copied folder stay identical to the source. - await cp(file.source, file.target, { - recursive: true, - errorOnExist: true, - force: false, - verbatimSymlinks: true, - }) + await copyInto(file.source, file.target) } } catch (error) { - throw await undoFailedDeploy(file.target, backup, record, error) + throw await putBackAfterFailure(file.target, backup, record, error) } + await recordDeployed(file, record) return backup == null ? { status: 'deployed' } : { status: 'backed-up', backup } } /** - * Removes a deployed file (the link, or a copy that was not modified since), - * then puts back the most recent backup configfile made of it, if any. Other - * `.old` files are never touched. + * Removes what configfile deployed (its link, or its copy when unmodified), + * then puts back the most recent backup it made, if that backup is unchanged. + * Nothing configfile did not create is ever removed. */ export async function undeployFile( file: ModuleFile, - { record }: { record: BackupRecord }, + context: DeployContext, ): Promise { - await assertSafeTarget(file) + const { record } = context + const decision = await planUndeploy(file, context) - const decision = decideUndeploy(await inspectFile(file)) if (decision.action === 'not-deployed') return { status: 'not-deployed' } if (decision.action === 'keep') return { status: 'kept', state: decision.state } - // Checked before removing anything, so a problem never leaves the target empty. - const backup = await record.latest(file.target) + // Moved aside first: if the backup cannot be put back, the deployed file returns. + const removed = siblingName(file.target, 'undeploy') + await rename(file.target, removed) - await rm(file.target, { recursive: true }) + const { backup } = decision + if (backup?.status === 'ok') { + try { + await rename(backup.path, file.target) + } catch (error) { + await rename(removed, file.target).catch(() => {}) + throw new CliError(`Cannot put the backup ${backup.path} back: ${messageOf(error)}`) + } + } - if (backup == null) return { status: 'removed', restored: null, missingBackup: null } - if (!backup.exists) { - await record.remove(file.target, backup.path) - return { status: 'removed', restored: null, missingBackup: backup.path } + await record.setDeployed(file.target, null) + if (backup != null && backup.status !== 'changed') { + await record.removeBackup(file.target, backup.path) } + let leftover: string | null = null try { - await rename(backup.path, file.target) - } catch (error) { - throw new CliError( - `${file.target} was removed, but its backup ${backup.path} could not be put back: ` + - `${(error as Error).message}`, - ) + await removeTree(removed) + } catch { + leftover = removed } - await record.remove(file.target, backup.path) - - return { status: 'removed', restored: backup.path, missingBackup: null } + return { status: 'removed', backup, leftover } } /** The name the next backup of `target` will get. */ @@ -222,127 +286,274 @@ export function nextBackupPath(target: string): string { return backup } -/** Fails with a readable message when the source of `file` is missing or unreadable. */ -export async function assertSourceExists(file: ModuleFile): Promise { - try { - await stat(file.source) - } catch (error) { - const code = (error as NodeJS.ErrnoException).code - throw new CliError( - code === 'ENOENT' - ? `Source file ${file.source} does not exist.` - : `Cannot read source file ${file.source}: ${(error as Error).message}`, - ) +// --------------------------------------------------------------------------- +// Safety checks + +/** + * The source must exist and really be inside its module folder, links + * included: a repository must not be able to deploy files from elsewhere + * (for example `~/.ssh`). Links inside a local folder are checked too, since + * copies follow them. + */ +export async function assertUsableSource(file: ModuleFile): Promise { + const stats = await statOrNull(file.source).catch(error => { + throw new CliError(`Cannot read source file ${file.source}: ${messageOf(error)}`) + }) + if (stats == null) throw new CliError(`Source file ${file.source} does not exist.`) + + const module = await realpath(file.module) + const assertInside = async (link: string) => { + const real = await realpath(link).catch(() => null) + if (real == null) throw new CliError(`${link} is a broken symbolic link.`) + if (!contains(module, real)) { + throw new CliError(`${link} leads outside the module folder (${real}).`) + } + } + + await assertInside(file.source) + if (file.strategy === 'local' && stats.isDirectory()) { + await walkLinks(await realpath(file.source), assertInside) } } /** - * Refuses targets that are, through symbolic links, inside the repository or - * one of its parents (settings are checked on paths as written; this checks - * where they really lead). The target itself is not followed: it may be the - * deployed link. + * Visits every link of `folder`, following links to folders. A link to a + * folder containing it would make the copy endless, so it is refused. */ -export async function assertSafeTarget(file: ModuleFile): Promise { - const repository = await realpath(file.repository) - const target = path.join( - await realpathOfExisting(path.dirname(file.target)), - path.basename(file.target), - ) - - if (contains(repository, target) || contains(target, repository)) { - throw new CliError( - `the target leads into the dotfiles repository (${repository}) through a symbolic link. ` + - 'Deploying there would change the repository itself.', - ) +async function walkLinks(folder: string, visit: (link: string) => Promise): Promise { + for (const entry of await readdir(folder, { withFileTypes: true })) { + const entryPath = path.join(folder, entry.name) + if (entry.isSymbolicLink()) { + await visit(entryPath) + const real = await realpath(entryPath) + if ((await statOrNull(real))?.isDirectory()) { + if (contains(real, folder)) { + throw new CliError(`${entryPath} leads to a folder containing it, which makes a loop.`) + } + await walkLinks(real, visit) + } + } else if (entry.isDirectory()) { + await walkLinks(entryPath, visit) + } + } +} + +/** + * Refuses targets that are, by identity (whatever their letter case or the + * links used to reach them), the home folder, the current folder, the + * repository, the module, configfile's own files, one of their parents, or + * inside the repository, the module or configfile's working folder. + */ +export class Guard { + readonly #home: string + readonly #cwd: string + readonly #ancestors = new Map>>() + + constructor({ home, cwd }: { home: string; cwd: string }) { + this.#home = home + this.#cwd = cwd + } + + async check(file: ModuleFile): Promise { + const own = configfilePaths(this.#home) + const stats = await lstatOrNull(file.target) + + if (stats != null && !stats.isSymbolicLink()) { + const replaced = [ + [this.#home, 'the home folder'], + [this.#cwd, 'the current folder'], + [file.repository, 'the dotfiles repository'], + [file.module, 'the module folder'], + [own.dir, "configfile's working folder"], + [own.rc, "configfile's configuration"], + ] as const + for (const [protectedPath, label] of replaced) { + const ancestors = await this.#ancestorsOf(protectedPath) + if (ancestors.has(key(identityOf(stats)))) { + throw new CliError(`the target would replace ${label} (${protectedPath}).`) + } + } + } + + const parents = await this.#ancestorsOf(path.dirname(file.target)) + for (const [protectedPath, label] of [ + [file.repository, 'the dotfiles repository'], + [file.module, 'the module folder'], + [own.dir, "configfile's working folder"], + ] as const) { + const identity = await statOrNull(protectedPath) + if (identity != null && parents.has(key(identityOf(identity)))) { + throw new CliError( + `the target is inside ${label} (${protectedPath}), possibly through a symbolic link.`, + ) + } + } + } + + /** Identities of `target` (links followed) and of all its parents, up to `/`. */ + #ancestorsOf(target: string): Promise> { + let cached = this.#ancestors.get(target) + if (cached == null) { + cached = (async () => { + const identities = new Map() + let current = await realpathOfExisting(target) + for (;;) { + const stats = await statOrNull(current) + if (stats != null) identities.set(key(identityOf(stats)), current) + const parent = path.dirname(current) + if (parent === current) return identities + current = parent + } + })() + this.#ancestors.set(target, cached) + } + return cached + } +} + +function key(identity: Identity): string { + return `${identity.dev}:${identity.ino}` +} + +// --------------------------------------------------------------------------- +// File operations + +async function recordDeployed(file: ModuleFile, record: DeploymentRecord): Promise { + const stats = await lstatOrNull(file.target) + if (stats == null) return + await record.setDeployed(file.target, { + strategy: file.strategy, + source: file.source, + identity: identityOf(stats), + }) +} + +/** Records the backup first, so that a crash never leaves an unknown `.old` file. */ +async function moveAside(target: string, backup: string, record: DeploymentRecord): Promise { + const stats = await lstatOrNull(target) + if (stats == null) return + await record.addBackup(target, { + path: backup, + identity: identityOf(stats), + kind: kindOf(stats), + modified: stats.mtimeMs, + }) + try { + await rename(target, backup) + } catch (error) { + await record.removeBackup(target, backup) + throw error } } -/** Real path of `target`, or of its closest existing parent followed by the rest. */ -async function realpathOfExisting(target: string): Promise { +/** Copies through a temporary sibling, so an interrupted copy never sits at the target. */ +async function copyInto(source: string, target: string): Promise { + const temporary = siblingName(target, 'copy') try { - return await realpath(target) + await cp(source, temporary, { + recursive: true, + dereference: true, + errorOnExist: true, + force: false, + }) + await rename(temporary, target) } catch (error) { - const parent = path.dirname(target) - if ((error as NodeJS.ErrnoException).code !== 'ENOENT' || parent === target) throw error - return path.join(await realpathOfExisting(parent), path.basename(target)) + await removeTree(temporary).catch(() => {}) + throw error } } -/** - * After a failed deployment: removes what was partly created at the target and - * puts the backup back. Explains where things are when that is not possible. - */ -async function undoFailedDeploy( +/** After a failed deployment, puts the backup back and explains where things are. */ +async function putBackAfterFailure( target: string, backup: string | null, - record: BackupRecord, + record: DeploymentRecord, error: unknown, ): Promise { - const reason = (error as Error).message - - // EEXIST: something else created the target meanwhile; it is not ours to remove. - if ((error as NodeJS.ErrnoException).code !== 'EEXIST') { - try { - await rm(target, { recursive: true, force: true }) - } catch (cleanupError) { - return new CliError( - `${reason} A partial copy was left at ${target} (${(cleanupError as Error).message})` + - (backup == null ? '.' : `; the previous file is in ${backup}.`), - ) - } - } - + const reason = messageOf(error) if (backup == null) return new CliError(reason) try { await rename(backup, target) - await record.remove(target, backup) + await record.removeBackup(target, backup) return new CliError(reason) } catch (restoreError) { return new CliError( `${reason} The previous file is in ${backup} (it could not be put back: ` + - `${(restoreError as Error).message}).`, + `${messageOf(restoreError)}).`, ) } } -/** Compares files, folders (recursively) and symlinks without following links. */ -async function sameContent(a: string, b: string): Promise { - const [statsA, statsB] = await Promise.all([lstatOrNull(a), lstatOrNull(b)]) - if (statsA == null || statsB == null) return false - - if (statsA.isSymbolicLink() || statsB.isSymbolicLink()) { - return ( - statsA.isSymbolicLink() && - statsB.isSymbolicLink() && - (await readlink(a)) === (await readlink(b)) - ) - } +/** The most recent recorded backup of `target`, and whether it can be restored as is. */ +async function checkLatestBackup( + target: string, + record: DeploymentRecord, +): Promise { + const backup: Backup | undefined = (await record.find(target))?.backups.at(-1) + if (backup == null || !isBackupPathOf(target, backup.path)) return null + + const stats = await lstatOrNull(backup.path).catch(error => { + throw new CliError(`Cannot check the backup ${backup.path}: ${messageOf(error)}`) + }) + if (stats == null) return { path: backup.path, status: 'missing' } + const replaced = + (backup.identity != null && !sameIdentity(backup.identity, identityOf(stats))) || + (backup.kind != null && backup.kind !== kindOf(stats)) || + (backup.modified != null && backup.modified !== stats.mtimeMs) + if (replaced) return { path: backup.path, status: 'changed' } + return { path: backup.path, status: 'ok' } +} - if (statsA.isDirectory() && statsB.isDirectory()) { - const [namesA, namesB] = await Promise.all([readdir(a), readdir(b)]) - namesA.sort() - namesB.sort() - if (namesA.length !== namesB.length || namesA.some((name, i) => name !== namesB[i])) { +/** + * Whether the local copy `target` has the content of `source`. Links in the + * source are followed (copies follow them); a link at the target never matches. + */ +async function sameContent(source: string, target: string): Promise { + const [sourceStats, targetStats] = await Promise.all([statOrNull(source), lstatOrNull(target)]) + if (sourceStats == null || targetStats == null || targetStats.isSymbolicLink()) return false + + if (sourceStats.isDirectory() && targetStats.isDirectory()) { + const [sourceNames, targetNames] = await Promise.all([readdir(source), readdir(target)]) + sourceNames.sort() + targetNames.sort() + if ( + sourceNames.length !== targetNames.length || + sourceNames.some((name, i) => name !== targetNames[i]) + ) { return false } - for (const name of namesA) { - if (!(await sameContent(path.join(a, name), path.join(b, name)))) return false + for (const name of sourceNames) { + if (!(await sameContent(path.join(source, name), path.join(target, name)))) return false } return true } - if (statsA.isFile() && statsB.isFile()) { - return statsA.size === statsB.size && (await readFile(a)).equals(await readFile(b)) + if (sourceStats.isFile() && targetStats.isFile()) { + return sourceStats.size === targetStats.size && (await sameBytes(source, target)) } return false } -async function lstatOrNull(target: string) { +/** Compares two files of the same size by chunks, whatever their size. */ +async function sameBytes(a: string, b: string): Promise { + const [handleA, handleB] = await Promise.all([open(a, 'r'), open(b, 'r')]) try { - return await lstat(target) - } catch (error) { - if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null - throw error + const size = 64 * 1024 + const bufferA = Buffer.alloc(size) + const bufferB = Buffer.alloc(size) + for (;;) { + const [readA, readB] = await Promise.all([ + handleA.read(bufferA, 0, size, null), + handleB.read(bufferB, 0, size, null), + ]) + if (readA.bytesRead !== readB.bytesRead) return false + if (readA.bytesRead === 0) return true + if (!bufferA.subarray(0, readA.bytesRead).equals(bufferB.subarray(0, readB.bytesRead))) { + return false + } + } + } finally { + await Promise.all([handleA.close(), handleB.close()]) } } diff --git a/src/fsutil.ts b/src/fsutil.ts new file mode 100644 index 00000000..b93f15d3 --- /dev/null +++ b/src/fsutil.ts @@ -0,0 +1,110 @@ +import { randomBytes } from 'node:crypto' +import type { Stats } from 'node:fs' +import { chmod, lstat, open, readdir, realpath, rename, rm, stat } from 'node:fs/promises' +import path from 'node:path' + +/** Identifies a file or folder independently of the path used to reach it. */ +export interface Identity { + readonly dev: number + readonly ino: number +} + +export function errnoCode(error: unknown): string | undefined { + return (error as NodeJS.ErrnoException | null)?.code +} + +export function messageOf(error: unknown): string { + return error instanceof Error ? error.message : String(error) +} + +/** `lstat`, or `null` when nothing exists at `target`. Other errors are thrown. */ +export async function lstatOrNull(target: string): Promise { + try { + return await lstat(target) + } catch (error) { + if (errnoCode(error) === 'ENOENT') return null + throw error + } +} + +/** `stat` (following links), or `null` when nothing exists there. Other errors are thrown. */ +export async function statOrNull(target: string): Promise { + try { + return await stat(target) + } catch (error) { + if (errnoCode(error) === 'ENOENT') return null + throw error + } +} + +export function identityOf(stats: Stats): Identity { + return { dev: stats.dev, ino: stats.ino } +} + +export function sameIdentity(a: Identity | null | undefined, b: Identity | null | undefined) { + return a != null && b != null && a.dev === b.dev && a.ino === b.ino +} + +export function kindOf(stats: Stats): 'file' | 'folder' | 'link' { + if (stats.isSymbolicLink()) return 'link' + return stats.isDirectory() ? 'folder' : 'file' +} + +/** Real path of `target`, or of its closest existing parent followed by the rest. */ +export async function realpathOfExisting(target: string): Promise { + try { + return await realpath(target) + } catch (error) { + const parent = path.dirname(target) + if (errnoCode(error) !== 'ENOENT' || parent === target) throw error + return path.join(await realpathOfExisting(parent), path.basename(target)) + } +} + +/** A name next to `target` that nothing else uses, for temporary copies. */ +export function siblingName(target: string, purpose: string): string { + const random = randomBytes(4).toString('hex') + return path.join( + path.dirname(target), + `.${path.basename(target)}.configfile-${purpose}-${process.pid}-${random}`, + ) +} + +/** + * Writes `content` to `file` through a new temporary file, so readers never + * see a half-written file. The temporary file is created exclusively, so a + * planted symbolic link is never followed. + */ +export async function writeFileAtomic( + file: string, + content: string, + { mode }: { mode: number }, +): Promise { + const temporary = siblingName(file, 'write') + const handle = await open(temporary, 'wx', mode) + try { + await handle.writeFile(content) + } finally { + await handle.close() + } + try { + await rename(temporary, file) + } catch (error) { + await rm(temporary, { force: true }) + throw error + } +} + +/** Deletes a file or folder, including read-only subfolders. Never follows links. */ +export async function removeTree(target: string): Promise { + const stats = await lstatOrNull(target) + if (stats == null) return + + if (stats.isDirectory()) { + await chmod(target, 0o700) + for (const name of await readdir(target)) { + await removeTree(path.join(target, name)) + } + } + await rm(target, { recursive: true, force: true }) +} diff --git a/src/lock.ts b/src/lock.ts new file mode 100644 index 00000000..394e52f2 --- /dev/null +++ b/src/lock.ts @@ -0,0 +1,78 @@ +import { mkdir, open, readFile, rm } from 'node:fs/promises' +import path from 'node:path' +import { setTimeout as sleep } from 'node:timers/promises' + +import { CliError } from './errors.js' +import { errnoCode } from './fsutil.js' +import { configfilePaths } from './paths.js' + +const RETRY_DELAY_MS = 100 +const MAX_WAIT_MS = 10_000 + +/** + * Runs `task` while holding `~/.configfile/lock`, so that two configfile + * processes never change the same files or the deployment record at once. + * Waits a little for another process to finish, and takes over the lock of a + * process that no longer exists. + */ +export async function withLock( + home: string, + task: () => Promise, + { maxWaitMs = MAX_WAIT_MS }: { maxWaitMs?: number } = {}, +): Promise { + const lock = path.join(configfilePaths(home).dir, 'lock') + await mkdir(path.dirname(lock), { recursive: true, mode: 0o700 }) + + const started = Date.now() + for (;;) { + try { + const handle = await open(lock, 'wx', 0o600) + await handle.writeFile(String(process.pid)) + await handle.close() + break + } catch (error) { + if (errnoCode(error) !== 'EEXIST') throw error + } + + const content = await readFile(lock, 'utf8').catch(() => '') + const owner = Number.parseInt(content, 10) + // An empty lock is being created by another process: wait for its pid. + if (content !== '' && !isRunning(owner)) { + // Re-read just before removing, so a lock another process has just taken is kept. + if ((await readFile(lock, 'utf8').catch(() => '')) === content) { + await rm(lock, { force: true }) + } + continue + } + if (Date.now() - started > maxWaitMs) { + const who = Number.isNaN(owner) + ? 'Another configfile' + : `Another configfile (process ${owner})` + throw new CliError( + `${who} is changing files. Try again when it is done, ` + + `or delete ${lock} if no configfile is running.`, + ) + } + await sleep(RETRY_DELAY_MS) + } + + try { + return await task() + } finally { + // Only remove our own lock. + if ((await readFile(lock, 'utf8').catch(() => '')) === String(process.pid)) { + await rm(lock, { force: true }) + } + } +} + +function isRunning(pid: number): boolean { + if (!Number.isInteger(pid) || pid <= 0) return false + try { + process.kill(pid, 0) + return true + } catch (error) { + // EPERM: the process exists but belongs to someone else. + return errnoCode(error) === 'EPERM' + } +} diff --git a/src/output.ts b/src/output.ts index e932cf21..6d3f67b9 100644 --- a/src/output.ts +++ b/src/output.ts @@ -19,7 +19,7 @@ export class Output { } print(message: string): void { - this.stdout.write(`${message}\n`) + this.stdout.write(`${escapeControls(message)}\n`) } info(message: string): void { @@ -48,7 +48,9 @@ export class Output { const style = (format: Style, text: string) => styleText(format, text, { stream: stream as NodeJS.WriteStream }) - stream.write(`${style(labelStyle, ` ${label} `)} ${style(textStyle, message)}\n`) + stream.write( + `${style(labelStyle, ` ${label} `)} ${style(textStyle, escapeControls(message))}\n`, + ) } } @@ -56,3 +58,24 @@ export class Output { export function plural(count: number, noun: string): string { return `${count} ${noun}${count === 1 ? '' : 's'}` } + +/** + * Shows control characters (terminal escape sequences, carriage returns, + * newlines…) as visible escapes, so that paths and names coming from a + * repository can never rewrite or hide what configfile prints. + */ +export function escapeControls(text: string): string { + // biome-ignore lint/suspicious/noControlCharactersInRegex: matching them is the point. + return text.replace(/[\u0000-\u001f\u007f-\u009f]/g, character => { + switch (character) { + case '\n': + return '\\n' + case '\r': + return '\\r' + case '\t': + return '\\t' + default: + return `\\x${character.charCodeAt(0).toString(16).padStart(2, '0')}` + } + }) +} diff --git a/src/paths.ts b/src/paths.ts index 6076df55..ae010595 100644 --- a/src/paths.ts +++ b/src/paths.ts @@ -17,3 +17,14 @@ export function slugify(name: string): string { .replace(/ /g, '-') .replace(/[^\w-]+/g, '') } + +/** Whether `child` is `parent` or inside it (paths are compared as text). */ +export function contains(parent: string, child: string): boolean { + const relative = path.relative(parent, child) + return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative)) +} + +/** Where configfile keeps its own files. Deployments must never touch them. */ +export function configfilePaths(home: string): { rc: string; dir: string } { + return { rc: path.join(home, '.configfilerc'), dir: path.join(home, '.configfile') } +} diff --git a/src/repository.ts b/src/repository.ts index ce0c63d6..a007e744 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -4,10 +4,10 @@ import path from 'node:path' import type { Context } from './context.js' import { CliError } from './errors.js' -import { resolveUserPath, slugify } from './paths.js' +import { configfilePaths, contains, resolveUserPath, slugify } from './paths.js' export interface ModuleFile { - /** Absolute path of the file inside the dotfiles repository. */ + /** Absolute path of the file inside its module folder. */ readonly source: string /** Absolute path where the file is deployed. Never inside the repository. */ readonly target: string @@ -15,6 +15,8 @@ export interface ModuleFile { readonly strategy: 'global' | 'local' /** Absolute path of the dotfiles repository the file comes from. */ readonly repository: string + /** Absolute path of the module folder (it may be a symbolic link to elsewhere). */ + readonly module: string } interface ModuleBase { @@ -125,7 +127,9 @@ async function readModuleFiles( return { error: `settings.json is not valid JSON (${(error as Error).message})` } } - const entries: unknown = (settings as { files?: unknown } | null)?.files + // configfile 0.3.1 wrote the list of files at the top level of settings.json. + const legacyList = Array.isArray(settings) + const entries: unknown = legacyList ? settings : (settings as { files?: unknown } | null)?.files if (!Array.isArray(entries)) { return { error: 'settings.json has no "files" list' } } @@ -154,6 +158,15 @@ async function readModuleFiles( invalid('"source_path" is missing') continue } + const resolvedSource = path.resolve(modulePath, source) + if ( + path.isAbsolute(source) || + resolvedSource === modulePath || + !contains(modulePath, resolvedSource) + ) { + invalid(`"source_path" (${source}) must name a file or folder inside the module folder`) + continue + } switch (strategy) { case 'invalid': @@ -175,26 +188,34 @@ async function readModuleFiles( cwd: strategy === 'global' ? env.home : env.cwd, }) - const problem = unsafeTarget(resolvedTarget, { ...env, repository }) + const problem = unsafeTarget(resolvedTarget, { ...env, repository, module: modulePath }) if (problem != null) { invalid(`"target_path" (${target}) ${problem}`) continue } files.push({ - source: path.resolve(modulePath, source), + source: resolvedSource, target: resolvedTarget, strategy, repository, + module: modulePath, }) } - const deprecations = usesLegacyKey - ? [ - '"global": true | false is deprecated and will stop working in 2.0. ' + - 'Use "deploy": "global" | "local" instead', - ] - : [] + const deprecations: string[] = [] + if (legacyList) { + deprecations.push( + 'settings.json is a list (configfile 0.3 format), which is deprecated and will stop ' + + 'working in 2.0. Put the list in a "files" key: { "files": [ ... ] }', + ) + } + if (usesLegacyKey) { + deprecations.push( + '"global": true | false is deprecated and will stop working in 2.0. ' + + 'Use "deploy": "global" | "local" instead', + ) + } return { error: null, files, undecided, invalidEntries, deprecations } } @@ -203,20 +224,38 @@ async function readModuleFiles( * Why deploying to `target` could destroy something important, or `null`. * Deploying moves whatever is at the target aside, so the target must not be * the home folder, the current folder, the repository, one of their parents, - * or anything inside the repository. + * anything inside the repository or the module, or configfile's own files. + * + * Paths are compared as written; deploying checks them again by identity. */ export function unsafeTarget( target: string, - { home, cwd, repository }: { home: string; cwd: string; repository: string }, + { + home, + cwd, + repository, + module, + }: { home: string; cwd: string; repository: string; module: string }, ): string | null { + const own = configfilePaths(home) + for (const [folder, label] of [ [home, 'the home folder'], [cwd, 'the current folder'], [repository, 'the dotfiles repository'], + [module, 'the module folder'], + [own.rc, "configfile's configuration"], + [own.dir, "configfile's working folder"], ] as const) { if (contains(target, folder)) return `would replace ${label} (${folder})` } - if (contains(repository, target)) return `is inside the dotfiles repository (${repository})` + for (const [folder, label] of [ + [repository, 'the dotfiles repository'], + [module, 'the module folder'], + [own.dir, "configfile's working folder"], + ] as const) { + if (contains(folder, target)) return `is inside ${label} (${folder})` + } return null } @@ -323,12 +362,6 @@ function isUsableName( return true } -/** Whether `child` is `parent` or inside it (paths are compared as text). */ -export function contains(parent: string, child: string): boolean { - const relative = path.relative(parent, child) - return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative)) -} - function errorCode(error: unknown): string { return (error as NodeJS.ErrnoException).code ?? (error as Error).message } diff --git a/src/state.ts b/src/state.ts index cd5700f9..04b4f5ac 100644 --- a/src/state.ts +++ b/src/state.ts @@ -1,109 +1,222 @@ -import { lstat, mkdir, readFile, rename, writeFile } from 'node:fs/promises' +import { mkdir, readFile } from 'node:fs/promises' import path from 'node:path' import { CliError } from './errors.js' +import { + type Identity, + identityOf, + lstatOrNull, + messageOf, + realpathOfExisting, + sameIdentity, + writeFileAtomic, +} from './fsutil.js' +import { configfilePaths } from './paths.js' + +/** A file configfile moved aside, as it was when moved. */ +export interface Backup { + readonly path: string + /** `null` only for backups recorded before 1.0 (not verifiable). */ + readonly identity: Identity | null + readonly kind: 'file' | 'folder' | 'link' | null + /** + * Modification time when moved aside (a rename keeps it). With the + * identity, it tells the backup from a new file that reused its inode + * number, which some file systems do as soon as a file is deleted. + */ + readonly modified?: number | null +} + +/** What configfile put at a target. */ +export interface Deployed { + readonly strategy: 'global' | 'local' + readonly source: string + readonly identity: Identity +} + +/** Everything configfile knows about one target. */ +export interface TargetRecord { + readonly target: string + readonly deployed: Deployed | null + /** Oldest first. */ + readonly backups: readonly Backup[] +} /** On-disk shape of `~/.configfile/state.json`. Unknown keys are preserved. */ interface RawState { - /** For each target, the backups configfile made of it, oldest first. */ + version?: number + targets?: Record + /** Version 1 (pre-1.0 development builds): backup paths per target. */ backups?: Record [key: string]: unknown } /** - * The backups (`.old`, …) configfile made when deploying, stored in - * `~/.configfile/state.json`. Undeploying only restores these, never a `.old` - * file created by someone else. + * The record of what configfile deployed and of the backups it made, stored + * in `~/.configfile/state.json`. Undeploying only removes what is recorded + * here (or links pointing to their source) and only restores recorded + * backups that are unchanged. + * + * Changes are saved immediately; callers hold the lock (see `withLock`) + * while they change files and this record. */ -export class BackupRecord { +export class DeploymentRecord { readonly path: string - #state: RawState + #state: RawState & { targets: Record } private constructor(filePath: string, state: RawState) { this.path = filePath - this.#state = state + this.#state = { ...state, version: 2, targets: state.targets ?? {} } } - static async load(home: string): Promise { - const filePath = path.join(home, '.configfile', 'state.json') + static async load(home: string): Promise { + const filePath = path.join(configfilePaths(home).dir, 'state.json') let content: string try { content = await readFile(filePath, 'utf8') } catch (error) { - if ((error as NodeJS.ErrnoException).code === 'ENOENT') return new BackupRecord(filePath, {}) - throw new CliError(`Cannot read ${filePath}: ${(error as Error).message}`) + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + return new DeploymentRecord(filePath, {}) + } + throw new CliError(`Cannot read ${filePath}: ${messageOf(error)}`) } let state: unknown try { state = JSON.parse(content) } catch (error) { - throw new CliError(`${filePath} is not valid JSON (${(error as Error).message}).`) + throw new CliError(`${filePath} is not valid JSON (${messageOf(error)}).`) } - const backups = (state as RawState | null)?.backups - const valid = - state != null && - typeof state === 'object' && - !Array.isArray(state) && - (backups === undefined || - (typeof backups === 'object' && - backups !== null && - Object.values(backups).every( - list => Array.isArray(list) && list.every(item => typeof item === 'string'), - ))) - if (!valid) { + if (state == null || typeof state !== 'object' || Array.isArray(state)) { throw new CliError(`${filePath} is not a valid configfile state file.`) } - return new BackupRecord(filePath, state as RawState) + const raw = state as RawState + if (raw.version === 2) { + if (!isTargets(raw.targets)) { + throw new CliError(`${filePath} is not a valid configfile state file.`) + } + return new DeploymentRecord(filePath, raw) + } + return new DeploymentRecord(filePath, migrateVersion1(raw, filePath)) } /** - * The most recent backup recorded for `target`. `exists` is `false` when the - * backup was deleted since; other errors are thrown, so nothing is removed - * before the backup is known to be usable. + * The record of `target`, found by path, or by identity when the path is + * written differently (letter case, Unicode normalization). */ - async latest(target: string): Promise<{ path: string; exists: boolean } | null> { - const backup = this.#state.backups?.[target]?.at(-1) - if (backup == null) return null + async find(target: string): Promise { + const exact = this.#state.targets[await keyOf(target)] + if (exact != null) return exact - try { - await lstat(backup) - return { path: backup, exists: true } - } catch (error) { - if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { path: backup, exists: false } - throw new CliError(`Cannot check the backup ${backup}: ${(error as Error).message}`) + const stats = await lstatOrNull(target) + if (stats == null) return null + const lowerKey = (await keyOf(target)).toLowerCase() + + for (const [key, record] of Object.entries(this.#state.targets)) { + if (key.toLowerCase() !== lowerKey) continue + const recorded = await lstatOrNull(record.target) + if (recorded != null && sameIdentity(identityOf(recorded), identityOf(stats))) return record } + return null + } + + async addBackup(target: string, backup: Backup): Promise { + await this.#update(target, record => ({ ...record, backups: [...record.backups, backup] })) + } + + async removeBackup(target: string, backupPath: string): Promise { + await this.#update(target, record => ({ + ...record, + backups: record.backups.filter(backup => backup.path !== backupPath), + })) } - async add(target: string, backup: string): Promise { - const backups = { ...this.#state.backups } - backups[target] = [...(backups[target] ?? []), backup] - await this.#save({ ...this.#state, backups }) + async setDeployed(target: string, deployed: Deployed | null): Promise { + await this.#update(target, record => ({ ...record, deployed })) } - async remove(target: string, backup: string): Promise { - const backups = { ...this.#state.backups } - const remaining = (backups[target] ?? []).filter(item => item !== backup) - if (remaining.length > 0) { - backups[target] = remaining + async #update(target: string, change: (record: TargetRecord) => TargetRecord): Promise { + const existing = await this.find(target) + const key = existing == null ? await keyOf(target) : await keyOf(existing.target) + const next = change(existing ?? { target, deployed: null, backups: [] }) + + const targets = { ...this.#state.targets } + if (next.deployed == null && next.backups.length === 0) { + delete targets[key] } else { - delete backups[target] + targets[key] = next } - await this.#save({ ...this.#state, backups }) - } - async #save(state: RawState): Promise { - // Written to a temporary file first, so an interruption never leaves a half-written record. - const temporary = `${this.path}.tmp` + const state = { ...this.#state, version: 2, targets } + delete state.backups try { - await mkdir(path.dirname(this.path), { recursive: true }) - await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`) - await rename(temporary, this.path) + await mkdir(path.dirname(this.path), { recursive: true, mode: 0o700 }) + await writeFileAtomic(this.path, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 }) } catch (error) { - throw new CliError(`Cannot save ${this.path}: ${(error as Error).message}`) + throw new CliError(`Cannot save ${this.path}: ${messageOf(error)}`) } this.#state = state } } + +/** Real path of the parent folder, then the name in Unicode NFC form. */ +async function keyOf(target: string): Promise { + const parent = await realpathOfExisting(path.dirname(target)) + return path.join(parent, path.basename(target).normalize('NFC')) +} + +function migrateVersion1(raw: RawState, filePath: string): RawState { + const backups = raw.backups ?? {} + const valid = Object.entries(backups).every( + ([target, list]) => + path.isAbsolute(target) && + Array.isArray(list) && + list.every(item => isBackupPathOf(target, item)), + ) + if (typeof backups !== 'object' || !valid) { + throw new CliError(`${filePath} is not a valid configfile state file.`) + } + + // Version 1 only existed in development builds before 1.0; its backups were + // not identified, so they are restored if they exist. + const targets: Record = {} + for (const [target, paths] of Object.entries(backups)) { + targets[target] = { + target, + deployed: null, + backups: paths.map(backupPath => ({ path: backupPath, identity: null, kind: null })), + } + } + const { backups: _, ...rest } = raw + return { ...rest, targets } +} + +function isTargets(value: unknown): value is Record { + if (value == null || typeof value !== 'object' || Array.isArray(value)) return false + return Object.values(value).every( + record => + record != null && + typeof record === 'object' && + typeof record.target === 'string' && + path.isAbsolute(record.target) && + Array.isArray(record.backups) && + record.backups.every( + (backup: unknown) => + backup != null && + typeof backup === 'object' && + isBackupPathOf(record.target, (backup as Backup).path), + ), + ) +} + +/** + * Backups are always `.old` or `.old.`: anything else in the + * record (edited by hand, or planted) must never be restored over a target. + */ +export function isBackupPathOf(target: string, backupPath: unknown): boolean { + if (typeof backupPath !== 'string' || !backupPath.startsWith(`${target}.old`)) return false + const suffix = backupPath.slice(`${target}.old`.length) + return suffix === '' || /^\.\d+$/.test(suffix) +} diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 73cf1d77..9dfcbb4a 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -1,5 +1,15 @@ import { existsSync } from 'node:fs' -import { chmod, copyFile, lstat, mkdir, readFile, readlink, stat, symlink } from 'node:fs/promises' +import { + chmod, + copyFile, + lstat, + mkdir, + readFile, + readlink, + rename, + stat, + symlink, +} from 'node:fs/promises' import path from 'node:path' import { describe, expect, it } from 'vitest' @@ -305,7 +315,7 @@ describe('modules status, dry run and undeploy', () => { await sandbox.write('cwd/a', 'edited') const local = await runCli(sandbox, ['modules', 'status', '--local']) - expect(local.stdout).toContain(`${sandbox.cwd}/a (differs from the repository)`) + expect(local.stdout).toContain(`${sandbox.cwd}/a (not deployed: a file is in the way)`) expect(local.stdout).toContain(`${sandbox.cwd}/b (not deployed)`) }) @@ -390,8 +400,27 @@ describe('modules status, dry run and undeploy', () => { const state = JSON.parse( await readFile(path.join(sandbox.home, '.configfile/state.json'), 'utf8'), ) + const zshrc = path.join(sandbox.home, '.zshrc') expect(state).toEqual({ - backups: { [path.join(sandbox.home, '.zshrc')]: [path.join(sandbox.home, '.zshrc.old')] }, + version: 2, + targets: { + [zshrc]: { + target: zshrc, + deployed: { + strategy: 'global', + source: path.join(sandbox.repo, 'files/zsh/zshrc'), + identity: { dev: expect.any(Number), ino: expect.any(Number) }, + }, + backups: [ + { + path: `${zshrc}.old`, + identity: { dev: expect.any(Number), ino: expect.any(Number) }, + kind: 'file', + modified: expect.any(Number), + }, + ], + }, + }, }) await runCli(sandbox, ['modules', 'undeploy', 'zsh']) @@ -476,6 +505,161 @@ describe('modules status, dry run and undeploy', () => { }, ) + it('deploys a repository written for configfile 0.3.1 (list format)', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/zsh/zshrc', 'zshrc') + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify([{ source_path: 'zshrc', target_path: '~/.zshrc', global: true }]), + ) + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + expect(result.code).toBe(0) + expect(result.stderr).toContain('settings.json is a list (configfile 0.3 format)') + expect(await readlink(path.join(sandbox.home, '.zshrc'))).toBe( + path.join(sandbox.repo, 'files/zsh/zshrc'), + ) + }) + + it('never lets a source outside the module be deployed or undeployed', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/Documents/thesis.txt', 'years of work') + await sandbox.write( + 'home/dotfiles/files/evil/settings.json', + JSON.stringify({ + files: [{ source_path: '../../../Documents', target_path: '~/Documents', deploy: 'local' }], + }), + ) + + const undeploy = await runCli(sandbox, ['modules', 'undeploy', '--local', 'evil']) + + expect(undeploy.code).toBe(1) + expect(undeploy.stderr).toContain('must name a file or folder inside the module folder') + expect(await readFile(path.join(sandbox.home, 'Documents/thesis.txt'), 'utf8')).toBe( + 'years of work', + ) + }) + + it('refuses a tampered state file before changing anything', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.ssh/id_rsa', 'PRIVATE KEY') + const zshrc = path.join(sandbox.home, '.zshrc') + await sandbox.write( + 'home/.configfile/state.json', + JSON.stringify({ + version: 2, + targets: { + [zshrc]: { + target: zshrc, + deployed: null, + backups: [{ path: path.join(sandbox.home, '.ssh/id_rsa'), identity: null, kind: null }], + }, + }, + }), + ) + + const result = await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('is not a valid configfile state file') + expect(await readFile(path.join(sandbox.home, '.ssh/id_rsa'), 'utf8')).toBe('PRIVATE KEY') + }) + + it('shows control characters from settings.json as escapes', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write( + 'home/dotfiles/files/a/settings.json', + JSON.stringify({ + files: [{ source_path: 'x\u001b]0;HIJACK\u0007\rfake', target_path: 't' }], + }), + ) + + const result = await runCli(sandbox, ['modules', 'status', 'a']) + + const controls = [...result.stdout].filter(c => c !== '\n' && c.charCodeAt(0) < 0x20) + expect(controls).toEqual([]) + expect(result.stdout).toContain('x\\x1b]0;HIJACK\\x07\\rfake (no deployment strategy)') + }) + + it('stacks two modules deployed to the same target, and unwinds them', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + for (const name of ['a', 'b']) { + await sandbox.write(`home/dotfiles/files/${name}/x`, name) + await sandbox.write( + `home/dotfiles/files/${name}/settings.json`, + JSON.stringify({ files: [{ source_path: 'x', target_path: '~/.x', deploy: 'global' }] }), + ) + } + await sandbox.write('home/.x', 'original') + const target = path.join(sandbox.home, '.x') + + await runCli(sandbox, ['modules', 'deploy', 'a']) + const deployB = await runCli(sandbox, ['modules', 'deploy', 'b']) + expect(deployB.stdout).toContain(`(deployed, previous file moved to ${target}.old.1)`) + expect((await runCli(sandbox, ['modules', 'status', 'a'])).stdout).toContain( + '(not deployed: a link is in the way)', + ) + + await runCli(sandbox, ['modules', 'undeploy', 'b']) + expect(await readlink(target)).toBe(path.join(sandbox.repo, 'files/a/x')) + await runCli(sandbox, ['modules', 'undeploy', 'a']) + expect(await readFile(target, 'utf8')).toBe('original') + }) + + it('refuses to copy a folder containing a link loop', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/l/d/file', 'x') + await symlink('.', path.join(sandbox.repo, 'files/l/d/loop')) + await sandbox.write( + 'home/dotfiles/files/l/settings.json', + JSON.stringify({ files: [{ source_path: 'd', target_path: 'd', deploy: 'local' }] }), + ) + + const result = await runCli(sandbox, ['modules', 'deploy', '--local', 'l']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('makes a loop') + expect(existsSync(path.join(sandbox.cwd, 'd'))).toBe(false) + }) + + it('keeps unknown keys of the state file', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write( + 'home/.configfile/state.json', + JSON.stringify({ version: 2, targets: {}, custom: 1 }), + ) + + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + const state = JSON.parse( + await readFile(path.join(sandbox.home, '.configfile/state.json'), 'utf8'), + ) + expect(state.custom).toBe(1) + }) + + it('keeps a local copy an editor saved through a new file', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await runCli(sandbox, ['modules', 'deploy', '--local', 'zsh']) + // Editors such as vim save by writing a new file and renaming it over the old one. + await sandbox.write('cwd/a.tmp', 'edited') + await rename(path.join(sandbox.cwd, 'a.tmp'), path.join(sandbox.cwd, 'a')) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--local', 'zsh']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.cwd, 'a'), 'utf8')).toBe('edited') + expect(existsSync(path.join(sandbox.cwd, 'b'))).toBe(false) + }) + it('warns about the deprecated "global" key', async () => { const sandbox = await createSandbox() await withModule(sandbox) @@ -675,6 +859,19 @@ describe('scripts', () => { expect(await readFile(path.join(sandbox.root, 'ran'), 'utf8')).toBe('yes') }) + it('removes its signal handlers once the script is done', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/quick.sh', 'true\n') + const counts = () => + ['SIGINT', 'SIGTERM', 'SIGHUP', 'SIGQUIT'].map(s => process.listenerCount(s)) + const before = counts() + + await runCli(sandbox, ['scripts', 'run', 'quick']) + + expect(counts()).toEqual(before) + }) + it('explains how to fix a non-executable script without extension', async () => { const sandbox = await createSandbox() await withScripts(sandbox) @@ -842,6 +1039,37 @@ describe('init', () => { }, ) + it('never lets a repository URL be read as a git option', async () => { + const sandbox = await createSandbox() + const pwned = path.join(sandbox.root, 'pwned') + + const result = await runCli(sandbox, [ + 'init', + '--repo', + `--upload-pack=touch ${pwned}`, + '--folder', + '~/dotfiles', + ]) + + expect(result.code).not.toBe(0) + expect(existsSync(pwned)).toBe(false) + }) + + it('hides credentials of the repository URL and keeps the configuration private', async () => { + const sandbox = await createSandbox() + await createRemote(sandbox) + // An existing clone is reused, so no network access is needed. + git(sandbox.root, 'clone', '--quiet', path.join(sandbox.root, 'remote'), sandbox.repo) + const url = 'https://user:ghp_SECRET@github.com/acme/dotfiles.git' + + const result = await runCli(sandbox, ['init', '--repo', url, '--folder', '~/dotfiles']) + + expect(result.code).toBe(0) + expect(result.stdout + result.stderr).not.toContain('ghp_SECRET') + expect(result.stderr).toContain('The repository URL contains credentials') + expect((await stat(path.join(sandbox.home, '.configfilerc'))).mode & 0o777).toBe(0o600) + }) + it('asks before overwriting an existing configuration', async () => { const sandbox = await createSandbox() await sandbox.configure({ repo_url: 'kept' }) diff --git a/tests/config.test.ts b/tests/config.test.ts index 4c22c582..62858dfe 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -2,6 +2,7 @@ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' import { describe, expect, it } from 'vitest' +import { redactUrl } from '../src/commands/init.js' import { ConfigStore } from '../src/config.js' import { CliError, NotInitializedError } from '../src/errors.js' import { createSandbox } from './helpers.js' @@ -130,3 +131,16 @@ describe('ConfigStore', () => { await expect(store.write({ repoUrl: 'u', folderPath: '/f' })).rejects.toThrow(/Cannot read/) }) }) + +describe('redactUrl', () => { + it.each([ + ['https://user:token@github.com/a/b.git', 'https://***:***@github.com/a/b.git'], + ['https://token@github.com/a/b.git', 'https://***@github.com/a/b.git'], + ['https://github.com/a/b.git', 'https://github.com/a/b.git'], + ['git@github.com:a/b.git', 'git@github.com:a/b.git'], + ['ssh://git@github.com/a/b.git', 'ssh://git@github.com/a/b.git'], + ['/local/path', '/local/path'], + ])('%s', (url, expected) => { + expect(redactUrl(url)).toBe(expected) + }) +}) diff --git a/tests/deploy.test.ts b/tests/deploy.test.ts index 916b17ad..e933018f 100644 --- a/tests/deploy.test.ts +++ b/tests/deploy.test.ts @@ -5,40 +5,58 @@ import { readdir, readFile, readlink, + rename, rm, symlink, + utimes, writeFile, } from 'node:fs/promises' import path from 'node:path' import { describe, expect, it } from 'vitest' -import { deployFile, inspectFile, undeployFile } from '../src/deploy.js' +import { + type DeployContext, + deployFile, + Guard, + inspectFile, + planDeploy, + undeployFile, +} from '../src/deploy.js' import { CliError } from '../src/errors.js' import type { ModuleFile } from '../src/repository.js' -import { BackupRecord } from '../src/state.js' +import { DeploymentRecord } from '../src/state.js' import { createSandbox, type Sandbox } from './helpers.js' const isRoot = process.getuid?.() === 0 +async function contextOf(sandbox: Sandbox): Promise { + return { + record: await DeploymentRecord.load(sandbox.home), + guard: new Guard({ home: sandbox.home, cwd: sandbox.cwd }), + } +} + async function setup() { const sandbox = await createSandbox() const source = await sandbox.write('home/dotfiles/files/zsh/zshrc', 'from repo') const target = path.join(sandbox.home, 'config', '.zshrc') - const record = await BackupRecord.load(sandbox.home) + const context = await contextOf(sandbox) const file = (strategy: 'global' | 'local', overrides: Partial = {}): ModuleFile => ({ source, target, strategy, repository: sandbox.repo, + module: path.join(sandbox.repo, 'files/zsh'), ...overrides, }) - return { sandbox, source, target, record, file } + return { sandbox, source, target, context, file } } -async function folderModule(sandbox: Sandbox) { +/** A local module copying the folder `files/vim/colors` (with a relative link) to `cwd/colors`. */ +async function folderModule(sandbox: Sandbox): Promise { await sandbox.write('home/dotfiles/files/vim/colors/theme.vim', 'theme') await symlink('theme.vim', path.join(sandbox.repo, 'files/vim/colors/link.vim')) return { @@ -46,88 +64,141 @@ async function folderModule(sandbox: Sandbox) { target: path.join(sandbox.cwd, 'colors'), strategy: 'local', repository: sandbox.repo, - } as const + module: path.join(sandbox.repo, 'files/vim'), + } } +const backupsOf = async (context: DeployContext, target: string) => + ((await context.record.find(target))?.backups ?? []).map(backup => backup.path) + describe('deployFile (global)', () => { - it('creates a symlink and its parent folders', async () => { - const { source, target, record, file } = await setup() + it('creates a symlink and its parent folders, and records it', async () => { + const { source, target, context, file } = await setup() - await expect(deployFile(file('global'), { record })).resolves.toEqual({ status: 'deployed' }) + await expect(deployFile(file('global'), context)).resolves.toEqual({ status: 'deployed' }) expect(await readlink(target)).toBe(source) + expect((await context.record.find(target))?.deployed).toMatchObject({ + strategy: 'global', + source, + }) }) it('does nothing when the link is already in place', async () => { - const { record, file } = await setup() - await deployFile(file('global'), { record }) + const { context, file } = await setup() + await deployFile(file('global'), context) + + await expect(deployFile(file('global'), context)).resolves.toEqual({ status: 'up-to-date' }) + }) + + it('adopts a link made by configfile 0.3 (not recorded)', async () => { + const { source, target, context, file } = await setup() + await mkdir(path.dirname(target), { recursive: true }) + await symlink(source, target) - await expect(deployFile(file('global'), { record })).resolves.toEqual({ status: 'up-to-date' }) + await expect(inspectFile(file('global'), context.record)).resolves.toEqual({ + kind: 'deployed', + recorded: false, + }) + await expect(deployFile(file('global'), context)).resolves.toEqual({ status: 'up-to-date' }) + await expect(inspectFile(file('global'), context.record)).resolves.toEqual({ + kind: 'deployed', + recorded: true, + }) }) it('backs up an existing file without overwriting a previous backup, and records it', async () => { - const { sandbox, source, target, record, file } = await setup() + const { sandbox, source, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') await sandbox.write('home/config/.zshrc.old', 'older') - await expect(deployFile(file('global'), { record })).resolves.toEqual({ + await expect(deployFile(file('global'), context)).resolves.toEqual({ status: 'backed-up', backup: `${target}.old.1`, }) expect(await readFile(`${target}.old`, 'utf8')).toBe('older') expect(await readFile(`${target}.old.1`, 'utf8')).toBe('mine') expect(await readlink(target)).toBe(source) - await expect(record.latest(target)).resolves.toEqual({ path: `${target}.old.1`, exists: true }) + expect(await backupsOf(context, target)).toEqual([`${target}.old.1`]) }) it('backs up a symlink that points somewhere else', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await mkdir(path.dirname(target), { recursive: true }) await symlink(path.join(sandbox.root, 'elsewhere'), target) - const result = await deployFile(file('global'), { record }) + const result = await deployFile(file('global'), context) expect(result).toEqual({ status: 'backed-up', backup: `${target}.old` }) expect((await lstat(`${target}.old`)).isSymbolicLink()).toBe(true) }) it('backs up a folder in the way, with its content', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc/inside', 'kept') - await deployFile(file('global'), { record }) + await deployFile(file('global'), context) expect(await readFile(path.join(`${target}.old`, 'inside'), 'utf8')).toBe('kept') }) it('recognises a relative symlink to the source as up to date', async () => { - const { source, target, record, file } = await setup() + const { source, target, context, file } = await setup() await mkdir(path.dirname(target), { recursive: true }) await symlink(path.relative(path.dirname(target), source), target) - await expect(deployFile(file('global'), { record })).resolves.toEqual({ status: 'up-to-date' }) + await expect(deployFile(file('global'), context)).resolves.toEqual({ status: 'up-to-date' }) }) it('does not reuse a backup name taken by a broken symlink', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') await symlink(path.join(sandbox.root, 'nowhere'), `${target}.old`) - const result = await deployFile(file('global'), { record }) + const result = await deployFile(file('global'), context) expect(result).toEqual({ status: 'backed-up', backup: `${target}.old.1` }) expect(await readFile(`${target}.old.1`, 'utf8')).toBe('mine') }) + it('replaces its own link to an old location of the repository without a backup', async () => { + const { sandbox, target, context, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + await deployFile(file('global'), context) + // The repository moved: the recorded link now points to a path that no longer exists. + const moved = path.join(sandbox.home, 'moved-dotfiles') + await rename(sandbox.repo, moved) + const movedFile = file('global', { + source: path.join(moved, 'files/zsh/zshrc'), + repository: moved, + module: path.join(moved, 'files/zsh'), + }) + + await expect(inspectFile(movedFile, context.record)).resolves.toEqual({ kind: 'stale' }) + await expect(deployFile(movedFile, context)).resolves.toEqual({ status: 'deployed' }) + expect(await readlink(target)).toBe(path.join(moved, 'files/zsh/zshrc')) + expect(await backupsOf(context, target)).toEqual([`${target}.old`]) + }) + it('fails when the source does not exist', async () => { - const { sandbox, record, file } = await setup() - const source = path.join(sandbox.repo, 'missing') + const { sandbox, context, file } = await setup() + const source = path.join(sandbox.repo, 'files/zsh/missing') + + await expect(deployFile(file('global', { source }), context)).rejects.toThrow(CliError) + }) - await expect(deployFile(file('global', { source }), { record })).rejects.toThrow(CliError) + it('refuses a source that leads outside the module through a symbolic link', async () => { + const { sandbox, context, file } = await setup() + await sandbox.write('home/.ssh/id_rsa', 'PRIVATE KEY') + const source = path.join(sandbox.repo, 'files/zsh/key') + await symlink(path.join(sandbox.home, '.ssh/id_rsa'), source) + + await expect(deployFile(file('global', { source }), context)).rejects.toThrow( + /leads outside the module folder/, + ) }) it('refuses a target that leads into the repository through a symbolic link', async () => { - const { sandbox, record, file } = await setup() - // ~/.config/nvim is a link to a folder of the repository (deployed by another module). + const { sandbox, context, file } = await setup() await mkdir(path.join(sandbox.repo, 'files/nvim/nvim'), { recursive: true }) await mkdir(path.join(sandbox.home, '.config'), { recursive: true }) await symlink( @@ -136,42 +207,98 @@ describe('deployFile (global)', () => { ) const target = path.join(sandbox.home, '.config/nvim/lua.vim') - await expect(deployFile(file('global', { target }), { record })).rejects.toThrow( - /leads into the dotfiles repository/, + await expect(deployFile(file('global', { target }), context)).rejects.toThrow( + /inside the dotfiles repository/, ) + await expect( + planDeploy(file('global', { target }), { ...context, force: false }), + ).rejects.toThrow(/inside the dotfiles repository/) expect(await readdir(path.join(sandbox.repo, 'files/nvim/nvim'))).toEqual([]) }) + + it('refuses a target that really is the repository, whatever the path used', async () => { + const { sandbox, context, file } = await setup() + // /link leads to the home folder, so /link/dotfiles is the repository itself. + await symlink(sandbox.home, path.join(sandbox.root, 'link')) + const target = path.join(sandbox.root, 'link', 'dotfiles') + + await expect(deployFile(file('global', { target }), context)).rejects.toThrow( + /dotfiles repository/, + ) + expect((await lstat(sandbox.repo)).isDirectory()).toBe(true) + }) + + it('refuses a target whose letter case differs from the repository (case-insensitive disks)', async () => { + const { sandbox, context, file } = await setup() + const upper = path.join(sandbox.home, 'DOTFILES') + const caseInsensitive = (await lstat(upper).catch(() => null)) != null + if (!caseInsensitive) return + + await expect(deployFile(file('global', { target: upper }), context)).rejects.toThrow( + /would replace the dotfiles repository/, + ) + }) + + it('refuses a target that is the real location of a symlinked module', async () => { + const { sandbox, context } = await setup() + await sandbox.write('home/.config/nvim/init.lua', 'lua') + await symlink(path.join(sandbox.home, '.config/nvim'), path.join(sandbox.repo, 'files/nvim')) + const file: ModuleFile = { + source: path.join(sandbox.repo, 'files/nvim/init.lua'), + target: path.join(sandbox.home, '.config'), + strategy: 'global', + repository: sandbox.repo, + module: path.join(sandbox.repo, 'files/nvim'), + } + + await expect(deployFile(file, context)).rejects.toThrow(/would replace the module folder/) + expect(await readFile(path.join(sandbox.home, '.config/nvim/init.lua'), 'utf8')).toBe('lua') + }) + + it("refuses configfile's own files", async () => { + const { sandbox, context, file } = await setup() + await sandbox.write('home/.configfilerc', '{}') + await mkdir(path.join(sandbox.home, '.configfile'), { recursive: true }) + + for (const target of [ + path.join(sandbox.home, '.configfilerc'), + path.join(sandbox.home, '.configfile'), + path.join(sandbox.home, '.configfile/state.json'), + ]) { + await expect(deployFile(file('global', { target }), context)).rejects.toThrow(/configfile's/) + } + }) }) describe('deployFile (local)', () => { it('copies the file', async () => { - const { target, record, file } = await setup() + const { target, context, file } = await setup() - await expect(deployFile(file('local'), { record })).resolves.toEqual({ status: 'deployed' }) + await expect(deployFile(file('local'), context)).resolves.toEqual({ status: 'deployed' }) expect(await readFile(target, 'utf8')).toBe('from repo') expect((await lstat(target)).isSymbolicLink()).toBe(false) }) it('reports an identical copy as up to date', async () => { - const { record, file } = await setup() - await deployFile(file('local'), { record }) + const { context, file } = await setup() + await deployFile(file('local'), context) - await expect(deployFile(file('local'), { record })).resolves.toEqual({ status: 'up-to-date' }) + await expect(deployFile(file('local'), context)).resolves.toEqual({ status: 'up-to-date' }) }) it('reports a conflict instead of overwriting', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') - await expect(deployFile(file('local'), { record })).resolves.toEqual({ status: 'conflict' }) + await expect(deployFile(file('local'), context)).resolves.toEqual({ status: 'conflict' }) expect(await readFile(target, 'utf8')).toBe('mine') }) it('moves the existing target aside when forced', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') - await expect(deployFile(file('local'), { force: true, record })).resolves.toEqual({ + await expect(deployFile(file('local'), { ...context, force: true })).resolves.toEqual({ status: 'backed-up', backup: `${target}.old`, }) @@ -180,79 +307,121 @@ describe('deployFile (local)', () => { }) it('replaces a folder instead of merging into it when forced', async () => { - const { sandbox, record } = await setup() + const { sandbox, context } = await setup() const colors = await folderModule(sandbox) await sandbox.write('cwd/colors/theme.vim', 'old') await sandbox.write('cwd/colors/stale.vim', 'stale') - await deployFile(colors, { force: true, record }) + await deployFile(colors, { ...context, force: true }) expect((await readdir(colors.target)).sort()).toEqual(['link.vim', 'theme.vim']) expect((await readdir(`${colors.target}.old`)).sort()).toEqual(['stale.vim', 'theme.vim']) }) - it('copies folders, keeping relative links as they are', async () => { - const { sandbox, record } = await setup() + it('makes real copies: links in the source are followed', async () => { + const { sandbox, context } = await setup() const colors = await folderModule(sandbox) - await deployFile(colors, { record }) + await deployFile(colors, context) + + const copiedLink = path.join(colors.target, 'link.vim') + expect((await lstat(copiedLink)).isSymbolicLink()).toBe(false) + expect(await readFile(copiedLink, 'utf8')).toBe('theme') + await expect(inspectFile(colors, context.record)).resolves.toEqual({ + kind: 'deployed', + recorded: true, + }) + }) + + it('copies the file a symlinked source points to, never a link into the repository', async () => { + const { sandbox, context, file } = await setup() + await sandbox.write('home/dotfiles/files/zsh/shared/cfg', 'shared') + const source = path.join(sandbox.repo, 'files/zsh/abs') + await symlink(path.join(sandbox.repo, 'files/zsh/shared/cfg'), source) + const target = path.join(sandbox.cwd, 'abs') + + await deployFile(file('local', { source, target }), context) + + expect((await lstat(target)).isSymbolicLink()).toBe(false) + await writeFile(target, 'edited') + expect(await readFile(path.join(sandbox.repo, 'files/zsh/shared/cfg'), 'utf8')).toBe('shared') + }) + + it('refuses to copy a folder containing a link that leads outside the module', async () => { + const { sandbox, context } = await setup() + const colors = await folderModule(sandbox) + await sandbox.write('home/.ssh/id_rsa', 'PRIVATE KEY') + await symlink(path.join(sandbox.home, '.ssh'), path.join(colors.source, 'ssh')) - expect(await readFile(path.join(colors.target, 'theme.vim'), 'utf8')).toBe('theme') - expect(await readlink(path.join(colors.target, 'link.vim'))).toBe('theme.vim') - await expect(inspectFile(colors)).resolves.toEqual({ kind: 'deployed' }) + await expect(deployFile(colors, context)).rejects.toThrow(/leads outside the module folder/) + await expect(lstat(colors.target)).rejects.toThrow() }) it.skipIf(isRoot)( - 'removes a partial copy and puts the original back when the copy fails', + 'puts the original back when the copy fails, leaving nothing half-copied', async () => { - const { sandbox, record } = await setup() + const { sandbox, context } = await setup() await sandbox.write('home/dotfiles/files/secret/folder/unreadable', 'x') await chmod(path.join(sandbox.repo, 'files/secret/folder/unreadable'), 0o000) await sandbox.write('cwd/folder/mine', 'mine') - const file = { + const file: ModuleFile = { source: path.join(sandbox.repo, 'files/secret/folder'), target: path.join(sandbox.cwd, 'folder'), strategy: 'local', repository: sandbox.repo, - } as const + module: path.join(sandbox.repo, 'files/secret'), + } - await expect(deployFile(file, { force: true, record })).rejects.toThrow(CliError) + await expect(deployFile(file, { ...context, force: true })).rejects.toThrow(CliError) expect(await readdir(file.target)).toEqual(['mine']) expect(await readdir(sandbox.cwd)).toEqual(['folder']) - await expect(record.latest(file.target)).resolves.toBeNull() + expect(await backupsOf(context, file.target)).toEqual([]) }, ) - it.skipIf(isRoot)('removes a partial copy when nothing was there before', async () => { - const { sandbox, record } = await setup() - await sandbox.write('home/dotfiles/files/secret/folder/unreadable', 'x') - await chmod(path.join(sandbox.repo, 'files/secret/folder/unreadable'), 0o000) - const file = { - source: path.join(sandbox.repo, 'files/secret/folder'), - target: path.join(sandbox.cwd, 'folder'), - strategy: 'local', - repository: sandbox.repo, - } as const - - await expect(deployFile(file, { record })).rejects.toThrow(CliError) - expect(await readdir(sandbox.cwd)).toEqual([]) + it('compares large files by chunks', async () => { + const { sandbox, context, file } = await setup() + const big = Buffer.alloc(3 * 1024 * 1024, 7) + const source = path.join(sandbox.repo, 'files/zsh/big') + await writeFile(source, big) + const target = path.join(sandbox.cwd, 'big') + await deployFile(file('local', { source, target }), context) + + await expect(inspectFile(file('local', { source, target }), context.record)).resolves.toEqual({ + kind: 'deployed', + recorded: true, + }) + big[big.length - 1] = 8 + await writeFile(target, big) + await expect(inspectFile(file('local', { source, target }), context.record)).resolves.toEqual({ + kind: 'modified', + }) }) }) describe('inspectFile', () => { it('describes global targets', async () => { - const { sandbox, record, file } = await setup() + const { sandbox, context, file } = await setup() - await expect(inspectFile(file('global'))).resolves.toEqual({ kind: 'missing' }) + await expect(inspectFile(file('global'), context.record)).resolves.toEqual({ kind: 'missing' }) await sandbox.write('home/config/.zshrc', 'mine') - await expect(inspectFile(file('global'))).resolves.toEqual({ kind: 'occupied', what: 'file' }) - await deployFile(file('global'), { record }) - await expect(inspectFile(file('global'))).resolves.toEqual({ kind: 'deployed' }) + await expect(inspectFile(file('global'), context.record)).resolves.toEqual({ + kind: 'foreign', + what: 'file', + }) + }) + + it('tells a copy configfile made from an identical file it did not make', async () => { + const { sandbox, context, file } = await setup() + await sandbox.write('home/config/.zshrc', 'from repo') + + await expect(inspectFile(file('local'), context.record)).resolves.toEqual({ kind: 'identical' }) + await expect(undeployFile(file('local'), context)).resolves.toMatchObject({ status: 'kept' }) }) it.each([ - ['a file was added', (target: string) => rmAndWrite(path.join(target, 'extra.vim'), 'extra')], + ['a file was added', (target: string) => writeFile(path.join(target, 'extra.vim'), 'extra')], [ 'a file was replaced by a link', async (target: string) => { @@ -260,36 +429,29 @@ describe('inspectFile', () => { await symlink('link.vim', path.join(target, 'theme.vim')) }, ], - [ - 'a link was changed', - async (target: string) => { - await rm(path.join(target, 'link.vim')) - await symlink('elsewhere.vim', path.join(target, 'link.vim')) - }, - ], - ['a file was edited', (target: string) => rmAndWrite(path.join(target, 'theme.vim'), 'edited')], + ['a file was edited', (target: string) => writeFile(path.join(target, 'theme.vim'), 'edited')], ])('detects a modified folder copy: %s', async (_, modify) => { - const { sandbox, record } = await setup() + const { sandbox, context } = await setup() const colors = await folderModule(sandbox) - await deployFile(colors, { record }) + await deployFile(colors, context) await modify(colors.target) - await expect(inspectFile(colors)).resolves.toEqual({ kind: 'modified' }) - await expect(undeployFile(colors, { record })).resolves.toMatchObject({ status: 'kept' }) + await expect(inspectFile(colors, context.record)).resolves.toEqual({ kind: 'modified' }) + await expect(undeployFile(colors, context)).resolves.toMatchObject({ status: 'kept' }) expect(await readdir(colors.target)).not.toEqual([]) }) it('reports targets whose source disappeared from the repository', async () => { - const { source, record, file } = await setup() - await deployFile(file('global'), { record }) + const { source, context, file } = await setup() + await deployFile(file('global'), context) await rm(source) - await expect(inspectFile(file('global'))).resolves.toEqual({ + await expect(inspectFile(file('global'), context.record)).resolves.toEqual({ kind: 'source-missing', ours: true, }) - await expect(inspectFile(file('local'))).resolves.toEqual({ + await expect(inspectFile(file('local'), context.record)).resolves.toEqual({ kind: 'source-missing', ours: false, }) @@ -298,112 +460,160 @@ describe('inspectFile', () => { describe('undeployFile', () => { it('removes the link and restores the backup configfile made', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') - await deployFile(file('global'), { record }) + await deployFile(file('global'), context) - await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + await expect(undeployFile(file('global'), context)).resolves.toEqual({ status: 'removed', - restored: `${target}.old`, - missingBackup: null, + backup: { path: `${target}.old`, status: 'ok' }, + leftover: null, }) expect(await readFile(target, 'utf8')).toBe('mine') - await expect(record.latest(target)).resolves.toBeNull() + await expect(context.record.find(target)).resolves.toBeNull() + }) + + it('restores the newest of two backups, then the older one', async () => { + const { sandbox, target, context, file } = await setup() + await sandbox.write('home/config/.zshrc', 'A') + await deployFile(file('global'), context) + await rm(target) + await sandbox.write('home/config/.zshrc', 'B') + await deployFile(file('global'), context) + + expect(await backupsOf(context, target)).toEqual([`${target}.old`, `${target}.old.1`]) + await undeployFile(file('global'), context) + expect(await readFile(target, 'utf8')).toBe('B') + expect(await readFile(`${target}.old`, 'utf8')).toBe('A') + expect(await backupsOf(context, target)).toEqual([`${target}.old`]) }) it('never restores a .old file configfile did not make', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc.old', 'made by hand') - await deployFile(file('global'), { record }) + await deployFile(file('global'), context) - await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + await expect(undeployFile(file('global'), context)).resolves.toEqual({ status: 'removed', - restored: null, - missingBackup: null, + backup: null, + leftover: null, }) expect(await readFile(`${target}.old`, 'utf8')).toBe('made by hand') expect(await readdir(path.dirname(target))).toEqual(['.zshrc.old']) }) - it('reports a recorded backup that was deleted since', async () => { - const { sandbox, target, record, file } = await setup() + it('does not restore a backup that was replaced since it was made', async () => { + const { sandbox, target, context, file } = await setup() + await sandbox.write('home/config/.zshrc', 'mine') + // An old modification time: the replacement differs even if it reuses the inode number. + await utimes(target, 1_000_000, 1_000_000) + await deployFile(file('global'), context) + await rm(`${target}.old`) + await sandbox.write('home/config/.zshrc.old', 'someone else') + + await expect(undeployFile(file('global'), context)).resolves.toMatchObject({ + status: 'removed', + backup: { path: `${target}.old`, status: 'changed' }, + }) + await expect(lstat(target)).rejects.toThrow() + expect(await backupsOf(context, target)).toEqual([`${target}.old`]) + }) + + it('reports a recorded backup that was deleted since, and forgets it', async () => { + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') - await deployFile(file('global'), { record }) + await deployFile(file('global'), context) await rm(`${target}.old`) - await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + await expect(undeployFile(file('global'), context)).resolves.toMatchObject({ status: 'removed', - restored: null, - missingBackup: `${target}.old`, + backup: { path: `${target}.old`, status: 'missing' }, }) + await expect(context.record.find(target)).resolves.toBeNull() }) it('removes a linked folder without touching the folder in the repository', async () => { - const { sandbox, record } = await setup() + const { sandbox, context } = await setup() await sandbox.write('home/dotfiles/files/nvim/nvim/init.lua', 'init') - const nvim = { + const nvim: ModuleFile = { source: path.join(sandbox.repo, 'files/nvim/nvim'), target: path.join(sandbox.home, '.config/nvim'), strategy: 'global', repository: sandbox.repo, - } as const - await deployFile(nvim, { record }) + module: path.join(sandbox.repo, 'files/nvim'), + } + await deployFile(nvim, context) - await expect(undeployFile(nvim, { record })).resolves.toMatchObject({ status: 'removed' }) + await expect(undeployFile(nvim, context)).resolves.toMatchObject({ status: 'removed' }) await expect(lstat(nvim.target)).rejects.toThrow() expect(await readdir(nvim.source)).toEqual(['init.lua']) }) - it('keeps what configfile did not deploy, and modified copies', async () => { - const { sandbox, target, record, file } = await setup() + it('keeps what configfile did not deploy', async () => { + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') - await expect(undeployFile(file('global'), { record })).resolves.toMatchObject({ - status: 'kept', - }) - await expect(undeployFile(file('local'), { record })).resolves.toMatchObject({ status: 'kept' }) + await expect(undeployFile(file('global'), context)).resolves.toMatchObject({ status: 'kept' }) + await expect(undeployFile(file('local'), context)).resolves.toMatchObject({ status: 'kept' }) expect(await readFile(target, 'utf8')).toBe('mine') }) it('removes an unmodified local copy and restores the forced backup', async () => { - const { sandbox, target, record, file } = await setup() + const { sandbox, target, context, file } = await setup() await sandbox.write('home/config/.zshrc', 'mine') - await deployFile(file('local'), { force: true, record }) + await deployFile(file('local'), { ...context, force: true }) - await expect(undeployFile(file('local'), { record })).resolves.toMatchObject({ + await expect(undeployFile(file('local'), context)).resolves.toMatchObject({ status: 'removed', - restored: `${target}.old`, + backup: { path: `${target}.old`, status: 'ok' }, }) expect(await readFile(target, 'utf8')).toBe('mine') }) - it('removes the link of a source that disappeared, but keeps a copy it cannot compare', async () => { - const { source, target, record, file } = await setup() - await deployFile(file('global'), { record }) + it.skipIf(isRoot)('removes a local copy containing a read-only folder', async () => { + const { sandbox, context } = await setup() + await sandbox.write('home/dotfiles/files/ro/d/sub/inner', 'x') + await chmod(path.join(sandbox.repo, 'files/ro/d/sub'), 0o555) + await sandbox.write('cwd/d', 'original') + const file: ModuleFile = { + source: path.join(sandbox.repo, 'files/ro/d'), + target: path.join(sandbox.cwd, 'd'), + strategy: 'local', + repository: sandbox.repo, + module: path.join(sandbox.repo, 'files/ro'), + } + await deployFile(file, { ...context, force: true }) + + await expect(undeployFile(file, context)).resolves.toMatchObject({ + status: 'removed', + leftover: null, + }) + expect(await readFile(file.target, 'utf8')).toBe('original') + expect(await readdir(sandbox.cwd)).toEqual(['d']) + await chmod(path.join(sandbox.repo, 'files/ro/d/sub'), 0o755) + }) + + it('removes its link even when the source disappeared, but keeps a copy it cannot compare', async () => { + const { source, target, context, file } = await setup() + await deployFile(file('global'), context) await rm(source) - await expect(undeployFile(file('global'), { record })).resolves.toMatchObject({ + await expect(undeployFile(file('global'), context)).resolves.toMatchObject({ status: 'removed', }) - await rmAndWrite(target, 'a copy') - await expect(undeployFile(file('local'), { record })).resolves.toEqual({ + await writeFile(target, 'a copy') + await expect(undeployFile(file('local'), context)).resolves.toEqual({ status: 'kept', state: { kind: 'source-missing', ours: false }, }) }) it('reports files that are not deployed', async () => { - const { record, file } = await setup() + const { context, file } = await setup() - await expect(undeployFile(file('global'), { record })).resolves.toEqual({ + await expect(undeployFile(file('global'), context)).resolves.toEqual({ status: 'not-deployed', }) }) }) - -async function rmAndWrite(target: string, content: string) { - await rm(target, { force: true }) - await mkdir(path.dirname(target), { recursive: true }) - await writeFile(target, content) -} diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts index 7a33f7d5..6cb7309f 100644 --- a/tests/e2e.test.ts +++ b/tests/e2e.test.ts @@ -1,4 +1,6 @@ import { spawn, spawnSync } from 'node:child_process' +import { readdir, readFile } from 'node:fs/promises' +import path from 'node:path' import { fileURLToPath } from 'node:url' import { afterEach, describe, expect, it } from 'vitest' @@ -115,4 +117,48 @@ describe('built CLI', () => { expect(result).toEqual({ code: 7, signal: null }) }) }) + + it('never loses a file when several configfile processes deploy at once', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + const modules = ['a', 'b', 'c', 'd'] + for (const name of modules) { + await sandbox.write(`home/dotfiles/files/${name}/x`, name) + await sandbox.write( + `home/dotfiles/files/${name}/settings.json`, + JSON.stringify({ + files: [{ source_path: 'x', target_path: '~/.shared', deploy: 'global' }], + }), + ) + } + await sandbox.write('home/.shared', 'PRECIOUS') + + const runs = modules.map( + name => + new Promise(resolve => { + const child = spawn(process.execPath, [cli, 'modules', 'deploy', name], { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, + stdio: 'ignore', + }) + child.on('close', resolve) + }), + ) + expect(await Promise.all(runs)).toEqual([0, 0, 0, 0]) + + const copies = (await readdir(sandbox.home)).filter(name => name.startsWith('.shared')) + const contents = await Promise.all( + copies.map(name => readFile(path.join(sandbox.home, name), 'utf8').catch(() => '')), + ) + expect(contents.filter(content => content === 'PRECIOUS')).toHaveLength(1) + + // Undeploying every module unwinds the backups down to the original file. + for (const _ of modules) { + spawnSync(process.execPath, [cli, 'modules', 'undeploy', '--all'], { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, + }) + } + expect(await readFile(path.join(sandbox.home, '.shared'), 'utf8')).toBe('PRECIOUS') + }) }) diff --git a/tests/lock.test.ts b/tests/lock.test.ts new file mode 100644 index 00000000..dd3339f4 --- /dev/null +++ b/tests/lock.test.ts @@ -0,0 +1,69 @@ +import { spawn } from 'node:child_process' +import { readFile } from 'node:fs/promises' +import path from 'node:path' + +import { describe, expect, it } from 'vitest' + +import { withLock } from '../src/lock.js' +import { createSandbox } from './helpers.js' + +describe('withLock', () => { + it('runs the task while holding ~/.configfile/lock, then releases it', async () => { + const { home } = await createSandbox() + const lock = path.join(home, '.configfile/lock') + + const seen = await withLock(home, () => readFile(lock, 'utf8')) + + expect(seen).toBe(String(process.pid)) + await expect(readFile(lock, 'utf8')).rejects.toThrow() + }) + + it('releases the lock when the task fails', async () => { + const { home } = await createSandbox() + + await expect(withLock(home, () => Promise.reject(new Error('boom')))).rejects.toThrow('boom') + await expect(withLock(home, async () => 'again')).resolves.toBe('again') + }) + + it('takes over the lock of a process that no longer exists', async () => { + const { home, write } = await createSandbox() + const dead = spawn(process.execPath, ['-e', '']) + await new Promise(resolve => dead.on('exit', resolve)) + await write('home/.configfile/lock', String(dead.pid)) + + await expect(withLock(home, async () => 'done')).resolves.toBe('done') + }) + + it('fails, naming the process, when another configfile keeps the lock', async () => { + const { home, write } = await createSandbox() + const other = spawn(process.execPath, ['-e', 'setTimeout(() => {}, 30000)']) + try { + await write('home/.configfile/lock', String(other.pid)) + + await expect(withLock(home, async () => 'never', { maxWaitMs: 300 })).rejects.toThrow( + `Another configfile (process ${other.pid}) is changing files`, + ) + expect(await readFile(path.join(home, '.configfile/lock'), 'utf8')).toBe(String(other.pid)) + } finally { + other.kill() + } + }) + + it('serializes tasks', async () => { + const { home } = await createSandbox() + const events: string[] = [] + const task = (name: string) => async () => { + events.push(`${name} start`) + await new Promise(resolve => setTimeout(resolve, 50)) + events.push(`${name} end`) + } + + await Promise.all([withLock(home, task('a')), withLock(home, task('b'))]) + + // Whichever runs first, the two tasks never overlap. + expect([ + ['a start', 'a end', 'b start', 'b end'], + ['b start', 'b end', 'a start', 'a end'], + ]).toContainEqual(events) + }) +}) diff --git a/tests/repository.test.ts b/tests/repository.test.ts index b537a268..864e8991 100644 --- a/tests/repository.test.ts +++ b/tests/repository.test.ts @@ -91,6 +91,7 @@ describe('listModules', () => { const { modules, warnings } = await modulesOf(sandbox) const zsh = usable(modules[0]) const repository = sandbox.repo + const module = path.join(sandbox.repo, 'files/zsh') expect(zsh.files).toEqual([ { @@ -98,24 +99,28 @@ describe('listModules', () => { target: path.join(sandbox.home, '.zshrc'), strategy: 'global', repository, + module, }, { source: path.join(sandbox.repo, 'files/zsh/local.env'), target: path.join(sandbox.cwd, '.env'), strategy: 'local', repository, + module, }, { source: path.join(sandbox.repo, 'files/zsh/aliases'), target: path.join(sandbox.home, '.aliases'), strategy: 'global', repository, + module, }, { source: path.join(sandbox.repo, 'files/zsh/editorconfig'), target: path.join(sandbox.cwd, '.editorconfig'), strategy: 'local', repository, + module, }, ]) expect(zsh.undecided).toEqual(['forgotten']) @@ -173,8 +178,11 @@ describe('listModules', () => { ['/', 'global', 'would replace the home folder'], ['.', 'local', 'would replace the current folder'], ['~/dotfiles', 'global', 'would replace the dotfiles repository'], - ['~/dotfiles/files', 'global', 'is inside the dotfiles repository'], + ['~/dotfiles/files', 'global', 'would replace the module folder'], ['~/dotfiles/files/zsh/zshrc', 'global', 'is inside the dotfiles repository'], + ['~/.configfilerc', 'global', "would replace configfile's configuration"], + ['~/.configfile', 'global', "would replace configfile's working folder"], + ['~/.configfile/state.json', 'global', "is inside configfile's working folder"], ])('refuses the dangerous target_path %s (%s)', async (target, deploy, reason) => { const sandbox = await createSandbox() await sandbox.write( @@ -189,6 +197,54 @@ describe('listModules', () => { expect(zsh.invalidEntries[0]).toContain(reason) }) + it.each(['../zshrc', '../../../Documents', '/etc/hosts', '.', 'sub/../../other/zshrc'])( + 'refuses a source_path outside the module folder: %s', + async source => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + settings([{ source_path: source, target_path: '~/.zshrc', deploy: 'global' }]), + ) + + const { modules } = await modulesOf(sandbox) + const zsh = usable(modules[0]) + + expect(zsh.files).toEqual([]) + expect(zsh.invalidEntries[0]).toContain('must name a file or folder inside the module folder') + }, + ) + + it('accepts sources in subfolders of the module', async () => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + settings([{ source_path: 'conf/./zshrc', target_path: '~/.zshrc', deploy: 'global' }]), + ) + + const { modules } = await modulesOf(sandbox) + + expect(usable(modules[0]).files[0]?.source).toBe( + path.join(sandbox.repo, 'files/zsh/conf/zshrc'), + ) + }) + + it('reads the configfile 0.3.1 list format, with a deprecation', async () => { + const sandbox = await createSandbox() + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify([{ source_path: 'zshrc', target_path: '~/.zshrc', global: true }]), + ) + + const { modules } = await modulesOf(sandbox) + const zsh = usable(modules[0]) + + expect(zsh.files.map(file => file.target)).toEqual([path.join(sandbox.home, '.zshrc')]) + expect(zsh.deprecations).toEqual([ + expect.stringContaining('settings.json is a list (configfile 0.3 format)'), + expect.stringContaining('"global": true | false is deprecated'), + ]) + }) + it('refuses a target that contains the repository', async () => { const sandbox = await createSandbox() // The repository lives in ~/.config/dot and a module targets ~/.config. From 5506d722a4494fcfabdfd8dcaba7887a73e7a406 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 1 Oct 2026 09:05:05 +0200 Subject: [PATCH 320/341] feat(update): keep configfile's copy of the repository as a mirror (#283) --- CHANGELOG.md | 7 +- README.md | 18 +++-- docs/home.md | 4 +- src/commands/init.ts | 27 ++++---- src/commands/update.ts | 36 +++++++--- src/paths.ts | 19 ++++- src/process.ts | 39 +++++++++-- src/sync.ts | 117 +++++++++++++++++++++++++++++++ tests/commands.test.ts | 153 +++++++++++++++++++++++++++++------------ 9 files changed, 338 insertions(+), 82 deletions(-) create mode 100644 src/sync.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 10a87aa5..1e535a33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - The `modules undeploy` command to remove the files configfile deployed and restore the saved versions it made (recorded in `~/.configfile/`). - The `modules status` command to see which files are deployed. -- The `update` command to pull the latest version of the dotfiles repository. +- The `update` command to sync with the latest version of the dotfiles repository. - A preview of the changes with `--dry-run` on `modules deploy` and `modules undeploy`. - Options to use configfile in scripts without questions: `--repo`, `--folder` and `--force` on `init`, `--all` and `--force` on `modules deploy`, `--all` on `modules undeploy`. @@ -39,6 +39,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. in a `"files"` key. - `~/.configfilerc` is only readable by its owner. - `init` reuses a folder that already contains the repository. +- `init` only asks for the repository URL and clones it into `~/.configfile/dotfiles`, a copy + configfile keeps in sync; `--folder` chooses another location. +- `update` makes configfile's copy identical to the remote, so it never fails on conflicts or + unpushed work; local changes found in the copy are first saved as a patch in + `~/.configfile/saved/`. ### Fixed - Git URL verification in `init` command is less strict. ([#48](https://github.com/Mindsers/configfile/issues/48)) diff --git a/README.md b/README.md index 6a627c9e..fd81b022 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,11 @@ npm install --global configfile ## Data storage -This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files, with this structure: +This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files. + +You edit your dotfiles in your own working copy of that repository and push them. *configfile* keeps its own copy, a mirror of the remote repository in `~/.configfile/dotfiles`, and deploys from it: `configfile update` makes the mirror identical to the remote, so unpushed or conflicting work never blocks it. Don't edit the mirror (or deployed links, which point into it): see [`update`](#usage) for what happens to such changes. + +The repository must have this structure: ```txt files/ @@ -89,9 +93,10 @@ Scripts can be written in any language: ## Usage -- `configfile init` (`i`): clone your dotfiles repository and save its location in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. +- `configfile init` (`i`): ask for the URL of your dotfiles repository, clone it into `~/.configfile/dotfiles` and save the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. - `-f, --force`: overwrite an existing configuration without asking. - - `--repo ` and `--folder `: answer the questions from the command line, for non-interactive setups. + - `--repo `: give the URL from the command line, for non-interactive setups. + - `--folder `: clone somewhere else than `~/.configfile/dotfiles`. - `configfile modules list` (`m l`, or just `configfile modules`): list available modules. - `configfile modules status [modules...]` (`m st`): show whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. - `-l, --local`: check the local files, in the current folder. @@ -104,20 +109,20 @@ Scripts can be written in any language: - `-l, --local`, `-a, --all` and `-n, --dry-run`: as for `deploy`. - `configfile scripts list` (`s l`, or just `configfile scripts`): list available scripts. - `configfile scripts run [-- args...]` (`s r`): run a script. Arguments after `--` are passed to the script. -- `configfile update` (`u`): pull the latest version of your dotfiles repository (`git pull --ff-only`). Global files are symbolic links, so they are up to date right away; run `modules deploy` for new files, and `modules deploy --local` to refresh local copies. +- `configfile update` (`u`): sync *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. *configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. ### Configuration -*configfile* keeps its configuration in `~/.configfilerc`, and its working files (the record of backups) in the `~/.configfile/` folder. +*configfile* keeps its configuration in `~/.configfilerc`, and its working files in the `~/.configfile/` folder: the mirror of your repository (`dotfiles/`), the record of deployments (`state.json`), the lock, and saved local changes (`saved/`). `~/.configfilerc` is a JSON file: ```json { "repo_url": "git@github.com:me/dotfiles.git", - "folder_path": "/Users/me/.dotfiles", + "folder_path": "/Users/me/.configfile/dotfiles", "script_extensions": [".js", ".sh", ""] } ``` @@ -135,6 +140,7 @@ Scripts can be written in any language: - Targets inside the dotfiles repository, or containing it, are now refused. - `modules undeploy` only removes what 1.0 or later deployed, and only restores backups it made (recorded in `~/.configfile/state.json`): local copies and `.old` files made by 0.3 stay where they are. - A `source_path` must stay inside its module folder. +- `init` clones into `~/.configfile/dotfiles` by default, and an existing `folder_path` is kept. `update` now makes that folder identical to the remote, saving local changes as a patch first. If your configured folder is also your working copy (for example `~/.dotfiles`), give *configfile* its own copy: run `configfile modules undeploy --all` (your previous files come back), then `configfile init --force --repo --folder ~/.configfile/dotfiles`, then `configfile modules deploy --all` (links now point to the copy). - With `script_extensions` set, only files with one of these extensions are scripts, and `""` means files without extension (0.3 matched any file containing the text). - Commands now exit with a non-zero code on failure. diff --git a/docs/home.md b/docs/home.md index 105b8eae..9a905fa6 100644 --- a/docs/home.md +++ b/docs/home.md @@ -18,10 +18,10 @@ Generating first configuration: configfile init ``` -It asks for your repository URL and where to clone it. To set it up without questions (in a script, for example): +It asks for your repository URL and clones it into `~/.configfile/dotfiles`, a copy configfile keeps in sync with the remote (edit your dotfiles in your own working copy). To set it up without questions (in a script, for example): ```bash -configfile init --repo git@github.com:me/dotfiles.git --folder ~/.dotfiles +configfile init --repo git@github.com:me/dotfiles.git ``` ### Running unit tests diff --git a/src/commands/init.ts b/src/commands/init.ts index 4c73b802..abadebc4 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -7,11 +7,9 @@ import type { Command } from 'commander' import { ConfigStore } from '../config.js' import type { Context } from '../context.js' import { CliError } from '../errors.js' -import { resolveUserPath } from '../paths.js' +import { configfilePaths, resolveUserPath } from '../paths.js' import { gitClone } from '../process.js' -const DEFAULT_FOLDER = '~/.dotfiles' - interface InitOptions { force?: boolean repo?: string @@ -22,10 +20,10 @@ export function registerInitCommand(program: Command, ctx: Context): void { program .command('init') .alias('i') - .description('clone your dotfiles repository and save its location') + .description('clone your dotfiles repository, which configfile then keeps in sync') .option('-f, --force', 'overwrite the existing configuration without asking') .option('--repo ', 'dotfiles repository URL (skips the question)') - .option('--folder ', 'where to clone the repository (skips the question)') + .option('--folder ', 'where to clone the repository (default: ~/.configfile/dotfiles)') .action((options: InitOptions) => init(options, ctx)) } @@ -38,7 +36,6 @@ async function init(options: InitOptions, ctx: Context): Promise { const missing = [ store.exists() && options.force !== true && '--force (a configuration already exists)', options.repo == null && '--repo ', - options.folder == null && '--folder ', ].filter(Boolean) if (missing.length > 0) { throw new CliError( @@ -74,14 +71,16 @@ async function init(options: InitOptions, ctx: Context): Promise { ) } - const folderInput = - options.folder ?? - (await prompts.input({ - message: 'Local folder for the repository:', - required: true, - default: previous.folderPath ?? DEFAULT_FOLDER, - })) - const folderPath = resolveUserPath(folderInput.trim(), ctx) + // configfile's copy is a mirror it keeps in sync, not a working copy: by + // default it lives in configfile's own folder. An existing one is kept. + const own = configfilePaths(ctx.home) + const folderPath = + options.folder != null + ? resolveUserPath(options.folder.trim(), ctx) + : (previous.folderPath ?? own.dotfiles) + if (folderPath === own.dotfiles) { + await mkdir(own.dir, { recursive: true, mode: 0o700 }) + } switch (await inspectFolder(folderPath)) { case 'not-a-directory': diff --git a/src/commands/update.ts b/src/commands/update.ts index e4e8f487..8e50a59e 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -6,32 +6,48 @@ import type { Command } from 'commander' import { ConfigStore } from '../config.js' import type { Context } from '../context.js' import { CliError } from '../errors.js' -import { gitPull } from '../process.js' +import { errnoCode, messageOf } from '../fsutil.js' +import { configfilePaths } from '../paths.js' +import { syncMirror } from '../sync.js' export function registerUpdateCommand(program: Command, ctx: Context): void { program .command('update') .alias('u') - .description('pull the latest version of your dotfiles repository') + .description("sync configfile's copy of your dotfiles repository with the remote") .action(() => update(ctx)) } async function update(ctx: Context): Promise { + const { output } = ctx const { folderPath } = await new ConfigStore(ctx.home).read() try { await lstat(path.join(folderPath, '.git')) } catch (error) { - if ((error as NodeJS.ErrnoException).code === 'ENOENT') { - throw new CliError(`${folderPath} is not a git repository. Run "configfile init".`) + if (errnoCode(error) === 'ENOENT') { + throw new CliError(`${folderPath} is not a git repository. Run "configfile init --force".`) } - throw new CliError(`Cannot read ${folderPath}: ${(error as Error).message}`) + throw new CliError(`Cannot read ${folderPath}: ${messageOf(error)}`) } - ctx.output.info(`Updating ${folderPath}…`) - await gitPull(folderPath) - ctx.output.success( - 'Dotfiles updated. Global files are symbolic links, so they are already up to date; ' + - 'run "configfile modules deploy" for new files.', + output.info(`Syncing ${folderPath}…`) + const result = await syncMirror(folderPath, configfilePaths(ctx.home).saved) + + if (result.saved != null) { + output.warn( + `${folderPath} had local changes: they were saved to ${result.saved} and replaced by ` + + `${result.upstream}. Edit your dotfiles in your own working copy; to keep these changes, ` + + `apply them there with: git am ${result.saved}`, + ) + } + + if (result.before === result.after) { + output.success(`Already up to date with ${result.upstream}.`) + return + } + output.success( + `Synced with ${result.upstream} (${result.after.slice(0, 7)}). Global files are links, so ` + + 'they are up to date; run "configfile modules deploy --all" for new files.', ) } diff --git a/src/paths.ts b/src/paths.ts index ae010595..c4b914f0 100644 --- a/src/paths.ts +++ b/src/paths.ts @@ -25,6 +25,21 @@ export function contains(parent: string, child: string): boolean { } /** Where configfile keeps its own files. Deployments must never touch them. */ -export function configfilePaths(home: string): { rc: string; dir: string } { - return { rc: path.join(home, '.configfilerc'), dir: path.join(home, '.configfile') } +export function configfilePaths(home: string): { + /** The configuration. */ + rc: string + /** configfile's working folder: lock, record, mirror, saved changes. */ + dir: string + /** Default location of the mirror of the dotfiles repository. */ + dotfiles: string + /** Local changes found in the mirror, saved before syncing. */ + saved: string +} { + const dir = path.join(home, '.configfile') + return { + rc: path.join(home, '.configfilerc'), + dir, + dotfiles: path.join(dir, 'dotfiles'), + saved: path.join(dir, 'saved'), + } } diff --git a/src/process.ts b/src/process.ts index c5c0cf77..ec3b8858 100644 --- a/src/process.ts +++ b/src/process.ts @@ -161,12 +161,43 @@ export async function gitClone( await git(['clone', '--', url, folder], { cwd }, 'git clone') } -/** Fast-forwards the repository in `folder` to its upstream branch. */ -export async function gitPull(folder: string): Promise { - await git(['pull', '--ff-only'], { cwd: folder }, 'git pull') +/** + * Runs git and returns its output, without showing it. Fails with git's own + * message unless `allowFailure` is set (then `null` is returned on failure). + */ +export async function gitOutput( + args: string[], + { cwd, allowFailure = false }: { cwd: string; allowFailure?: boolean }, +): Promise { + const result = await new Promise<{ code: number | null; stdout: string; stderr: string }>( + (resolve, reject) => { + const child = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] }) + let stdout = '' + let stderr = '' + child.stdout.on('data', chunk => { + stdout += chunk + }) + child.stderr.on('data', chunk => { + stderr += chunk + }) + child.once('error', error => { + reject( + (error as NodeJS.ErrnoException).code === 'ENOENT' + ? new CliError('git is not installed or not in PATH.') + : error, + ) + }) + child.once('close', code => resolve({ code, stdout, stderr })) + }, + ) + + if (result.code === 0) return result.stdout + if (allowFailure) return null + throw new CliError(`git ${args[0]} failed: ${result.stderr.trim() || `exit code ${result.code}`}`) } -async function git(args: string[], { cwd }: { cwd: string }, label: string): Promise { +/** Runs git with its output shown to the user. */ +export async function git(args: string[], { cwd }: { cwd: string }, label: string): Promise { let code: number try { code = await run('git', args, { cwd }) diff --git a/src/sync.ts b/src/sync.ts new file mode 100644 index 00000000..ffd4b44f --- /dev/null +++ b/src/sync.ts @@ -0,0 +1,117 @@ +import { mkdir } from 'node:fs/promises' +import path from 'node:path' + +import { CliError } from './errors.js' +import { writeFileAtomic } from './fsutil.js' +import { git, gitOutput } from './process.js' + +export interface SyncResult { + /** The remote branch the mirror follows, such as `origin/main`. */ + readonly upstream: string + /** Commit of the mirror before and after syncing (`null`: none yet). */ + readonly before: string | null + readonly after: string + /** Patch of the local changes found in the mirror, saved before syncing. */ + readonly saved: string | null +} + +/** Identity and settings for the commit that saves local changes. */ +const SAVE_COMMIT = [ + '-c', + 'user.name=configfile', + '-c', + 'user.email=configfile@localhost', + '-c', + 'commit.gpgsign=false', +] + +/** + * Makes the mirror of the dotfiles repository identical to the remote. The + * mirror is not a working copy: local changes and unpushed commits (for + * example edits made through deployed links) are saved as a patch in + * `savedFolder`, so that nothing is lost, then the mirror is reset. Syncing + * never stops on conflicts. + */ +export async function syncMirror(folder: string, savedFolder: string): Promise { + const cwd = folder + await git(['fetch', '--prune', '--quiet'], { cwd }, 'git fetch') + + const upstream = await upstreamOf(folder) + const before = await revision('HEAD', folder) + + let saved: string | null = null + const dirty = + ((await gitOutput(['status', '--porcelain', '--untracked-files=all'], { cwd })) ?? '') !== '' + const ahead = + before == null + ? 0 + : Number((await gitOutput(['rev-list', '--count', `${upstream}..HEAD`], { cwd }))?.trim()) + + if (dirty || ahead > 0) { + if (dirty) { + await gitOutput(['add', '--all'], { cwd }) + await gitOutput( + [ + ...SAVE_COMMIT, + 'commit', + '--quiet', + '--no-verify', + '--message', + 'Local changes saved by configfile before syncing', + ], + { cwd }, + ) + } + saved = await savePatch(folder, upstream, savedFolder) + } + + await gitOutput(['reset', '--hard', '--quiet', upstream], { cwd }) + const after = await revision('HEAD', folder) + if (after == null) throw new CliError(`Cannot read the commit of ${folder} after syncing.`) + + return { upstream, before, after, saved } +} + +/** The remote branch followed by the mirror: its upstream, or the remote's default branch. */ +async function upstreamOf(folder: string): Promise { + const cwd = folder + const tracked = await gitOutput( + ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'], + { cwd, allowFailure: true }, + ) + if (tracked != null && tracked.trim() !== '') return tracked.trim() + + const remoteDefault = await gitOutput(['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], { + cwd, + allowFailure: true, + }) + if (remoteDefault != null && remoteDefault.trim() !== '') return remoteDefault.trim() + + throw new CliError( + `${folder} follows no remote branch. Run "configfile init --force" to clone the repository again.`, + ) +} + +async function revision(name: string, folder: string): Promise { + const output = await gitOutput(['rev-parse', '--verify', '--quiet', name], { + cwd: folder, + allowFailure: true, + }) + return output == null || output.trim() === '' ? null : output.trim() +} + +/** Writes the commits of the mirror that are not on `upstream` as a `git am` patch. */ +async function savePatch(folder: string, upstream: string, savedFolder: string): Promise { + const cwd = folder + const base = ( + await gitOutput(['merge-base', upstream, 'HEAD'], { cwd, allowFailure: true }) + )?.trim() + const range = base == null || base === '' ? ['--root', 'HEAD'] : [`${base}..HEAD`] + const patch = (await gitOutput(['format-patch', '--stdout', ...range], { cwd })) ?? '' + + const stamp = new Date().toISOString().replace(/[:.]/g, '-') + const file = path.join(savedFolder, `${stamp}.patch`) + await mkdir(savedFolder, { recursive: true, mode: 0o700 }) + await writeFileAtomic(file, patch, { mode: 0o600 }) + return file +} diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 9dfcbb4a..baf99969 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -4,11 +4,13 @@ import { copyFile, lstat, mkdir, + readdir, readFile, readlink, rename, stat, symlink, + writeFile, } from 'node:fs/promises' import path from 'node:path' @@ -904,11 +906,14 @@ describe('init', () => { const sandbox = await createSandbox() const remote = await withRemote(sandbox) - const result = await runCli(sandbox, ['init'], [remote, '~/dotfiles']) + const result = await runCli(sandbox, ['init'], [remote]) - expect(result.code).toBe(0) - expect(existsSync(path.join(sandbox.repo, 'files/.gitkeep'))).toBe(true) - expect(await readConfig(sandbox)).toEqual({ repo_url: remote, folder_path: sandbox.repo }) + // Only the URL is asked: the mirror lives in configfile's own folder. + const mirror = path.join(sandbox.home, '.configfile/dotfiles') + expect(result).toMatchObject({ code: 0, asked: ['Dotfiles repository URL:'] }) + expect(existsSync(path.join(mirror, 'files/.gitkeep'))).toBe(true) + expect(await readConfig(sandbox)).toEqual({ repo_url: remote, folder_path: mirror }) + expect((await stat(path.join(sandbox.home, '.configfile'))).mode & 0o777).toBe(0o700) }) it('can run without prompts', async () => { @@ -980,11 +985,12 @@ describe('init', () => { const remote = await withRemote(sandbox) await sandbox.configure({ repo_url: 'old' }) - const result = await runCli(sandbox, ['init'], [true, remote, '~/dotfiles']) + const result = await runCli(sandbox, ['init'], [true, remote]) expect(result.code).toBe(0) - expect(result.asked).toHaveLength(3) - expect((await readConfig(sandbox)).repo_url).toBe(remote) + expect(result.asked).toHaveLength(2) + // The existing folder_path is kept. + expect(await readConfig(sandbox)).toEqual({ repo_url: remote, folder_path: sandbox.repo }) }) it.each([ @@ -1012,7 +1018,7 @@ describe('init', () => { it('does not save the configuration when cancelled', async () => { const sandbox = await createSandbox() - const result = await runCli(sandbox, ['init'], ['url', exitPromptError()]) + const result = await runCli(sandbox, ['init'], [exitPromptError()]) expect(result.code).toBe(130) expect(existsSync(path.join(sandbox.home, '.configfilerc'))).toBe(false) @@ -1083,54 +1089,115 @@ describe('init', () => { }) describe('update', () => { - it('pulls the dotfiles repository', async () => { - const sandbox = await createSandbox() + /** A remote, configfile's mirror of it, and a function to commit in the remote. */ + async function withMirror(sandbox: Sandbox) { const remote = await createRemote(sandbox) git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) await sandbox.configure() + const commitInRemote = async (file: string, content: string) => { + await sandbox.write(`remote/${file}`, content) + git(remote, 'add', '.') + git(remote, 'commit', '--quiet', '-m', `change ${file}`) + } + return { remote, commitInRemote } + } + + const savedPatches = async (sandbox: Sandbox) => { + const folder = path.join(sandbox.home, '.configfile/saved') + return existsSync(folder) ? (await readdir(folder)).map(name => path.join(folder, name)) : [] + } - await sandbox.write('remote/files/new-file', 'new') - git(remote, 'add', '.') - git(remote, 'commit', '--quiet', '-m', 'second') + it('syncs the mirror with the remote', async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/new-file', 'new') const result = await runCli(sandbox, ['update']) expect(result.code).toBe(0) + expect(result.stdout).toContain('Synced with origin/main') expect(await readFile(path.join(sandbox.repo, 'files/new-file'), 'utf8')).toBe('new') + expect(await savedPatches(sandbox)).toEqual([]) }) - it('refuses to merge when the histories diverged (fast-forward only)', async () => { + it('says when the mirror is already up to date', async () => { const sandbox = await createSandbox() - const remote = await createRemote(sandbox) - git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) - await sandbox.configure() - await sandbox.write('remote/files/remote-change', 'remote') - git(remote, 'add', '.') - git(remote, 'commit', '--quiet', '-m', 'remote') - await sandbox.write('home/dotfiles/files/local-change', 'local') + await withMirror(sandbox) + + const result = await runCli(sandbox, ['update']) + + expect(result).toMatchObject({ code: 0 }) + expect(result.stdout).toContain('Already up to date with origin/main.') + }) + + it('saves local commits, edits and new files as a patch, then syncs anyway', async () => { + const sandbox = await createSandbox() + const { remote, commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/remote-change', 'remote') + await sandbox.write('home/dotfiles/files/committed', 'committed locally') git(sandbox.repo, 'add', '.') - git(sandbox.repo, 'commit', '--quiet', '-m', 'local') - - // Without --ff-only, this configuration would let git pull create a merge commit. - const gitConfig = { - GIT_CONFIG_COUNT: '3', - GIT_CONFIG_KEY_0: 'pull.rebase', - GIT_CONFIG_VALUE_0: 'false', - GIT_CONFIG_KEY_1: 'user.name', - GIT_CONFIG_VALUE_1: 'test', - GIT_CONFIG_KEY_2: 'user.email', - GIT_CONFIG_VALUE_2: 'test@example.com', - } - Object.assign(process.env, gitConfig) - try { - const result = await runCli(sandbox, ['update']) - - expect(result.code).not.toBe(0) - expect(result.stderr).toContain('git pull failed') - expect(existsSync(path.join(sandbox.repo, 'files/remote-change'))).toBe(false) - } finally { - for (const key of Object.keys(gitConfig)) delete process.env[key] - } + git(sandbox.repo, 'commit', '--quiet', '-m', 'local commit') + await sandbox.write('home/dotfiles/files/.gitkeep', 'edited, not committed') + await sandbox.write('home/dotfiles/files/untracked', 'new file') + + const result = await runCli(sandbox, ['update']) + + expect(result.code).toBe(0) + const [patch] = await savedPatches(sandbox) + expect(result.stderr).toContain(`had local changes: they were saved to ${patch}`) + expect(result.stderr).toContain(`git am ${patch}`) + // The mirror is now exactly the remote. + expect(await readFile(path.join(sandbox.repo, 'files/remote-change'), 'utf8')).toBe('remote') + expect(existsSync(path.join(sandbox.repo, 'files/committed'))).toBe(false) + expect(existsSync(path.join(sandbox.repo, 'files/untracked'))).toBe(false) + expect(await readFile(path.join(sandbox.repo, 'files/.gitkeep'), 'utf8')).toBe('') + + // The saved patch brings everything back in a working copy. + const workingCopy = path.join(sandbox.root, 'working-copy') + git(sandbox.root, 'clone', '--quiet', remote, workingCopy) + git(workingCopy, 'am', '--quiet', patch ?? '') + expect(await readFile(path.join(workingCopy, 'files/committed'), 'utf8')).toBe( + 'committed locally', + ) + expect(await readFile(path.join(workingCopy, 'files/untracked'), 'utf8')).toBe('new file') + expect(await readFile(path.join(workingCopy, 'files/.gitkeep'), 'utf8')).toBe( + 'edited, not committed', + ) + }) + + it('saves an edit made through a deployed link before syncing', async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/zsh/zshrc', 'from remote') + await commitInRemote( + 'files/zsh/settings.json', + JSON.stringify({ + files: [{ source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }], + }), + ) + await runCli(sandbox, ['update']) + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + await writeFile(path.join(sandbox.home, '.zshrc'), 'edited through the link') + await commitInRemote('files/zsh/zshrc', 'newer from remote') + + const result = await runCli(sandbox, ['update']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.home, '.zshrc'), 'utf8')).toBe('newer from remote') + const [patch] = await savedPatches(sandbox) + expect(await readFile(patch ?? '', 'utf8')).toContain('+edited through the link') + }) + + it('follows the remote default branch when the mirror has no upstream', async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + git(sandbox.repo, 'branch', '--unset-upstream') + await commitInRemote('files/new-file', 'new') + + const result = await runCli(sandbox, ['update']) + + expect(result.code).toBe(0) + expect(await readFile(path.join(sandbox.repo, 'files/new-file'), 'utf8')).toBe('new') }) it('fails when the dotfiles folder is not a git repository', async () => { From 1addadfbc54f78efa95059068310e33e4fbc9865 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 1 Oct 2026 12:03:30 +0200 Subject: [PATCH 321/341] feat: record what configfile changes in a history log (#284) --- CHANGELOG.md | 3 + README.md | 34 ++++- docs/home.md | 1 + src/cli.ts | 6 +- src/commands/history.ts | 167 ++++++++++++++++++++++ src/commands/init.ts | 18 +-- src/commands/modules.ts | 67 ++++++++- src/commands/scripts.ts | 2 + src/commands/update.ts | 11 +- src/config.ts | 43 ++++++ src/context.ts | 3 + src/history.ts | 299 ++++++++++++++++++++++++++++++++++++++++ src/output.ts | 14 ++ src/program.ts | 51 ++++++- src/sync.ts | 8 +- tests/commands.test.ts | 253 +++++++++++++++++++++++++++++++++- tests/config.test.ts | 45 +++++- tests/e2e.test.ts | 32 +++++ tests/helpers.ts | 9 ++ tests/history.test.ts | 271 ++++++++++++++++++++++++++++++++++++ 20 files changed, 1301 insertions(+), 36 deletions(-) create mode 100644 src/commands/history.ts create mode 100644 src/history.ts create mode 100644 tests/history.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e535a33..269d4850 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. or `"none"` to keep a file in the repository without deploying it. - Arguments can be passed to scripts: `configfile scripts run -- `. - A script can be a folder containing an `index` file. +- configfile records what each command changed, when, and whether it failed, in + `~/.configfile/history.jsonl` ([#36](https://github.com/mindsers/configfile/issues/36)). +- The `history` command to see what configfile changed. - The `settings.json` format is documented in the README. ### Changed diff --git a/README.md b/README.md index fd81b022..4ea7df1b 100644 --- a/README.md +++ b/README.md @@ -110,12 +110,15 @@ Scripts can be written in any language: - `configfile scripts list` (`s l`, or just `configfile scripts`): list available scripts. - `configfile scripts run [-- args...]` (`s r`): run a script. Arguments after `--` are passed to the script. - `configfile update` (`u`): sync *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. +- `configfile history`: show what *configfile* changed, most recent last (see [History](#history)). + - `-n, --limit `: number of runs to show (20 by default). + - `--json`: print the raw history lines (JSON Lines), for scripts. -*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. +*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. Each run that changes something is also recorded in the [history](#history). ### Configuration -*configfile* keeps its configuration in `~/.configfilerc`, and its working files in the `~/.configfile/` folder: the mirror of your repository (`dotfiles/`), the record of deployments (`state.json`), the lock, and saved local changes (`saved/`). +*configfile* keeps its configuration in `~/.configfilerc`, and its working files in the `~/.configfile/` folder: the mirror of your repository (`dotfiles/`), the record of deployments (`state.json`), the [history](#history) (`history.jsonl`), the lock, and saved local changes (`saved/`). `~/.configfilerc` is a JSON file: @@ -123,11 +126,34 @@ Scripts can be written in any language: { "repo_url": "git@github.com:me/dotfiles.git", "folder_path": "/Users/me/.configfile/dotfiles", - "script_extensions": [".js", ".sh", ""] + "script_extensions": [".js", ".sh", ""], + "history_max_size": "1MB" } ``` -`folder_path` may start with `~`; a relative path is relative to your home folder. `script_extensions` is optional: without it, every file of `scripts/` is a script. With it, only files with one of these extensions are; the dot may be omitted (`"py"`), and `""` means files without extension. +`folder_path` may start with `~`; a relative path is relative to your home folder. `script_extensions` is optional: without it, every file of `scripts/` is a script. With it, only files with one of these extensions are; the dot may be omitted (`"py"`), and `""` means files without extension. `history_max_size` is optional: see [History](#history). + +### History + +*configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes. + +Script arguments, environment variables and file contents are never recorded, and passwords or tokens in URLs are hidden. The file is only readable by its owner. + +`configfile history` shows the last runs: + +```txt +2026-10-01 11:12 modules deploy zsh ok + linked ~/.zshrc (previous file moved to ~/.zshrc.old) + 2 unchanged +``` + +The file is also easy to query with `jq`, for example to list the failed runs: + +```bash +jq 'select(.exitCode != 0)' ~/.configfile/history.jsonl +``` + +When the file reaches `history_max_size` (1MB by default; a number of bytes, or a size such as `"512KB"` or `"5MB"` in `~/.configfilerc`), it is renamed to `history.1.jsonl`, replacing the previous one, so the history takes about twice that size at most. `"history_max_size": 0` turns the history off. ## Upgrading from 0.3 diff --git a/docs/home.md b/docs/home.md index 9a905fa6..f4805610 100644 --- a/docs/home.md +++ b/docs/home.md @@ -40,6 +40,7 @@ pnpm test - [configfile scripts list](../README.md#usage) - [configfile scripts run](../README.md#usage) - [configfile update](../README.md#usage) +- [configfile history](../README.md#history) ## Configfiles Configuration diff --git a/src/cli.ts b/src/cli.ts index 99236aa7..92b64146 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,13 +1,17 @@ #!/usr/bin/env node import os from 'node:os' +import { History } from './history.js' import { Output } from './output.js' import { main } from './program.js' import { interactivePrompts, nonInteractivePrompts } from './prompts.js' +const home = os.homedir() + process.exitCode = await main(process.argv.slice(2), { - home: os.homedir(), + home, cwd: process.cwd(), output: new Output(process.stdout, process.stderr), prompts: process.stdin.isTTY ? interactivePrompts : nonInteractivePrompts, + history: new History(home), }) diff --git a/src/commands/history.ts b/src/commands/history.ts new file mode 100644 index 00000000..c6974249 --- /dev/null +++ b/src/commands/history.ts @@ -0,0 +1,167 @@ +import type { Command } from 'commander' + +import type { Context } from '../context.js' +import { CliError } from '../errors.js' +import type { Change, HistoryLine } from '../history.js' +import { plural } from '../output.js' + +const DEFAULT_LIMIT = 20 + +interface HistoryOptions { + limit?: string + json?: boolean +} + +export function registerHistoryCommand(program: Command, ctx: Context): void { + program + .command('history') + .description('show what configfile changed, most recent last') + .option('-n, --limit ', `number of runs to show (default: ${DEFAULT_LIMIT})`) + .option('--json', 'print the raw history lines (JSON Lines), for scripts') + .action((options: HistoryOptions) => history(options, ctx)) +} + +async function history(options: HistoryOptions, ctx: Context): Promise { + const { output } = ctx + const limit = parseLimit(options.limit) + const { lines, invalid } = await ctx.history.read({ limit }) + + if (invalid > 0) { + output.warn(`${plural(invalid, 'unreadable line')} of ${ctx.history.file} skipped.`) + } + + if (options.json === true) { + for (const line of lines) output.stdout.write(`${JSON.stringify(line)}\n`) + return + } + + if (lines.length === 0) { + const { maxBytes } = await ctx.history.settings() + output.info( + maxBytes === 0 + ? 'The history is turned off ("history_max_size" is 0 in ~/.configfilerc).' + : 'No history yet.', + ) + return + } + + const show = (text: string) => shortenHome(text, ctx.home) + for (const [index, line] of lines.entries()) { + if (index > 0) output.print('') + output.print( + `${formatTime(line.time)} ${show(describeRun(line))} ${line.exitCode === 0 ? 'ok' : `exit ${line.exitCode}`}`, + ) + if (line.error != null && !line.error.expected) { + output.print(` error ${show(line.error.message)}`) + } + for (const change of line.changes) { + output.print(` ${show(describeChange(change))}`) + } + if (line.truncated != null) output.print(` …and ${line.truncated} more changes`) + if (line.unchanged > 0) output.print(` ${line.unchanged} unchanged`) + } +} + +function parseLimit(value: string | undefined): number { + if (value == null) return DEFAULT_LIMIT + const limit = Number(value) + if (!Number.isInteger(limit) || limit <= 0) { + throw new CliError(`--limit must be a positive number, not "${value}".`) + } + return limit +} + +/** The command line of a run, rebuilt from its recorded options. */ +function describeRun(line: HistoryLine): string { + const options = line.options + const words = [line.command ?? '(unknown command)'] + + if (Array.isArray(options.modules)) words.push(...options.modules.map(String)) + if (typeof options.script === 'string') words.push(options.script) + if (typeof options.repo === 'string') words.push('--repo', options.repo) + if (typeof options.folder === 'string') words.push('--folder', options.folder) + for (const flag of ['local', 'all', 'force'] as const) { + if (options[flag] === true) words.push(`--${flag}`) + } + if (typeof options.argCount === 'number' && options.argCount > 0) { + words.push(`(${plural(options.argCount, 'argument')})`) + } + return words.join(' ') +} + +/** One change, as an aligned line: a verb, then what it applies to. */ +function describeChange(change: Change): string { + const line = (verb: string, text: string) => `${verb.padEnd(9)} ${text}` + + switch (change.kind) { + case 'deployed': { + const moved = change.backup == null ? '' : ` (previous file moved to ${change.backup})` + return line(change.how === 'link' ? 'linked' : 'copied', `${change.target}${moved}`) + } + case 'skipped': + return line('skipped', `${change.target} (it already existed)`) + case 'removed': { + const backup = + change.backup == null + ? '' + : { + restored: ` (${change.backup.path} restored)`, + missing: ` (its backup ${change.backup.path} no longer existed)`, + changed: ` (its backup ${change.backup.path} had changed, not restored)`, + }[change.backup.status] + const leftover = change.leftover == null ? '' : ` (left at ${change.leftover})` + return line('removed', `${change.target}${backup}${leftover}`) + } + case 'kept': { + const reason = { + foreign: 'not deployed by configfile', + modified: 'modified since it was copied', + identical: 'not copied by configfile', + 'source-missing': 'its source was missing', + }[change.reason] + return line('kept', `${change.target} (${reason})`) + } + case 'failed': + return line( + 'failed', + `${change.target ?? `module ${change.module ?? '?'}`} ${change.reason}`, + ) + case 'synced': + return line( + 'synced', + change.from === change.to + ? `${change.folder} (already up to date with ${change.upstream})` + : `${change.folder} with ${change.upstream} (${short(change.from)} → ${short(change.to)})`, + ) + case 'saved-patch': + return line('saved', `local changes to ${change.file}`) + case 'script': + return line('script', `${change.name} exit ${change.exitCode}`) + case 'cloned': + return line('cloned', `${change.repository} into ${change.folder}`) + case 'reused': + return line('reused', `${change.folder} for ${change.repository}`) + case 'configured': + return line('saved', `configuration ${change.file}`) + } +} + +function short(commit: string | null): string { + return commit == null ? 'nothing' : commit.slice(0, 7) +} + +/** `2026-10-01 11:12`, in local time. */ +function formatTime(iso: string): string { + const date = new Date(iso) + if (Number.isNaN(date.getTime())) return iso + const pad = (value: number) => String(value).padStart(2, '0') + return ( + `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` + + `${pad(date.getHours())}:${pad(date.getMinutes())}` + ) +} + +/** Shows paths in the home folder as `~/…` (display only; the file keeps full paths). */ +function shortenHome(text: string, home: string): string { + return text.split(`${home}/`).join('~/') +} diff --git a/src/commands/init.ts b/src/commands/init.ts index abadebc4..31d96629 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -7,6 +7,7 @@ import type { Command } from 'commander' import { ConfigStore } from '../config.js' import type { Context } from '../context.js' import { CliError } from '../errors.js' +import { redactUrl } from '../output.js' import { configfilePaths, resolveUserPath } from '../paths.js' import { gitClone } from '../process.js' @@ -91,6 +92,7 @@ async function init(options: InitOptions, ctx: Context): Promise { ) case 'git-repository': output.info(`${folderPath} already contains a git repository. It is used as is.`) + ctx.history.record({ kind: 'reused', repository: redactUrl(repoUrl), folder: folderPath }) break case 'missing': case 'empty': @@ -99,6 +101,7 @@ async function init(options: InitOptions, ctx: Context): Promise { }) output.info(`Cloning ${redactUrl(repoUrl)} into ${folderPath}…`) await gitClone(repoUrl, folderPath, ctx) + ctx.history.record({ kind: 'cloned', repository: redactUrl(repoUrl), folder: folderPath }) break } @@ -110,6 +113,7 @@ async function init(options: InitOptions, ctx: Context): Promise { '"configfile init" again, it will reuse it.', ) } + ctx.history.record({ kind: 'configured', file: store.path }) output.success(`configfile is ready. Configuration saved to ${store.path}.`) } @@ -136,17 +140,3 @@ async function inspectFolder(folderPath: string) { if ((await readdir(folderPath).catch(fail)).length > 0) return 'not-empty' return 'empty' } - -/** The URL with its password or token (`https://user:token@host/…`) hidden. */ -export function redactUrl(url: string): string { - let parsed: URL - try { - parsed = new URL(url) - } catch { - return url // Not a URL (for example git@host:repo.git or a local path). - } - if (parsed.password === '' && (parsed.username === '' || parsed.protocol === 'ssh:')) return url - parsed.username = parsed.username === '' ? '' : '***' - parsed.password = parsed.password === '' ? '' : '***' - return parsed.toString() -} diff --git a/src/commands/modules.ts b/src/commands/modules.ts index e7b7da45..5875fff1 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -219,6 +219,7 @@ async function deployAll( conflicts.push(file) } else { output.print(`- ${file.target} ${describeDeploy(result)}`) + recordDeploy(file, result, ctx) } } catch (error) { reportError(file, error) @@ -238,6 +239,7 @@ async function deployAll( if (!replace) { skipped++ output.print(`- ${file.target} (already exists, skipped)`) + ctx.history.record({ kind: 'skipped', target: file.target, reason: 'exists' }) continue } @@ -247,6 +249,7 @@ async function deployAll( throw new CliError('the target still exists after being moved aside.') } output.print(`- ${file.target} ${describeDeploy(result)}`) + recordDeploy(file, result, ctx) } catch (error) { reportError(file, error) } @@ -266,10 +269,15 @@ async function undeploy(names: string[], options: Options, ctx: Context): Promis const undeployEach = async (context: DeployContext) => { for (const file of files) { try { - const line = options.dryRun - ? `(${describePlannedUndeploy(await planUndeploy(file, context))})` - : describeUndeploy(await undeployFile(file, context)) - output.print(`- ${file.target} ${line}`) + if (options.dryRun) { + output.print( + `- ${file.target} (${describePlannedUndeploy(await planUndeploy(file, context))})`, + ) + continue + } + const result = await undeployFile(file, context) + output.print(`- ${file.target} ${describeUndeploy(result)}`) + recordUndeploy(file, result, ctx) } catch (error) { failures++ reportFileError(file, error, ctx) @@ -314,11 +322,15 @@ async function prepare( if (module.error != null) { failures++ output.error(`Module "${module.name}" was not ${verb}ed: ${module.error}.`) + ctx.history.record({ kind: 'failed', module: module.name, reason: module.error }) continue } usable.push(module) failures += module.invalidEntries.length + for (const problem of module.invalidEntries) { + ctx.history.record({ kind: 'failed', module: module.name, reason: problem }) + } reportSettings(module, ctx) for (const source of module.undecided) { output.warn( @@ -434,7 +446,8 @@ function finish(failures: number, problems: string[], success: string, ctx: Cont } function reportFileError(file: ModuleFile, error: unknown, ctx: Context): void { - ctx.output.error(`${file.target}: ${(error as Error).message}`) + ctx.output.error(`${file.target}: ${messageOf(error)}`) + ctx.history.record({ kind: 'failed', target: file.target, reason: messageOf(error) }) if (!(error instanceof CliError) && process.env.DEBUG != null) { ctx.output.stderr.write(`${(error as Error).stack}\n`) } @@ -546,3 +559,47 @@ function describeUndeploy(result: UndeployResult): string { return `(kept: ${describeKept(result.state)})` } } + +/** Records a deployment in the history (files already in place are only counted). */ +function recordDeploy( + file: ModuleFile, + result: Exclude, + ctx: Context, +): void { + if (result.status === 'up-to-date') { + ctx.history.unchanged() + return + } + ctx.history.record({ + kind: 'deployed', + how: file.strategy === 'global' ? 'link' : 'copy', + source: file.source, + target: file.target, + ...(result.status === 'backed-up' && { backup: result.backup }), + }) +} + +/** Records an undeployment in the history (files that were not deployed are only counted). */ +function recordUndeploy(file: ModuleFile, result: UndeployResult, ctx: Context): void { + switch (result.status) { + case 'not-deployed': + ctx.history.unchanged() + return + case 'kept': + ctx.history.record({ kind: 'kept', target: file.target, reason: result.state.kind }) + return + case 'removed': + ctx.history.record({ + kind: 'removed', + target: file.target, + ...(result.backup != null && { + backup: { + path: result.backup.path, + status: result.backup.status === 'ok' ? 'restored' : result.backup.status, + }, + }), + ...(result.leftover != null && { leftover: result.leftover }), + }) + return + } +} diff --git a/src/commands/scripts.ts b/src/commands/scripts.ts index d6cb49dc..17585e73 100644 --- a/src/commands/scripts.ts +++ b/src/commands/scripts.ts @@ -64,6 +64,8 @@ async function run(name: string, args: string[], ctx: Context): Promise { output.info(`Running "${name}"…`) const code = await runScript(script, args, ctx) + // The arguments are never recorded: they may contain secrets. + ctx.history.record({ kind: 'script', name: script.name, file: script.path, exitCode: code }) if (code !== 0) { throw new CliError(`Script "${name}" exited with code ${code}.`, code) diff --git a/src/commands/update.ts b/src/commands/update.ts index 8e50a59e..6aef41ec 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -32,7 +32,16 @@ async function update(ctx: Context): Promise { } output.info(`Syncing ${folderPath}…`) - const result = await syncMirror(folderPath, configfilePaths(ctx.home).saved) + const result = await syncMirror(folderPath, configfilePaths(ctx.home).saved, { + onSaved: file => ctx.history.record({ kind: 'saved-patch', file }), + }) + ctx.history.record({ + kind: 'synced', + folder: folderPath, + upstream: result.upstream, + from: result.before, + to: result.after, + }) if (result.saved != null) { output.warn( diff --git a/src/config.ts b/src/config.ts index 598d6a5c..3d09d3ee 100644 --- a/src/config.ts +++ b/src/config.ts @@ -76,6 +76,35 @@ export class ConfigStore { return partial } + /** + * The maximum size of the history (`history_max_size`), in bytes: a number + * of bytes or a size such as "512KB" or "5MB"; 0 turns the history off. + * Never fails: the history must work before `init` and with an invalid + * configuration, so problems give the default and a warning. + */ + async readHistorySize(): Promise<{ maxBytes: number; warning: string | null }> { + let raw: RawConfig | null + try { + raw = await this.#readRaw() + } catch { + return { maxBytes: DEFAULT_HISTORY_SIZE, warning: null } + } + + const value = raw?.history_max_size + if (value === undefined) return { maxBytes: DEFAULT_HISTORY_SIZE, warning: null } + + const size = parseSize(value) + if (size == null) { + return { + maxBytes: DEFAULT_HISTORY_SIZE, + warning: + `"history_max_size" in ${this.path} must be a size such as 1048576, "512KB" or ` + + `"5MB" (0 turns the history off); using 1MB.`, + } + } + return { maxBytes: size, warning: null } + } + /** Saves the configuration. Unknown keys of a valid existing file are kept. */ async write(config: { repoUrl: string; folderPath: string }): Promise { const previous = (await this.#readRaw().catch(ignoreInvalid)) ?? {} @@ -137,3 +166,17 @@ function ignoreInvalid(error: unknown): null { if (error instanceof InvalidConfigError) return null throw error } + +/** Default size of `history.jsonl` before it is rotated: 1 MiB. */ +export const DEFAULT_HISTORY_SIZE = 1024 * 1024 + +const UNITS: Record = { B: 1, KB: 1024, MB: 1024 ** 2, GB: 1024 ** 3 } + +/** Bytes from 1048576, "1048576", "512KB" or "5 MB"; `null` when invalid. */ +function parseSize(value: unknown): number | null { + if (typeof value === 'number') return Number.isInteger(value) && value >= 0 ? value : null + if (typeof value !== 'string') return null + const match = /^\s*(\d+)\s*(B|KB|MB|GB)?\s*$/i.exec(value) + if (match == null) return null + return Number(match[1]) * (UNITS[(match[2] ?? 'B').toUpperCase()] ?? 1) +} diff --git a/src/context.ts b/src/context.ts index 92596bf6..af91ea75 100644 --- a/src/context.ts +++ b/src/context.ts @@ -1,3 +1,4 @@ +import type { History } from './history.js' import type { Output } from './output.js' export interface Prompts { @@ -13,4 +14,6 @@ export interface Context { readonly cwd: string readonly output: Output readonly prompts: Prompts + /** What this run changes, saved to `~/.configfile/history.jsonl` when it ends. */ + readonly history: History } diff --git a/src/history.ts b/src/history.ts new file mode 100644 index 00000000..a10b0258 --- /dev/null +++ b/src/history.ts @@ -0,0 +1,299 @@ +import { constants } from 'node:fs' +import { mkdir, open, readFile, rename } from 'node:fs/promises' +import path from 'node:path' + +import { type Command, CommanderError } from 'commander' + +import { ConfigStore } from './config.js' +import type { KeptState } from './deploy.js' +import { CliError, isPromptExit } from './errors.js' +import { errnoCode, lstatOrNull, messageOf } from './fsutil.js' +import { redactUrl } from './output.js' +import { configfilePaths } from './paths.js' + +/** At most this many changes are written per run; the rest are counted. */ +const MAX_CHANGES = 1000 + +/** Commands that change files: each run is recorded, successful or not (dry runs excepted). */ +export const RECORDED = new Set([ + 'init', + 'modules deploy', + 'modules undeploy', + 'update', + 'scripts run', +]) + +/** Commands that change nothing: only recorded when they fail unexpectedly. */ +export const READ_ONLY = new Set(['modules list', 'modules status', 'scripts list', 'history']) + +/** One thing configfile did (or failed to do) during a run. */ +export type Change = + | { kind: 'deployed'; how: 'link' | 'copy'; source: string; target: string; backup?: string } + | { kind: 'skipped'; target: string; reason: 'exists' } + | { + kind: 'removed' + target: string + backup?: { path: string; status: 'restored' | 'missing' | 'changed' } + leftover?: string + } + | { kind: 'kept'; target: string; reason: KeptState['kind'] } + | { kind: 'failed'; target?: string; module?: string; reason: string } + | { kind: 'synced'; folder: string; upstream: string; from: string | null; to: string } + | { kind: 'saved-patch'; file: string } + | { kind: 'script'; name: string; file: string; exitCode: number } + | { kind: 'cloned' | 'reused'; repository: string; folder: string } + | { kind: 'configured'; file: string } + +/** The command a run executed, with the options worth recording. */ +export interface Invocation { + readonly command: string + readonly options: Readonly> + readonly dryRun: boolean +} + +/** One line of `history.jsonl`. */ +export interface HistoryLine { + v: 1 + time: string + durationMs: number + pid: number + version: string + command: string | null + options: Record + cwd: string + exitCode: number + error?: { message: string; expected: boolean; stack?: string } + changes: Change[] + unchanged: number + truncated?: number +} + +/** The full name of the command that runs, whatever alias was typed (`m d` → `modules deploy`). */ +export function commandPath(action: Command): string { + const names: string[] = [] + for (let command: Command | null = action; command?.parent != null; command = command.parent) { + names.unshift(command.name()) + } + return names.join(' ') +} + +/** + * The command and its options. Options are copied from an allowlist per + * command, never from the raw arguments: script arguments, for example, can + * contain secrets, so only their number is kept. + */ +export function describeInvocation(action: Command): Invocation { + const command = commandPath(action) + const given = action.opts() as Record + const args = action.processedArgs as unknown[] + const options: Record = {} + const copy = (...names: string[]) => { + for (const name of names) { + if (given[name] !== undefined) options[name] = given[name] + } + } + + switch (command) { + case 'init': + copy('force', 'folder') + if (typeof given.repo === 'string') options.repo = redactUrl(given.repo) + break + case 'modules deploy': + case 'modules undeploy': + case 'modules status': + options.modules = Array.isArray(args[0]) ? args[0] : [] + copy('local', 'all', 'force', 'dryRun') + break + case 'scripts run': + options.script = args[0] + options.argCount = Array.isArray(args[1]) ? args[1].length : 0 + break + case 'history': + copy('limit', 'json') + break + } + + return { command, options, dryRun: given.dryRun === true } +} + +/** Errors users are told about by design, as opposed to crashes. */ +export function isExpectedError(error: unknown): boolean { + return ( + error == null || + error instanceof CliError || + error instanceof CommanderError || + isPromptExit(error) + ) +} + +/** Runs of commands that change files are recorded, and any unexpected crash. */ +export function shouldRecord(invocation: Invocation | null, error: unknown): boolean { + const changing = invocation != null && RECORDED.has(invocation.command) && !invocation.dryRun + return changing || !isExpectedError(error) +} + +/** Hides credentials in URLs (`https://user:token@host`) anywhere in a text. */ +export function redactCredentials(text: string): string { + return text.replace(/([a-z][a-z0-9+.-]*:\/\/)([^\s/@]+)@/gi, (match, scheme, credentials) => + // Already hidden (by redactUrl): keep it as it is. + /^[*:]+$/.test(credentials) ? match : `${scheme}***@`, + ) +} + +/** + * The history of what configfile changed: one JSON line per run in + * `~/.configfile/history.jsonl`, rotated to `history.1.jsonl` when it reaches + * its maximum size (`history_max_size` in `~/.configfilerc`; 0 turns it off). + * + * Commands record their changes in memory during a run; `main` saves them at + * the end. Saving never throws: the history must never change a command's + * result. + */ +export class History { + readonly file: string + readonly previousFile: string + readonly #home: string + readonly #maxBytes: number | undefined + #settings: Promise<{ maxBytes: number; warning: string | null }> | undefined + readonly #changes: Change[] = [] + #unchanged = 0 + #truncated = 0 + + /** `maxBytes`: forces the size limit instead of reading it from `~/.configfilerc`. */ + constructor(home: string, { maxBytes }: { maxBytes?: number } = {}) { + const { dir } = configfilePaths(home) + this.#home = home + this.#maxBytes = maxBytes + this.file = path.join(dir, 'history.jsonl') + this.previousFile = path.join(dir, 'history.1.jsonl') + } + + /** The size limit (0: history turned off), and a warning when the setting is invalid. */ + settings(): Promise<{ maxBytes: number; warning: string | null }> { + this.#settings ??= + this.#maxBytes != null + ? Promise.resolve({ maxBytes: this.#maxBytes, warning: null }) + : new ConfigStore(this.#home).readHistorySize() + return this.#settings + } + + record(change: Change): void { + if (this.#changes.length < MAX_CHANGES) { + this.#changes.push(change) + } else { + this.#truncated++ + } + } + + /** Counts a file that was already as expected (nothing changed). */ + unchanged(): void { + this.#unchanged++ + } + + /** Appends the line of this run. Returns the error instead of throwing it. */ + async save(run: { + time: Date + version: string + invocation: Invocation | null + cwd: string + exitCode: number + error: unknown + }): Promise { + try { + const { maxBytes } = await this.settings() + if (maxBytes === 0) return null + + const line: HistoryLine = { + v: 1, + time: run.time.toISOString(), + durationMs: Date.now() - run.time.getTime(), + pid: process.pid, + version: run.version, + command: run.invocation?.command ?? null, + options: { ...run.invocation?.options }, + cwd: run.cwd, + exitCode: run.exitCode, + ...(run.error != null && { error: describeError(run.error) }), + changes: this.#changes, + unchanged: this.#unchanged, + ...(this.#truncated > 0 && { truncated: this.#truncated }), + } + const content = Buffer.from( + `${JSON.stringify(line, (_, value) => (typeof value === 'string' ? redactCredentials(value) : value))}\n`, + ) + + await mkdir(path.dirname(this.file), { recursive: true, mode: 0o700 }) + await this.#rotate(maxBytes) + + // One write in append mode keeps lines whole when several runs write at once. + // O_NOFOLLOW: a symbolic link planted at the history's place is never followed. + const handle = await open( + this.file, + constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW, + 0o600, + ) + try { + const { bytesWritten } = await handle.write(content) + if (bytesWritten !== content.length) throw new Error('the line was only partly written') + } finally { + await handle.close() + } + return null + } catch (error) { + return error instanceof Error ? error : new Error(String(error)) + } + } + + /** The last `limit` runs, oldest first, and the number of lines that could not be read. */ + async read({ limit }: { limit?: number } = {}): Promise<{ + lines: HistoryLine[] + invalid: number + }> { + const lines: HistoryLine[] = [] + let invalid = 0 + + for (const file of [this.previousFile, this.file]) { + let content: string + try { + content = await readFile(file, 'utf8') + } catch (error) { + if (errnoCode(error) === 'ENOENT') continue + throw new CliError(`Cannot read ${file}: ${messageOf(error)}`) + } + for (const text of content.split('\n')) { + if (text.trim() === '') continue + try { + const line = JSON.parse(text) as HistoryLine + if (line?.v !== 1 || typeof line.time !== 'string' || !Array.isArray(line.changes)) { + throw new Error('not a history line') + } + lines.push(line) + } catch { + invalid++ + } + } + } + + return { lines: limit == null ? lines : lines.slice(-limit), invalid } + } + + async #rotate(maxBytes: number): Promise { + const stats = await lstatOrNull(this.file) + if (stats == null || stats.size < maxBytes) return + try { + await rename(this.file, this.previousFile) + } catch (error) { + // Another configfile rotated it at the same moment. + if (errnoCode(error) !== 'ENOENT') throw error + } + } +} + +function describeError(error: unknown): NonNullable { + const stack = process.env.DEBUG != null && error instanceof Error ? error.stack : undefined + return { + message: messageOf(error), + expected: isExpectedError(error), + ...(stack != null && { stack }), + } +} diff --git a/src/output.ts b/src/output.ts index 6d3f67b9..a607e979 100644 --- a/src/output.ts +++ b/src/output.ts @@ -79,3 +79,17 @@ export function escapeControls(text: string): string { } }) } + +/** The URL with its password or token (`https://user:token@host/…`) hidden. */ +export function redactUrl(url: string): string { + let parsed: URL + try { + parsed = new URL(url) + } catch { + return url // Not a URL (for example git@host:repo.git or a local path). + } + if (parsed.password === '' && (parsed.username === '' || parsed.protocol === 'ssh:')) return url + parsed.username = parsed.username === '' ? '' : '***' + parsed.password = parsed.password === '' ? '' : '***' + return parsed.toString() +} diff --git a/src/program.ts b/src/program.ts index 96ec3cc4..b28b2a90 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2,12 +2,15 @@ import { readFileSync } from 'node:fs' import { Command, CommanderError } from 'commander' +import { registerHistoryCommand } from './commands/history.js' import { registerInitCommand } from './commands/init.js' import { registerModulesCommand } from './commands/modules.js' import { registerScriptsCommand } from './commands/scripts.js' import { registerUpdateCommand } from './commands/update.js' import type { Context } from './context.js' import { CliError, isPromptExit } from './errors.js' +import { messageOf } from './fsutil.js' +import { describeInvocation, type Invocation, shouldRecord } from './history.js' const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string @@ -30,36 +33,70 @@ export function buildProgram(ctx: Context): Command { registerModulesCommand(program, ctx) registerScriptsCommand(program, ctx) registerUpdateCommand(program, ctx) + registerHistoryCommand(program, ctx) return program } /** Runs the CLI with user arguments (no `node` / script path) and returns the exit code. */ export async function main(args: string[], ctx: Context): Promise { + const time = new Date() + let invocation: Invocation | null = null + + const program = buildProgram(ctx) + // Runs before the action of any command, nested ones included (not for --help or usage errors). + program.hook('preAction', (_, action) => { + invocation = describeInvocation(action) + }) + + const { code, error } = await execute(program, args, ctx) + + if (shouldRecord(invocation, error)) { + const failed = await ctx.history.save({ + time, + version: pkg.version, + invocation, + cwd: ctx.cwd, + exitCode: code, + error, + }) + const { warning } = await ctx.history.settings() + if (warning != null) ctx.output.warn(warning) + if (failed != null) ctx.output.warn(`Cannot write ${ctx.history.file}: ${messageOf(failed)}`) + } + return code +} + +/** Parses and runs the command, turning errors into messages and an exit code. */ +async function execute( + program: Command, + args: string[], + ctx: Context, +): Promise<{ code: number; error: unknown }> { try { - await buildProgram(ctx).parseAsync(args, { from: 'user' }) - return 0 + await program.parseAsync(args, { from: 'user' }) + return { code: 0, error: null } } catch (error) { // Help, version and usage errors: commander already printed the message. - if (error instanceof CommanderError) return error.exitCode + if (error instanceof CommanderError) return { code: error.exitCode, error } if (error instanceof CliError) { ctx.output.error(error.message) - return error.exitCode + return { code: error.exitCode, error } } if (isPromptExit(error)) { ctx.output.print('') ctx.output.info('Cancelled.') - return 130 + return { code: 130, error } } - ctx.output.error(`Unexpected error: ${(error as Error).message ?? String(error)}`) + ctx.output.error(`Unexpected error: ${messageOf(error)}`) if (process.env.DEBUG != null) { ctx.output.stderr.write(`${(error as Error).stack}\n`) } else { ctx.output.stderr.write('Run again with DEBUG=1 for details.\n') } - return 1 + return { code: 1, error } } } diff --git a/src/sync.ts b/src/sync.ts index ffd4b44f..e47ff6fa 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -32,7 +32,11 @@ const SAVE_COMMIT = [ * `savedFolder`, so that nothing is lost, then the mirror is reset. Syncing * never stops on conflicts. */ -export async function syncMirror(folder: string, savedFolder: string): Promise { +export async function syncMirror( + folder: string, + savedFolder: string, + { onSaved }: { onSaved?: (file: string) => void } = {}, +): Promise { const cwd = folder await git(['fetch', '--prune', '--quiet'], { cwd }, 'git fetch') @@ -63,6 +67,8 @@ export async function syncMirror(folder: string, savedFolder: string): Promise { }) }) +describe('history', () => { + it('records each change of a deployment, and its failures', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.zshrc', 'mine') + await sandbox.write('cwd/a', 'mine') + const zshrc = path.join(sandbox.home, '.zshrc') + + await runCli(sandbox, ['m', 'd', 'zsh']) + await runCli(sandbox, ['modules', 'deploy', '--local', 'zsh'], [], { interactive: false }) + + const [global, local] = await readHistory(sandbox) + expect(global).toMatchObject({ + command: 'modules deploy', + options: { modules: ['zsh'] }, + cwd: sandbox.cwd, + exitCode: 0, + changes: [ + { + kind: 'deployed', + how: 'link', + source: path.join(sandbox.repo, 'files/zsh/zshrc'), + target: zshrc, + backup: `${zshrc}.old`, + }, + ], + }) + expect(global).not.toHaveProperty('error') + expect(local).toMatchObject({ + options: { modules: ['zsh'], local: true }, + exitCode: 1, + error: { expected: true }, + changes: [ + { kind: 'deployed', how: 'copy', target: path.join(sandbox.cwd, 'b') }, + { kind: 'skipped', target: path.join(sandbox.cwd, 'a'), reason: 'exists' }, + ], + }) + }) + + it('records nothing for read-only commands and dry runs', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + for (const args of [ + ['modules', 'list'], + ['modules', 'status'], + ['modules', 'deploy', '--dry-run', 'zsh'], + ['modules', 'undeploy', '--dry-run', 'zsh'], + ['scripts', 'list'], + ['history'], + ]) { + await runCli(sandbox, args) + } + + await expect(readHistory(sandbox)).resolves.toEqual([]) + }) + + it('records what undeploy removed, restored and kept', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.zshrc', 'mine') + await sandbox.write('cwd/a', 'mine') + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + const zshrc = path.join(sandbox.home, '.zshrc') + + await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + await runCli(sandbox, ['modules', 'undeploy', '--local', 'zsh']) + + const [, undeployGlobal, undeployLocal] = await readHistory(sandbox) + expect(undeployGlobal?.changes).toEqual([ + { kind: 'removed', target: zshrc, backup: { path: `${zshrc}.old`, status: 'restored' } }, + ]) + expect(undeployLocal).toMatchObject({ + changes: [{ kind: 'kept', target: path.join(sandbox.cwd, 'a'), reason: 'foreign' }], + unchanged: 1, + }) + }) + + it('records scripts without their arguments', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/setup.sh', 'exit 4\n') + + await runCli(sandbox, ['scripts', 'run', 'setup', '--', 'token=s3cr3t']) + + const [line] = await readHistory(sandbox) + expect(line).toMatchObject({ + command: 'scripts run', + options: { script: 'setup', argCount: 1 }, + exitCode: 4, + changes: [{ kind: 'script', name: 'setup', exitCode: 4 }], + }) + const raw = await readFile(path.join(sandbox.home, '.configfile/history.jsonl'), 'utf8') + expect(raw).not.toContain('s3cr3t') + }) + + it('records syncs and the patches they saved', async () => { + const sandbox = await createSandbox() + const remote = await createRemote(sandbox) + git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) + await sandbox.configure() + await sandbox.write('home/dotfiles/files/local-edit', 'edit') + await sandbox.write('remote/files/new', 'new') + git(remote, 'add', '.') + git(remote, 'commit', '--quiet', '-m', 'new') + + await runCli(sandbox, ['update']) + + const [line] = await readHistory(sandbox) + expect(line?.changes).toEqual([ + { kind: 'saved-patch', file: expect.stringContaining('/.configfile/saved/') }, + { + kind: 'synced', + folder: sandbox.repo, + upstream: 'origin/main', + from: expect.any(String), + to: expect.any(String), + }, + ]) + }) + + it('records init, with the repository URL redacted', async () => { + const sandbox = await createSandbox() + const remote = await createRemote(sandbox) + git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) + + await runCli(sandbox, [ + 'init', + '--repo', + 'https://me:tok@example.com/r.git', + '--folder', + sandbox.repo, + ]) + + const [line] = await readHistory(sandbox) + expect(line).toMatchObject({ + command: 'init', + options: { repo: 'https://***:***@example.com/r.git', folder: sandbox.repo }, + changes: [ + { kind: 'reused', repository: 'https://***:***@example.com/r.git', folder: sandbox.repo }, + { kind: 'configured', file: path.join(sandbox.home, '.configfilerc') }, + ], + }) + }) + + it('records unexpected errors of any command', async () => { + const sandbox = await createSandbox() + + await runCli(sandbox, ['init'], [new Error('boom')]) + + const [line] = await readHistory(sandbox) + expect(line).toMatchObject({ + command: 'init', + exitCode: 1, + error: { message: 'boom', expected: false }, + }) + expect(line?.error).not.toHaveProperty('stack') + }) + + it('records the changes made before Ctrl+C', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('cwd/a', 'mine') + + await runCli(sandbox, ['m', 'd', '-l', 'zsh'], [exitPromptError()]) + + const [line] = await readHistory(sandbox) + expect(line).toMatchObject({ + exitCode: 130, + changes: [{ kind: 'deployed', target: path.join(sandbox.cwd, 'b') }], + }) + }) + + it('never changes the exit code when the history cannot be written', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await mkdir(path.join(sandbox.home, '.configfile/history.jsonl'), { recursive: true }) + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + expect(result.code).toBe(0) + expect(result.stderr.match(/Cannot write .*history\.jsonl/g)).toHaveLength(1) + }) + + it('can be turned off', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.configure({ history_max_size: 0 }) + + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + const history = await runCli(sandbox, ['history']) + + expect(existsSync(path.join(sandbox.home, '.configfile/history.jsonl'))).toBe(false) + expect(history.stdout).toContain('The history is turned off') + }) + + it('shows the history, readable or as JSON Lines', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.zshrc', 'mine') + + expect((await runCli(sandbox, ['history'])).stdout).toContain('No history yet.') + + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + const readable = await runCli(sandbox, ['history']) + const last = await runCli(sandbox, ['history', '-n', '1']) + const json = await runCli(sandbox, ['history', '--json']) + + expect(readable.code).toBe(0) + expect(readable.stdout).toMatch( + /^\d{4}-\d\d-\d\d \d\d:\d\d {2}modules deploy zsh {2}ok\n {2}linked {4}~\/\.zshrc {2}\(previous file moved to ~\/\.zshrc\.old\)\n/, + ) + expect(last.stdout).toMatch(/^\S+ \S+ {2}modules deploy zsh {2}ok\n {2}1 unchanged\n$/) + const lines = json.stdout + .trim() + .split('\n') + .map(text => JSON.parse(text)) + expect(lines.map(line => line.command)).toEqual(['modules deploy', 'modules deploy']) + expect((await runCli(sandbox, ['history', '-n', 'x'])).code).toBe(1) + }) + + it('classifies every command as recorded or read-only', async () => { + const sandbox = await createSandbox() + const leaves: string[] = [] + const walk = (command: ReturnType, prefix: string[]) => { + for (const child of command.commands) { + const path = [...prefix, child.name()] + if (child.commands.length === 0) leaves.push(path.join(' ')) + else walk(child, path) + } + } + walk(buildProgram(createContext(sandbox)), []) + + expect(leaves.length).toBeGreaterThan(5) + for (const leaf of leaves) { + expect(RECORDED.has(leaf) || READ_ONLY.has(leaf), `"${leaf}" is not classified`).toBe(true) + } + }) +}) + describe('program', () => { it('prints the version', async () => { const sandbox = await createSandbox() diff --git a/tests/config.test.ts b/tests/config.test.ts index 62858dfe..381d29d0 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -1,10 +1,9 @@ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' import { describe, expect, it } from 'vitest' - -import { redactUrl } from '../src/commands/init.js' import { ConfigStore } from '../src/config.js' import { CliError, NotInitializedError } from '../src/errors.js' +import { redactUrl } from '../src/output.js' import { createSandbox } from './helpers.js' describe('ConfigStore', () => { @@ -144,3 +143,45 @@ describe('redactUrl', () => { expect(redactUrl(url)).toBe(expected) }) }) + +describe('ConfigStore.readHistorySize', () => { + it.each([ + [undefined, 1024 * 1024], + [0, 0], + [2048, 2048], + ['512KB', 512 * 1024], + ['5 MB', 5 * 1024 * 1024], + ['1gb', 1024 ** 3], + ['100', 100], + ])('reads %o as %i bytes', async (value, expected) => { + const sandbox = await createSandbox() + await sandbox.configure(value === undefined ? {} : { history_max_size: value }) + + await expect(new ConfigStore(sandbox.home).readHistorySize()).resolves.toEqual({ + maxBytes: expected, + warning: null, + }) + }) + + it.each([-1, 1.5, 'big', '5 TB', true])( + 'falls back to 1MB with a warning for %o', + async value => { + const sandbox = await createSandbox() + await sandbox.configure({ history_max_size: value }) + + const result = await new ConfigStore(sandbox.home).readHistorySize() + + expect(result.maxBytes).toBe(1024 * 1024) + expect(result.warning).toContain('"history_max_size"') + }, + ) + + it('works without a configuration, or with an invalid one', async () => { + const { home } = await createSandbox() + const store = new ConfigStore(home) + await expect(store.readHistorySize()).resolves.toEqual({ maxBytes: 1024 * 1024, warning: null }) + + await writeFile(store.path, 'not json') + await expect(store.readHistorySize()).resolves.toEqual({ maxBytes: 1024 * 1024, warning: null }) + }) +}) diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts index 6cb7309f..291276e3 100644 --- a/tests/e2e.test.ts +++ b/tests/e2e.test.ts @@ -161,4 +161,36 @@ describe('built CLI', () => { } expect(await readFile(path.join(sandbox.home, '.shared'), 'utf8')).toBe('PRECIOUS') }) + + it('keeps one whole history line per run when many runs write at once', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/ok.sh', 'exit 0\n') + const env: NodeJS.ProcessEnv = { ...process.env, HOME: sandbox.home, NO_COLOR: '1' } + + const runs = Array.from( + { length: 16 }, + () => + new Promise(resolve => { + const child = spawn(process.execPath, [cli, 'scripts', 'run', 'ok'], { + cwd: sandbox.cwd, + env, + stdio: 'ignore', + }) + child.on('close', resolve) + }), + ) + expect(new Set(await Promise.all(runs))).toEqual(new Set([0])) + + const lines = (await readFile(path.join(sandbox.home, '.configfile/history.jsonl'), 'utf8')) + .trim() + .split('\n') + .map(text => JSON.parse(text)) + const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')) + expect(lines).toHaveLength(16) + expect(new Set(lines.map(line => line.pid)).size).toBe(16) + expect( + lines.every(line => line.version === pkg.version && line.command === 'scripts run'), + ).toBe(true) + }) }) diff --git a/tests/helpers.ts b/tests/helpers.ts index ad7223f3..85fd5c70 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -7,6 +7,7 @@ import { Writable } from 'node:stream' import { afterEach } from 'vitest' import type { Context, Prompts } from '../src/context.js' +import { History, type HistoryLine } from '../src/history.js' import { Output } from '../src/output.js' import { main } from '../src/program.js' @@ -117,6 +118,7 @@ export function createContext( cwd: sandbox.cwd, output: new Output(stdout, stderr), prompts, + history: new History(sandbox.home), stdout, stderr, asked, @@ -167,3 +169,10 @@ export async function createRemote(sandbox: Sandbox): Promise { git(remote, 'commit', '--quiet', '-m', 'first') return remote } + +/** Every line of the history files (rotated file first); fails on an unreadable line. */ +export async function readHistory(sandbox: Sandbox): Promise { + const { lines, invalid } = await new History(sandbox.home).read() + if (invalid > 0) throw new Error(`${invalid} unreadable history lines`) + return lines +} diff --git a/tests/history.test.ts b/tests/history.test.ts new file mode 100644 index 00000000..5acb5fbf --- /dev/null +++ b/tests/history.test.ts @@ -0,0 +1,271 @@ +import { mkdir, readFile, stat, symlink, writeFile } from 'node:fs/promises' +import path from 'node:path' + +import { Command, CommanderError } from 'commander' +import { describe, expect, it } from 'vitest' + +import { CliError } from '../src/errors.js' +import { + describeInvocation, + History, + type Invocation, + redactCredentials, + shouldRecord, +} from '../src/history.js' +import { createSandbox } from './helpers.js' + +const run = (overrides: Partial[0]> = {}) => ({ + time: new Date('2026-10-01T09:00:00.000Z'), + version: '1.0.0', + invocation: { command: 'modules deploy', options: { modules: ['zsh'] }, dryRun: false }, + cwd: '/work', + exitCode: 0, + error: null, + ...overrides, +}) + +describe('History', () => { + it('appends one line per run, in a private file', async () => { + const { home } = await createSandbox() + const first = new History(home) + first.record({ kind: 'deployed', how: 'link', source: '/s', target: '/t' }) + first.unchanged() + await expect(first.save(run())).resolves.toBeNull() + await expect(new History(home).save(run({ exitCode: 3 }))).resolves.toBeNull() + + const { lines } = await new History(home).read() + expect(lines).toMatchObject([ + { + v: 1, + command: 'modules deploy', + options: { modules: ['zsh'] }, + exitCode: 0, + changes: [{ kind: 'deployed', how: 'link', source: '/s', target: '/t' }], + unchanged: 1, + pid: process.pid, + version: '1.0.0', + }, + { exitCode: 3, changes: [], unchanged: 0 }, + ]) + expect((await stat(first.file)).mode & 0o777).toBe(0o600) + expect((await stat(path.dirname(first.file))).mode & 0o777).toBe(0o700) + }) + + it('rotates the file when it reaches its maximum size, keeping one previous file', async () => { + const { home } = await createSandbox() + const save = (exitCode: number) => new History(home, { maxBytes: 300 }).save(run({ exitCode })) + + for (const exitCode of [1, 2, 3, 4, 5, 6]) await save(exitCode) + + const history = new History(home) + const current = (await readFile(history.file, 'utf8')).trim().split('\n') + const previous = (await readFile(history.previousFile, 'utf8')).trim().split('\n') + expect(current.length).toBeGreaterThan(0) + expect(previous.length).toBeGreaterThan(0) + // The oldest lines were dropped by the second rotation; the newest is last. + const { lines } = await history.read() + expect(lines.length).toBeLessThan(6) + expect(lines.at(-1)?.exitCode).toBe(6) + }) + + it('writes nothing when turned off', async () => { + const { home } = await createSandbox() + const history = new History(home, { maxBytes: 0 }) + + await expect(history.save(run())).resolves.toBeNull() + + await expect(stat(history.file)).rejects.toThrow() + }) + + it('never follows a symbolic link planted at the history', async () => { + const { home, root } = await createSandbox() + const history = new History(home) + await mkdir(path.dirname(history.file), { recursive: true }) + await writeFile(path.join(root, 'victim'), 'untouched') + await symlink(path.join(root, 'victim'), history.file) + + await expect(history.save(run())).resolves.toBeInstanceOf(Error) + expect(await readFile(path.join(root, 'victim'), 'utf8')).toBe('untouched') + }) + + it('returns the error instead of throwing when it cannot write', async () => { + const { home } = await createSandbox() + const history = new History(home) + await mkdir(history.file, { recursive: true }) + + await expect(history.save(run())).resolves.toBeInstanceOf(Error) + }) + + it('hides credentials anywhere in the line', async () => { + const { home } = await createSandbox() + const history = new History(home) + history.record({ + kind: 'failed', + reason: "fatal: could not read from 'https://user:ghp_SECRET@github.com/a/b.git'", + }) + + await history.save(run({ error: new CliError('git clone https://x:tok@host/r failed') })) + + const text = await readFile(history.file, 'utf8') + expect(text).not.toContain('ghp_SECRET') + expect(text).not.toContain('tok@') + }) + + it('records unexpected errors, with the stack only when DEBUG is set', async () => { + const { home } = await createSandbox() + await new History(home).save(run({ exitCode: 1, error: new Error('boom') })) + process.env.DEBUG = '1' + try { + await new History(home).save(run({ exitCode: 1, error: new Error('boom') })) + } finally { + delete process.env.DEBUG + } + + const { lines } = await new History(home).read() + expect(lines[0]?.error).toEqual({ message: 'boom', expected: false }) + expect(lines[1]?.error?.stack).toContain('Error: boom') + }) + + it('keeps at most 1000 changes per run and counts the others', async () => { + const { home } = await createSandbox() + const history = new History(home) + for (let i = 0; i < 1005; i++) + history.record({ kind: 'skipped', target: `/t${i}`, reason: 'exists' }) + + await history.save(run()) + + const [line] = (await new History(home).read()).lines + expect(line?.changes).toHaveLength(1000) + expect(line?.truncated).toBe(5) + }) + + it('keeps every line whole when many runs write at once', async () => { + const { home } = await createSandbox() + + await Promise.all( + Array.from({ length: 50 }, (_, i) => { + const history = new History(home, { maxBytes: 4096 }) + history.record({ kind: 'script', name: `s${i}`, file: `/scripts/s${i}`, exitCode: 0 }) + return history.save(run({ exitCode: i })) + }), + ) + + // read() counts any line that does not parse as invalid. + const { invalid } = await new History(home).read() + expect(invalid).toBe(0) + }) + + it('reads the last runs, oldest first, skipping unreadable lines', async () => { + const { home } = await createSandbox() + for (const exitCode of [1, 2, 3]) await new History(home).save(run({ exitCode })) + const history = new History(home) + await writeFile(history.file, `${await readFile(history.file, 'utf8')}not json\n`) + + const result = await history.read({ limit: 2 }) + + expect(result.lines.map(line => line.exitCode)).toEqual([2, 3]) + expect(result.invalid).toBe(1) + }) +}) + +describe('describeInvocation', () => { + /** Parses `args` with a program shaped like configfile's, returning the invocation. */ + async function invocationOf(args: string[]): Promise { + let invocation: Invocation | null = null + const program = new Command('configfile').exitOverride() + program.hook('preAction', (_, action) => { + invocation = describeInvocation(action) + }) + program + .command('init') + .option('-f, --force') + .option('--repo ') + .option('--folder ') + .action(() => {}) + const modules = program.command('modules').alias('m') + modules + .command('deploy') + .alias('d') + .argument('[modules...]') + .option('-l, --local') + .option('-n, --dry-run') + .action(() => {}) + program + .command('scripts') + .command('run') + .argument('') + .argument('[args...]') + .action(() => {}) + await program.parseAsync(args, { from: 'user' }) + return invocation + } + + it('names the command whatever alias was typed', async () => { + await expect(invocationOf(['m', 'd', 'zsh', '-l'])).resolves.toEqual({ + command: 'modules deploy', + options: { modules: ['zsh'], local: true }, + dryRun: false, + }) + }) + + it('marks dry runs', async () => { + await expect(invocationOf(['modules', 'deploy', '-n'])).resolves.toMatchObject({ + dryRun: true, + }) + }) + + it('never keeps script arguments, only their number', async () => { + const invocation = await invocationOf(['scripts', 'run', 'setup', '--', 'token=s3cr3t', 'x']) + + expect(invocation?.options).toEqual({ script: 'setup', argCount: 2 }) + expect(JSON.stringify(invocation)).not.toContain('s3cr3t') + }) + + it('hides credentials of the repository URL', async () => { + const invocation = await invocationOf(['init', '--repo', 'https://me:tok@host/r.git']) + + expect(invocation?.options).toEqual({ repo: 'https://***:***@host/r.git' }) + }) +}) + +describe('shouldRecord', () => { + const invocation = (command: string, dryRun = false): Invocation => ({ + command, + options: {}, + dryRun, + }) + + it.each([ + ['a command that changes files', invocation('modules deploy'), null, true], + ['the same command failing', invocation('update'), new CliError('x'), true], + ['a dry run', invocation('modules undeploy', true), null, false], + ['a read-only command', invocation('modules status'), null, false], + [ + 'an expected error of a read-only command', + invocation('scripts list'), + new CliError('x'), + false, + ], + [ + 'an unexpected error of a read-only command', + invocation('modules list'), + new Error('x'), + true, + ], + ['help or a usage error', null, new CommanderError(1, 'c', 'm'), false], + ['an unexpected error before any command', null, new TypeError('x'), true], + ])('%s: %s', (_, inv, error, expected) => { + expect(shouldRecord(inv, error)).toBe(expected) + }) +}) + +describe('redactCredentials', () => { + it.each([ + ['clone https://user:token@github.com/a/b failed', 'clone https://***@github.com/a/b failed'], + ['ssh://git@host:22/r', 'ssh://***@host:22/r'], + ['no url here', 'no url here'], + ['https://github.com/a/b', 'https://github.com/a/b'], + ])('%s', (text, expected) => { + expect(redactCredentials(text)).toBe(expected) + }) +}) From c7d791e772700fc46748f6b6c3047038b51eb70f Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 1 Oct 2026 13:35:10 +0200 Subject: [PATCH 322/341] fix: harden the history reader, rotation and privacy (#285) --- CHANGELOG.md | 6 +- README.md | 13 +- src/commands/history.ts | 66 ++++--- src/commands/modules.ts | 1 + src/config.ts | 25 ++- src/context.ts | 2 +- src/fsutil.ts | 8 + src/history.ts | 379 +++++++++++++++++++++++++++++++++------- src/program.ts | 8 +- src/repository.ts | 3 +- src/state.ts | 3 +- tests/commands.test.ts | 358 +++++++++++++++++++++++++++++++++++-- tests/config.test.ts | 23 ++- tests/e2e.test.ts | 50 +++++- tests/helpers.ts | 10 +- tests/history.test.ts | 208 +++++++++++++++++++++- tests/setup.ts | 2 + vitest.config.ts | 1 + 18 files changed, 1028 insertions(+), 138 deletions(-) create mode 100644 tests/setup.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 269d4850..0ae49184 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,9 +18,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. or `"none"` to keep a file in the repository without deploying it. - Arguments can be passed to scripts: `configfile scripts run -- `. - A script can be a folder containing an `index` file. -- configfile records what each command changed, when, and whether it failed, in - `~/.configfile/history.jsonl` ([#36](https://github.com/mindsers/configfile/issues/36)). -- The `history` command to see what configfile changed. +- A history of what configfile changed, when, and whether it failed, in + `~/.configfile/history.jsonl`, and the `history` command to see it + ([#36](https://github.com/Mindsers/configfile/issues/36)). - The `settings.json` format is documented in the README. ### Changed diff --git a/README.md b/README.md index 4ea7df1b..6967059c 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ Scripts can be written in any language: - `-n, --limit `: number of runs to show (20 by default). - `--json`: print the raw history lines (JSON Lines), for scripts. -*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. Each run that changes something is also recorded in the [history](#history). +*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. Each run of a command that changes files, and any unexpected error, is also recorded in the [history](#history). ### Configuration @@ -135,9 +135,9 @@ Scripts can be written in any language: ### History -*configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes. +*configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs and usage errors excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes. -Script arguments, environment variables and file contents are never recorded, and passwords or tokens in URLs are hidden. The file is only readable by its owner. +Script arguments, environment variables and file contents are never recorded. In URLs, user names and passwords (`https://user:token@host`) and query parameters that look like secrets (`?private_token=…`) are hidden. Paths are recorded in full, so they include your user name. When *configfile* creates the file, only its owner can read it. A run stopped by a signal (Ctrl+C outside a question) is not recorded. `configfile history` shows the last runs: @@ -145,15 +145,20 @@ Script arguments, environment variables and file contents are never recorded, an 2026-10-01 11:12 modules deploy zsh ok linked ~/.zshrc (previous file moved to ~/.zshrc.old) 2 unchanged + +2026-10-01 11:15 update exit 128 + error git fetch failed (exit code 128). ``` +`-n ` shows another number of runs, and `--json` prints the lines as they are written. + The file is also easy to query with `jq`, for example to list the failed runs: ```bash jq 'select(.exitCode != 0)' ~/.configfile/history.jsonl ``` -When the file reaches `history_max_size` (1MB by default; a number of bytes, or a size such as `"512KB"` or `"5MB"` in `~/.configfilerc`), it is renamed to `history.1.jsonl`, replacing the previous one, so the history takes about twice that size at most. `"history_max_size": 0` turns the history off. +When the file reaches `history_max_size` (1MB by default; a number of bytes, or a size such as `"512KB"` or `"5MB"` in `~/.configfilerc`), it is renamed to `history.1.jsonl`, replacing the previous one, so the history takes about twice that size at most. `"history_max_size": 0` turns the history off. An invalid value gives the default and a warning; when `~/.configfilerc` cannot be read, nothing is recorded. ## Upgrading from 0.3 diff --git a/src/commands/history.ts b/src/commands/history.ts index c6974249..cfe7a70f 100644 --- a/src/commands/history.ts +++ b/src/commands/history.ts @@ -2,11 +2,14 @@ import type { Command } from 'commander' import type { Context } from '../context.js' import { CliError } from '../errors.js' -import type { Change, HistoryLine } from '../history.js' +import type { Change, HistoryLine, KeptReason } from '../history.js' import { plural } from '../output.js' const DEFAULT_LIMIT = 20 +/** Width of the verb that starts each change line. */ +const VERB_WIDTH = 9 + interface HistoryOptions { limit?: string json?: boolean @@ -24,48 +27,67 @@ export function registerHistoryCommand(program: Command, ctx: Context): void { async function history(options: HistoryOptions, ctx: Context): Promise { const { output } = ctx const limit = parseLimit(options.limit) - const { lines, invalid } = await ctx.history.read({ limit }) + const [{ entries, invalid, problems }, settings] = await Promise.all([ + ctx.history.read(), + ctx.history.settings(), + ]) - if (invalid > 0) { - output.warn(`${plural(invalid, 'unreadable line')} of ${ctx.history.file} skipped.`) - } + if (settings.warning != null) output.warn(settings.warning) + for (const problem of problems) output.warn(problem) + if (invalid > 0) output.warn(`${plural(invalid, 'damaged line')} of the history skipped.`) if (options.json === true) { - for (const line of lines) output.stdout.write(`${JSON.stringify(line)}\n`) + // The lines as written, newer formats included: scripts decide what they read. + for (const entry of entries.slice(-limit)) output.stdout.write(`${entry.raw}\n`) return } - if (lines.length === 0) { - const { maxBytes } = await ctx.history.settings() - output.info( - maxBytes === 0 - ? 'The history is turned off ("history_max_size" is 0 in ~/.configfilerc).' - : 'No history yet.', + const readable = entries.filter(entry => entry.line != null) + const newer = entries.length - readable.length + if (newer > 0) { + output.warn( + `${plural(newer, 'line')} written by a newer configfile skipped. Update configfile to see them.`, ) + } + + if (readable.length === 0) { + if (settings.maxBytes === 0 && settings.warning == null) { + output.info('The history is turned off ("history_max_size" is 0 in ~/.configfilerc).') + } else { + output.info( + entries.length + invalid + problems.length > 0 ? 'No readable history.' : 'No history yet.', + ) + } return } const show = (text: string) => shortenHome(text, ctx.home) - for (const [index, line] of lines.entries()) { + for (const [index, { line, unreadableChanges }] of readable.slice(-limit).entries()) { + if (line == null) continue if (index > 0) output.print('') output.print( `${formatTime(line.time)} ${show(describeRun(line))} ${line.exitCode === 0 ? 'ok' : `exit ${line.exitCode}`}`, ) - if (line.error != null && !line.error.expected) { - output.print(` error ${show(line.error.message)}`) - } for (const change of line.changes) { output.print(` ${show(describeChange(change))}`) } + if (unreadableChanges > 0) { + output.print(` …and ${plural(unreadableChanges, 'change')} this configfile cannot show`) + } if (line.truncated != null) output.print(` …and ${line.truncated} more changes`) if (line.unchanged > 0) output.print(` ${line.unchanged} unchanged`) + if (line.error != null) { + // Expected errors explain most failures (a held lock, a failed git fetch…). + const label = line.error.expected ? 'error' : 'crashed' + output.print(` ${label.padEnd(VERB_WIDTH)} ${show(line.error.message)}`) + } } } function parseLimit(value: string | undefined): number { if (value == null) return DEFAULT_LIMIT const limit = Number(value) - if (!Number.isInteger(limit) || limit <= 0) { + if (!/^\d+$/.test(value) || !Number.isSafeInteger(limit) || limit <= 0) { throw new CliError(`--limit must be a positive number, not "${value}".`) } return limit @@ -91,7 +113,7 @@ function describeRun(line: HistoryLine): string { /** One change, as an aligned line: a verb, then what it applies to. */ function describeChange(change: Change): string { - const line = (verb: string, text: string) => `${verb.padEnd(9)} ${text}` + const line = (verb: string, text: string) => `${verb.padEnd(VERB_WIDTH)} ${text}` switch (change.kind) { case 'deployed': { @@ -113,18 +135,18 @@ function describeChange(change: Change): string { return line('removed', `${change.target}${backup}${leftover}`) } case 'kept': { - const reason = { + const reason: Record = { foreign: 'not deployed by configfile', modified: 'modified since it was copied', identical: 'not copied by configfile', 'source-missing': 'its source was missing', - }[change.reason] - return line('kept', `${change.target} (${reason})`) + } + return line('kept', `${change.target} (${reason[change.reason]})`) } case 'failed': return line( 'failed', - `${change.target ?? `module ${change.module ?? '?'}`} ${change.reason}`, + `${'target' in change ? change.target : `module ${change.module}`} ${change.reason}`, ) case 'synced': return line( diff --git a/src/commands/modules.ts b/src/commands/modules.ts index 5875fff1..a0f3dcee 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -403,6 +403,7 @@ async function selectModules( return [] } + ctx.history.option('all', true) return modules } diff --git a/src/config.ts b/src/config.ts index 3d09d3ee..b724d13d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -3,7 +3,7 @@ import { readFile } from 'node:fs/promises' import path from 'node:path' import { CliError, NotInitializedError } from './errors.js' -import { writeFileAtomic } from './fsutil.js' +import { describeJsonError, messageOf, writeFileAtomic } from './fsutil.js' import { resolveUserPath } from './paths.js' export interface Config { @@ -79,27 +79,31 @@ export class ConfigStore { /** * The maximum size of the history (`history_max_size`), in bytes: a number * of bytes or a size such as "512KB" or "5MB"; 0 turns the history off. - * Never fails: the history must work before `init` and with an invalid - * configuration, so problems give the default and a warning. + * Works before `init`, without a configuration file. An invalid value gives + * the default and a warning. A file that cannot be read gives 0 and a + * warning: it may be what turns the history off. */ async readHistorySize(): Promise<{ maxBytes: number; warning: string | null }> { let raw: RawConfig | null try { raw = await this.#readRaw() - } catch { - return { maxBytes: DEFAULT_HISTORY_SIZE, warning: null } + } catch (error) { + return { + maxBytes: 0, + warning: `${messageOf(error)} This run is not recorded in the history.`, + } } const value = raw?.history_max_size if (value === undefined) return { maxBytes: DEFAULT_HISTORY_SIZE, warning: null } const size = parseSize(value) - if (size == null) { + if (size == null || size > MAX_HISTORY_SIZE) { return { maxBytes: DEFAULT_HISTORY_SIZE, warning: - `"history_max_size" in ${this.path} must be a size such as 1048576, "512KB" or ` + - `"5MB" (0 turns the history off); using 1MB.`, + `"history_max_size" in ${this.path} must be a size up to 1GB, such as 1048576, ` + + `"512KB" or "5MB" (0 turns the history off); using 1MB.`, } } return { maxBytes: size, warning: null } @@ -151,7 +155,7 @@ export class ConfigStore { data = JSON.parse(content) } catch (error) { throw new InvalidConfigError( - `Invalid configuration in ${this.path}: not valid JSON (${(error as Error).message}).`, + `Invalid configuration in ${this.path}: not valid JSON (${describeJsonError(error)}).`, ) } @@ -170,6 +174,9 @@ function ignoreInvalid(error: unknown): null { /** Default size of `history.jsonl` before it is rotated: 1 MiB. */ export const DEFAULT_HISTORY_SIZE = 1024 * 1024 +/** Larger histories would be slow to read back. */ +const MAX_HISTORY_SIZE = 1024 ** 3 + const UNITS: Record = { B: 1, KB: 1024, MB: 1024 ** 2, GB: 1024 ** 3 } /** Bytes from 1048576, "1048576", "512KB" or "5 MB"; `null` when invalid. */ diff --git a/src/context.ts b/src/context.ts index af91ea75..b5fb9930 100644 --- a/src/context.ts +++ b/src/context.ts @@ -14,6 +14,6 @@ export interface Context { readonly cwd: string readonly output: Output readonly prompts: Prompts - /** What this run changes, saved to `~/.configfile/history.jsonl` when it ends. */ + /** What this run changes, saved to `~/.configfile/history.jsonl` when it ends if it is recorded (see `shouldRecord`). */ readonly history: History } diff --git a/src/fsutil.ts b/src/fsutil.ts index b93f15d3..ce02259f 100644 --- a/src/fsutil.ts +++ b/src/fsutil.ts @@ -17,6 +17,14 @@ export function messageOf(error: unknown): string { return error instanceof Error ? error.message : String(error) } +/** + * The message of a `JSON.parse` error without the start of the text it + * quotes, which may contain a secret. + */ +export function describeJsonError(error: unknown): string { + return messageOf(error).replace(/, "[\s\S]*"(?:\.\.\.)? is not valid JSON$/, '') +} + /** `lstat`, or `null` when nothing exists at `target`. Other errors are thrown. */ export async function lstatOrNull(target: string): Promise { try { diff --git a/src/history.ts b/src/history.ts index a10b0258..64e2d67f 100644 --- a/src/history.ts +++ b/src/history.ts @@ -1,10 +1,10 @@ import { constants } from 'node:fs' -import { mkdir, open, readFile, rename } from 'node:fs/promises' +import { mkdir, open, rename, rm } from 'node:fs/promises' import path from 'node:path' import { type Command, CommanderError } from 'commander' -import { ConfigStore } from './config.js' +import { ConfigStore, DEFAULT_HISTORY_SIZE } from './config.js' import type { KeptState } from './deploy.js' import { CliError, isPromptExit } from './errors.js' import { errnoCode, lstatOrNull, messageOf } from './fsutil.js' @@ -14,17 +14,28 @@ import { configfilePaths } from './paths.js' /** At most this many changes are written per run; the rest are counted. */ const MAX_CHANGES = 1000 -/** Commands that change files: each run is recorded, successful or not (dry runs excepted). */ -export const RECORDED = new Set([ - 'init', - 'modules deploy', - 'modules undeploy', - 'update', - 'scripts run', -]) +/** A rotation lock older than this was left by a configfile that died while rotating. */ +const STALE_ROTATION_MS = 60_000 -/** Commands that change nothing: only recorded when they fail unexpectedly. */ -export const READ_ONLY = new Set(['modules list', 'modules status', 'scripts list', 'history']) +/** + * Every command, and whether its runs are recorded: commands that change files + * are recorded successful or not (dry runs excepted); read-only ones only when + * they fail unexpectedly. A command missing here is recorded. + */ +export const COMMANDS = { + init: 'recorded', + 'modules deploy': 'recorded', + 'modules undeploy': 'recorded', + update: 'recorded', + 'scripts run': 'recorded', + 'modules list': 'read-only', + 'modules status': 'read-only', + 'scripts list': 'read-only', + history: 'read-only', +} as const satisfies Record + +/** Why undeploy kept a file, as written in the history. */ +export type KeptReason = KeptState['kind'] /** One thing configfile did (or failed to do) during a run. */ export type Change = @@ -36,8 +47,9 @@ export type Change = backup?: { path: string; status: 'restored' | 'missing' | 'changed' } leftover?: string } - | { kind: 'kept'; target: string; reason: KeptState['kind'] } - | { kind: 'failed'; target?: string; module?: string; reason: string } + | { kind: 'kept'; target: string; reason: KeptReason } + | { kind: 'failed'; target: string; reason: string } + | { kind: 'failed'; module: string; reason: string } | { kind: 'synced'; folder: string; upstream: string; from: string | null; to: string } | { kind: 'saved-patch'; file: string } | { kind: 'script'; name: string; file: string; exitCode: number } @@ -51,7 +63,11 @@ export interface Invocation { readonly dryRun: boolean } -/** One line of `history.jsonl`. */ +/** + * One line of `history.jsonl`. Version 1: later 1.x releases may add change + * kinds and optional fields (readers skip what they do not know); any other + * change gets a new `v`. + */ export interface HistoryLine { v: 1 time: string @@ -68,6 +84,22 @@ export interface HistoryLine { truncated?: number } +/** A line read back from the history. */ +export interface HistoryEntry { + /** The line as written. */ + readonly raw: string + /** `null` when the line was written in a newer format (another `v`). */ + readonly line: HistoryLine | null + /** Changes that could not be read: unknown kinds (from a newer 1.x) or damaged ones. */ + readonly unreadableChanges: number +} + +/** The size limit of the history (0: turned off), and a warning about its setting. */ +export interface HistorySettings { + readonly maxBytes: number + readonly warning: string | null +} + /** The full name of the command that runs, whatever alias was typed (`m d` → `modules deploy`). */ export function commandPath(action: Command): string { const names: string[] = [] @@ -126,54 +158,90 @@ export function isExpectedError(error: unknown): boolean { ) } -/** Runs of commands that change files are recorded, and any unexpected crash. */ +/** + * Runs of commands that change files are recorded, and any unexpected crash. + * Usage errors and `--help` never reach a command, so `invocation` is `null` + * and they are not recorded. + */ export function shouldRecord(invocation: Invocation | null, error: unknown): boolean { - const changing = invocation != null && RECORDED.has(invocation.command) && !invocation.dryRun + const changing = + invocation != null && + !invocation.dryRun && + (COMMANDS as Record)[invocation.command] !== 'read-only' return changing || !isExpectedError(error) } -/** Hides credentials in URLs (`https://user:token@host`) anywhere in a text. */ +const SSH_SCHEMES = new Set(['ssh://', 'git+ssh://', 'ssh+git://']) + +/** + * Hides credentials anywhere in a text: the user info of URLs + * (`https://user:token@host`; a lone ssh user name such as `git` is kept, as + * in `redactUrl`) and query parameters that look like secrets (`?token=…`). + */ export function redactCredentials(text: string): string { - return text.replace(/([a-z][a-z0-9+.-]*:\/\/)([^\s/@]+)@/gi, (match, scheme, credentials) => - // Already hidden (by redactUrl): keep it as it is. - /^[*:]+$/.test(credentials) ? match : `${scheme}***@`, - ) + return text + .replace( + /([a-z][a-z0-9+.-]*:\/\/)([^\s/?#]+)@/gi, + (match, scheme: string, userInfo: string) => { + // Already hidden (by redactUrl), or an ssh user name: keep it as it is. + if (/^[*:]+$/.test(userInfo)) return match + if (SSH_SCHEMES.has(scheme.toLowerCase()) && !/[:@]/.test(userInfo)) return match + return `${scheme}***@` + }, + ) + .replace( + /([?&][^=\s&#]*(?:token|key|secret|passw(?:or)?d|auth|signature|sig)[^=\s&#]*=)[^\s&#'"]+/gi, + '$1***', + ) } /** * The history of what configfile changed: one JSON line per run in - * `~/.configfile/history.jsonl`, rotated to `history.1.jsonl` when it reaches - * its maximum size (`history_max_size` in `~/.configfilerc`; 0 turns it off). + * `~/.configfile/history.jsonl`. Before a write, once the file has reached its + * maximum size (`history_max_size` in `~/.configfilerc`; 0 turns it off), it + * is renamed to `history.1.jsonl`, replacing the previous one. * * Commands record their changes in memory during a run; `main` saves them at * the end. Saving never throws: the history must never change a command's * result. + * + * Known limits: on NFS, appends from several machines can interleave; a run + * killed by a signal (Ctrl+C outside a question) writes no line. */ export class History { readonly file: string readonly previousFile: string + readonly #rotationLock: string readonly #home: string readonly #maxBytes: number | undefined - #settings: Promise<{ maxBytes: number; warning: string | null }> | undefined + #settings: Promise | undefined readonly #changes: Change[] = [] + readonly #options: Record = {} #unchanged = 0 #truncated = 0 /** `maxBytes`: forces the size limit instead of reading it from `~/.configfilerc`. */ constructor(home: string, { maxBytes }: { maxBytes?: number } = {}) { + if (maxBytes != null && !(Number.isSafeInteger(maxBytes) && maxBytes >= 0)) { + throw new RangeError(`maxBytes must be a positive integer or 0, not ${maxBytes}`) + } const { dir } = configfilePaths(home) this.#home = home this.#maxBytes = maxBytes this.file = path.join(dir, 'history.jsonl') this.previousFile = path.join(dir, 'history.1.jsonl') + this.#rotationLock = path.join(dir, 'history.rotating') } /** The size limit (0: history turned off), and a warning when the setting is invalid. */ - settings(): Promise<{ maxBytes: number; warning: string | null }> { + settings(): Promise { this.#settings ??= this.#maxBytes != null ? Promise.resolve({ maxBytes: this.#maxBytes, warning: null }) - : new ConfigStore(this.#home).readHistorySize() + : new ConfigStore(this.#home).readHistorySize().catch(error => ({ + maxBytes: DEFAULT_HISTORY_SIZE, + warning: `Cannot read "history_max_size": ${messageOf(error)}; using 1MB.`, + })) return this.#settings } @@ -190,6 +258,11 @@ export class History { this.#unchanged++ } + /** Records an option decided during the run, such as `all` when confirmed at a question. */ + option(name: string, value: unknown): void { + this.#options[name] = value + } + /** Appends the line of this run. Returns the error instead of throwing it. */ async save(run: { time: Date @@ -210,7 +283,7 @@ export class History { pid: process.pid, version: run.version, command: run.invocation?.command ?? null, - options: { ...run.invocation?.options }, + options: { ...run.invocation?.options, ...this.#options }, cwd: run.cwd, exitCode: run.exitCode, ...(run.error != null && { error: describeError(run.error) }), @@ -218,75 +291,249 @@ export class History { unchanged: this.#unchanged, ...(this.#truncated > 0 && { truncated: this.#truncated }), } - const content = Buffer.from( - `${JSON.stringify(line, (_, value) => (typeof value === 'string' ? redactCredentials(value) : value))}\n`, - ) + const text = `${JSON.stringify(line, (_, value) => (typeof value === 'string' ? redactCredentials(value) : value))}\n` await mkdir(path.dirname(this.file), { recursive: true, mode: 0o700 }) await this.#rotate(maxBytes) - - // One write in append mode keeps lines whole when several runs write at once. - // O_NOFOLLOW: a symbolic link planted at the history's place is never followed. - const handle = await open( - this.file, - constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW, - 0o600, - ) - try { - const { bytesWritten } = await handle.write(content) - if (bytesWritten !== content.length) throw new Error('the line was only partly written') - } finally { - await handle.close() - } + await this.#append(text) return null } catch (error) { return error instanceof Error ? error : new Error(String(error)) } } - /** The last `limit` runs, oldest first, and the number of lines that could not be read. */ + /** + * The last `limit` lines, oldest first, the number of lines that could not + * be read, and the files that could not be read at all. + */ async read({ limit }: { limit?: number } = {}): Promise<{ - lines: HistoryLine[] + entries: HistoryEntry[] invalid: number + problems: string[] }> { - const lines: HistoryLine[] = [] + if (limit != null && !(Number.isSafeInteger(limit) && limit > 0)) { + throw new RangeError(`limit must be a positive integer, not ${limit}`) + } + const entries: HistoryEntry[] = [] + const problems: string[] = [] let invalid = 0 for (const file of [this.previousFile, this.file]) { let content: string try { - content = await readFile(file, 'utf8') + content = await readRegularFile(file) } catch (error) { - if (errnoCode(error) === 'ENOENT') continue - throw new CliError(`Cannot read ${file}: ${messageOf(error)}`) + if (errnoCode(error) !== 'ENOENT') problems.push(`Cannot read ${file}: ${messageOf(error)}`) + continue } - for (const text of content.split('\n')) { - if (text.trim() === '') continue - try { - const line = JSON.parse(text) as HistoryLine - if (line?.v !== 1 || typeof line.time !== 'string' || !Array.isArray(line.changes)) { - throw new Error('not a history line') - } - lines.push(line) - } catch { + for (const raw of content.split('\n')) { + if (raw.trim() === '') continue + const entry = parseHistoryLine(raw) + if (entry == null) { invalid++ + } else { + entries.push(entry) } } } - return { lines: limit == null ? lines : lines.slice(-limit), invalid } + return { entries: limit == null ? entries : entries.slice(-limit), invalid, problems } + } + + /** + * One write in append mode keeps lines whole when several runs write at + * once. O_NOFOLLOW: a symbolic link planted at the history's place is never + * followed. + */ + async #append(text: string): Promise { + const handle = await open( + this.file, + constants.O_RDWR | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW, + 0o600, + ) + let failure: unknown = null + try { + // A line left unfinished (a full disk, for example) must not swallow this one. + const { size } = await handle.stat() + const last = Buffer.alloc(1) + if (size > 0) await handle.read(last, 0, 1, size - 1) + const content = Buffer.from(size > 0 && last[0] !== 0x0a ? `\n${text}` : text) + const { bytesWritten } = await handle.write(content) + if (bytesWritten !== content.length) throw new Error('the line was only partly written') + } catch (error) { + failure = error + } + try { + await handle.close() + } catch (error) { + failure ??= error + } + if (failure != null) throw failure } + /** + * Renames a full history to `history.1.jsonl`. Runs rotating at the same + * moment would otherwise rename each other's new file over the previous + * one, so rotation takes a small lock of its own (not the deploy lock, so + * no command ever waits for it): a run that cannot take it skips rotating, + * and the size is checked again once the lock is held. + */ async #rotate(maxBytes: number): Promise { - const stats = await lstatOrNull(this.file) - if (stats == null || stats.size < maxBytes) return + if (!(await this.#isFull(maxBytes))) return + + let lock: Awaited> try { - await rename(this.file, this.previousFile) + lock = await open(this.#rotationLock, 'wx', 0o600) } catch (error) { - // Another configfile rotated it at the same moment. - if (errnoCode(error) !== 'ENOENT') throw error + if (errnoCode(error) !== 'EEXIST') throw error + // Left by a configfile that died while rotating: remove it, the next run rotates. + const stats = await lstatOrNull(this.#rotationLock) + if (stats != null && Date.now() - stats.mtimeMs > STALE_ROTATION_MS) { + await rm(this.#rotationLock, { force: true }) + } + return } + + try { + if (await this.#isFull(maxBytes)) await rename(this.file, this.previousFile) + } finally { + await lock.close() + await rm(this.#rotationLock, { force: true }) + } + } + + /** Only a regular file is rotated: a link or a folder in its place is left for `open` to refuse. */ + async #isFull(maxBytes: number): Promise { + const stats = await lstatOrNull(this.file) + return stats?.isFile() === true && stats.size >= maxBytes + } +} + +/** Reads a file without following a symbolic link in its place. */ +async function readRegularFile(file: string): Promise { + let handle: Awaited> + try { + handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW) + } catch (error) { + if (errnoCode(error) === 'ELOOP') throw new Error('it is a symbolic link, not a file') + throw error } + try { + if (!(await handle.stat()).isFile()) throw new Error('it is not a file') + return await handle.readFile('utf8') + } finally { + await handle.close() + } +} + +/** + * Parses one line of the history, checking its shape: a hand-edited, damaged + * or newer line never reaches code that expects a valid one. `null` when the + * line cannot be read. + */ +export function parseHistoryLine(raw: string): HistoryEntry | null { + let value: unknown + try { + value = JSON.parse(raw) + } catch { + return null + } + if (!isObject(value) || typeof value.v !== 'number') return null + if (value.v !== 1) { + return value.v > 1 ? { raw, line: null, unreadableChanges: 0 } : null + } + + const { error, changes } = value + const valid = + typeof value.time === 'string' && + typeof value.durationMs === 'number' && + typeof value.pid === 'number' && + typeof value.version === 'string' && + (value.command === null || typeof value.command === 'string') && + isObject(value.options) && + typeof value.cwd === 'string' && + Number.isInteger(value.exitCode) && + (error === undefined || + (isObject(error) && + typeof error.message === 'string' && + typeof error.expected === 'boolean' && + (error.stack === undefined || typeof error.stack === 'string'))) && + Array.isArray(changes) && + isCount(value.unchanged) && + (value.truncated === undefined || isCount(value.truncated)) + if (!valid) return null + + const readable = changes.filter(isChange) + return { + raw, + line: { ...(value as unknown as HistoryLine), changes: readable }, + unreadableChanges: changes.length - readable.length, + } +} + +const KEPT_REASONS: Record = { + foreign: true, + modified: true, + identical: true, + 'source-missing': true, +} + +function isChange(value: unknown): value is Change { + if (!isObject(value)) return false + const { backup } = value + switch (value.kind) { + case 'deployed': + return ( + (value.how === 'link' || value.how === 'copy') && + areStrings(value.source, value.target) && + (backup === undefined || typeof backup === 'string') + ) + case 'skipped': + return typeof value.target === 'string' && value.reason === 'exists' + case 'removed': + return ( + typeof value.target === 'string' && + (backup === undefined || + (isObject(backup) && + typeof backup.path === 'string' && + ['restored', 'missing', 'changed'].includes(backup.status as string))) && + (value.leftover === undefined || typeof value.leftover === 'string') + ) + case 'kept': + return typeof value.target === 'string' && Object.hasOwn(KEPT_REASONS, value.reason as string) + case 'failed': + return ( + typeof value.reason === 'string' && + (typeof value.target === 'string') !== (typeof value.module === 'string') + ) + case 'synced': + return ( + areStrings(value.folder, value.upstream, value.to) && + (value.from === null || typeof value.from === 'string') + ) + case 'saved-patch': + case 'configured': + return typeof value.file === 'string' + case 'script': + return areStrings(value.name, value.file) && Number.isInteger(value.exitCode) + case 'cloned': + case 'reused': + return areStrings(value.repository, value.folder) + default: + return false + } +} + +function isObject(value: unknown): value is Record { + return value != null && typeof value === 'object' && !Array.isArray(value) +} + +function areStrings(...values: unknown[]): boolean { + return values.every(value => typeof value === 'string') +} + +function isCount(value: unknown): boolean { + return Number.isSafeInteger(value) && (value as number) >= 0 } function describeError(error: unknown): NonNullable { diff --git a/src/program.ts b/src/program.ts index b28b2a90..be0e2c64 100644 --- a/src/program.ts +++ b/src/program.ts @@ -45,6 +45,7 @@ export async function main(args: string[], ctx: Context): Promise { const program = buildProgram(ctx) // Runs before the action of any command, nested ones included (not for --help or usage errors). + // A run killed by a signal (Ctrl+C outside a question) ends before its line is written. program.hook('preAction', (_, action) => { invocation = describeInvocation(action) }) @@ -62,7 +63,12 @@ export async function main(args: string[], ctx: Context): Promise { }) const { warning } = await ctx.history.settings() if (warning != null) ctx.output.warn(warning) - if (failed != null) ctx.output.warn(`Cannot write ${ctx.history.file}: ${messageOf(failed)}`) + if (failed != null) { + ctx.output.warn( + `This run could not be recorded in the history: ${messageOf(failed)}. ` + + 'Fix the file, or set "history_max_size" to 0 in ~/.configfilerc to turn the history off.', + ) + } } return code } diff --git a/src/repository.ts b/src/repository.ts index a007e744..b1389124 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -4,6 +4,7 @@ import path from 'node:path' import type { Context } from './context.js' import { CliError } from './errors.js' +import { describeJsonError } from './fsutil.js' import { configfilePaths, contains, resolveUserPath, slugify } from './paths.js' export interface ModuleFile { @@ -124,7 +125,7 @@ async function readModuleFiles( try { settings = JSON.parse(await readFile(settingsPath, 'utf8')) } catch (error) { - return { error: `settings.json is not valid JSON (${(error as Error).message})` } + return { error: `settings.json is not valid JSON (${describeJsonError(error)})` } } // configfile 0.3.1 wrote the list of files at the top level of settings.json. diff --git a/src/state.ts b/src/state.ts index 04b4f5ac..baae8c7b 100644 --- a/src/state.ts +++ b/src/state.ts @@ -3,6 +3,7 @@ import path from 'node:path' import { CliError } from './errors.js' import { + describeJsonError, type Identity, identityOf, lstatOrNull, @@ -86,7 +87,7 @@ export class DeploymentRecord { try { state = JSON.parse(content) } catch (error) { - throw new CliError(`${filePath} is not valid JSON (${messageOf(error)}).`) + throw new CliError(`${filePath} is not valid JSON (${describeJsonError(error)}).`) } if (state == null || typeof state !== 'object' || Array.isArray(state)) { throw new CliError(`${filePath} is not a valid configfile state file.`) diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 7111e9a4..e34f0c4f 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -1,3 +1,4 @@ +import { execFileSync } from 'node:child_process' import { existsSync } from 'node:fs' import { chmod, @@ -8,6 +9,7 @@ import { readFile, readlink, rename, + rm, stat, symlink, writeFile, @@ -16,7 +18,7 @@ import path from 'node:path' import { describe, expect, it } from 'vitest' -import { READ_ONLY, RECORDED } from '../src/history.js' +import { COMMANDS } from '../src/history.js' import { buildProgram } from '../src/program.js' import { createContext, @@ -1328,18 +1330,39 @@ describe('history', () => { git(remote, 'add', '.') git(remote, 'commit', '--quiet', '-m', 'new') + const head = (cwd: string) => + execFileSync('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8' }).trim() + const before = head(sandbox.repo) + const after = head(remote) + + await runCli(sandbox, ['update']) await runCli(sandbox, ['update']) + const [first, second] = await readHistory(sandbox) + expect(before).not.toBe(after) + expect(first?.changes).toEqual([ + { kind: 'saved-patch', file: expect.stringContaining('/.configfile/saved/') }, + { kind: 'synced', folder: sandbox.repo, upstream: 'origin/main', from: before, to: after }, + ]) + expect(second?.changes).toEqual([ + { kind: 'synced', folder: sandbox.repo, upstream: 'origin/main', from: after, to: after }, + ]) + }) + + it('records the clone made by init', async () => { + const sandbox = await createSandbox() + const remote = await createRemote(sandbox) + + await runCli(sandbox, ['init', '--repo', remote]) + const [line] = await readHistory(sandbox) expect(line?.changes).toEqual([ - { kind: 'saved-patch', file: expect.stringContaining('/.configfile/saved/') }, { - kind: 'synced', - folder: sandbox.repo, - upstream: 'origin/main', - from: expect.any(String), - to: expect.any(String), + kind: 'cloned', + repository: remote, + folder: path.join(sandbox.home, '.configfile/dotfiles'), }, + { kind: 'configured', file: path.join(sandbox.home, '.configfilerc') }, ]) }) @@ -1391,10 +1414,88 @@ describe('history', () => { const [line] = await readHistory(sandbox) expect(line).toMatchObject({ exitCode: 130, + error: { expected: true }, changes: [{ kind: 'deployed', target: path.join(sandbox.cwd, 'b') }], }) }) + it('records the failures of a deployment', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify({ + files: [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'missing', target_path: '~/x', deploy: 'global' }, + { source_path: 'a', deploy: 'global' }, + ], + }), + ) + await sandbox.write('home/dotfiles/files/broken/settings.json', '{') + + const deployed = await runCli(sandbox, ['modules', 'deploy', '--all']) + await runCli(sandbox, ['modules', 'deploy', 'nope']) + + expect(deployed.code).toBe(1) + const [all, unknown] = await readHistory(sandbox) + expect(all).toMatchObject({ options: { all: true }, exitCode: 1, error: { expected: true } }) + expect(all?.changes).toEqual( + expect.arrayContaining([ + { kind: 'failed', module: 'broken', reason: expect.stringContaining('not valid JSON') }, + { + kind: 'failed', + module: 'zsh', + reason: expect.stringContaining('"target_path" is missing'), + }, + { + kind: 'failed', + target: path.join(sandbox.home, 'x'), + reason: expect.stringContaining('does not exist'), + }, + expect.objectContaining({ kind: 'deployed', target: path.join(sandbox.home, '.zshrc') }), + ]), + ) + expect(unknown).toMatchObject({ + exitCode: 1, + error: { message: expect.stringContaining('Unknown module: nope'), expected: true }, + changes: [], + }) + }) + + it('records modules chosen at a question as --all', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + + await runCli(sandbox, ['modules', 'deploy'], [true]) + + const [line] = await readHistory(sandbox) + expect(line?.options).toEqual({ modules: [], all: true }) + }) + + it('records backups that could not be restored', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + const zshrc = path.join(sandbox.home, '.zshrc') + await sandbox.write('home/.zshrc', 'mine') + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + await sandbox.write('home/.zshrc.old', 'changed since') + await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + await rm(`${zshrc}.old`) + await sandbox.write('home/.zshrc', 'mine again') + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + await rm(`${zshrc}.old`) + await runCli(sandbox, ['modules', 'undeploy', 'zsh']) + + const lines = await readHistory(sandbox) + expect(lines[1]?.changes).toEqual([ + { kind: 'removed', target: zshrc, backup: { path: `${zshrc}.old`, status: 'changed' } }, + ]) + expect(lines[3]?.changes).toEqual([ + { kind: 'removed', target: zshrc, backup: { path: `${zshrc}.old`, status: 'missing' } }, + ]) + }) + it('never changes the exit code when the history cannot be written', async () => { const sandbox = await createSandbox() await withModule(sandbox) @@ -1403,7 +1504,40 @@ describe('history', () => { const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) expect(result.code).toBe(0) - expect(result.stderr.match(/Cannot write .*history\.jsonl/g)).toHaveLength(1) + expect( + result.stderr.match(/could not be recorded in the history: .*history\.jsonl/g), + ).toHaveLength(1) + + await sandbox.write('home/dotfiles/scripts/fail.sh', 'exit 4\n') + const failing = await runCli(sandbox, ['scripts', 'run', 'fail']) + expect(failing.code).toBe(4) + expect(failing.stderr.match(/could not be recorded/g)).toHaveLength(1) + }) + + it('warns about an invalid size, and records with the default one', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.configure({ history_max_size: 'big' }) + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + const history = await runCli(sandbox, ['history']) + + expect(result.code).toBe(0) + expect(result.stderr.match(/"history_max_size" .* must be a size/g)).toHaveLength(1) + expect(await readHistory(sandbox)).toHaveLength(1) + expect(history.stderr).toContain('"history_max_size"') + }) + + it('records nothing when the configuration cannot be read, as it may turn the history off', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write('home/.configfilerc', '{"history_max_size": 0,') + + const result = await runCli(sandbox, ['modules', 'deploy', 'zsh']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('This run is not recorded in the history.') + expect(existsSync(path.join(sandbox.home, '.configfile/history.jsonl'))).toBe(false) }) it('can be turned off', async () => { @@ -1441,10 +1575,209 @@ describe('history', () => { .split('\n') .map(text => JSON.parse(text)) expect(lines.map(line => line.command)).toEqual(['modules deploy', 'modules deploy']) - expect((await runCli(sandbox, ['history', '-n', 'x'])).code).toBe(1) + for (const limit of ['x', '0', '-1', '1.5', '0x1', '1e1']) { + const result = await runCli(sandbox, ['history', '-n', limit]) + expect(result.code, limit).toBe(1) + } + }) + + it('shows every kind of change, and why runs failed', async () => { + const sandbox = await createSandbox() + const home = (file: string) => path.join(sandbox.home, file) + const line = (fields: Record) => + JSON.stringify({ + v: 1, + time: '2026-10-01T09:00:00.000Z', + durationMs: 1, + pid: 1, + version: '1.0.0', + command: 'modules deploy', + options: {}, + cwd: sandbox.cwd, + exitCode: 0, + changes: [], + unchanged: 0, + ...fields, + }) + await sandbox.write( + 'home/.configfile/history.jsonl', + `${[ + line({ + options: { modules: ['zsh', 'git'], local: true, force: true }, + exitCode: 1, + error: { message: '1 file, module or settings entry failed.', expected: true }, + changes: [ + { + kind: 'deployed', + how: 'link', + source: '/s', + target: home('.a'), + backup: home('.a.old'), + }, + { kind: 'deployed', how: 'copy', source: '/s', target: '/work/b' }, + { kind: 'skipped', target: '/work/c', reason: 'exists' }, + { kind: 'failed', target: home('x'), reason: 'EACCES' }, + { kind: 'failed', module: 'git', reason: 'settings.json has no "files" list' }, + ], + unchanged: 2, + }), + line({ + command: 'modules undeploy', + options: { modules: [], all: true }, + changes: [ + { + kind: 'removed', + target: home('.a'), + backup: { path: home('.a.old'), status: 'restored' }, + }, + { + kind: 'removed', + target: home('.b'), + backup: { path: home('.b.old'), status: 'missing' }, + }, + { + kind: 'removed', + target: home('.c'), + backup: { path: home('.c.old'), status: 'changed' }, + }, + { kind: 'removed', target: home('.d'), leftover: home('.d.tmp') }, + { kind: 'kept', target: home('.e'), reason: 'foreign' }, + { kind: 'kept', target: home('.f'), reason: 'modified' }, + { kind: 'kept', target: home('.g'), reason: 'identical' }, + { kind: 'kept', target: home('.h'), reason: 'source-missing' }, + { kind: 'future-kind' }, + ], + truncated: 3, + }), + line({ + command: 'update', + changes: [ + { kind: 'saved-patch', file: home('.configfile/saved/p.patch') }, + { + kind: 'synced', + folder: home('.configfile/dotfiles'), + upstream: 'origin/main', + from: '7d0289a1f', + to: '1217e91aa', + }, + ], + }), + line({ + command: 'update', + changes: [ + { + kind: 'synced', + folder: home('.configfile/dotfiles'), + upstream: 'origin/main', + from: 'abc', + to: 'abc', + }, + ], + }), + line({ + command: 'scripts run', + options: { script: 'setup', argCount: 2 }, + exitCode: 3, + error: { message: 'Script "setup" exited with code 3.', expected: true }, + changes: [{ kind: 'script', name: 'setup', file: '/s/setup.sh', exitCode: 3 }], + }), + line({ + command: 'init', + options: { repo: 'https://***@host/r.git' }, + changes: [ + { + kind: 'cloned', + repository: 'https://***@host/r.git', + folder: home('.configfile/dotfiles'), + }, + { kind: 'configured', file: home('.configfilerc') }, + ], + }), + line({ + command: 'init', + options: { folder: '/dotfiles' }, + changes: [{ kind: 'reused', repository: 'git@host:r.git', folder: '/dotfiles' }], + }), + line({ command: null, exitCode: 1, error: { message: 'boom', expected: false } }), + ].join('\n')}\n`, + ) + + const result = await runCli(sandbox, ['history']) + + expect(result.code).toBe(0) + expect(result.stdout.replace(/^\d{4}-\d\d-\d\d \d\d:\d\d/gm, 'TIME')).toBe( + [ + 'TIME modules deploy zsh git --local --force exit 1', + ' linked ~/.a (previous file moved to ~/.a.old)', + ' copied /work/b', + ' skipped /work/c (it already existed)', + ' failed ~/x EACCES', + ' failed module git settings.json has no "files" list', + ' 2 unchanged', + ' error 1 file, module or settings entry failed.', + '', + 'TIME modules undeploy --all ok', + ' removed ~/.a (~/.a.old restored)', + ' removed ~/.b (its backup ~/.b.old no longer existed)', + ' removed ~/.c (its backup ~/.c.old had changed, not restored)', + ' removed ~/.d (left at ~/.d.tmp)', + ' kept ~/.e (not deployed by configfile)', + ' kept ~/.f (modified since it was copied)', + ' kept ~/.g (not copied by configfile)', + ' kept ~/.h (its source was missing)', + ' …and 1 change this configfile cannot show', + ' …and 3 more changes', + '', + 'TIME update ok', + ' saved local changes to ~/.configfile/saved/p.patch', + ' synced ~/.configfile/dotfiles with origin/main (7d0289a → 1217e91)', + '', + 'TIME update ok', + ' synced ~/.configfile/dotfiles (already up to date with origin/main)', + '', + 'TIME scripts run setup (2 arguments) exit 3', + ' script setup exit 3', + ' error Script "setup" exited with code 3.', + '', + 'TIME init --repo https://***@host/r.git ok', + ' cloned https://***@host/r.git into ~/.configfile/dotfiles', + ' saved configuration ~/.configfilerc', + '', + 'TIME init --folder /dotfiles ok', + ' reused /dotfiles for git@host:r.git', + '', + 'TIME (unknown command) exit 1', + ' crashed boom', + '', + ].join('\n'), + ) }) - it('classifies every command as recorded or read-only', async () => { + it('skips damaged lines and lines of a newer format instead of failing', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + const file = path.join(sandbox.home, '.configfile/history.jsonl') + const newer = JSON.stringify({ v: 2, time: 'later' }) + await writeFile( + file, + `${await readFile(file, 'utf8')}not json\n{"v":1,"time":"2026-01-01T00:00:00.000Z","changes":[]}\n${newer}\n`, + ) + + const readable = await runCli(sandbox, ['history']) + const json = await runCli(sandbox, ['history', '--json']) + + expect(readable.code).toBe(0) + expect(readable.stdout).toContain('modules deploy zsh ok') + expect(readable.stderr).toContain('2 damaged lines of the history skipped.') + expect(readable.stderr).toContain('1 line written by a newer configfile skipped.') + expect(json.code).toBe(0) + expect(json.stdout.trim().split('\n').at(-1)).toBe(newer) + // Reading the history never records anything. + expect((await readFile(file, 'utf8')).trim().split('\n')).toHaveLength(4) + }) + + it('classifies every command, and only them, as recorded or read-only', async () => { const sandbox = await createSandbox() const leaves: string[] = [] const walk = (command: ReturnType, prefix: string[]) => { @@ -1456,10 +1789,7 @@ describe('history', () => { } walk(buildProgram(createContext(sandbox)), []) - expect(leaves.length).toBeGreaterThan(5) - for (const leaf of leaves) { - expect(RECORDED.has(leaf) || READ_ONLY.has(leaf), `"${leaf}" is not classified`).toBe(true) - } + expect(leaves.sort()).toEqual(Object.keys(COMMANDS).sort()) }) }) diff --git a/tests/config.test.ts b/tests/config.test.ts index 381d29d0..056d07c3 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -163,7 +163,7 @@ describe('ConfigStore.readHistorySize', () => { }) }) - it.each([-1, 1.5, 'big', '5 TB', true])( + it.each([-1, 1.5, 'big', '5 TB', '2GB', true])( 'falls back to 1MB with a warning for %o', async value => { const sandbox = await createSandbox() @@ -176,12 +176,25 @@ describe('ConfigStore.readHistorySize', () => { }, ) - it('works without a configuration, or with an invalid one', async () => { + it('works without a configuration', async () => { + const { home } = await createSandbox() + + await expect(new ConfigStore(home).readHistorySize()).resolves.toEqual({ + maxBytes: 1024 * 1024, + warning: null, + }) + }) + + it('turns the history off, with a warning, when the configuration cannot be read', async () => { const { home } = await createSandbox() const store = new ConfigStore(home) - await expect(store.readHistorySize()).resolves.toEqual({ maxBytes: 1024 * 1024, warning: null }) + await writeFile(store.path, 'me:ghp_SECRETTOKEN@host') + + const result = await store.readHistorySize() - await writeFile(store.path, 'not json') - await expect(store.readHistorySize()).resolves.toEqual({ maxBytes: 1024 * 1024, warning: null }) + expect(result.maxBytes).toBe(0) + expect(result.warning).toContain('This run is not recorded in the history.') + // JSON errors never quote the file: it may contain a secret. + expect(result.warning).not.toContain('ghp_') }) }) diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts index 291276e3..c2f23b6e 100644 --- a/tests/e2e.test.ts +++ b/tests/e2e.test.ts @@ -162,7 +162,9 @@ describe('built CLI', () => { expect(await readFile(path.join(sandbox.home, '.shared'), 'utf8')).toBe('PRECIOUS') }) - it('keeps one whole history line per run when many runs write at once', async () => { + it('keeps one whole history line per run when many runs write at once', { + timeout: 30_000, + }, async () => { const sandbox = await createSandbox() await sandbox.configure() await sandbox.write('home/dotfiles/scripts/ok.sh', 'exit 0\n') @@ -193,4 +195,50 @@ describe('built CLI', () => { lines.every(line => line.version === pkg.version && line.command === 'scripts run'), ).toBe(true) }) + + it('loses no line when many runs rotate the history at once', { timeout: 30_000 }, async () => { + const sandbox = await createSandbox() + await sandbox.configure({ history_max_size: '8KB' }) + await sandbox.write('home/dotfiles/scripts/ok.sh', 'exit 0\n') + const old = JSON.stringify({ + v: 1, + time: '2026-01-01T00:00:00.000Z', + durationMs: 1, + pid: 1, + version: '0.0.0', + command: 'update', + options: {}, + cwd: '/', + exitCode: 0, + changes: [], + unchanged: 0, + }) + const count = Math.ceil(8192 / old.length) + 1 + await sandbox.write('home/.configfile/history.jsonl', `${old}\n`.repeat(count)) + const env: NodeJS.ProcessEnv = { ...process.env, HOME: sandbox.home, NO_COLOR: '1' } + + // One rotation is due; the 16 new lines then fit under the limit. + await Promise.all( + Array.from( + { length: 16 }, + () => + new Promise(resolve => { + spawn(process.execPath, [cli, 'scripts', 'run', 'ok'], { + cwd: sandbox.cwd, + env, + stdio: 'ignore', + }).on('close', resolve) + }), + ), + ) + + const lines = async (name: string) => + (await readFile(path.join(sandbox.home, '.configfile', name), 'utf8')) + .split('\n') + .filter(line => line !== '') + expect((await lines('history.1.jsonl')).length).toBeGreaterThanOrEqual(count) + expect([...(await lines('history.1.jsonl')), ...(await lines('history.jsonl'))]).toHaveLength( + count + 16, + ) + }) }) diff --git a/tests/helpers.ts b/tests/helpers.ts index 85fd5c70..2d71d9d7 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -172,7 +172,11 @@ export async function createRemote(sandbox: Sandbox): Promise { /** Every line of the history files (rotated file first); fails on an unreadable line. */ export async function readHistory(sandbox: Sandbox): Promise { - const { lines, invalid } = await new History(sandbox.home).read() - if (invalid > 0) throw new Error(`${invalid} unreadable history lines`) - return lines + const { entries, invalid, problems } = await new History(sandbox.home).read() + if (invalid > 0 || problems.length > 0) throw new Error(`Unreadable history: ${problems}`) + return entries.map(entry => { + if (entry.line == null || entry.unreadableChanges > 0) + throw new Error(`Unreadable: ${entry.raw}`) + return entry.line + }) } diff --git a/tests/history.test.ts b/tests/history.test.ts index 5acb5fbf..a8fb5da1 100644 --- a/tests/history.test.ts +++ b/tests/history.test.ts @@ -1,4 +1,5 @@ -import { mkdir, readFile, stat, symlink, writeFile } from 'node:fs/promises' +import { existsSync } from 'node:fs' +import { lstat, mkdir, readFile, stat, symlink, utimes, writeFile } from 'node:fs/promises' import path from 'node:path' import { Command, CommanderError } from 'commander' @@ -9,6 +10,7 @@ import { describeInvocation, History, type Invocation, + parseHistoryLine, redactCredentials, shouldRecord, } from '../src/history.js' @@ -24,6 +26,16 @@ const run = (overrides: Partial[0]> = {}) => ({ ...overrides, }) +/** The lines `history.read()` returns, written in the current format. */ +async function linesOf(history: History, options?: { limit?: number }) { + return (await history.read(options)).entries.map(entry => entry.line) +} + +/** Number of lines in a history file. */ +async function countLines(file: string): Promise { + return (await readFile(file, 'utf8')).split('\n').filter(line => line !== '').length +} + describe('History', () => { it('appends one line per run, in a private file', async () => { const { home } = await createSandbox() @@ -33,7 +45,7 @@ describe('History', () => { await expect(first.save(run())).resolves.toBeNull() await expect(new History(home).save(run({ exitCode: 3 }))).resolves.toBeNull() - const { lines } = await new History(home).read() + const lines = await linesOf(new History(home)) expect(lines).toMatchObject([ { v: 1, @@ -63,11 +75,72 @@ describe('History', () => { expect(current.length).toBeGreaterThan(0) expect(previous.length).toBeGreaterThan(0) // The oldest lines were dropped by the second rotation; the newest is last. - const { lines } = await history.read() + const lines = await linesOf(history) expect(lines.length).toBeLessThan(6) expect(lines.at(-1)?.exitCode).toBe(6) }) + it('rotates once the file has reached the limit, not before', async () => { + const { home } = await createSandbox() + await new History(home).save(run({ exitCode: 1 })) + const { size } = await stat(new History(home).file) + + await new History(home, { maxBytes: size + 1 }).save(run({ exitCode: 2 })) + expect(existsSync(new History(home).previousFile)).toBe(false) + + await new History(home, { maxBytes: size * 2 }).save(run({ exitCode: 3 })) + const history = new History(home) + expect(await countLines(history.previousFile)).toBe(2) + expect(await countLines(history.file)).toBe(1) + }) + + it('never loses the rotated file when several runs rotate at once', async () => { + const { home } = await createSandbox() + const history = new History(home) + for (let i = 0; i < 40; i++) await history.save(run({ exitCode: i })) + const { size } = await stat(history.file) + + // One rotation is due; the 20 new lines then fit under the limit. + await Promise.all( + Array.from({ length: 20 }, () => new History(home, { maxBytes: size }).save(run())), + ) + + expect(await countLines(history.previousFile)).toBeGreaterThanOrEqual(40) + expect((await countLines(history.previousFile)) + (await countLines(history.file))).toBe(60) + }) + + it('skips rotating while another run rotates, and clears a rotation lock left behind', async () => { + const { home } = await createSandbox() + const history = new History(home) + await history.save(run()) + const lock = path.join(path.dirname(history.file), 'history.rotating') + await writeFile(lock, '') + + await new History(home, { maxBytes: 1 }).save(run()) + expect(existsSync(history.previousFile)).toBe(false) + expect(await countLines(history.file)).toBe(2) + + const old = new Date(Date.now() - 5 * 60_000) + await utimes(lock, old, old) + await new History(home, { maxBytes: 1 }).save(run()) + await new History(home, { maxBytes: 1 }).save(run()) + expect(existsSync(lock)).toBe(false) + expect(await countLines(history.previousFile)).toBe(3) + }) + + it('keeps the next line whole after a line left unfinished', async () => { + const { home } = await createSandbox() + const history = new History(home) + await mkdir(path.dirname(history.file), { recursive: true }) + await writeFile(history.file, '{"v":1,"time":"2026') + + await history.save(run({ exitCode: 7 })) + + const { entries, invalid } = await history.read() + expect(invalid).toBe(1) + expect(entries.map(entry => entry.line?.exitCode)).toEqual([7]) + }) + it('writes nothing when turned off', async () => { const { home } = await createSandbox() const history = new History(home, { maxBytes: 0 }) @@ -88,6 +161,39 @@ describe('History', () => { expect(await readFile(path.join(root, 'victim'), 'utf8')).toBe('untouched') }) + it('never rotates or reads through a symbolic link planted at the history', async () => { + const { home, root } = await createSandbox() + const history = new History(home, { maxBytes: 1 }) + await mkdir(path.dirname(history.file), { recursive: true }) + await writeFile(path.join(root, 'victim'), `${JSON.stringify({ v: 1 })}\n`) + await symlink(path.join(root, 'victim'), history.file) + + await expect(history.save(run())).resolves.toBeInstanceOf(Error) + const { entries, problems } = await history.read() + + expect((await lstat(history.file)).isSymbolicLink()).toBe(true) + expect(existsSync(history.previousFile)).toBe(false) + expect(entries).toEqual([]) + expect(problems).toEqual([expect.stringContaining('symbolic link')]) + }) + + it('still reads the current file when the previous one cannot be read', async () => { + const { home } = await createSandbox() + const history = new History(home) + await history.save(run({ exitCode: 5 })) + await mkdir(history.previousFile) + + const { entries, problems } = await history.read() + + expect(entries.map(entry => entry.line?.exitCode)).toEqual([5]) + expect(problems).toEqual([expect.stringContaining(history.previousFile)]) + }) + + it('refuses an invalid size limit', () => { + expect(() => new History('/home', { maxBytes: -1 })).toThrow(RangeError) + expect(() => new History('/home', { maxBytes: 1.5 })).toThrow(RangeError) + }) + it('returns the error instead of throwing when it cannot write', async () => { const { home } = await createSandbox() const history = new History(home) @@ -101,6 +207,7 @@ describe('History', () => { const history = new History(home) history.record({ kind: 'failed', + module: 'zsh', reason: "fatal: could not read from 'https://user:ghp_SECRET@github.com/a/b.git'", }) @@ -121,7 +228,7 @@ describe('History', () => { delete process.env.DEBUG } - const { lines } = await new History(home).read() + const lines = await linesOf(new History(home)) expect(lines[0]?.error).toEqual({ message: 'boom', expected: false }) expect(lines[1]?.error?.stack).toContain('Error: boom') }) @@ -134,7 +241,7 @@ describe('History', () => { await history.save(run()) - const [line] = (await new History(home).read()).lines + const [line] = await linesOf(new History(home)) expect(line?.changes).toHaveLength(1000) expect(line?.truncated).toBe(5) }) @@ -163,11 +270,72 @@ describe('History', () => { const result = await history.read({ limit: 2 }) - expect(result.lines.map(line => line.exitCode)).toEqual([2, 3]) + expect(result.entries.map(entry => entry.line?.exitCode)).toEqual([2, 3]) expect(result.invalid).toBe(1) }) }) +describe('parseHistoryLine', () => { + const valid = { + v: 1, + time: '2026-10-01T09:00:00.000Z', + durationMs: 3, + pid: 1, + version: '1.0.0', + command: 'update', + options: {}, + cwd: '/work', + exitCode: 0, + changes: [], + unchanged: 0, + } + const parse = (value: unknown) => parseHistoryLine(JSON.stringify(value)) + + it('reads a valid line', () => { + expect(parse(valid)).toMatchObject({ line: valid, unreadableChanges: 0 }) + }) + + it.each([ + ['not an object', [1]], + ['no version', { ...valid, v: undefined }], + ['an older version', { ...valid, v: 0 }], + ['options missing', { ...valid, options: undefined }], + ['options null', { ...valid, options: null }], + ['a time that is not text', { ...valid, time: 3 }], + ['an exit code that is not a number', { ...valid, exitCode: '1' }], + ['an error message that is not text', { ...valid, error: { message: 1, expected: true } }], + ['changes that are not a list', { ...valid, changes: {} }], + ['a negative unchanged count', { ...valid, unchanged: -1 }], + ])('refuses a line with %s', (_, value) => { + expect(parse(value)).toBeNull() + }) + + it('keeps lines written in a newer format, without reading them', () => { + expect(parse({ v: 2, anything: true })).toEqual({ + raw: JSON.stringify({ v: 2, anything: true }), + line: null, + unreadableChanges: 0, + }) + }) + + it('skips changes it cannot read and counts them', () => { + const entry = parse({ + ...valid, + changes: [ + null, + { kind: 'future-kind' }, + { kind: 'kept', target: '/t', reason: 'future-reason' }, + { kind: 'synced', folder: '/f', upstream: 'origin/main', from: 1, to: 2 }, + { kind: 'failed', reason: 'neither a target nor a module' }, + { kind: 'saved-patch', file: '/p' }, + ], + }) + + expect(entry?.line?.changes).toEqual([{ kind: 'saved-patch', file: '/p' }]) + expect(entry?.unreadableChanges).toBe(5) + }) +}) + describe('describeInvocation', () => { /** Parses `args` with a program shaped like configfile's, returning the invocation. */ async function invocationOf(args: string[]): Promise { @@ -229,6 +397,7 @@ describe('describeInvocation', () => { }) describe('shouldRecord', () => { + const promptExit = () => Object.assign(new Error('closed'), { name: 'ExitPromptError' }) const invocation = (command: string, dryRun = false): Invocation => ({ command, options: {}, @@ -253,6 +422,19 @@ describe('shouldRecord', () => { true, ], ['help or a usage error', null, new CommanderError(1, 'c', 'm'), false], + [ + 'Ctrl+C at a question of a read-only command', + invocation('modules status'), + promptExit(), + false, + ], + [ + 'Ctrl+C at a question of a command that changes files', + invocation('update'), + promptExit(), + true, + ], + ['a command missing from the table', invocation('future command'), null, true], ['an unexpected error before any command', null, new TypeError('x'), true], ])('%s: %s', (_, inv, error, expected) => { expect(shouldRecord(inv, error)).toBe(expected) @@ -262,7 +444,19 @@ describe('shouldRecord', () => { describe('redactCredentials', () => { it.each([ ['clone https://user:token@github.com/a/b failed', 'clone https://***@github.com/a/b failed'], - ['ssh://git@host:22/r', 'ssh://***@host:22/r'], + ['ssh://git@host:22/r', 'ssh://git@host:22/r'], + ['ssh://git:secret@host/r', 'ssh://***@host/r'], + ['https://TOKEN@github.com/a/b', 'https://***@github.com/a/b'], + ['HTTPS://U:T@host/r', 'HTTPS://***@host/r'], + ['https://user:p@ss@host/r', 'https://***@host/r'], + [ + "Cloning into 'https://a:one@h/r'... fatal: 'https://b:two@h/r'", + "Cloning into 'https://***@h/r'... fatal: 'https://***@h/r'", + ], + ['https://***:***@host/r', 'https://***:***@host/r'], + ['https://host/r.git?private_token=SECRET&x=1', 'https://host/r.git?private_token=***&x=1'], + ['https://host/r?access_token=SECRET', 'https://host/r?access_token=***'], + ['https://host/r?page=2', 'https://host/r?page=2'], ['no url here', 'no url here'], ['https://github.com/a/b', 'https://github.com/a/b'], ])('%s', (text, expected) => { diff --git a/tests/setup.ts b/tests/setup.ts new file mode 100644 index 00000000..39eeddab --- /dev/null +++ b/tests/setup.ts @@ -0,0 +1,2 @@ +// Tests check output with and without DEBUG: they start without it, whatever the shell exports. +delete process.env.DEBUG diff --git a/vitest.config.ts b/vitest.config.ts index 09dd24b2..516d3300 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,6 +4,7 @@ export default defineConfig({ test: { include: ['tests/**/*.test.ts'], globalSetup: ['tests/global-setup.ts'], + setupFiles: ['tests/setup.ts'], // Git run by tests and by the CLI under test ignores the developer's configuration. env: { GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_NOSYSTEM: '1' }, coverage: { From 30f4d37f2e3b1fa9d34e2af0a91b43baddfe579e Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 1 Oct 2026 15:41:54 +0200 Subject: [PATCH 323/341] docs: switch support to GitHub Sponsors and refresh contributor docs (#286) --- .github/FUNDING.yml | 13 +-- .github/ISSUE_TEMPLATE/bug_report.md | 43 +++---- .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/feature_request.md | 8 +- .github/ISSUE_TEMPLATE/question.md | 15 +++ .github/pull_request_template.md | 8 +- CHANGELOG.md | 25 ++-- CODE_OF_CONDUCT.md | 132 ++++++++++++++++++++++ CONTRIBUTING.md | 66 +++++++---- README.md | 17 +-- SECURITY.md | 39 +++++++ SPONSORS.md | 27 ++--- docs/home.md | 15 ++- package.json | 5 +- 14 files changed, 314 insertions(+), 104 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 SECURITY.md diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 6664f2e0..792ccbac 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,12 +1 @@ -# These are supported funding model platforms - -github: [mindsers] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: mindsers # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: mindsers # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: mindsers # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: nathanaelcherrier.com/en/support # Replace with a single custom sponsorship URL +github: [mindsers] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 449caeff..bf3d698a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,38 +1,41 @@ --- name: Bug report -about: Create a report to help us improve +about: Something configfile does wrong title: '' labels: 'type: bug' assignees: '' --- + + **Describe the bug** A clear and concise description of what the bug is. -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error +**To reproduce** +The commands you ran, in order, for example: +1. `configfile init --repo ` +2. `configfile modules deploy zsh` + +If the bug depends on a module, add its `settings.json` (remove anything private). **Expected behavior** -A clear and concise description of what you expected to happen. +What you expected to happen. + +**Output** +What configfile printed. Running the command again with `DEBUG=1` adds details to unexpected errors. + +```txt -**Screenshots** -If applicable, add screenshots to help explain your problem. +``` -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] +The last runs of `configfile history` often help too. Check them for paths or names you would rather not share. -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] +**Environment** +- configfile version (`configfile --version`): +- Node.js version (`node --version`): +- Operating system and version: +- Installed with (npm, pnpm, yarn…): **Additional context** -Add any other context about the problem here. +Anything else about the problem. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..6b2c7c16 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Report a security vulnerability + url: https://github.com/mindsers/configfile/security/advisories/new + about: Report vulnerabilities privately, never in a public issue. See SECURITY.md. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 3166f913..08c07da4 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest an idea for this project +about: Suggest an idea for configfile title: '' labels: 'type: enhancement' assignees: '' @@ -11,10 +11,10 @@ assignees: '' A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** -A clear and concise description of what you want to happen. +What you want to happen, for example the command or setting you would use. **Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +Other solutions or workarounds you've considered. **Additional context** -Add any other context or screenshots about the feature request here. +Anything else about the feature request. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 00000000..e933de94 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,15 @@ +--- +name: Question +about: Ask how to use configfile +title: '' +labels: 'question' +assignees: '' + +--- + +**Your question** +What you want to do, and what you tried. + +**Environment** +- configfile version (`configfile --version`): +- Operating system: diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8b5e591c..a359529a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,5 +1,6 @@ + `feat(modules): add status command`, `fix: …`, `docs: …`. + Open it against `develop`, not `master`. See CONTRIBUTING.md. --> ### Summary @@ -14,5 +15,6 @@ If there's anything else that's important and relevant to your pull request, mention that information here. This could include benchmarks, or other information. -If you are updating any of the CHANGELOG files or are asked to update the -CHANGELOG files by reviewers, please add the CHANGELOG entry at the top of the file. +Describe how to test the change, and what changes for users (and whether +anything breaks). When users will notice the change, add a line to the +`[Unreleased]` section of CHANGELOG.md, in the style of the existing entries. diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ae49184..241fccf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,11 @@ # Changelog All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Added -- Add new contributor to SPONSORS.md - The `modules undeploy` command to remove the files configfile deployed and restore the saved versions it made (recorded in `~/.configfile/`). - The `modules status` command to see which files are deployed. @@ -20,7 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - A script can be a folder containing an `index` file. - A history of what configfile changed, when, and whether it failed, in `~/.configfile/history.jsonl`, and the `history` command to see it - ([#36](https://github.com/Mindsers/configfile/issues/36)). + ([#36](https://github.com/mindsers/configfile/issues/36)). - The `settings.json` format is documented in the README. ### Changed @@ -49,8 +48,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. `~/.configfile/saved/`. ### Fixed -- Git URL verification in `init` command is less strict. ([#48](https://github.com/Mindsers/configfile/issues/48)) -- Script standard outputs are correctly displayed ([!57](https://github.com/Mindsers/configfile/pull/57), [#13](https://github.com/Mindsers/configfile/issues/13)) +- Git URL verification in `init` command is less strict. ([#48](https://github.com/mindsers/configfile/issues/48)) +- Script standard outputs are correctly displayed ([!57](https://github.com/mindsers/configfile/pull/57), [#13](https://github.com/mindsers/configfile/issues/13)) - A failed `init` saved the configuration anyway. - Deploying a module could overwrite a previously saved `.old` file. - Hidden files such as `.DS_Store` were listed as scripts. @@ -102,10 +101,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - The `run` command to run custom and saved scripts. Scripts can be write in all languages. - The README file to give first information on the project (installation, usage, etc.). -[Unreleased]: https://github.com/Mindsers/configfile/tree/develop -[0.3.1]: https://github.com/Mindsers/configfile/tree/0.3.1 -[0.3.0]: https://github.com/Mindsers/configfile/tree/0.3.0 -[0.2.1]: https://github.com/Mindsers/configfile/tree/0.2.1 -[0.2.0]: https://github.com/Mindsers/configfile/tree/0.2.0 -[0.1.1]: https://github.com/Mindsers/configfile/tree/0.1.1 -[0.1.0]: https://github.com/Mindsers/configfile/tree/0.1.0 +[Unreleased]: https://github.com/mindsers/configfile/tree/develop +[0.3.1]: https://github.com/mindsers/configfile/tree/0.3.1 +[0.3.0]: https://github.com/mindsers/configfile/tree/0.3.0 +[0.2.1]: https://github.com/mindsers/configfile/tree/0.2.1 +[0.2.0]: https://github.com/mindsers/configfile/tree/0.2.0 +[0.1.1]: https://github.com/mindsers/configfile/tree/0.1.1 +[0.1.0]: https://github.com/mindsers/configfile/tree/0.1.0 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..71037452 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +nathanael@cherrier.dev. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5140736d..13e3f4fd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,67 +1,77 @@ -# How to contribute to Configfile +# How to contribute to configfile *First off, thanks for taking the time to contribute!* -This file is a set of guilines for contributing to *Configfile* project. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. +This file is a set of guidelines for contributing to *configfile*. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. + +Everyone taking part in the project follows the [code of conduct](CODE_OF_CONDUCT.md). #### Table of contents [How can I contribute?](#how-can-i-contribute) +* [Do you have a question?](#do-you-have-a-question) * [Did you find a bug?](#did-you-find-a-bug) +* [Did you find a security vulnerability?](#did-you-find-a-security-vulnerability) * [Did you write a patch that fixes a bug?](#did-you-write-a-patch-that-fixes-a-bug) * [Did you fix whitespace, format code, or make a purely cosmetic patch?](#did-you-fix-whitespace-format-code-or-make-a-purely-cosmetic-patch) * [Do you intend to add a new feature or change an existing one?](#do-you-intend-to-add-a-new-feature-or-change-an-existing-one) -* [Do you have questions about the source code?](#do-you-have-questions-about-the-source-code) -* [Do you want to contribute to the Configfile documentation?](#do-you-want-to-contribute-to-the-Configfile-documentation) +* [Do you want to contribute to the documentation?](#do-you-want-to-contribute-to-the-documentation) [Styleguides](#styleguides) * [Development setup](#development-setup) +* [Branches and pull requests](#branches-and-pull-requests) * [TypeScript styleguide](#typescript-styleguide) * [Git commit messages](#git-commit-messages) ## How can I contribute? +### Do you have a question? + +* **Search the [issues][Issues] first**: it may already be answered. + +* Otherwise, [open an issue with the question template][new-issue]. Include your *configfile* version (`configfile --version`), the command you ran and what you expected. + ### Did you find a bug? * **Ensure the bug was not already reported** by searching on GitHub under [Issues][Issues]. -* If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/Mindsers/configfile/issues/new). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. +* If you're unable to find an open issue addressing the problem, [open a new one with the bug report template][new-issue]. Be sure to include a **title and clear description**, your *configfile*, Node.js and operating system versions, the command you ran, and its output. -* If possible, use the relevant bug report templates to create the issue. +* `configfile history` shows what *configfile* changed and why runs failed: its output often helps. Check it for paths or names you would rather not share before pasting it. + +### Did you find a security vulnerability? + +* **Do not open a public issue.** Follow the [security policy](SECURITY.md) to report it privately. ### Did you write a patch that fixes a bug? * Write new unit test(s) that match the bug case to limit future regression. -* Open a new GitHub pull request with the patch. +* Open a new GitHub pull request with the patch (see [Branches and pull requests](#branches-and-pull-requests)). * Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. -* Before submitting, please ensure your code follow the code convention. +* Before submitting, please ensure your code follows the code conventions. ### Did you fix whitespace, format code, or make a purely cosmetic patch? -* Your changes must follow the coding convention. +* Your changes must follow the coding conventions. -* Please ensure that your changes does not include regression. +* Please ensure that your changes do not include regressions. ### Do you intend to add a new feature or change an existing one? -* Please ask first ([open an issue][Issues] or [talk about it on the community forum][forum]) before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project. +* Please ask first ([open an issue][Issues]) before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project. * Please adhere to the coding conventions used in this project (indentation, accurate comments, etc.) and any other requirements (such as test coverage, documentation). -### Do you have questions about the source code? - -* Ask any question about how to use Configfile in the [community forum][forum] or on [Stack Overflow](https://stackoverflow.com). - -### Do you want to contribute to the Configfile documentation? +### Do you want to contribute to the documentation? -Documentation file are stored in the project source code. +The documentation lives with the source code: the [README](README.md) for users, and this file for contributors. -* Please refer to "Do you intend to add a new feature or change an existing one?" section. +* Please refer to the "Do you intend to add a new feature or change an existing one?" section. ## Styleguides @@ -77,13 +87,27 @@ pnpm build # compile to dist/ node dist/cli.js --help ``` +### Branches and pull requests + +The project uses [git-flow](https://nvie.com/posts/a-successful-git-branching-model/): `develop` holds the next release, and `master` the released versions. + +* Create your branch from `develop`: `feature/` for a feature or a documentation change, `bugfix/` for a fix. + +* Open the pull request against `develop`, never `master`. Releases are handled by the maintainer. + +* Describe the change for a reviewer who doesn't know the code: why it is needed, what changes for users, how to test it. The pull request template has the sections. + +* Add a line to the `[Unreleased]` section of the [CHANGELOG](CHANGELOG.md) when users will notice the change. Write it for users, in the style of the existing entries. + +* `pnpm check` must pass: it is what the CI runs. + ### TypeScript styleguide Formatting and linting are handled by [Biome](https://biomejs.dev), configured in `biome.json`. Run `pnpm format` before committing; `pnpm lint` must pass. * Relative imports use the `.js` extension (`import { x } from './x.js'`). * Expected failures throw a `CliError` (exit code and message for the user); never call `process.exit`. -* Commands get everything from the injected `Context` (home, cwd, output, prompts) so they can be tested. The only exception is the `DEBUG` environment variable, read where stack traces are printed. +* Commands get everything from the injected `Context` (home, cwd, output, prompts, history) so they can be tested. The only exception is the `DEBUG` environment variable, read where stack traces are printed. * Bug fixes come with a test that reproduces the bug. ### Git commit messages @@ -108,5 +132,5 @@ Commit messages and pull request titles follow [Conventional Commits](https://ww * Reference issues and pull requests in the body or the footer (`Fixes #48`). -[Issues]: https://github.com/Mindsers/configfile/issues -[forum]: https://community.nathanaelcherrier.com/c/open-source/configfile/8 +[Issues]: https://github.com/mindsers/configfile/issues +[new-issue]: https://github.com/mindsers/configfile/issues/new/choose diff --git a/README.md b/README.md index 6967059c..bdaf45ac 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![npm](https://img.shields.io/npm/dt/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) [![CI](https://img.shields.io/github/actions/workflow/status/mindsers/configfile/ci.yml?branch=develop&style=flat-square)](https://github.com/mindsers/configfile/actions/workflows/ci.yml) [![npm](https://img.shields.io/npm/l/configfile.svg?style=flat-square)](https://github.com/mindsers/configfile/blob/develop/LICENSE) -[![Patreon](https://img.shields.io/badge/support-patreon-F96854.svg?logo=patreon&style=flat-square)](https://www.patreon.com/bePatron?u=9715649) +[![GitHub Sponsors](https://img.shields.io/github/sponsors/mindsers?logo=githubsponsors&style=flat-square)](https://github.com/sponsors/mindsers) *configfile* is a command line tool that helps you manage your configuration files (dotfiles) and setup scripts from a git repository. @@ -177,18 +177,19 @@ When the file reaches `history_max_size` (1MB by default; a number of bytes, or ## Contribution -Contributions to the source code of *configfile* are welcome and greatly appreciated. For help on how to contribute to this project, please refer to [How to contribute to Configfile](https://github.com/mindsers/configfile/blob/develop/CONTRIBUTING.md). +Contributions are welcome and greatly appreciated. Read [How to contribute to configfile](https://github.com/mindsers/configfile/blob/develop/CONTRIBUTING.md) before opening a pull request, and follow the [code of conduct](https://github.com/mindsers/configfile/blob/develop/CODE_OF_CONDUCT.md). -## Support +- **Questions and bugs:** [open an issue](https://github.com/mindsers/configfile/issues/new/choose). +- **Security vulnerabilities:** never in a public issue. See the [security policy](https://github.com/mindsers/configfile/blob/develop/SECURITY.md). -*configfile* is licensed under an Apache-2.0 license, which means that it's a completely free open source software. Unfortunately, *configfile* doesn't make itself. +## Support -If you're using *configfile* and want to support the development, you now have the chance! Go on my [Patreon page](https://www.patreon.com/mindsers) and become my joyful patron!! +*configfile* is free and open source software, under the Apache-2.0 license, built on my free time. -[![Become a Patron!](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/bePatron?u=9715649) +If you use it and want to support its development, you can sponsor me on [GitHub Sponsors](https://github.com/sponsors/mindsers). Thank you! -For help on how to support Configfile, please refer to [The awesome people who support Configfile](https://github.com/mindsers/configfile/blob/develop/SPONSORS.md). +The people who support *configfile* are listed in [SPONSORS.md](https://github.com/mindsers/configfile/blob/develop/SPONSORS.md). ## License -This project is under Apache-2.0 license. See LICENSE file. +This project is under the Apache-2.0 license. See the [LICENSE](https://github.com/mindsers/configfile/blob/develop/LICENSE) file. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..6d434abb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,39 @@ +# Security policy + +*configfile* changes files in your home folder and runs scripts on your machine, so security problems matter. Thank you for reporting them responsibly. + +## Supported versions + +| Version | Supported | +| --- | --- | +| 1.x (latest release) | Yes | +| 0.3 and older | No | + +Fixes are released in a new 1.x version. Please check the issue still happens with the latest release before reporting it. + +## Reporting a vulnerability + +**Do not open a public issue, pull request or discussion for a vulnerability.** + +Report it privately with GitHub's private vulnerability reporting: go to the [Security tab](https://github.com/mindsers/configfile/security) of the repository and click **Report a vulnerability**, or open [a new security advisory](https://github.com/mindsers/configfile/security/advisories/new) directly. + +Please include: + +- the *configfile* version (`configfile --version`), Node.js version and operating system; +- what an attacker can do, and what they need first (for example, control of the dotfiles repository, or another local user account); +- the steps to reproduce it, ideally with a minimal dotfiles repository or `settings.json`; +- any idea of a fix, if you have one. + +The report stays private while it is investigated. You will get an answer in the advisory, and be credited in it when the fix is released, unless you prefer not to be. + +## What counts as a vulnerability + +*configfile* deploys the files of a dotfiles repository and runs its scripts. **Deploying a repository means trusting it**, like code you run: a repository you chose running a harmful script is not a vulnerability in *configfile*. + +These are, for example: + +- a file deployed, replaced or removed outside its `target_path`, or a `source_path` read outside its module folder; +- a file you own deleted or overwritten without being moved aside to a `.old` backup; +- another local user making *configfile* write or read files through links in shared folders; +- credentials (from a repository URL, for example) written to the history, the configuration or the terminal where they should be hidden; +- a script run, or a command executed, that the user did not ask for. diff --git a/SPONSORS.md b/SPONSORS.md index cec2e173..5722a443 100644 --- a/SPONSORS.md +++ b/SPONSORS.md @@ -1,36 +1,25 @@ -# The awesome people who support Configfile +# The awesome people who support configfile *First off, thanks for being a part of this project!* -This file is an extension of the **Support** section in `README.md`. You can find here all the people who support *Configfile* organized by their contribution. - -#### Table of content - -[How can I support this project?](#how-can-i-support-this-project) - -[Who are the people behind this project?](#who-are-the-people-behind-this-project) - -* [Sponsors](#sponsors) -* [Supporters](#supporters) +This file extends the **Support** section of the [README](README.md): it lists the people who support *configfile*. ## How can I support this project? -*Configfile* is licensed under an Apache-2.0 license, which means that it's a completely free open source software. Unfortunately, *Configfile* doesn't make itself and I'm happy to build it on my free time. +*configfile* is free and open source software, under the Apache-2.0 license, built on my free time. -If you're using *Configfile* and want to support the development, you can do it via the Patreon service. On this platform you can choose exactly what you want to give from $1 to whatever you want... You can click on the "Become a patron" button bellow to see Mindsers' patreon page. +If you use *configfile* and want to support its development, you can sponsor me on [GitHub Sponsors](https://github.com/sponsors/mindsers), with a one-time or a monthly amount of your choice. Your support is greatly appreciated. -Be sure your effort to support this project will be greatly appreciated. +[![Sponsor mindsers on GitHub](https://img.shields.io/github/sponsors/mindsers?label=Sponsor&logo=githubsponsors&style=for-the-badge)](https://github.com/sponsors/mindsers) -[![Become a Patron!](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/bePatron?u=9715649) +Contributing code, documentation, bug reports or ideas helps too: see [How to contribute to configfile](CONTRIBUTING.md). ## Who are the people behind this project? ### Sponsors -No one is in the **Sponsors** section for now. Be the first! Read the **How can I support this project** section above. +Current sponsors are listed on the [GitHub Sponsors page](https://github.com/sponsors/mindsers). ### Supporters -The best supporters are listed below: - -- Aurore Jacquemont +No one is listed here for now. Be the first: see [How can I support this project?](#how-can-i-support-this-project). diff --git a/docs/home.md b/docs/home.md index f4805610..6b7950b5 100644 --- a/docs/home.md +++ b/docs/home.md @@ -24,13 +24,15 @@ It asks for your repository URL and clones it into `~/.configfile/dotfiles`, a c configfile init --repo git@github.com:me/dotfiles.git ``` -### Running unit tests +### Running the tests ```bash pnpm install -pnpm test +pnpm check # lint, type check and tests ``` +See [How to contribute](../CONTRIBUTING.md) for the development setup. + ### Additional commands - [configfile modules list](../README.md#usage) @@ -48,3 +50,12 @@ pnpm test - [Module settings](../README.md#modules) - [Scripts](../README.md#scripts) - [~/.configfilerc](../README.md#configuration) +- [History](../README.md#history) + +## Project + +- [How to contribute](../CONTRIBUTING.md) +- [Code of conduct](../CODE_OF_CONDUCT.md) +- [Security policy](../SECURITY.md) +- [Changelog](../CHANGELOG.md) +- [Support configfile on GitHub Sponsors](https://github.com/sponsors/mindsers) diff --git a/package.json b/package.json index af8768d2..b3bb6375 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "configfile", "version": "0.3.1", - "description": "Personal config files manager", + "description": "Manage your dotfiles and setup scripts from a git repository.", "keywords": [ "dotfiles", "config", @@ -10,11 +10,12 @@ ], "homepage": "https://github.com/mindsers/configfile#readme", "bugs": "https://github.com/mindsers/configfile/issues", + "funding": "https://github.com/sponsors/mindsers", "repository": { "type": "git", "url": "git+https://github.com/mindsers/configfile.git" }, - "author": "Mindsers ", + "author": "Mindsers (https://nathanaelcherrier.dev)", "license": "Apache-2.0", "type": "module", "bin": { From cab396fbca89be2442b3aef6323c585e85227e17 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 1 Oct 2026 21:50:29 +0200 Subject: [PATCH 324/341] feat(modules): undeploy files the repository no longer deploys (#287) --- CHANGELOG.md | 3 + README.md | 12 +- src/commands/history.ts | 5 +- src/commands/modules.ts | 230 +++++++++++---- src/commands/update.ts | 54 +++- src/deploy.ts | 31 +- src/history.ts | 11 +- src/removed.ts | 175 +++++++++++ src/repository.ts | 37 +++ src/state.ts | 27 ++ tests/commands.test.ts | 615 ++++++++++++++++++++++++++++++++++++++- tests/helpers.ts | 6 +- tests/history.test.ts | 3 +- tests/repository.test.ts | 14 + 14 files changed, 1145 insertions(+), 78 deletions(-) create mode 100644 src/removed.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 241fccf4..b83b039a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The `modules undeploy` command to remove the files configfile deployed and restore the saved versions it made (recorded in `~/.configfile/`). - The `modules status` command to see which files are deployed. +- `modules undeploy --removed` to remove the files deployed for entries that left the repository + and restore what they replaced (`--all` does it too); `modules status` lists these files and + `update` warns about them. - The `update` command to sync with the latest version of the dotfiles repository. - A preview of the changes with `--dry-run` on `modules deploy` and `modules undeploy`. - Options to use configfile in scripts without questions: `--repo`, `--folder` and `--force` diff --git a/README.md b/README.md index bdaf45ac..7f8b97cc 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,10 @@ When a local file already exists and differs from the one in the repository, *co *configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links and the local copies *configfile* made (unless they were modified since), and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), local copies that were modified or saved again by an editor since, and `.old` files you made yourself. +When an entry leaves the repository (removed, set to `"deploy": "none"`, given another `target_path`, or its module deleted), what *configfile* deployed for it stays in place until it is undeployed: `modules status` lists these files, `update` warns about them, and `modules undeploy --removed` (or `--all`) removes them and restores the files they replaced. Local copies are handled from the folder they were copied into, like `modules deploy --local`. A removed file that *configfile* cannot remove safely (replaced by your own file, a modified copy, a copy whose source is gone) is left where it is, and *configfile* stops tracking it. + +To stay safe, *configfile* never undeploys a file when it cannot tell whether the repository still deploys it: files of a module whose `settings.json` cannot be used or has invalid entries, of a module folder that is not usable (a broken symbolic link, a name another folder uses), and entries without a deployment strategy. `modules status` lists them separately. Links deployed by 0.3 and not deployed again since were not recorded, so they are not found either. + Only one *configfile* at a time changes files: a second one waits for the first to finish (the lock is `~/.configfile/lock`). > **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. @@ -98,7 +102,7 @@ Scripts can be written in any language: - `--repo `: give the URL from the command line, for non-interactive setups. - `--folder `: clone somewhere else than `~/.configfile/dotfiles`. - `configfile modules list` (`m l`, or just `configfile modules`): list available modules. -- `configfile modules status [modules...]` (`m st`): show whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. +- `configfile modules status [modules...]` (`m st`): show whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. Without module names, it also lists the deployed files the repository no longer deploys. - `-l, --local`: check the local files, in the current folder. - `configfile modules deploy [modules...]` (`m d`): deploy the global files of the given modules. Without module names, asks to deploy all modules. - `-l, --local`: copy the local files of the modules instead. @@ -106,10 +110,12 @@ Scripts can be written in any language: - `-f, --force`: replace existing local files without asking (they are moved to `.old`). - `-n, --dry-run`: show what would be done, without changing anything. - `configfile modules undeploy [modules...]` (`m u`): remove the deployed global files of the given modules and restore their backups. Without module names, asks to undeploy all modules. - - `-l, --local`, `-a, --all` and `-n, --dry-run`: as for `deploy`. + - `-a, --all`: undeploy every module without asking, and the files the repository no longer deploys. + - `--removed`: only undeploy the files the repository no longer deploys (see [Modules](#modules)); with `--local`, the copies made in the current folder. + - `-l, --local` and `-n, --dry-run`: as for `deploy`. - `configfile scripts list` (`s l`, or just `configfile scripts`): list available scripts. - `configfile scripts run [-- args...]` (`s r`): run a script. Arguments after `--` are passed to the script. -- `configfile update` (`u`): sync *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. +- `configfile update` (`u`): sync *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. It warns about deployed files the repository no longer deploys. - `configfile history`: show what *configfile* changed, most recent last (see [History](#history)). - `-n, --limit `: number of runs to show (20 by default). - `--json`: print the raw history lines (JSON Lines), for scripts. diff --git a/src/commands/history.ts b/src/commands/history.ts index cfe7a70f..8e966096 100644 --- a/src/commands/history.ts +++ b/src/commands/history.ts @@ -102,7 +102,7 @@ function describeRun(line: HistoryLine): string { if (typeof options.script === 'string') words.push(options.script) if (typeof options.repo === 'string') words.push('--repo', options.repo) if (typeof options.folder === 'string') words.push('--folder', options.folder) - for (const flag of ['local', 'all', 'force'] as const) { + for (const flag of ['local', 'all', 'force', 'removed'] as const) { if (options[flag] === true) words.push(`--${flag}`) } if (typeof options.argCount === 'number' && options.argCount > 0) { @@ -141,7 +141,8 @@ function describeChange(change: Change): string { identical: 'not copied by configfile', 'source-missing': 'its source was missing', } - return line('kept', `${change.target} (${reason[change.reason]})`) + const forgotten = change.forgotten === true ? '; configfile no longer tracks it' : '' + return line('kept', `${change.target} (${reason[change.reason]}${forgotten})`) } case 'failed': return line( diff --git a/src/commands/modules.ts b/src/commands/modules.ts index a0f3dcee..d01a34cd 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -1,6 +1,5 @@ import type { Command } from 'commander' -import { ConfigStore } from '../config.js' import type { Context } from '../context.js' import { type BackupCheck, @@ -14,6 +13,7 @@ import { planDeploy, planUndeploy, type TargetState, + type UndeployableFile, type UndeployDecision, type UndeployResult, undeployFile, @@ -22,7 +22,8 @@ import { CliError } from '../errors.js' import { messageOf } from '../fsutil.js' import { withLock } from '../lock.js' import { plural } from '../output.js' -import { listModules, type Module, type ModuleFile } from '../repository.js' +import { findRemovedFiles, type HeldBack, type RecordedFile } from '../removed.js' +import { loadRepository, type Module, type ModuleFile } from '../repository.js' import { DeploymentRecord } from '../state.js' type Strategy = ModuleFile['strategy'] @@ -34,6 +35,7 @@ interface RawOptions { all?: boolean force?: boolean dryRun?: boolean + removed?: boolean } /** Options once normalized at the command boundary. */ @@ -42,6 +44,8 @@ interface Options { all: boolean force: boolean dryRun: boolean + /** Undeploy: the files the repository no longer deploys. */ + removed: boolean } function normalize(options: RawOptions): Options { @@ -50,6 +54,7 @@ function normalize(options: RawOptions): Options { all: options.all === true, force: options.force === true, dryRun: options.dryRun === true, + removed: options.removed === true, } } @@ -90,21 +95,44 @@ export function registerModulesCommand(program: Command, ctx: Context): void { .argument('[modules...]', 'modules to undeploy (use --all, or answer a question, when omitted)') .description('remove the deployed files of one or more modules and restore their backups') .option('-l, --local', 'remove the local copies of the modules instead of global links') - .option('-a, --all', 'undeploy every module without asking') + .option( + '-a, --all', + 'undeploy every module without asking, and the files the repository no longer deploys', + ) + .option('--removed', 'only undeploy the files the repository no longer deploys') .option('-n, --dry-run', 'show what would be done, without changing anything') .action((names: string[], options: RawOptions) => undeploy(names, normalize(options), ctx)) } async function loadModules(ctx: Context): Promise { - const config = await new ConfigStore(ctx.home).read() + return (await loadRepository(ctx)).modules +} - return listModules(config.folderPath, { +type Repository = Awaited> + +/** + * Files the repository no longer deploys, for `strategy`: local copies only + * when made in the current folder, like the other local commands. + */ +function removedFiles( + record: DeploymentRecord, + { repository, modules }: Repository, + strategy: Strategy, + ctx: Context, +): Promise<{ removed: RecordedFile[]; heldBack: HeldBack[] }> { + return findRemovedFiles(record, modules, { + repository, home: ctx.home, - cwd: ctx.cwd, - warn: message => ctx.output.warn(message), + strategy, + ...(strategy === 'local' && { folder: ctx.cwd }), }) } +/** The command that undeploys them, with `--local` when needed. */ +function undeployRemovedCommand(strategy: Strategy): string { + return `configfile modules undeploy --removed${strategy === 'local' ? ' --local' : ''}` +} + async function list(ctx: Context): Promise { const modules = await loadModules(ctx) @@ -122,16 +150,29 @@ async function list(ctx: Context): Promise { async function status(names: string[], options: Options, ctx: Context): Promise { const { output } = ctx - const modules = await loadModules(ctx) - const selected = names.length === 0 ? modules : pickModules(modules, names) + const repo = await loadRepository(ctx) + const selected = names.length === 0 ? repo.modules : pickModules(repo.modules, names) + + // Read only: status never changes files or the record. + const record = await DeploymentRecord.load(ctx.home) + const { removed, heldBack } = + names.length === 0 + ? await removedFiles(record, repo, options.strategy, ctx) + : { removed: [], heldBack: [] } - if (selected.length === 0) { + if (selected.length === 0 && removed.length === 0 && heldBack.length === 0) { output.info('No module found.') return } - // Read only: status never changes files or the record. - const record = await DeploymentRecord.load(ctx.home) + const describeTarget = async (file: Pick) => { + try { + return describeState(await inspectFile(file, record)) + } catch (error) { + return `cannot be checked: ${messageOf(error)}` + } + } + for (const module of selected) { output.print(`${module.name}:`) @@ -143,13 +184,7 @@ async function status(names: string[], options: Options, ctx: Context): Promise< const files = module.files.filter(file => file.strategy === options.strategy) for (const file of files) { - let state: string - try { - state = describeState(await inspectFile(file, record)) - } catch (error) { - state = `cannot be checked: ${messageOf(error)}` - } - output.print(` ${file.target} (${state})`) + output.print(` ${file.target} (${await describeTarget(file)})`) } for (const source of module.undecided) { output.print(` ${source} (no deployment strategy)`) @@ -158,12 +193,27 @@ async function status(names: string[], options: Options, ctx: Context): Promise< output.print(` no ${options.strategy} file`) } } + + if (removed.length > 0) { + output.print( + `No longer deployed by the repository (run "${undeployRemovedCommand(options.strategy)}"):`, + ) + for (const file of removed) { + output.print(` ${file.target} (${await describeTarget(file)})`) + } + } + if (heldBack.length > 0) { + output.print('Deployed, but configfile cannot tell whether the repository still deploys them:') + for (const { target, reason } of heldBack) { + output.print(` ${target} (${reason})`) + } + } } async function deploy(names: string[], options: Options, ctx: Context): Promise { const { output, prompts } = ctx - const run = await prepare('deploy', names, options, ctx) - if (run == null) return + const run = await prepare('deploy', await loadRepository(ctx), names, options, ctx) + if (run == null || run.files.length === 0) return const { files } = run let failures = run.failures @@ -260,35 +310,94 @@ async function deployAll( async function undeploy(names: string[], options: Options, ctx: Context): Promise { const { output } = ctx - const run = await prepare('undeploy', names, options, ctx) - if (run == null) return + if (options.removed && names.length > 0) { + throw new CliError('Give module names or --removed, not both.') + } + if (options.removed && options.all) { + throw new CliError('Give --all or --removed, not both: --all also undeploys removed files.') + } - const { files } = run - let failures = run.failures + const repo = await loadRepository(ctx) + const run = options.removed + ? { files: [], failures: 0, all: false } + : await prepare('undeploy', repo, names, options, ctx) + // Undeploying every module also undeploys what the repository no longer deploys. + const withRemoved = options.removed || options.all || run?.all === true + if (run == null && !withRemoved) return + const files = run?.files ?? [] + let failures = run?.failures ?? 0 - const undeployEach = async (context: DeployContext) => { - for (const file of files) { + const undeployOne = async (file: UndeployableFile, context: DeployContext) => { + try { + if (options.dryRun) { + output.print( + `- ${file.target} (${describePlannedUndeploy(await planUndeploy(file, context))})`, + ) + return + } + const result = await undeployFile(file, context) + output.print(`- ${file.target} ${describeUndeploy(result)}`) + recordUndeploy(file, result, ctx) + } catch (error) { + failures++ + reportFileError(file, error, ctx) + } + } + + /** Returns the number of files worked on. */ + const undeployEach = async (context: DeployContext): Promise => { + for (const file of files) await undeployOne(file, context) + if (!withRemoved) return files.length + + const { removed, heldBack } = await removedFiles(context.record, repo, options.strategy, ctx) + for (const { target, reason } of heldBack) { + output.warn(`${target} was not checked: ${reason}.`) + } + if (removed.length === 0) { + if (options.removed && heldBack.length === 0) { + output.info(`Every deployed ${options.strategy} file is still deployed by the repository.`) + } + return files.length + } + + output.info( + options.dryRun + ? 'Files the repository no longer deploys would be undeployed:' + : 'Undeploying the files the repository no longer deploys…', + ) + for (const file of removed) { try { if (options.dryRun) { - output.print( - `- ${file.target} (${describePlannedUndeploy(await planUndeploy(file, context))})`, - ) + const decision = await planUndeploy(file, context) + const handOver = decision.action === 'keep' ? '; configfile would stop tracking it' : '' + output.print(`- ${file.target} (${describePlannedUndeploy(decision)}${handOver})`) continue } const result = await undeployFile(file, context) - output.print(`- ${file.target} ${describeUndeploy(result)}`) - recordUndeploy(file, result, ctx) + if (result.status === 'kept') { + // configfile no longer deploys it and cannot remove it safely: it is the user's now. + await context.record.setDeployed(file.target, null) + output.print( + `- ${file.target} (kept: ${describeKept(result.state)}; configfile no longer tracks it)`, + ) + } else { + output.print(`- ${file.target} ${describeUndeploy(result)}`) + } + recordUndeploy(file, result, ctx, { forgotten: result.status === 'kept' }) } catch (error) { failures++ reportFileError(file, error, ctx) } } + return files.length + removed.length } - if (options.dryRun) { - await undeployEach(await deployContext(ctx)) - } else { - await withLock(ctx.home, async () => undeployEach(await deployContext(ctx))) + const count = options.dryRun + ? await undeployEach(await deployContext(ctx)) + : await withLock(ctx.home, async () => undeployEach(await deployContext(ctx))) + if (count === 0) { + if (failures > 0) finish(failures, [], '', ctx) + return } finish(failures, [], options.dryRun ? 'Dry run finished.' : 'Undeployment finished.', ctx) } @@ -308,13 +417,19 @@ async function deployContext(ctx: Context): Promise { */ async function prepare( verb: 'deploy' | 'undeploy', + { modules }: Repository, names: string[], options: Options, ctx: Context, -): Promise<{ files: ModuleFile[]; failures: number } | null> { +): Promise<{ + files: ModuleFile[] + failures: number + /** Every module was selected (with --all, or at the question), even when there is none. */ + all: boolean +} | null> { const { output } = ctx - const selected = await selectModules(verb, await loadModules(ctx), names, options, ctx) - if (selected.length === 0) return null + const { selected, all } = await selectModules(verb, modules, names, options, ctx) + if (selected.length === 0) return all ? { files: [], failures: 0, all } : null let failures = 0 const usable: UsableModule[] = [] @@ -351,7 +466,7 @@ async function prepare( `Nothing could be ${verb}ed. ${plural(failures, 'module or settings entry')} failed.`, ) output.info(`No ${options.strategy} file to ${verb} in ${moduleNames}.`) - return null + return { files, failures, all } } const action = verb === 'deploy' ? 'Deploying' : 'Undeploying' @@ -360,7 +475,7 @@ async function prepare( ? `Dry run, nothing is changed. ${action} ${moduleNames} would do:` : `${action} ${moduleNames}…`, ) - return { files, failures } + return { files, failures, all } } async function selectModules( @@ -369,7 +484,7 @@ async function selectModules( names: string[], options: Options, ctx: Context, -): Promise { +): Promise<{ selected: Module[]; all: boolean }> { if (names.length > 0) { if (options.all) { throw new CliError('Give module names or --all, not both.') @@ -380,31 +495,34 @@ async function selectModules( if (broken?.error != null) { throw new CliError(`Module "${broken.name}" cannot be ${verb}ed: ${broken.error}.`) } - return selected + return { selected, all: false } } if (modules.length === 0) { ctx.output.info('No module found.') - return [] + return { selected: [], all: options.all } } - if (options.all) return modules + if (options.all) return { selected: modules, all: true } if (!ctx.prompts.interactive) { throw new CliError(`No module given. Pass module names, or --all to ${verb} every module.`) } const confirmed = await ctx.prompts.confirm({ - message: `No module given. ${verb === 'deploy' ? 'Deploy' : 'Undeploy'} all available modules?`, + message: + verb === 'deploy' + ? 'No module given. Deploy all available modules?' + : 'No module given. Undeploy all available modules, and the files the repository no longer deploys?', default: false, }) if (!confirmed) { ctx.output.info(`Nothing ${verb}ed.`) - return [] + return { selected: [], all: false } } ctx.history.option('all', true) - return modules + return { selected: modules, all: true } } /** The modules named on the command line, in repository order. Fails on unknown names. */ @@ -446,7 +564,7 @@ function finish(failures: number, problems: string[], success: string, ctx: Cont ctx.output.success(success) } -function reportFileError(file: ModuleFile, error: unknown, ctx: Context): void { +function reportFileError(file: { target: string }, error: unknown, ctx: Context): void { ctx.output.error(`${file.target}: ${messageOf(error)}`) ctx.history.record({ kind: 'failed', target: file.target, reason: messageOf(error) }) if (!(error instanceof CliError) && process.env.DEBUG != null) { @@ -581,13 +699,23 @@ function recordDeploy( } /** Records an undeployment in the history (files that were not deployed are only counted). */ -function recordUndeploy(file: ModuleFile, result: UndeployResult, ctx: Context): void { +function recordUndeploy( + file: { target: string }, + result: UndeployResult, + ctx: Context, + { forgotten = false }: { forgotten?: boolean } = {}, +): void { switch (result.status) { case 'not-deployed': ctx.history.unchanged() return case 'kept': - ctx.history.record({ kind: 'kept', target: file.target, reason: result.state.kind }) + ctx.history.record({ + kind: 'kept', + target: file.target, + reason: result.state.kind, + ...(forgotten && { forgotten: true }), + }) return case 'removed': ctx.history.record({ diff --git a/src/commands/update.ts b/src/commands/update.ts index 6aef41ec..85d546c2 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -7,7 +7,11 @@ import { ConfigStore } from '../config.js' import type { Context } from '../context.js' import { CliError } from '../errors.js' import { errnoCode, messageOf } from '../fsutil.js' +import { plural } from '../output.js' import { configfilePaths } from '../paths.js' +import { findRemovedFiles } from '../removed.js' +import { loadRepository } from '../repository.js' +import { DeploymentRecord } from '../state.js' import { syncMirror } from '../sync.js' export function registerUpdateCommand(program: Command, ctx: Context): void { @@ -53,10 +57,50 @@ async function update(ctx: Context): Promise { if (result.before === result.after) { output.success(`Already up to date with ${result.upstream}.`) - return + } else { + output.success( + `Synced with ${result.upstream} (${result.after.slice(0, 7)}). Global files are links, so ` + + 'they are up to date; run "configfile modules deploy --all" for new files.', + ) + } + await warnAboutRemovedFiles(ctx) +} + +/** + * Deployed files whose entry left the repository stay in place until they are + * undeployed: says so. Never fails, the sync is already done. + */ +async function warnAboutRemovedFiles(ctx: Context): Promise { + const { output } = ctx + try { + const { repository, modules } = await loadRepository(ctx) + const record = await DeploymentRecord.load(ctx.home) + const find = async (strategy: 'global' | 'local') => + (await findRemovedFiles(record, modules, { repository, home: ctx.home, strategy })).removed + const global = await find('global') + const local = await find('local') + const count = global.length + local.length + if (count === 0) return + + const one = count === 1 + const targets = [...global, ...local].map(file => file.target).join(', ') + // A local copy is undeployed from the folder it was copied into. + const folders = [...new Set(local.map(file => file.folder))].filter(folder => folder != null) + const steps = [ + global.length > 0 ? 'run "configfile modules undeploy --removed"' : null, + local.length > 0 + ? `run "configfile modules undeploy --removed --local" in ${folders.join(', ')}` + : null, + ].filter(step => step != null) + output.warn( + `${plural(count, 'deployed file')} ${one ? 'is' : 'are'} no longer deployed by the ` + + `repository: ${targets}. To remove ${one ? 'it' : 'them'} and restore what ` + + `${one ? 'it' : 'they'} replaced, ${steps.join(', and ')}.`, + ) + } catch (error) { + output.warn(`Cannot check for files the repository no longer deploys: ${messageOf(error)}`) + if (!(error instanceof CliError) && process.env.DEBUG != null) { + output.stderr.write(`${(error as Error).stack}\n`) + } } - output.success( - `Synced with ${result.upstream} (${result.after.slice(0, 7)}). Global files are links, so ` + - 'they are up to date; run "configfile modules deploy --all" for new files.', - ) } diff --git a/src/deploy.ts b/src/deploy.ts index 88420fca..103da03e 100644 --- a/src/deploy.ts +++ b/src/deploy.ts @@ -16,9 +16,16 @@ import { statOrNull, } from './fsutil.js' import { configfilePaths, contains } from './paths.js' +import type { RecordedFile } from './removed.js' import type { ModuleFile } from './repository.js' import { type Backup, type DeploymentRecord, isBackupPathOf } from './state.js' +/** + * A file undeploy can work on: a file of a module, or one the repository no + * longer deploys, rebuilt from the record. Only module files can be deployed. + */ +export type UndeployableFile = ModuleFile | RecordedFile + /** What is currently at the target of a module file, and whose it is. */ export type TargetState = | { kind: 'missing' } @@ -88,7 +95,7 @@ export interface DeployContext { // Inspecting and deciding (shared by dry runs and real runs) export async function inspectFile( - file: ModuleFile, + file: Pick, record: DeploymentRecord, ): Promise { const existing = await lstatOrNull(file.target) @@ -152,7 +159,7 @@ export async function planDeploy( /** What undeploying `file` would do. Runs every check a real undeployment runs. */ export async function planUndeploy( - file: ModuleFile, + file: UndeployableFile, { record, guard }: DeployContext, ): Promise { await guard.check(file) @@ -196,11 +203,16 @@ export async function deployFile( if (decision.action === 'conflict') return { status: 'conflict' } if (decision.action === 'up-to-date') { - // Adopt links made before 1.0, so that undeploy knows they are ours. + // Adopt links made before 1.0, so that undeploy knows they are ours, and + // complete records made before entries were kept. const stats = await lstatOrNull(file.target) const known = (await record.find(file.target))?.deployed - if (stats != null && !sameIdentity(known?.identity, identityOf(stats))) { - if (file.strategy === 'global') await recordDeployed(file, record) + const ours = stats != null && sameIdentity(known?.identity, identityOf(stats)) + if ( + (!ours && stats != null && file.strategy === 'global') || + (ours && known?.entry == null && file.entry != null) + ) { + await recordDeployed(file, record) } return { status: 'up-to-date' } } @@ -237,7 +249,7 @@ export async function deployFile( * Nothing configfile did not create is ever removed. */ export async function undeployFile( - file: ModuleFile, + file: UndeployableFile, context: DeployContext, ): Promise { const { record } = context @@ -354,7 +366,7 @@ export class Guard { this.#cwd = cwd } - async check(file: ModuleFile): Promise { + async check(file: UndeployableFile): Promise { const own = configfilePaths(this.#home) const stats = await lstatOrNull(file.target) @@ -363,7 +375,7 @@ export class Guard { [this.#home, 'the home folder'], [this.#cwd, 'the current folder'], [file.repository, 'the dotfiles repository'], - [file.module, 'the module folder'], + ...(file.module == null ? [] : [[file.module, 'the module folder'] as const]), [own.dir, "configfile's working folder"], [own.rc, "configfile's configuration"], ] as const @@ -378,7 +390,7 @@ export class Guard { const parents = await this.#ancestorsOf(path.dirname(file.target)) for (const [protectedPath, label] of [ [file.repository, 'the dotfiles repository'], - [file.module, 'the module folder'], + ...(file.module == null ? [] : [[file.module, 'the module folder'] as const]), [own.dir, "configfile's working folder"], ] as const) { const identity = await statOrNull(protectedPath) @@ -425,6 +437,7 @@ async function recordDeployed(file: ModuleFile, record: DeploymentRecord): Promi strategy: file.strategy, source: file.source, identity: identityOf(stats), + ...(file.entry != null && { entry: file.entry }), }) } diff --git a/src/history.ts b/src/history.ts index 64e2d67f..fcf463cb 100644 --- a/src/history.ts +++ b/src/history.ts @@ -47,7 +47,8 @@ export type Change = backup?: { path: string; status: 'restored' | 'missing' | 'changed' } leftover?: string } - | { kind: 'kept'; target: string; reason: KeptReason } + /** `forgotten`: configfile stopped tracking it (its entry left the repository). */ + | { kind: 'kept'; target: string; reason: KeptReason; forgotten?: true } | { kind: 'failed'; target: string; reason: string } | { kind: 'failed'; module: string; reason: string } | { kind: 'synced'; folder: string; upstream: string; from: string | null; to: string } @@ -134,7 +135,7 @@ export function describeInvocation(action: Command): Invocation { case 'modules undeploy': case 'modules status': options.modules = Array.isArray(args[0]) ? args[0] : [] - copy('local', 'all', 'force', 'dryRun') + copy('local', 'all', 'force', 'dryRun', 'removed') break case 'scripts run': options.script = args[0] @@ -500,7 +501,11 @@ function isChange(value: unknown): value is Change { (value.leftover === undefined || typeof value.leftover === 'string') ) case 'kept': - return typeof value.target === 'string' && Object.hasOwn(KEPT_REASONS, value.reason as string) + return ( + typeof value.target === 'string' && + Object.hasOwn(KEPT_REASONS, value.reason as string) && + (value.forgotten === undefined || value.forgotten === true) + ) case 'failed': return ( typeof value.reason === 'string' && diff --git a/src/removed.ts b/src/removed.ts new file mode 100644 index 00000000..e561fa39 --- /dev/null +++ b/src/removed.ts @@ -0,0 +1,175 @@ +import { realpath } from 'node:fs/promises' +import path from 'node:path' + +import { lstatOrNull } from './fsutil.js' +import { contains, resolveUserPath } from './paths.js' +import type { Entry, Module, ModuleFile } from './repository.js' +import type { DeploymentRecord, TargetRecord } from './state.js' + +/** + * A file configfile deployed for an entry the repository no longer deploys, + * rebuilt from the deployment record. It can be undeployed, never deployed. + */ +export interface RecordedFile { + readonly source: string + readonly target: string + readonly strategy: ModuleFile['strategy'] + /** The current repository, which undeploy must never touch. */ + readonly repository: string + /** The module folder it came from, or `null` when that folder is gone. */ + readonly module: string | null + /** Local copies: the folder it was copied into, where undeploy --local finds it. */ + readonly folder?: string +} + +/** A deployed file configfile cannot tell about, and why. */ +export interface HeldBack { + readonly target: string + readonly reason: string +} + +/** + * Files configfile deployed that the repository no longer deploys: their + * entry was removed or set to `"deploy": "none"`, its target changed, or its + * module was deleted. + * + * A file is still deployed when a current entry of the same strategy resolves + * to its target: global entries from the home folder, local entries from the + * folder the copy was made in (recorded with it). Targets are compared as + * written and through the record, which finds a target written differently. + * + * Anything that cannot be proven gone is held back instead, because + * undeploying it by mistake would change the user's files: files of a module + * that cannot be used, has invalid entries or is in the repository but was + * not loaded (a broken symbolic link, a name used twice), entries without a + * deployment strategy, and records that do not say which entry they come + * from. Targets deleted by hand are left out: there is nothing to undeploy + * (a `.old` backup, if any, stays where it is). + */ +export async function findRemovedFiles( + record: DeploymentRecord, + modules: readonly Module[], + { + repository, + home, + strategy, + folder, + }: { + /** Absolute path of the dotfiles repository. */ + repository: string + home: string + strategy: ModuleFile['strategy'] + /** Local copies: only those made in this folder (all folders when omitted). */ + folder?: string + }, +): Promise<{ removed: RecordedFile[]; heldBack: HeldBack[] }> { + const loaded = new Map(modules.map(module => [path.relative(repository, module.path), module])) + const current = modules.flatMap(module => + module.error == null ? module.files.filter(file => file.strategy === strategy) : [], + ) + + const removed: RecordedFile[] = [] + const heldBack: HeldBack[] = [] + for (const targetRecord of record.targets()) { + const deployed = targetRecord.deployed + if (deployed == null || deployed.strategy !== strategy) continue + const { target } = targetRecord + + // Local copies made before their folder was recorded (development builds + // of 1.0) are never guessed. + if (strategy === 'local') { + if (deployed.entry == null) continue + if (folder != null && !(await isSameFolder(deployed.entry.folder, folder))) continue + } + + if (await isStillDeployed(targetRecord, current, record, home)) continue + // Nothing left to undeploy. An unreadable target is listed: undeploy says why it fails. + if ((await lstatOrNull(target).catch(() => true)) == null) continue + + const entry = deployed.entry ?? entryOf(deployed.source, repository) + const reason = await uncertainty(entry, loaded, repository) + if (reason != null) { + heldBack.push({ target, reason }) + continue + } + + const module = entry == null ? null : loaded.get(entry.module) + removed.push({ + source: deployed.source, + target, + strategy, + repository, + module: module?.path ?? null, + ...(strategy === 'local' && deployed.entry != null && { folder: deployed.entry.folder }), + }) + } + + const byTarget = (a: { target: string }, b: { target: string }) => + a.target.localeCompare(b.target) + return { removed: removed.sort(byTarget), heldBack: heldBack.sort(byTarget) } +} + +/** Whether a current entry of the repository resolves to the recorded target. */ +async function isStillDeployed( + targetRecord: TargetRecord, + current: readonly ModuleFile[], + record: DeploymentRecord, + home: string, +): Promise { + const { target, deployed } = targetRecord + for (const file of current) { + // Local entries resolve from the folder the copy was made in. + const candidate = + file.strategy === 'local' && deployed?.entry != null && file.entry != null + ? resolveUserPath(file.entry.target, { home, cwd: deployed.entry.folder }) + : file.target + if (candidate === target) return true + // Found through the record, which compares paths the way it stores them. + // A target that cannot be checked is not proven gone. + const found = await record.find(candidate).catch(() => targetRecord) + if (found?.target === target) return true + } + return false +} + +/** Why the record of an entry cannot be trusted to be gone, or `null`. */ +async function uncertainty( + entry: Pick | null, + loaded: ReadonlyMap, + repository: string, +): Promise { + if (entry == null) return 'configfile does not know which entry of the repository it comes from' + + const module = loaded.get(entry.module) + if (module == null) { + // Gone means gone: anything still at its place (a broken link, a folder + // whose module name another folder uses) may come back. + const there = await lstatOrNull(path.join(repository, entry.module)).catch(() => true) + return there == null ? null : `${entry.module} is in the repository but is not a usable module` + } + if (module.error != null) return `module "${module.name}" cannot be used: ${module.error}` + if (module.invalidEntries.length > 0) return `module "${module.name}" has invalid entries` + const undecided = module.undecided.map(source => path.normalize(source)) + if (undecided.includes(path.normalize(entry.source))) { + return `its entry in module "${module.name}" has no deployment strategy` + } + return null +} + +/** The entry of a source in this repository, for records made before entries were kept. */ +function entryOf(source: string, repository: string): Pick | null { + const files = path.join(repository, 'files') + if (!contains(files, source)) return null + const [module, ...rest] = path.relative(files, source).split(path.sep) + if (module == null || module === '' || rest.length === 0) return null + return { module: path.join('files', module), source: path.join(...rest) } +} + +async function isSameFolder(a: string, b: string): Promise { + if (path.resolve(a) === path.resolve(b)) return true + const [realA, realB] = await Promise.all([ + realpath(a).catch(() => null), + realpath(b).catch(() => null), + ]) + return realA != null && realA === realB +} diff --git a/src/repository.ts b/src/repository.ts index b1389124..8ae9698c 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -2,6 +2,7 @@ import type { Dirent, Stats } from 'node:fs' import { readdir, readFile, stat } from 'node:fs/promises' import path from 'node:path' +import { ConfigStore } from './config.js' import type { Context } from './context.js' import { CliError } from './errors.js' import { describeJsonError } from './fsutil.js' @@ -18,6 +19,23 @@ export interface ModuleFile { readonly repository: string /** Absolute path of the module folder (it may be a symbolic link to elsewhere). */ readonly module: string + /** The settings.json entry of the file, recorded when it is deployed. */ + readonly entry?: Entry +} + +/** + * Where a deployed file comes from, recorded with it: this is how configfile + * later tells whether the repository still deploys it. + */ +export interface Entry { + /** The module folder, relative to the repository (`files/zsh`). */ + readonly module: string + /** `source_path`, relative to the module folder. */ + readonly source: string + /** `target_path`, as written. */ + readonly target: string + /** The folder `target` is resolved from: the home folder (global) or the current folder (local). */ + readonly folder: string } interface ModuleBase { @@ -53,6 +71,19 @@ export interface Script { type Environment = Pick & { warn(message: string): void } +/** The modules, and the folder of the repository they come from. */ +export async function loadRepository( + ctx: Context, +): Promise<{ repository: string; modules: Module[] }> { + const { folderPath } = await new ConfigStore(ctx.home).read() + const modules = await listModules(folderPath, { + home: ctx.home, + cwd: ctx.cwd, + warn: message => ctx.output.warn(message), + }) + return { repository: folderPath, modules } +} + /** * Reads the modules of a dotfiles repository: every folder of `files/` * (symlinks to folders included) that contains a `settings.json`. @@ -201,6 +232,12 @@ async function readModuleFiles( strategy, repository, module: modulePath, + entry: { + module: path.relative(repository, modulePath), + source: path.relative(modulePath, resolvedSource), + target: target.trim(), + folder: strategy === 'global' ? env.home : env.cwd, + }, }) } diff --git a/src/state.ts b/src/state.ts index baae8c7b..683753a0 100644 --- a/src/state.ts +++ b/src/state.ts @@ -13,6 +13,7 @@ import { writeFileAtomic, } from './fsutil.js' import { configfilePaths } from './paths.js' +import type { Entry } from './repository.js' /** A file configfile moved aside, as it was when moved. */ export interface Backup { @@ -33,6 +34,8 @@ export interface Deployed { readonly strategy: 'global' | 'local' readonly source: string readonly identity: Identity + /** The settings.json entry it was deployed for (missing in records made before it was kept). */ + readonly entry?: Entry } /** Everything configfile knows about one target. */ @@ -123,6 +126,11 @@ export class DeploymentRecord { return null } + /** Every recorded target, including those with only backups (`deployed` is null). A snapshot. */ + targets(): readonly TargetRecord[] { + return Object.values(this.#state.targets) + } + async addBackup(target: string, backup: Backup): Promise { await this.#update(target, record => ({ ...record, backups: [...record.backups, backup] })) } @@ -202,6 +210,7 @@ function isTargets(value: unknown): value is Record { typeof record === 'object' && typeof record.target === 'string' && path.isAbsolute(record.target) && + isDeployed(record.deployed) && Array.isArray(record.backups) && record.backups.every( (backup: unknown) => @@ -212,6 +221,24 @@ function isTargets(value: unknown): value is Record { ) } +function isDeployed(value: unknown): boolean { + if (value === null) return true + if (value == null || typeof value !== 'object') return false + const { strategy, source, identity, entry } = value as Record + const isObject = (item: unknown): item is Record => + item != null && typeof item === 'object' + return ( + (strategy === 'global' || strategy === 'local') && + typeof source === 'string' && + isObject(identity) && + typeof identity.dev === 'number' && + typeof identity.ino === 'number' && + (entry === undefined || + (isObject(entry) && + ['module', 'source', 'target', 'folder'].every(key => typeof entry[key] === 'string'))) + ) +} + /** * Backups are always `.old` or `.old.`: anything else in the * record (edited by hand, or planted) must never be restored over a target. diff --git a/tests/commands.test.ts b/tests/commands.test.ts index e34f0c4f..0a8b6d41 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -424,6 +424,12 @@ describe('modules status, dry run and undeploy', () => { strategy: 'global', source: path.join(sandbox.repo, 'files/zsh/zshrc'), identity: { dev: expect.any(Number), ino: expect.any(Number) }, + entry: { + module: 'files/zsh', + source: 'zshrc', + target: '~/.zshrc', + folder: sandbox.home, + }, }, backups: [ { @@ -583,6 +589,30 @@ describe('modules status, dry run and undeploy', () => { expect(await readFile(path.join(sandbox.home, '.ssh/id_rsa'), 'utf8')).toBe('PRIVATE KEY') }) + it('refuses a state file whose deployed record is malformed', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + const zshrc = path.join(sandbox.home, '.zshrc') + await sandbox.write( + 'home/.configfile/state.json', + JSON.stringify({ + version: 2, + targets: { + [zshrc]: { + target: zshrc, + deployed: { strategy: 'global', source: 42, identity: { dev: 1, ino: 2 } }, + backups: [], + }, + }, + }), + ) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('is not a valid configfile state file') + }) + it('shows control characters from settings.json as escapes', async () => { const sandbox = await createSandbox() await sandbox.configure() @@ -690,6 +720,497 @@ describe('modules status, dry run and undeploy', () => { }) }) +describe('files the repository no longer deploys', () => { + /** A module with two global files, deployed over an existing ~/.aliases. */ + async function withDeployedModule(sandbox: Sandbox) { + await sandbox.configure() + await sandbox.write('home/dotfiles/files/zsh/zshrc', 'zshrc') + await sandbox.write('home/dotfiles/files/zsh/aliases', 'aliases') + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'aliases', target_path: '~/.aliases', deploy: 'global' }, + ]) + await sandbox.write('home/.aliases', 'mine') + expect((await runCli(sandbox, ['modules', 'deploy', 'zsh'])).code).toBe(0) + return { + aliases: path.join(sandbox.home, '.aliases'), + zshrc: path.join(sandbox.home, '.zshrc'), + } + } + + const writeSettings = (sandbox: Sandbox, module: string, files: unknown) => + sandbox.write(`home/dotfiles/files/${module}/settings.json`, JSON.stringify({ files })) + + it('lists, then undeploys a removed entry and restores what it replaced', async () => { + const sandbox = await createSandbox() + const { aliases, zshrc } = await withDeployedModule(sandbox) + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + ]) + await rm(path.join(sandbox.repo, 'files/zsh/aliases')) + + const status = await runCli(sandbox, ['modules', 'status']) + const dryRun = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--dry-run']) + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(status.stdout).toContain( + `No longer deployed by the repository (run "configfile modules undeploy --removed"):\n` + + ` ${aliases} (deployed, but its source is missing from the repository)\n`, + ) + expect(dryRun.stdout).toContain(`- ${aliases} (would be removed, ${aliases}.old restored)\n`) + expect(result.code).toBe(0) + expect(result.stdout).toContain(`- ${aliases} (removed, ${aliases}.old restored)\n`) + expect(result.stdout).not.toContain(zshrc) + expect(await readFile(aliases, 'utf8')).toBe('mine') + expect(await readlink(zshrc)).toBe(path.join(sandbox.repo, 'files/zsh/zshrc')) + expect((await runCli(sandbox, ['modules', 'status'])).stdout).not.toContain('No longer') + + const [, undeployed] = await readHistory(sandbox) + expect(undeployed).toMatchObject({ + command: 'modules undeploy', + options: { modules: [], removed: true }, + changes: [ + { + kind: 'removed', + target: aliases, + backup: { path: `${aliases}.old`, status: 'restored' }, + }, + ], + }) + }) + + it('undeploys them with --all, also when their module was deleted', async () => { + const sandbox = await createSandbox() + const { aliases, zshrc } = await withDeployedModule(sandbox) + await sandbox.write('home/dotfiles/files/git/gitconfig', 'git') + await writeSettings(sandbox, 'git', [ + { source_path: 'gitconfig', target_path: '~/.gitconfig', deploy: 'global' }, + ]) + await rm(path.join(sandbox.repo, 'files/zsh'), { recursive: true }) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(result.code).toBe(0) + expect(result.stdout).toContain(`- ${aliases} (removed, ${aliases}.old restored)`) + expect(result.stdout).toContain(`- ${zshrc} (removed)`) + expect(await readFile(aliases, 'utf8')).toBe('mine') + expect(existsSync(zshrc)).toBe(false) + }) + + it('undeploys them when all modules are chosen at the question', async () => { + const sandbox = await createSandbox() + const { aliases } = await withDeployedModule(sandbox) + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + ]) + + const result = await runCli(sandbox, ['modules', 'undeploy'], [true]) + + expect(result.code).toBe(0) + expect(await readFile(aliases, 'utf8')).toBe('mine') + }) + + it('counts an entry set to "deploy": "none" as no longer deployed', async () => { + const sandbox = await createSandbox() + const { aliases } = await withDeployedModule(sandbox) + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'aliases', target_path: '~/.aliases', deploy: 'none' }, + ]) + + const status = await runCli(sandbox, ['modules', 'status']) + await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(status.stdout).toContain(` ${aliases} (deployed)\n`) + expect(await readFile(aliases, 'utf8')).toBe('mine') + }) + + it('counts a changed target as no longer deployed at the old one', async () => { + const sandbox = await createSandbox() + const { aliases } = await withDeployedModule(sandbox) + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'aliases', target_path: '~/.zsh_aliases', deploy: 'global' }, + ]) + + await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(await readFile(aliases, 'utf8')).toBe('mine') + }) + + it.each([ + ['whose settings.json is broken', '{'], + [ + 'with an invalid entry', + JSON.stringify({ + files: [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'aliases', deploy: 'global' }, + ], + }), + ], + [ + 'with an entry without strategy', + JSON.stringify({ + files: [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'aliases', target_path: '~/.aliases' }, + ], + }), + ], + ])('never counts the files of a module %s as removed', async (_, settings) => { + const sandbox = await createSandbox() + const { aliases } = await withDeployedModule(sandbox) + await sandbox.write('home/dotfiles/files/zsh/settings.json', settings) + + const status = await runCli(sandbox, ['modules', 'status']) + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed']) + const all = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(status.stdout).not.toContain('No longer deployed') + expect(status.stdout).toContain( + `configfile cannot tell whether the repository still deploys them:\n ${aliases} (`, + ) + expect(result.code).toBe(0) + expect(result.stderr).toContain(`${aliases} was not checked: `) + expect(result.stdout).not.toContain(`- ${aliases}`) + expect(all.stdout).not.toContain(`- ${aliases}`) + expect(await readlink(aliases)).toBe(path.join(sandbox.repo, 'files/zsh/aliases')) + }) + + it('never counts the files of a module that was not loaded as removed', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/zsh!/aliases', 'aliases') + await writeSettings(sandbox, 'zsh!', [ + { source_path: 'aliases', target_path: '~/.aliases', deploy: 'global' }, + ]) + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + // Same module name: "zsh!" is now ignored, with a warning. + await sandbox.write('home/dotfiles/files/zsh/zshrc', 'zshrc') + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + ]) + + const status = await runCli(sandbox, ['modules', 'status']) + await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(status.stderr).toContain('is ignored: another module is already named "zsh"') + expect(status.stdout).not.toContain('No longer deployed') + expect(await readlink(path.join(sandbox.home, '.aliases'))).toBe( + path.join(sandbox.repo, 'files/zsh!/aliases'), + ) + }) + + it('keeps a removed local copy whose source is gone: it cannot be compared', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/web/editorconfig', 'root = true') + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + ]) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web']) + await writeSettings(sandbox, 'web', []) + await rm(path.join(sandbox.repo, 'files/web/editorconfig')) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--local']) + + expect(result.stdout).toContain( + `- ${path.join(sandbox.cwd, '.editorconfig')} (kept: its source is missing from the repository, so it cannot be compared; configfile no longer tracks it)`, + ) + expect(existsSync(path.join(sandbox.cwd, '.editorconfig'))).toBe(true) + // It is the user's file now: no more warnings about it. + const again = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--local']) + expect(again.stdout).toContain('Every deployed local file is still deployed by the repository.') + }) + + it('undeploys removed local copies of the current folder only, unless modified', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/web/editorconfig', 'root = true') + await sandbox.write('home/dotfiles/files/web/prettierrc', '{}') + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + { source_path: 'prettierrc', target_path: '.prettierrc', deploy: 'local' }, + ]) + const other = path.join(sandbox.root, 'other') + await mkdir(other) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web']) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web'], [], { cwd: other }) + await sandbox.write('cwd/.prettierrc', '{ "semi": false }') + await writeSettings(sandbox, 'web', []) + + const status = await runCli(sandbox, ['modules', 'status', '--local']) + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--local']) + + expect(status.stdout).toContain(` ${path.join(sandbox.cwd, '.editorconfig')} (deployed)`) + expect(status.stdout).not.toContain(other) + expect(result.stdout).toContain(`- ${path.join(sandbox.cwd, '.editorconfig')} (removed)`) + expect(result.stdout).toContain( + `- ${path.join(sandbox.cwd, '.prettierrc')} (kept: it was modified since it was copied; configfile no longer tracks it)`, + ) + expect(existsSync(path.join(sandbox.cwd, '.editorconfig'))).toBe(false) + expect(existsSync(path.join(other, '.editorconfig'))).toBe(true) + }) + + it('still matches local copies after the repository moved', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/web/editorconfig', 'root = true') + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + ]) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web']) + const moved = path.join(sandbox.root, 'moved') + await rename(sandbox.repo, moved) + await sandbox.configure({ folder_path: moved }) + + const status = await runCli(sandbox, ['modules', 'status', '--local']) + + expect(status.code).toBe(0) + expect(status.stdout).not.toContain('No longer deployed') + }) + + it('keeps a link whose parent folder, a symbolic link, now leads elsewhere', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/app/apprc', 'app') + await writeSettings(sandbox, 'app', [ + { source_path: 'apprc', target_path: '~/.cfg/apprc', deploy: 'global' }, + ]) + await mkdir(path.join(sandbox.home, 'real-a')) + await symlink(path.join(sandbox.home, 'real-a'), path.join(sandbox.home, '.cfg')) + await runCli(sandbox, ['modules', 'deploy', 'app']) + // ~/.cfg moved elsewhere (Dropbox, iCloud…), its link updated. + await rename(path.join(sandbox.home, 'real-a'), path.join(sandbox.home, 'real-b')) + await rm(path.join(sandbox.home, '.cfg')) + await symlink(path.join(sandbox.home, 'real-b'), path.join(sandbox.home, '.cfg')) + + const status = await runCli(sandbox, ['modules', 'status']) + await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(status.stdout).not.toContain('No longer deployed') + expect(await readlink(path.join(sandbox.home, '.cfg/apprc'))).toBe( + path.join(sandbox.repo, 'files/app/apprc'), + ) + }) + + it('keeps a link whose target is now written with other letter case', async ({ skip }) => { + const sandbox = await createSandbox() + await sandbox.write('home/case-check', '') + // Only meaningful on a case-insensitive file system (macOS by default). + if (!existsSync(path.join(sandbox.home, 'CASE-CHECK'))) skip() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/app/apprc', 'app') + await writeSettings(sandbox, 'app', [ + { source_path: 'apprc', target_path: '~/.apprc', deploy: 'global' }, + ]) + await runCli(sandbox, ['modules', 'deploy', 'app']) + await writeSettings(sandbox, 'app', [ + { source_path: 'apprc', target_path: '~/.AppRc', deploy: 'global' }, + ]) + + const status = await runCli(sandbox, ['modules', 'status']) + + expect(status.stdout).not.toContain('No longer deployed') + }) + + it('holds back the files of a module folder that is a broken symbolic link', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + const external = path.join(sandbox.root, 'external-work') + await sandbox.write('external-work/workrc', 'work') + await sandbox.write( + 'external-work/settings.json', + JSON.stringify({ + files: [{ source_path: 'workrc', target_path: '~/.workrc', deploy: 'global' }], + }), + ) + await mkdir(path.join(sandbox.repo, 'files'), { recursive: true }) + await symlink(external, path.join(sandbox.repo, 'files/work')) + await runCli(sandbox, ['modules', 'deploy', 'work']) + // The drive is not mounted. + await rename(external, `${external}-unmounted`) + + const status = await runCli(sandbox, ['modules', 'status']) + const all = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(status.stdout).toContain( + ` ${path.join(sandbox.home, '.workrc')} (files/work is in the repository but is not a usable module)`, + ) + expect(all.stdout).not.toContain('.workrc (removed') + expect(existsSync(path.join(sandbox.home, '.workrc'))).toBe(false) + expect((await lstat(path.join(sandbox.home, '.workrc'))).isSymbolicLink()).toBe(true) + }) + + it('holds back the files of a module that is not loaded after the repository moved', async () => { + const sandbox = await createSandbox() + const { aliases } = await withDeployedModule(sandbox) + const moved = path.join(sandbox.root, 'moved') + await rename(sandbox.repo, moved) + await sandbox.configure({ folder_path: moved }) + // A folder listed first now gives the same module name: "zsh" is ignored. + await sandbox.write('moved/files/!zsh/settings.json', JSON.stringify({ files: [] })) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(result.stderr).toContain('"zsh" is ignored: another module is already named "zsh"') + expect(result.stderr).toContain( + `${aliases} was not checked: files/zsh is in the repository but is not a usable module.`, + ) + expect(result.stdout).not.toContain(`- ${aliases}`) + expect((await lstat(aliases)).isSymbolicLink()).toBe(true) + }) + + it('forgets a removed file replaced by the user, and stops warning about it', async () => { + const sandbox = await createSandbox() + const { aliases } = await withDeployedModule(sandbox) + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + ]) + await rm(aliases) + await sandbox.write('home/.aliases', 'my own') + + const dryRun = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--dry-run']) + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed']) + const again = await runCli(sandbox, ['modules', 'status']) + + expect(dryRun.stdout).toContain( + `- ${aliases} (would be kept: the file there was not deployed by configfile; configfile would stop tracking it)`, + ) + expect(result.code).toBe(0) + expect(result.stdout).toContain( + `- ${aliases} (kept: the file there was not deployed by configfile; configfile no longer tracks it)`, + ) + expect(await readFile(aliases, 'utf8')).toBe('my own') + expect(again.stdout).not.toContain('No longer deployed') + // Its backup stays recorded, untouched. + expect(await readFile(`${aliases}.old`, 'utf8')).toBe('mine') + const [, undeployed] = await readHistory(sandbox) + expect(undeployed?.changes).toEqual([ + { kind: 'kept', target: aliases, reason: 'foreign', forgotten: true }, + ]) + expect((await runCli(sandbox, ['history', '-n', '1'])).stdout).toContain( + 'kept ~/.aliases (not deployed by configfile; configfile no longer tracks it)', + ) + }) + + it('leaves out targets deleted by hand: there is nothing to undeploy', async () => { + const sandbox = await createSandbox() + const { aliases } = await withDeployedModule(sandbox) + await writeSettings(sandbox, 'zsh', [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + ]) + await rm(aliases) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(result.stdout).toContain( + 'Every deployed global file is still deployed by the repository.', + ) + }) + + it('undeploys them with --all when no module is left, and previews it', async () => { + const sandbox = await createSandbox() + const { aliases, zshrc } = await withDeployedModule(sandbox) + await rm(path.join(sandbox.repo, 'files/zsh'), { recursive: true }) + + const status = await runCli(sandbox, ['modules', 'status']) + const dryRun = await runCli(sandbox, ['modules', 'undeploy', '--all', '--dry-run']) + expect(await readlink(zshrc)).toBe(path.join(sandbox.repo, 'files/zsh/zshrc')) + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(status.stdout).toContain(`No longer deployed by the repository`) + expect(status.stdout).toContain(` ${zshrc} (`) + expect(dryRun.stdout).toContain(`- ${aliases} (would be removed, ${aliases}.old restored)`) + expect(result).toMatchObject({ code: 0 }) + expect(result.stdout).toContain('Undeployment finished.') + expect(await readFile(aliases, 'utf8')).toBe('mine') + expect(existsSync(zshrc)).toBe(false) + }) + + it('keeps a local copy whose entry changed source but not target', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/web/editorconfig', 'root = true') + await sandbox.write('home/dotfiles/files/web/editorconfig.ini', 'root = true') + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + ]) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web']) + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig.ini', target_path: '.editorconfig', deploy: 'local' }, + ]) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--local']) + + expect(result.stdout).toContain( + 'Every deployed local file is still deployed by the repository.', + ) + expect(existsSync(path.join(sandbox.cwd, '.editorconfig'))).toBe(true) + }) + + it('undeploys the old copy of a local entry whose target changed', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/web/editorconfig', 'root = true') + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + ]) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web']) + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig', target_path: 'config/.editorconfig', deploy: 'local' }, + ]) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--local']) + + expect(result.stdout).toContain(`- ${path.join(sandbox.cwd, '.editorconfig')} (removed)`) + }) + + it('only reaches the local copies made in the current folder, not in its subfolders', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/files/web/editorconfig', 'root = true') + await writeSettings(sandbox, 'web', [ + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + ]) + const project = path.join(sandbox.cwd, 'project') + await mkdir(project) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web'], [], { cwd: project }) + await writeSettings(sandbox, 'web', []) + + const fromParent = await runCli(sandbox, ['modules', 'status', '--local']) + const fromProject = await runCli(sandbox, ['modules', 'status', '--local'], [], { + cwd: project, + }) + + expect(fromParent.stdout).not.toContain('No longer deployed') + expect(fromProject.stdout).toContain( + 'No longer deployed by the repository (run "configfile modules undeploy --removed --local"):', + ) + }) + + it('refuses --removed with --all', async () => { + const sandbox = await createSandbox() + await withDeployedModule(sandbox) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Give --all or --removed, not both') + }) + + it('refuses module names with --removed', async () => { + const sandbox = await createSandbox() + await withDeployedModule(sandbox) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--removed', 'zsh']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Give module names or --removed, not both.') + }) +}) + describe('scripts', () => { async function withScripts(sandbox: Sandbox) { await sandbox.configure() @@ -1212,6 +1733,96 @@ describe('update', () => { expect(await readFile(path.join(sandbox.repo, 'files/new-file'), 'utf8')).toBe('new') }) + it('warns about deployed files the repository no longer deploys', async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/zsh/zshrc', 'zshrc') + await commitInRemote( + 'files/zsh/settings.json', + JSON.stringify({ + files: [{ source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }], + }), + ) + await runCli(sandbox, ['update']) + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + await commitInRemote('files/zsh/settings.json', JSON.stringify({ files: [] })) + + const result = await runCli(sandbox, ['update']) + const again = await runCli(sandbox, ['update']) + + const zshrc = path.join(sandbox.home, '.zshrc') + const warning = + `1 deployed file is no longer deployed by the repository: ${zshrc}. To remove it and ` + + 'restore what it replaced, run "configfile modules undeploy --removed".' + expect(result.code).toBe(0) + expect(result.stderr).toContain(warning) + // Until the file is undeployed. + expect(again.stderr).toContain(warning) + }) + + it('names the folders of removed local copies', async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/zsh/zshrc', 'zshrc') + await commitInRemote('files/zsh/editorconfig', 'root = true') + await commitInRemote( + 'files/zsh/settings.json', + JSON.stringify({ + files: [ + { source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }, + { source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }, + ], + }), + ) + await runCli(sandbox, ['update']) + await runCli(sandbox, ['modules', 'deploy', 'zsh']) + await runCli(sandbox, ['modules', 'deploy', '--local', 'zsh']) + await commitInRemote('files/zsh/settings.json', JSON.stringify({ files: [] })) + + const result = await runCli(sandbox, ['update']) + + expect(result.stderr).toContain( + `2 deployed files are no longer deployed by the repository: ${path.join(sandbox.home, '.zshrc')}, ` + + `${path.join(sandbox.cwd, '.editorconfig')}. To remove them and restore what they replaced, ` + + `run "configfile modules undeploy --removed", and run "configfile modules undeploy --removed --local" in ${sandbox.cwd}.`, + ) + }) + + it('checks local copies against the folder they were copied into', async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/web/editorconfig', 'root = true') + await commitInRemote( + 'files/web/settings.json', + JSON.stringify({ + files: [{ source_path: 'editorconfig', target_path: '.editorconfig', deploy: 'local' }], + }), + ) + await runCli(sandbox, ['update']) + const project = path.join(sandbox.root, 'project') + await mkdir(project) + await runCli(sandbox, ['modules', 'deploy', '--local', 'web'], [], { cwd: project }) + + // Run from another folder: the entry still deploys project/.editorconfig. + const result = await runCli(sandbox, ['update']) + + expect(result.stderr).not.toContain('no longer deployed') + }) + + it('still succeeds when the synced repository cannot be read', async () => { + const sandbox = await createSandbox() + const { remote } = await withMirror(sandbox) + await rm(path.join(remote, 'files'), { recursive: true }) + await sandbox.write('remote/files', 'a file, not a folder') + git(remote, 'add', '-A') + git(remote, 'commit', '--quiet', '-m', 'no files') + + const result = await runCli(sandbox, ['update']) + + expect(result.code).toBe(0) + expect(result.stderr).toContain('Cannot check for files the repository no longer deploys') + }) + it('fails when the dotfiles folder is not a git repository', async () => { const sandbox = await createSandbox() await sandbox.configure() @@ -1623,7 +2234,7 @@ describe('history', () => { }), line({ command: 'modules undeploy', - options: { modules: [], all: true }, + options: { modules: [], all: true, removed: true }, changes: [ { kind: 'removed', @@ -1716,7 +2327,7 @@ describe('history', () => { ' 2 unchanged', ' error 1 file, module or settings entry failed.', '', - 'TIME modules undeploy --all ok', + 'TIME modules undeploy --all --removed ok', ' removed ~/.a (~/.a.old restored)', ' removed ~/.b (its backup ~/.b.old no longer existed)', ' removed ~/.c (its backup ~/.c.old had changed, not restored)', diff --git a/tests/helpers.ts b/tests/helpers.ts index 2d71d9d7..141f2012 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -81,6 +81,8 @@ export interface FakeContext extends Context { export interface CliOptions { /** `false` simulates stdin not being a terminal. Defaults to `true`. */ interactive?: boolean + /** The current folder. Defaults to `/cwd`. */ + cwd?: string } /** @@ -91,7 +93,7 @@ export interface CliOptions { export function createContext( sandbox: Sandbox, answers: Array = [], - { interactive = true }: CliOptions = {}, + { interactive = true, cwd = sandbox.cwd }: CliOptions = {}, ): FakeContext { const stdout = new Capture() const stderr = new Capture() @@ -115,7 +117,7 @@ export function createContext( return { home: sandbox.home, - cwd: sandbox.cwd, + cwd, output: new Output(stdout, stderr), prompts, history: new History(sandbox.home), diff --git a/tests/history.test.ts b/tests/history.test.ts index a8fb5da1..9d78d395 100644 --- a/tests/history.test.ts +++ b/tests/history.test.ts @@ -325,6 +325,7 @@ describe('parseHistoryLine', () => { null, { kind: 'future-kind' }, { kind: 'kept', target: '/t', reason: 'future-reason' }, + { kind: 'kept', target: '/t', reason: 'foreign', forgotten: 'yes' }, { kind: 'synced', folder: '/f', upstream: 'origin/main', from: 1, to: 2 }, { kind: 'failed', reason: 'neither a target nor a module' }, { kind: 'saved-patch', file: '/p' }, @@ -332,7 +333,7 @@ describe('parseHistoryLine', () => { }) expect(entry?.line?.changes).toEqual([{ kind: 'saved-patch', file: '/p' }]) - expect(entry?.unreadableChanges).toBe(5) + expect(entry?.unreadableChanges).toBe(6) }) }) diff --git a/tests/repository.test.ts b/tests/repository.test.ts index 864e8991..028df607 100644 --- a/tests/repository.test.ts +++ b/tests/repository.test.ts @@ -100,6 +100,7 @@ describe('listModules', () => { strategy: 'global', repository, module, + entry: { module: 'files/zsh', source: 'zshrc', target: '~/.zshrc', folder: sandbox.home }, }, { source: path.join(sandbox.repo, 'files/zsh/local.env'), @@ -107,6 +108,7 @@ describe('listModules', () => { strategy: 'local', repository, module, + entry: { module: 'files/zsh', source: 'local.env', target: '.env', folder: sandbox.cwd }, }, { source: path.join(sandbox.repo, 'files/zsh/aliases'), @@ -114,6 +116,12 @@ describe('listModules', () => { strategy: 'global', repository, module, + entry: { + module: 'files/zsh', + source: 'aliases', + target: '~/.aliases', + folder: sandbox.home, + }, }, { source: path.join(sandbox.repo, 'files/zsh/editorconfig'), @@ -121,6 +129,12 @@ describe('listModules', () => { strategy: 'local', repository, module, + entry: { + module: 'files/zsh', + source: 'editorconfig', + target: '.editorconfig', + folder: sandbox.cwd, + }, }, ]) expect(zsh.undecided).toEqual(['forgotten']) From 6033cf8d61e8a2a86215dc43b47464dc8c11d274 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 1 Oct 2026 22:22:29 +0200 Subject: [PATCH 325/341] build!: require Node.js 24, use mise, harden installs and CI (#288) --- .github/workflows/ci.yml | 56 +++- .github/workflows/publish.yml | 45 +++ .node-version | 1 - .renovaterc.json | 47 ++- CHANGELOG.md | 4 +- CONTRIBUTING.md | 17 +- README.md | 4 +- biome.json | 4 +- docs/home.md | 2 +- mise.toml | 7 + package.json | 13 +- pnpm-lock.yaml | 580 +++++++++++++++++----------------- pnpm-workspace.yaml | 11 + src/cli.ts | 8 +- src/commands/history.ts | 8 +- src/commands/init.ts | 19 +- src/commands/modules.ts | 28 +- src/commands/scripts.ts | 14 +- src/commands/update.ts | 22 +- src/config.ts | 9 +- src/context.ts | 4 +- src/deploy.ts | 56 ++-- src/errors.ts | 8 +- src/fsutil.ts | 6 +- src/history.ts | 28 +- src/lock.ts | 9 +- src/output.ts | 11 +- src/process.ts | 59 ++-- src/program.ts | 23 +- src/prompts.ts | 4 +- src/removed.ts | 8 +- src/repository.ts | 12 +- src/state.ts | 12 +- src/sync.ts | 6 +- tests/commands.test.ts | 6 +- tests/config.test.ts | 8 +- tests/deploy.test.ts | 10 +- tests/e2e.test.ts | 5 +- tests/helpers.ts | 8 +- tests/history.test.ts | 6 +- tests/lock.test.ts | 4 +- tests/repository.test.ts | 6 +- tsconfig.json | 7 +- vitest.config.ts | 2 + 44 files changed, 694 insertions(+), 513 deletions(-) create mode 100644 .github/workflows/publish.yml delete mode 100644 .node-version create mode 100644 mise.toml create mode 100644 pnpm-workspace.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94b492cc..1864c6e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,26 +12,60 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7 - - uses: pnpm/setup@v3 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - cache: true - require-lockfile: true + persist-credentials: false + # Tool versions come from mise.toml. + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + - run: pnpm install --frozen-lockfile - run: pnpm lint - run: pnpm typecheck + - name: Check the workflows + run: | + actionlint + zizmor --persona regular .github/workflows test: strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - node: [22, 24, 26] + # The oldest supported version (mise.toml) and the newest. + node: ['24', '26'] runs-on: ${{ matrix.os }} + env: + MISE_NODE_VERSION: ${{ matrix.node }} steps: - - uses: actions/checkout@v7 - - uses: pnpm/setup@v3 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + # One cache per Node.js version: the override is not part of mise.toml. + cache_key_prefix: mise-node-${{ matrix.node }} + - run: pnpm install --frozen-lockfile + - run: pnpm test:coverage + + package: + # Installs the package as users get it, and runs it. + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 with: - runtime: node@${{ matrix.node }} - cache: true - require-lockfile: true - - run: pnpm test + version: 2026.9.18 # mise version, updated by Renovate + - run: pnpm install --frozen-lockfile + - run: pnpm pack --out "$RUNNER_TEMP/configfile.tgz" + - name: Install and run the packed package + working-directory: ${{ runner.temp }} + # Installing the package just built is what this job tests. + run: | # zizmor: ignore[adhoc-packages] + npm install --global ./configfile.tgz + configfile --version + configfile --help + HOME="$RUNNER_TEMP/home" configfile history diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..37635d3c --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,45 @@ +name: Publish + +# Publishes to npm when a version tag (such as 1.0.0) is pushed on a commit of +# master, the release branch of git-flow. Uses npm trusted publishing: no npm +# token is stored, and the package gets a provenance statement. Set it up once +# on npmjs.com (package settings > Trusted publishing): repository +# mindsers/configfile, workflow publish.yml, environment npm. + +on: + push: + tags: ['[0-9]+.[0-9]+.[0-9]+*'] + +permissions: + contents: read + +jobs: + publish: + runs-on: ubuntu-latest + environment: npm + permissions: + contents: read + id-token: write # npm trusted publishing + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + # No cache: nothing restored from another run can end up in a release. + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + cache: false + - name: Check the tag is on master and matches package.json + env: + TAG: ${{ github.ref_name }} + run: | + git merge-base --is-ancestor "$GITHUB_SHA" origin/master || { + echo "::error::$TAG is not on master."; exit 1; } + version=$(node -p "require('./package.json').version") + [ "$version" = "$TAG" ] || { + echo "::error::package.json is $version, the tag is $TAG."; exit 1; } + - run: pnpm install --frozen-lockfile + - run: pnpm check + # npm (not pnpm) publishes: trusted publishing needs npm 11.5.1 or later. + - run: npm publish --access public diff --git a/.node-version b/.node-version deleted file mode 100644 index a45fd52c..00000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -24 diff --git a/.renovaterc.json b/.renovaterc.json index 5e5328c4..1af64eac 100644 --- a/.renovaterc.json +++ b/.renovaterc.json @@ -1,6 +1,49 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended"], + "extends": ["config:recommended", ":semanticCommits", "helpers:pinGitHubActionDigests"], + "baseBranchPatterns": ["develop"], "assignees": ["mindsers"], - "labels": ["state: need review", "type: enhancement"] + "labels": ["type: dependencies"], + "minimumReleaseAge": "1 day", + "lockFileMaintenance": { + "enabled": true + }, + "packageRules": [ + { + "description": "Development tools in one weekly pull request", + "matchDepTypes": ["devDependencies"], + "matchUpdateTypes": ["minor", "patch"], + "groupName": "development tools", + "schedule": ["before 6am on monday"] + }, + { + "description": "pnpm is pinned in package.json and mise.toml: update both together", + "matchPackageNames": ["pnpm"], + "groupName": "pnpm" + }, + { + "description": "Node.js in mise.toml is the oldest supported version: never bump its major", + "matchManagers": ["mise"], + "matchPackageNames": ["node"], + "matchUpdateTypes": ["major"], + "enabled": false + }, + { + "description": "@types/node follows the oldest supported Node.js", + "matchPackageNames": ["@types/node"], + "matchUpdateTypes": ["major"], + "enabled": false + } + ], + "customManagers": [ + { + "description": "The mise version installed by jdx/mise-action in the workflows", + "customType": "regex", + "managerFilePatterns": ["/^\\.github/workflows/.+\\.ya?ml$/"], + "matchStrings": ["version: (?\\S+) # mise version"], + "depNameTemplate": "jdx/mise", + "datasourceTemplate": "github-releases", + "extractVersionTemplate": "^v(?.+)$" + } + ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index b83b039a..2e4a1df1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,15 +24,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `~/.configfile/history.jsonl`, and the `history` command to see it ([#36](https://github.com/mindsers/configfile/issues/36)). - The `settings.json` format is documented in the README. +- Releases are published to npm with a provenance statement, which `npm audit signatures` checks. ### Changed -- **Breaking:** Node.js 22.13 or later is required, and only macOS and Linux are supported. +- **Breaking:** Node.js 24.11 or later is required, and only macOS and Linux are supported. - **Breaking:** a relative `target_path` of a global file now starts from the home folder instead of the current folder. - The `global` setting in `settings.json` is deprecated. Use `deploy` instead; `global` will be removed in 2.0. - Configfile is rewritten in TypeScript ([!281](https://github.com/mindsers/configfile/pull/281)). - Commands exit with an error code when something fails, so configfile can be used in scripts. +- With `DEBUG=1`, an error also shows the system error behind it. - Files replaced by `modules deploy --local` are saved as `.old` files, like global files. - Configfile no longer makes scripts executable: scripts that are not executable run with the interpreter of their first line (`#!`), or with `node` or `sh` for `.js` and `.sh` files. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 13e3f4fd..11d3757a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -77,23 +77,27 @@ The documentation lives with the source code: the [README](README.md) for users, ### Development setup -*Configfile* is written in TypeScript and uses [pnpm](https://pnpm.io). Use the Node.js version from `.node-version` (22.13 or later is supported). +*Configfile* is written in TypeScript and uses [pnpm](https://pnpm.io). Tool versions (Node.js, pnpm, and the workflow linters) are pinned in `mise.toml`: with [mise](https://mise.jdx.dev), run `mise install` once in the repository. Node.js 24.11 or later is supported. ```bash pnpm install -pnpm check # lint, type check and tests -pnpm test:watch # tests in watch mode -pnpm build # compile to dist/ +pnpm check # lint, type check and tests +pnpm test:watch # tests in watch mode +pnpm test:coverage # tests with coverage (CI fails below the thresholds in vitest.config.ts) +pnpm dev --help # run the TypeScript source directly +pnpm build # compile to dist/ node dist/cli.js --help ``` +`pnpm-workspace.yaml` protects installs: a newly published version is only installed after a day, a version with weaker provenance than earlier ones is refused, and no dependency may run install scripts. So `pnpm update` or `pnpm add` cannot pick a version published in the last 24 hours (`ERR_PNPM_NO_MATCHING_VERSION`): wait, or pick an older version. + ### Branches and pull requests The project uses [git-flow](https://nvie.com/posts/a-successful-git-branching-model/): `develop` holds the next release, and `master` the released versions. * Create your branch from `develop`: `feature/` for a feature or a documentation change, `bugfix/` for a fix. -* Open the pull request against `develop`, never `master`. Releases are handled by the maintainer. +* Open the pull request against `develop`, never `master`. Releases are handled by the maintainer: a version tag pushed on `master` publishes the package to npm, with provenance (`.github/workflows/publish.yml`). * Describe the change for a reviewer who doesn't know the code: why it is needed, what changes for users, how to test it. The pull request template has the sections. @@ -105,7 +109,8 @@ The project uses [git-flow](https://nvie.com/posts/a-successful-git-branching-mo Formatting and linting are handled by [Biome](https://biomejs.dev), configured in `biome.json`. Run `pnpm format` before committing; `pnpm lint` must pass. -* Relative imports use the `.js` extension (`import { x } from './x.js'`). +* Relative imports use the `.ts` extension (`import { x } from './x.ts'`), so Node.js runs the source directly; the build rewrites them to `.js`. Only erasable TypeScript syntax is allowed (no `enum`, `namespace` or constructor parameter properties). +* Wrapping an error keeps it as the `cause` (`new CliError(message, { cause: error })`): `DEBUG=1` shows it. * Expected failures throw a `CliError` (exit code and message for the user); never call `process.exit`. * Commands get everything from the injected `Context` (home, cwd, output, prompts, history) so they can be tested. The only exception is the `DEBUG` environment variable, read where stack traces are printed. * Bug fixes come with a test that reproduces the bug. diff --git a/README.md b/README.md index 7f8b97cc..7454bd4b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## Requirements - macOS or Linux -- Node.js 22.13 or later +- Node.js 24.11 or later - git ## Installation @@ -168,7 +168,7 @@ When the file reaches `history_max_size` (1MB by default; a number of bytes, or ## Upgrading from 0.3 -- Node.js 22.13 or later is required, on macOS or Linux. Install again with `npm install --global configfile`. +- Node.js 24.11 or later is required, on macOS or Linux. Install again with `npm install --global configfile`. - `~/.configfilerc`, the repository layout and `settings.json` work as before, including `settings.json` files that are a plain list (the 0.3.1 format, deprecated: put the list in a `"files"` key). Links deployed by 0.3 are recognised as deployed. - If you installed 0.3 with Yarn, remove it first: `yarn global remove configfile`. - `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. diff --git a/biome.json b/biome.json index 95c1cb1a..f5378689 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.5.14/schema.json", + "$schema": "https://biomejs.dev/schemas/2.5.15/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -26,7 +26,7 @@ "useImportExtensions": { "level": "error", "options": { - "forceJsExtensions": true + "forceJsExtensions": false } } } diff --git a/docs/home.md b/docs/home.md index 6b7950b5..668a3619 100644 --- a/docs/home.md +++ b/docs/home.md @@ -10,7 +10,7 @@ To install Configfile: npm install --global configfile ``` -macOS or Linux, Node.js 22.13 or later and git are required. +macOS or Linux, Node.js 24.11 or later and git are required. Generating first configuration: diff --git a/mise.toml b/mise.toml new file mode 100644 index 00000000..0aeb4f2d --- /dev/null +++ b/mise.toml @@ -0,0 +1,7 @@ +# Tool versions for development and CI: run `mise install` once in the repository. +# Node.js is the oldest version configfile supports; CI also tests newer ones. +[tools] +node = "24.21.0" +pnpm = "12.8.1" +actionlint = "1.7.12" +zizmor = "1.30.1" diff --git a/package.json b/package.json index b3bb6375..d3ef5e43 100644 --- a/package.json +++ b/package.json @@ -25,15 +25,16 @@ "dist" ], "engines": { - "node": ">=22.13.0" + "node": ">=24.11.0" }, "os": [ "darwin", "linux" ], - "packageManager": "pnpm@12.6.0", + "packageManager": "pnpm@12.8.1", "scripts": { "build": "tsc -p tsconfig.build.json", + "dev": "node src/cli.ts", "typecheck": "tsc --noEmit", "lint": "biome check .", "format": "biome check --write .", @@ -49,10 +50,10 @@ "commander": "^15.0.0" }, "devDependencies": { - "@biomejs/biome": "2.5.14", - "@types/node": "22.20.4", - "@vitest/coverage-v8": "5.0.2", + "@biomejs/biome": "2.5.15", + "@types/node": "24.19.0", + "@vitest/coverage-v8": "5.0.3", "typescript": "7.0.2", - "vitest": "5.0.2" + "vitest": "5.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ca34407..1f77b364 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,153 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.6.0 - version: 12.6.0 + specifier: 12.8.1 + version: 12.8.1 packages: - '@pnpm/exe.android-arm64@12.6.0': - resolution: {integrity: sha512-kviIHft9h02q+7N2In7tSL9T/HRUSGwYmU74YPtsWU5ee7vgqPyC0JT6RRX6miW+NxX1CvHgQxg69qq1qTLJYQ==} + '@pnpm/exe.android-arm64@12.8.1': + resolution: {integrity: sha512-siDxcidfz5eM6L2tJfik+i2bbUEw8UC7MZ3Yl2HYdRmqbdhHGAOQACtOOu6QVW4Jul4/w5wVKm+wM8ACtgh1Pg==} cpu: [arm64] os: [android] - '@pnpm/exe.android-x64@12.6.0': - resolution: {integrity: sha512-CT8aJKLq2mtZFE71pr4E5Z2xHL8uGnRGr+NclDqsXlVF4SVcQ2QAs14mWi0C8gjT4hbmi+Q0lJRRIkMAWfjjng==} + '@pnpm/exe.android-x64@12.8.1': + resolution: {integrity: sha512-0F/uqPRc3aN4vLHsa0f+6fTtmsigFQ9/yxEU43fionF//pNHEd5e97b3w/nKIgqYMCUQCJphmBRMA9Q8/wlo9Q==} cpu: [x64] os: [android] - '@pnpm/exe.darwin-arm64@12.6.0': - resolution: {integrity: sha512-rafpVkjzugKBMxSvGQd5wK1x5eOTkD/+lcJIFHeQhvd+BJ8kDisOOvwhQDrpGd4vd2Fx+hhW0P2Ptt638OlhFg==} + '@pnpm/exe.darwin-arm64@12.8.1': + resolution: {integrity: sha512-/rwavvMQJsl2RIxOHBnDF+4Gk+fhQFAY4M3PQZoKskJOEnaJcygG9p1xby6wcQcbS4d9dIubv09CQhufTgfmpw==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.6.0': - resolution: {integrity: sha512-72Jpuv1m24gI8zUNcaylYpBWEhBzz1VPhnDIU2GYM2eRP+KsOqVLwV78i+JrihI39zY2NNXmaN4eAKX1inpaDQ==} + '@pnpm/exe.darwin-x64@12.8.1': + resolution: {integrity: sha512-htYt2gN7zqJKLhC99Ft6EUiO7myjZAZXfmGCTJUL1v+o7vE9hZdE1+fAkk4Oj1ZHNRti6b2woOxEkRkAusi8OQ==} cpu: [x64] os: [darwin] - '@pnpm/exe.freebsd-x64@12.6.0': - resolution: {integrity: sha512-LON4QgNy1w/XF4uySZIyC/5hEB0oGdelXsY9tSKqstER+2j2X2oHz67skD11RRd/HWFRtMr64shQZ4I9ZoZ0zg==} + '@pnpm/exe.freebsd-x64@12.8.1': + resolution: {integrity: sha512-PB5BULNgytxvExoOXUUeseS/DcpPENs+cg3iA6xHHeaLT4ctEGKSGXEbuj7USeqvo8JBpAx039hivnbzGqDwnA==} cpu: [x64] os: [freebsd] - '@pnpm/exe.linux-arm64-musl@12.6.0': - resolution: {integrity: sha512-BdDpX+DeaMUc5x6WNcE6FkmFy36NwrBbBvwsZU737Zt3u1fTY+iKFPchjEQNCM4rT6q6xvF2oN3ZwExGsJCkxQ==} + '@pnpm/exe.linux-arm64-musl@12.8.1': + resolution: {integrity: sha512-kKeyC/ArjrgdciQRBrOL0j9HtOI4gDRgoyP+eJ1CQKyadpKlf/DhDDyspXe07R3B9KagTVLUF2nlt6Dr5quFIg==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.6.0': - resolution: {integrity: sha512-8h2sNoIhHDpHDYqZZCh9PXr6krqW10btb0GHVGuw710muDHlFAHMtUG2ogmaHge6zJG1xgY4Y7mwX5g/LWvrYg==} + '@pnpm/exe.linux-arm64@12.8.1': + resolution: {integrity: sha512-q4s9a9X2O3N9aeUFooW24orNrxvu20+jyVUFR5RanPCqOKKPBrgs2iywMkBBx1aXkkzdWT54/mfz8Be8sJlWEw==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-ppc64@12.6.0': - resolution: {integrity: sha512-ld6xgcEhFCFrsVsJhbmdmR714PnsEspO/Ij8w0/D7OSiz2hYGu3fZd5tKRxOI5m6H6Gl0/RRFAPncTHbsgXVjQ==} + '@pnpm/exe.linux-ppc64@12.8.1': + resolution: {integrity: sha512-F7XSjKJthwCh/L6abZiMpAfo2Cm61SZIT3e4dfgiIjESndlWaXCnfLKngSgZ/SEMsdmHT6dud3+kWIB3tw0/xQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-riscv64@12.6.0': - resolution: {integrity: sha512-HIbImydoC3J8NFt+8MXfhTCf5rO6NjCMyinSAHac0VmV8uCHw+kbQkyAzxV84rzz9ZOzmBOnj0b1N461UIYGsw==} + '@pnpm/exe.linux-riscv64@12.8.1': + resolution: {integrity: sha512-z1ecpIK/ZY08Unk69KWWE9867oaKUytGUjrHnBoGFAAhsK+q+0cfvBH+f5fWobJ7FX97leMlLO+gkJolddM45Q==} cpu: [riscv64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-s390x@12.6.0': - resolution: {integrity: sha512-DjSqT7+BZ/lWcDHwNMuzsRVfyxUimh+D54Xw4tSWbdVVQhtWtNMUyI93LVnwCmsoEpar2gC3SFeAgywx37svKQ==} + '@pnpm/exe.linux-s390x@12.8.1': + resolution: {integrity: sha512-KU6tnrBfu4uKXTq6N5qJwSm8FSrs9Wc8b5AUEsHK9bRXwNdsZ1/lRxG1++X29SKRW9OSNuDSjxASv5mAvGo1gA==} cpu: [s390x] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.6.0': - resolution: {integrity: sha512-31lKeGPmRE6xfV6I3VjaEGVFRei14pl/zgoFDK4w+UkbJqOuNl2Ht3O1GuqNIg3Gl14qTEb4kZRAYFHXifDx9A==} + '@pnpm/exe.linux-x64-musl@12.8.1': + resolution: {integrity: sha512-eUE8BWJkDr2tJb/yrk0yVnszlmNqFarVxUlqiZ9BAkct28Nq/5g2H0tvMDmPA7fAQW3STNj+omJPPRVT+4s5sQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.6.0': - resolution: {integrity: sha512-qFWBneHJAJ73W4whtbaFOL1M/7DBC6ILHXuxc7ZPtEhfPuT1zeZiGrmKHoMAfJA+mcm6xhOFljqVTUS+00Jabw==} + '@pnpm/exe.linux-x64@12.8.1': + resolution: {integrity: sha512-8bDZ0lZlCdi2rvnFul7EYgcC7zKeWSe76y8JV2oXobaS8p9i9d6PSf6LgLtTM0fI7R9Oh4eLCbveXyNDMmvZ+g==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.6.0': - resolution: {integrity: sha512-OhfefXEEykZlslSUhR8PPRe6MVPV3Oink/dVfIecE5velpc7j80cZYsHlaDrtRDcm3TPwQHkaRW1SJ1efX9oFg==} + '@pnpm/exe.win32-arm64@12.8.1': + resolution: {integrity: sha512-MsT0dlrRxnCRCHCaosNbhWpEiAFnFuMEu3KuDJDU41BXgTwiINxU8goloUSUDejWZUqKaUqNC/qUTihl9nFtqg==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.6.0': - resolution: {integrity: sha512-L2tuyrD2+Imgxs3VK/ST/2L3xD6vDP0ktJQxM0TaGw7TbAQEMq+RMc8iK6Ew7Id579uzjJe8jSfJID2ZGsOHCA==} + '@pnpm/exe.win32-x64@12.8.1': + resolution: {integrity: sha512-SWtPe0PsbTTk//gJND10tMdOfCYjrkq5+qV49hzVhY7xz2iJ339Rc+xwASlcvbwTfrvH39YNqpKYibD+CRGLwA==} cpu: [x64] os: [win32] - pnpm@12.6.0: - resolution: {integrity: sha512-PvaPlRyxEawgS0paFvCy3fDaVqluBBPoHYVdnwtV75JnFHCQKOHNAMQFwsX7e56OxNxGd3yAXQNzwvL/AP0g7A==} + pnpm@12.8.1: + resolution: {integrity: sha512-9kupB1B/XOr+BsjTjmBS0BeURFgOwSed3Vv8EctIqoomRLZlmOB+dh2oSHKp/FfV+QK4f6SdAkGY1VhhKqu+RQ==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.android-arm64@12.6.0': + '@pnpm/exe.android-arm64@12.8.1': optional: true - '@pnpm/exe.android-x64@12.6.0': + '@pnpm/exe.android-x64@12.8.1': optional: true - '@pnpm/exe.darwin-arm64@12.6.0': + '@pnpm/exe.darwin-arm64@12.8.1': optional: true - '@pnpm/exe.darwin-x64@12.6.0': + '@pnpm/exe.darwin-x64@12.8.1': optional: true - '@pnpm/exe.freebsd-x64@12.6.0': + '@pnpm/exe.freebsd-x64@12.8.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.6.0': + '@pnpm/exe.linux-arm64-musl@12.8.1': optional: true - '@pnpm/exe.linux-arm64@12.6.0': + '@pnpm/exe.linux-arm64@12.8.1': optional: true - '@pnpm/exe.linux-ppc64@12.6.0': + '@pnpm/exe.linux-ppc64@12.8.1': optional: true - '@pnpm/exe.linux-riscv64@12.6.0': + '@pnpm/exe.linux-riscv64@12.8.1': optional: true - '@pnpm/exe.linux-s390x@12.6.0': + '@pnpm/exe.linux-s390x@12.8.1': optional: true - '@pnpm/exe.linux-x64-musl@12.6.0': + '@pnpm/exe.linux-x64-musl@12.8.1': optional: true - '@pnpm/exe.linux-x64@12.6.0': + '@pnpm/exe.linux-x64@12.8.1': optional: true - '@pnpm/exe.win32-arm64@12.6.0': + '@pnpm/exe.win32-arm64@12.8.1': optional: true - '@pnpm/exe.win32-x64@12.6.0': + '@pnpm/exe.win32-x64@12.8.1': optional: true - pnpm@12.6.0: + pnpm@12.8.1: optionalDependencies: - '@pnpm/exe.android-arm64': 12.6.0 - '@pnpm/exe.android-x64': 12.6.0 - '@pnpm/exe.darwin-arm64': 12.6.0 - '@pnpm/exe.darwin-x64': 12.6.0 - '@pnpm/exe.freebsd-x64': 12.6.0 - '@pnpm/exe.linux-arm64': 12.6.0 - '@pnpm/exe.linux-arm64-musl': 12.6.0 - '@pnpm/exe.linux-ppc64': 12.6.0 - '@pnpm/exe.linux-riscv64': 12.6.0 - '@pnpm/exe.linux-s390x': 12.6.0 - '@pnpm/exe.linux-x64': 12.6.0 - '@pnpm/exe.linux-x64-musl': 12.6.0 - '@pnpm/exe.win32-arm64': 12.6.0 - '@pnpm/exe.win32-x64': 12.6.0 + '@pnpm/exe.android-arm64': 12.8.1 + '@pnpm/exe.android-x64': 12.8.1 + '@pnpm/exe.darwin-arm64': 12.8.1 + '@pnpm/exe.darwin-x64': 12.8.1 + '@pnpm/exe.freebsd-x64': 12.8.1 + '@pnpm/exe.linux-arm64': 12.8.1 + '@pnpm/exe.linux-arm64-musl': 12.8.1 + '@pnpm/exe.linux-ppc64': 12.8.1 + '@pnpm/exe.linux-riscv64': 12.8.1 + '@pnpm/exe.linux-s390x': 12.8.1 + '@pnpm/exe.linux-x64': 12.8.1 + '@pnpm/exe.linux-x64-musl': 12.8.1 + '@pnpm/exe.win32-arm64': 12.8.1 + '@pnpm/exe.win32-x64': 12.8.1 --- lockfileVersion: '9.0' @@ -168,26 +168,26 @@ importers: dependencies: '@inquirer/prompts': specifier: ^8.7.2 - version: 8.7.2(@types/node@22.20.4) + version: 8.7.2(@types/node@24.19.0) commander: specifier: ^15.0.0 version: 15.0.0 devDependencies: '@biomejs/biome': - specifier: 2.5.14 - version: 2.5.14 + specifier: 2.5.15 + version: 2.5.15 '@types/node': - specifier: 22.20.4 - version: 22.20.4 + specifier: 24.19.0 + version: 24.19.0 '@vitest/coverage-v8': - specifier: 5.0.2 - version: 5.0.2(vitest@5.0.2) + specifier: 5.0.3 + version: 5.0.3(vitest@5.0.3) typescript: specifier: 7.0.2 version: 7.0.2 vitest: - specifier: 5.0.2 - version: 5.0.2(@types/node@22.20.4)(@vitest/coverage-v8@5.0.2)(vite@8.3.1(@types/node@22.20.4)) + specifier: 5.0.3 + version: 5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)) packages: @@ -212,59 +212,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.5.14': - resolution: {integrity: sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw==} + '@biomejs/biome@2.5.15': + resolution: {integrity: sha512-WZTW4slm/pdkh92K6t/3aEN++44JD1PQ7squ7RCMLI1flHGl43DVOIGXvCjHiZgBMO1V4uYxoFNtqrIA4qGuIQ==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.5.14': - resolution: {integrity: sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ==} + '@biomejs/cli-darwin-arm64@2.5.15': + resolution: {integrity: sha512-BZVzFhJ/mUvTLMYbc9x6el0o2Uv5zP7bACYyhFb6fSc1giroXm7PL0a5KqMJ9F+/BnkYRjagD/ROSDVOZ6eapg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.14': - resolution: {integrity: sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA==} + '@biomejs/cli-darwin-x64@2.5.15': + resolution: {integrity: sha512-V5Kw63V+fVGNFhFrizDxMbGXAzZCh8kYzJpy3GI6gTapWDg7bZK9oYC9CbVgQSEdTnupz0U5Efz8Ev+5vdBBXw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.5.14': - resolution: {integrity: sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==} + '@biomejs/cli-linux-arm64-musl@2.5.15': + resolution: {integrity: sha512-tGzZUTcJCV7tj5Adh/Gn6nR4MycqA3iohq2LEcrarAgRBkU0h0OKd2UzCRkOsOYOuUGaUJb4YmqRqyy2feGGSw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.14': - resolution: {integrity: sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q==} + '@biomejs/cli-linux-arm64@2.5.15': + resolution: {integrity: sha512-XaG7P7eeSLYETD3K9grfB0mQmpLQZjygdbsxekWBJAg4am79fGAtRpfRyNnTvXB2fZFNnJZG3nXm7HBat0+VUw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.14': - resolution: {integrity: sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==} + '@biomejs/cli-linux-x64-musl@2.5.15': + resolution: {integrity: sha512-IlxUcyxilVGPsE008x13pWdkTbU3nQpP2i9b5UrbOYj6goBkKsRX1XB7yJLcV+O1H9LBchIIm4adOaVLZBX0ZQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.14': - resolution: {integrity: sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA==} + '@biomejs/cli-linux-x64@2.5.15': + resolution: {integrity: sha512-xE4iEW/3LqlYj9GFgGrFsFSH51dEEpUbYWBfeOv0q87WkUDxK2o/HhreSb7qMJqck70RVM6Lg96hgedcAYcOkA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.5.14': - resolution: {integrity: sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg==} + '@biomejs/cli-win32-arm64@2.5.15': + resolution: {integrity: sha512-2kPKzhNlm8C+Ru3GcO0Me2ODkCBLrVOUNuyi84RJyWDVKAA4+Kjj3jMjL938lF6BRfvltC4vB2nPY9SvN51Ovg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.14': - resolution: {integrity: sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ==} + '@biomejs/cli-win32-x64@2.5.15': + resolution: {integrity: sha512-yAzh4UqEImV6Hcy0zjUqNfJAsUhoD64FBQCdTG8Md/Z2wQeVP/ZmJ3XRYAs1g8J9fjTFyl2fCtc5FB5til47+g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -413,101 +413,101 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@oxc-project/types@0.151.0': - resolution: {integrity: sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==} + '@oxc-project/types@0.152.0': + resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==} - '@rolldown/binding-android-arm-eabi@1.2.11': - resolution: {integrity: sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==} + '@rolldown/binding-android-arm-eabi@1.2.12': + resolution: {integrity: sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.11': - resolution: {integrity: sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==} + '@rolldown/binding-android-arm64@1.2.12': + resolution: {integrity: sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.11': - resolution: {integrity: sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==} + '@rolldown/binding-darwin-arm64@1.2.12': + resolution: {integrity: sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.11': - resolution: {integrity: sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==} + '@rolldown/binding-darwin-x64@1.2.12': + resolution: {integrity: sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.11': - resolution: {integrity: sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==} + '@rolldown/binding-freebsd-x64@1.2.12': + resolution: {integrity: sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.11': - resolution: {integrity: sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.12': + resolution: {integrity: sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.11': - resolution: {integrity: sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==} + '@rolldown/binding-linux-arm64-gnu@1.2.12': + resolution: {integrity: sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.11': - resolution: {integrity: sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==} + '@rolldown/binding-linux-arm64-musl@1.2.12': + resolution: {integrity: sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.11': - resolution: {integrity: sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==} + '@rolldown/binding-linux-ppc64-gnu@1.2.12': + resolution: {integrity: sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.11': - resolution: {integrity: sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.12': + resolution: {integrity: sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.11': - resolution: {integrity: sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==} + '@rolldown/binding-linux-x64-gnu@1.2.12': + resolution: {integrity: sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.11': - resolution: {integrity: sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==} + '@rolldown/binding-linux-x64-musl@1.2.12': + resolution: {integrity: sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.11': - resolution: {integrity: sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==} + '@rolldown/binding-openharmony-arm64@1.2.12': + resolution: {integrity: sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.11': - resolution: {integrity: sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==} + '@rolldown/binding-win32-arm64-msvc@1.2.12': + resolution: {integrity: sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.11': - resolution: {integrity: sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==} + '@rolldown/binding-win32-x64-msvc@1.2.12': + resolution: {integrity: sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -524,8 +524,8 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/node@22.20.4': - resolution: {integrity: sha512-zJRE40jpHtKqE/C4fgHrAKQLJuSpzEnP9ff9Y7YtoR3Wd2pwqzlekDeEuUQXjRd+QCYnVnNwuJYmhdk9XV8gvA==} + '@types/node@24.19.0': + resolution: {integrity: sha512-zY+5tKxXdhGh1PYI0ac+7juvEu4OI6vWtVVoj5i2m42jxAY1U+zHGt6QCyOFwykdP62sM3MJ9stoYYUw5aCWew==} '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} @@ -647,11 +647,11 @@ packages: cpu: [x64] os: [win32] - '@vitest/coverage-v8@5.0.2': - resolution: {integrity: sha512-3ffHBEi8DOOBLwIGBhOBZbRfYFYWjMUuxZicONdhuFEFEG5AVsMOSrVeuROskqnqpbOmEJwxM2eTVZ9N3a1t+A==} + '@vitest/coverage-v8@5.0.3': + resolution: {integrity: sha512-+klsyz7BvT1vCU28Zkfzms1Ia78XD0V41U3FUtRaa3S+vOr/EXvK1O6BvVD7l1RzEjm6SONR2aybOvDDf9u0mQ==} peerDependencies: - '@vitest/browser': 5.0.2 - vitest: 5.0.2 + '@vitest/browser': 5.0.3 + vitest: 5.0.3 peerDependenciesMeta: '@vitest/browser': optional: true @@ -664,8 +664,8 @@ packages: resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==} engines: {node: '>=22'} - '@vitest/mocker@5.0.2': - resolution: {integrity: sha512-Z5FS00Q1SJHkB35xATsmWGdQ5WA1/0MV3CDjqyv7GavHv1OfOj145MNfHOlHk7QLes21dKFDHr8EO2zvL+9WGA==} + '@vitest/mocker@5.0.3': + resolution: {integrity: sha512-T8sWAIbkSyAjkwTcaEc3Iu0o9A27X1/kdXrizhZkGuSKScRQtRzclfAMpOTcGdXCsqxeWlpGy3XjqaW8CpLORg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -675,8 +675,8 @@ packages: vite: optional: true - '@vitest/spy@5.0.2': - resolution: {integrity: sha512-Ijc7T1nT9efNb5LxvjaBrEqw3f/QwUv5EE0nKqZxgqsaV/FxAAZ8baGylA8X/Z2oS4Lp+K74Jr6dTJsDKxJDeg==} + '@vitest/spy@5.0.3': + resolution: {integrity: sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg==} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} @@ -685,8 +685,8 @@ packages: ast-v8-to-istanbul@1.0.7: resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==} - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} engines: {node: '>=18'} chardet@2.2.0: @@ -848,8 +848,8 @@ packages: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} - rolldown@1.2.11: - resolution: {integrity: sha512-qpSwIyz0jHQq5qXBTNxFmE6664rJ7O+4TvPFOiOaBSrz8IOHc1koKKSqTM2H6u1UG1+TveuC6vaDHKXFOvb1Kw==} + rolldown@1.2.12: + resolution: {integrity: sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -860,12 +860,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} - std-env@4.2.0: - resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} tinybench@6.2.0: resolution: {integrity: sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==} @@ -879,8 +879,8 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.1: - resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} typescript@7.0.2: @@ -888,8 +888,8 @@ packages: engines: {node: '>=16.20.0'} hasBin: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} vite@8.3.1: resolution: {integrity: sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==} @@ -934,20 +934,20 @@ packages: yaml: optional: true - vitest@5.0.2: - resolution: {integrity: sha512-7MQrx9pDv5aHiUcovIb/70Ys3tgtkUVgCtledvKdCmEO+/1Dicq5ZqoSxOW034m03oqC+oHOKui2dM6qtMLoJg==} + vitest@5.0.3: + resolution: {integrity: sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.2 - '@vitest/browser-preview': 5.0.2 + '@vitest/browser-playwright': 5.0.3 + '@vitest/browser-preview': 5.0.3 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.2 - '@vitest/coverage-v8': 5.0.2 - '@vitest/ui': 5.0.2 + '@vitest/coverage-istanbul': 5.0.3 + '@vitest/coverage-v8': 5.0.3 + '@vitest/ui': 5.0.3 happy-dom: '*' jsdom: '*' vite: ^6.4.0 || ^7.0.0 || ^8.0.0 @@ -975,8 +975,8 @@ packages: jsdom: optional: true - why-is-node-running@3.2.2: - resolution: {integrity: sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A==} + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} engines: {node: '>=20.11'} hasBin: true @@ -997,159 +997,159 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.5.14': + '@biomejs/biome@2.5.15': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.14 - '@biomejs/cli-darwin-x64': 2.5.14 - '@biomejs/cli-linux-arm64': 2.5.14 - '@biomejs/cli-linux-arm64-musl': 2.5.14 - '@biomejs/cli-linux-x64': 2.5.14 - '@biomejs/cli-linux-x64-musl': 2.5.14 - '@biomejs/cli-win32-arm64': 2.5.14 - '@biomejs/cli-win32-x64': 2.5.14 + '@biomejs/cli-darwin-arm64': 2.5.15 + '@biomejs/cli-darwin-x64': 2.5.15 + '@biomejs/cli-linux-arm64': 2.5.15 + '@biomejs/cli-linux-arm64-musl': 2.5.15 + '@biomejs/cli-linux-x64': 2.5.15 + '@biomejs/cli-linux-x64-musl': 2.5.15 + '@biomejs/cli-win32-arm64': 2.5.15 + '@biomejs/cli-win32-x64': 2.5.15 - '@biomejs/cli-darwin-arm64@2.5.14': + '@biomejs/cli-darwin-arm64@2.5.15': optional: true - '@biomejs/cli-darwin-x64@2.5.14': + '@biomejs/cli-darwin-x64@2.5.15': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.14': + '@biomejs/cli-linux-arm64-musl@2.5.15': optional: true - '@biomejs/cli-linux-arm64@2.5.14': + '@biomejs/cli-linux-arm64@2.5.15': optional: true - '@biomejs/cli-linux-x64-musl@2.5.14': + '@biomejs/cli-linux-x64-musl@2.5.15': optional: true - '@biomejs/cli-linux-x64@2.5.14': + '@biomejs/cli-linux-x64@2.5.15': optional: true - '@biomejs/cli-win32-arm64@2.5.14': + '@biomejs/cli-win32-arm64@2.5.15': optional: true - '@biomejs/cli-win32-x64@2.5.14': + '@biomejs/cli-win32-x64@2.5.15': optional: true '@inquirer/ansi@2.0.8': {} - '@inquirer/checkbox@5.2.5(@types/node@22.20.4)': + '@inquirer/checkbox@5.2.5(@types/node@24.19.0)': dependencies: '@inquirer/ansi': 2.0.8 - '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/confirm@6.3.2(@types/node@22.20.4)': + '@inquirer/confirm@6.3.2(@types/node@24.19.0)': dependencies: - '@inquirer/core': 12.0.3(@types/node@22.20.4) - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/core@12.0.3(@types/node@22.20.4)': + '@inquirer/core@12.0.3(@types/node@24.19.0)': dependencies: '@inquirer/ansi': 2.0.8 '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@24.19.0) cli-width: 4.1.0 fast-wrap-ansi: 0.2.2 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/editor@5.3.3(@types/node@22.20.4)': + '@inquirer/editor@5.3.3(@types/node@24.19.0)': dependencies: - '@inquirer/core': 12.0.3(@types/node@22.20.4) - '@inquirer/external-editor': 3.0.5(@types/node@22.20.4) - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) + '@inquirer/external-editor': 3.0.5(@types/node@24.19.0) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/expand@5.1.5(@types/node@22.20.4)': + '@inquirer/expand@5.1.5(@types/node@24.19.0)': dependencies: - '@inquirer/core': 12.0.3(@types/node@22.20.4) - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/external-editor@3.0.5(@types/node@22.20.4)': + '@inquirer/external-editor@3.0.5(@types/node@24.19.0)': dependencies: chardet: 2.2.0 iconv-lite: 0.7.3 optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 '@inquirer/figures@2.0.9': {} - '@inquirer/input@5.1.6(@types/node@22.20.4)': + '@inquirer/input@5.1.6(@types/node@24.19.0)': dependencies: - '@inquirer/core': 12.0.3(@types/node@22.20.4) - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/number@4.2.3(@types/node@22.20.4)': + '@inquirer/number@4.2.3(@types/node@24.19.0)': dependencies: - '@inquirer/core': 12.0.3(@types/node@22.20.4) - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/password@5.2.2(@types/node@22.20.4)': + '@inquirer/password@5.2.2(@types/node@24.19.0)': dependencies: '@inquirer/ansi': 2.0.8 - '@inquirer/core': 12.0.3(@types/node@22.20.4) - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/prompts@8.7.2(@types/node@22.20.4)': + '@inquirer/prompts@8.7.2(@types/node@24.19.0)': dependencies: - '@inquirer/checkbox': 5.2.5(@types/node@22.20.4) - '@inquirer/confirm': 6.3.2(@types/node@22.20.4) - '@inquirer/editor': 5.3.3(@types/node@22.20.4) - '@inquirer/expand': 5.1.5(@types/node@22.20.4) - '@inquirer/input': 5.1.6(@types/node@22.20.4) - '@inquirer/number': 4.2.3(@types/node@22.20.4) - '@inquirer/password': 5.2.2(@types/node@22.20.4) - '@inquirer/rawlist': 5.3.5(@types/node@22.20.4) - '@inquirer/search': 4.3.3(@types/node@22.20.4) - '@inquirer/select': 5.2.5(@types/node@22.20.4) + '@inquirer/checkbox': 5.2.5(@types/node@24.19.0) + '@inquirer/confirm': 6.3.2(@types/node@24.19.0) + '@inquirer/editor': 5.3.3(@types/node@24.19.0) + '@inquirer/expand': 5.1.5(@types/node@24.19.0) + '@inquirer/input': 5.1.6(@types/node@24.19.0) + '@inquirer/number': 4.2.3(@types/node@24.19.0) + '@inquirer/password': 5.2.2(@types/node@24.19.0) + '@inquirer/rawlist': 5.3.5(@types/node@24.19.0) + '@inquirer/search': 4.3.3(@types/node@24.19.0) + '@inquirer/select': 5.2.5(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/rawlist@5.3.5(@types/node@22.20.4)': + '@inquirer/rawlist@5.3.5(@types/node@24.19.0)': dependencies: - '@inquirer/core': 12.0.3(@types/node@22.20.4) - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/search@4.3.3(@types/node@22.20.4)': + '@inquirer/search@4.3.3(@types/node@24.19.0)': dependencies: - '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/select@5.2.5(@types/node@22.20.4)': + '@inquirer/select@5.2.5(@types/node@24.19.0)': dependencies: '@inquirer/ansi': 2.0.8 - '@inquirer/core': 12.0.3(@types/node@22.20.4) + '@inquirer/core': 12.0.3(@types/node@24.19.0) '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@22.20.4) + '@inquirer/type': 4.1.1(@types/node@24.19.0) optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 - '@inquirer/type@4.1.1(@types/node@22.20.4)': + '@inquirer/type@4.1.1(@types/node@24.19.0)': optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 '@jridgewell/resolve-uri@3.1.2': {} @@ -1160,51 +1160,51 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 - '@oxc-project/types@0.151.0': {} + '@oxc-project/types@0.152.0': {} - '@rolldown/binding-android-arm-eabi@1.2.11': + '@rolldown/binding-android-arm-eabi@1.2.12': optional: true - '@rolldown/binding-android-arm64@1.2.11': + '@rolldown/binding-android-arm64@1.2.12': optional: true - '@rolldown/binding-darwin-arm64@1.2.11': + '@rolldown/binding-darwin-arm64@1.2.12': optional: true - '@rolldown/binding-darwin-x64@1.2.11': + '@rolldown/binding-darwin-x64@1.2.12': optional: true - '@rolldown/binding-freebsd-x64@1.2.11': + '@rolldown/binding-freebsd-x64@1.2.12': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.11': + '@rolldown/binding-linux-arm-gnueabihf@1.2.12': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.11': + '@rolldown/binding-linux-arm64-gnu@1.2.12': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.11': + '@rolldown/binding-linux-arm64-musl@1.2.12': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.11': + '@rolldown/binding-linux-ppc64-gnu@1.2.12': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.11': + '@rolldown/binding-linux-s390x-gnu@1.2.12': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.11': + '@rolldown/binding-linux-x64-gnu@1.2.12': optional: true - '@rolldown/binding-linux-x64-musl@1.2.11': + '@rolldown/binding-linux-x64-musl@1.2.12': optional: true - '@rolldown/binding-openharmony-arm64@1.2.11': + '@rolldown/binding-openharmony-arm64@1.2.12': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.11': + '@rolldown/binding-win32-arm64-msvc@1.2.12': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.11': + '@rolldown/binding-win32-x64-msvc@1.2.12': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -1218,9 +1218,9 @@ snapshots: '@types/estree@1.0.9': {} - '@types/node@22.20.4': + '@types/node@24.19.0': dependencies: - undici-types: 6.21.0 + undici-types: 7.24.6 '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -1282,7 +1282,7 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true - '@vitest/coverage-v8@5.0.2(vitest@5.0.2)': + '@vitest/coverage-v8@5.0.3(vitest@5.0.3)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/istanbul-lib-coverage': 1.0.2 @@ -1290,9 +1290,9 @@ snapshots: ast-v8-to-istanbul: 1.0.7 magicast: 0.5.5 obug: 2.2.1 - std-env: 4.2.0 - tinyrainbow: 3.1.1 - vitest: 5.0.2(@types/node@22.20.4)(@vitest/coverage-v8@5.0.2)(vite@8.3.1(@types/node@22.20.4)) + std-env: 4.3.0 + tinyrainbow: 3.2.0 + vitest: 5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)) '@vitest/istanbul-lib-coverage@1.0.2': {} @@ -1300,16 +1300,16 @@ snapshots: dependencies: '@vitest/istanbul-lib-coverage': 1.0.2 - '@vitest/mocker@5.0.2(vite@8.3.1(@types/node@22.20.4))': + '@vitest/mocker@5.0.3(vite@8.3.1(@types/node@24.19.0))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.2 + '@vitest/spy': 5.0.3 estree-walker: 3.0.3 magic-string: 1.4.2 optionalDependencies: - vite: 8.3.1(@types/node@22.20.4) + vite: 8.3.1(@types/node@24.19.0) - '@vitest/spy@5.0.2': {} + '@vitest/spy@5.0.3': {} assertion-error@2.0.1: {} @@ -1319,7 +1319,7 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 - chai@6.2.2: {} + chai@6.3.0: {} chardet@2.2.0: {} @@ -1417,7 +1417,7 @@ snapshots: dependencies: '@babel/parser': 7.29.9 '@babel/types': 7.29.8 - source-map-js: 1.2.1 + source-map-js: 1.2.2 mute-stream@3.0.0: {} @@ -1433,36 +1433,36 @@ snapshots: dependencies: nanoid: 3.3.19 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 - rolldown@1.2.11: + rolldown@1.2.12: dependencies: - '@oxc-project/types': 0.151.0 + '@oxc-project/types': 0.152.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.11 - '@rolldown/binding-android-arm64': 1.2.11 - '@rolldown/binding-darwin-arm64': 1.2.11 - '@rolldown/binding-darwin-x64': 1.2.11 - '@rolldown/binding-freebsd-x64': 1.2.11 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.11 - '@rolldown/binding-linux-arm64-gnu': 1.2.11 - '@rolldown/binding-linux-arm64-musl': 1.2.11 - '@rolldown/binding-linux-ppc64-gnu': 1.2.11 - '@rolldown/binding-linux-s390x-gnu': 1.2.11 - '@rolldown/binding-linux-x64-gnu': 1.2.11 - '@rolldown/binding-linux-x64-musl': 1.2.11 - '@rolldown/binding-openharmony-arm64': 1.2.11 - '@rolldown/binding-win32-arm64-msvc': 1.2.11 - '@rolldown/binding-win32-x64-msvc': 1.2.11 + '@rolldown/binding-android-arm-eabi': 1.2.12 + '@rolldown/binding-android-arm64': 1.2.12 + '@rolldown/binding-darwin-arm64': 1.2.12 + '@rolldown/binding-darwin-x64': 1.2.12 + '@rolldown/binding-freebsd-x64': 1.2.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.12 + '@rolldown/binding-linux-arm64-gnu': 1.2.12 + '@rolldown/binding-linux-arm64-musl': 1.2.12 + '@rolldown/binding-linux-ppc64-gnu': 1.2.12 + '@rolldown/binding-linux-s390x-gnu': 1.2.12 + '@rolldown/binding-linux-x64-gnu': 1.2.12 + '@rolldown/binding-linux-x64-musl': 1.2.12 + '@rolldown/binding-openharmony-arm64': 1.2.12 + '@rolldown/binding-win32-arm64-msvc': 1.2.12 + '@rolldown/binding-win32-x64-msvc': 1.2.12 safer-buffer@2.1.2: {} signal-exit@4.1.0: {} - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} - std-env@4.2.0: {} + std-env@4.3.0: {} tinybench@6.2.0: {} @@ -1473,7 +1473,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinyrainbow@3.1.1: {} + tinyrainbow@3.2.0: {} typescript@7.0.2: optionalDependencies: @@ -1498,39 +1498,39 @@ snapshots: '@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-x64': 7.0.2 - undici-types@6.21.0: {} + undici-types@7.24.6: {} - vite@8.3.1(@types/node@22.20.4): + vite@8.3.1(@types/node@24.19.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 postcss: 8.5.28 - rolldown: 1.2.11 + rolldown: 1.2.12 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 22.20.4 + '@types/node': 24.19.0 fsevents: 2.3.3 - vitest@5.0.2(@types/node@22.20.4)(@vitest/coverage-v8@5.0.2)(vite@8.3.1(@types/node@22.20.4)): + vitest@5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.2(vite@8.3.1(@types/node@22.20.4)) - chai: 6.2.2 + '@vitest/mocker': 5.0.3(vite@8.3.1(@types/node@24.19.0)) + chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 magic-string: 1.4.2 obug: 2.2.1 picomatch: 4.0.7 - std-env: 4.2.0 + std-env: 4.3.0 tinybench: 6.2.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.1(@types/node@22.20.4) - why-is-node-running: 3.2.2 + vite: 8.3.1(@types/node@24.19.0) + why-is-node-running: 3.2.1 optionalDependencies: - '@types/node': 22.20.4 - '@vitest/coverage-v8': 5.0.2(vitest@5.0.2) + '@types/node': 24.19.0 + '@vitest/coverage-v8': 5.0.3(vitest@5.0.3) transitivePeerDependencies: - msw - why-is-node-running@3.2.2: {} + why-is-node-running@3.2.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..3476775c --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,11 @@ +# Supply-chain protections for installing dependencies. + +# Wait a day before installing a newly published version: most malicious +# releases are found and removed within hours. +minimumReleaseAge: 1440 +# Refuse a version published with weaker trust evidence than earlier ones +# (for example, without provenance after releases that had it). +trustPolicy: no-downgrade +# No dependency may run install scripts unless listed here. +strictDepBuilds: true +onlyBuiltDependencies: [] diff --git a/src/cli.ts b/src/cli.ts index 92b64146..58056660 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,10 +1,10 @@ #!/usr/bin/env node import os from 'node:os' -import { History } from './history.js' -import { Output } from './output.js' -import { main } from './program.js' -import { interactivePrompts, nonInteractivePrompts } from './prompts.js' +import { History } from './history.ts' +import { Output } from './output.ts' +import { main } from './program.ts' +import { interactivePrompts, nonInteractivePrompts } from './prompts.ts' const home = os.homedir() diff --git a/src/commands/history.ts b/src/commands/history.ts index 8e966096..ba52585f 100644 --- a/src/commands/history.ts +++ b/src/commands/history.ts @@ -1,9 +1,9 @@ import type { Command } from 'commander' -import type { Context } from '../context.js' -import { CliError } from '../errors.js' -import type { Change, HistoryLine, KeptReason } from '../history.js' -import { plural } from '../output.js' +import type { Context } from '../context.ts' +import { CliError } from '../errors.ts' +import type { Change, HistoryLine, KeptReason } from '../history.ts' +import { plural } from '../output.ts' const DEFAULT_LIMIT = 20 diff --git a/src/commands/init.ts b/src/commands/init.ts index 31d96629..494ee450 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -4,12 +4,12 @@ import path from 'node:path' import type { Command } from 'commander' -import { ConfigStore } from '../config.js' -import type { Context } from '../context.js' -import { CliError } from '../errors.js' -import { redactUrl } from '../output.js' -import { configfilePaths, resolveUserPath } from '../paths.js' -import { gitClone } from '../process.js' +import { ConfigStore } from '../config.ts' +import type { Context } from '../context.ts' +import { CliError } from '../errors.ts' +import { redactUrl } from '../output.ts' +import { configfilePaths, resolveUserPath } from '../paths.ts' +import { gitClone } from '../process.ts' interface InitOptions { force?: boolean @@ -97,7 +97,9 @@ async function init(options: InitOptions, ctx: Context): Promise { case 'missing': case 'empty': await mkdir(folderPath, { recursive: true }).catch(error => { - throw new CliError(`Cannot create ${folderPath}: ${(error as Error).message}`) + throw new CliError(`Cannot create ${folderPath}: ${(error as Error).message}`, { + cause: error, + }) }) output.info(`Cloning ${redactUrl(repoUrl)} into ${folderPath}…`) await gitClone(repoUrl, folderPath, ctx) @@ -111,6 +113,7 @@ async function init(options: InitOptions, ctx: Context): Promise { throw new CliError( `${(error as Error).message} The repository is in ${folderPath}: fix the problem and run ` + '"configfile init" again, it will reuse it.', + { cause: error }, ) } ctx.history.record({ kind: 'configured', file: store.path }) @@ -119,7 +122,7 @@ async function init(options: InitOptions, ctx: Context): Promise { async function inspectFolder(folderPath: string) { const fail = (error: unknown): never => { - throw new CliError(`Cannot use ${folderPath}: ${(error as Error).message}`) + throw new CliError(`Cannot use ${folderPath}: ${(error as Error).message}`, { cause: error }) } const link = await lstat(folderPath).catch(error => { diff --git a/src/commands/modules.ts b/src/commands/modules.ts index d01a34cd..fb200bef 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -1,6 +1,8 @@ +import { inspect } from 'node:util' + import type { Command } from 'commander' -import type { Context } from '../context.js' +import type { Context } from '../context.ts' import { type BackupCheck, type DeployContext, @@ -17,14 +19,14 @@ import { type UndeployDecision, type UndeployResult, undeployFile, -} from '../deploy.js' -import { CliError } from '../errors.js' -import { messageOf } from '../fsutil.js' -import { withLock } from '../lock.js' -import { plural } from '../output.js' -import { findRemovedFiles, type HeldBack, type RecordedFile } from '../removed.js' -import { loadRepository, type Module, type ModuleFile } from '../repository.js' -import { DeploymentRecord } from '../state.js' +} from '../deploy.ts' +import { CliError } from '../errors.ts' +import { messageOf } from '../fsutil.ts' +import { withLock } from '../lock.ts' +import { plural } from '../output.ts' +import { findRemovedFiles, type HeldBack, type RecordedFile } from '../removed.ts' +import { loadRepository, type Module, type ModuleFile } from '../repository.ts' +import { DeploymentRecord } from '../state.ts' type Strategy = ModuleFile['strategy'] type UsableModule = Extract @@ -567,8 +569,12 @@ function finish(failures: number, problems: string[], success: string, ctx: Cont function reportFileError(file: { target: string }, error: unknown, ctx: Context): void { ctx.output.error(`${file.target}: ${messageOf(error)}`) ctx.history.record({ kind: 'failed', target: file.target, reason: messageOf(error) }) - if (!(error instanceof CliError) && process.env.DEBUG != null) { - ctx.output.stderr.write(`${(error as Error).stack}\n`) + if (process.env.DEBUG != null) { + if (!(error instanceof CliError)) { + ctx.output.stderr.write(`${(error as Error).stack}\n`) + } else if (error.cause !== undefined) { + ctx.output.stderr.write(`Caused by: ${inspect(error.cause)}\n`) + } } } diff --git a/src/commands/scripts.ts b/src/commands/scripts.ts index 17585e73..dfe89380 100644 --- a/src/commands/scripts.ts +++ b/src/commands/scripts.ts @@ -1,11 +1,11 @@ import type { Command } from 'commander' -import { ConfigStore } from '../config.js' -import type { Context } from '../context.js' -import { CliError } from '../errors.js' -import { plural } from '../output.js' -import { runScript } from '../process.js' -import { listScripts, type Script } from '../repository.js' +import { ConfigStore } from '../config.ts' +import type { Context } from '../context.ts' +import { CliError } from '../errors.ts' +import { plural } from '../output.ts' +import { runScript } from '../process.ts' +import { listScripts, type Script } from '../repository.ts' export function registerScriptsCommand(program: Command, ctx: Context): void { const scripts = program @@ -68,7 +68,7 @@ async function run(name: string, args: string[], ctx: Context): Promise { ctx.history.record({ kind: 'script', name: script.name, file: script.path, exitCode: code }) if (code !== 0) { - throw new CliError(`Script "${name}" exited with code ${code}.`, code) + throw new CliError(`Script "${name}" exited with code ${code}.`, { exitCode: code }) } output.success(`Script "${name}" finished.`) diff --git a/src/commands/update.ts b/src/commands/update.ts index 85d546c2..662ec06d 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -3,16 +3,16 @@ import path from 'node:path' import type { Command } from 'commander' -import { ConfigStore } from '../config.js' -import type { Context } from '../context.js' -import { CliError } from '../errors.js' -import { errnoCode, messageOf } from '../fsutil.js' -import { plural } from '../output.js' -import { configfilePaths } from '../paths.js' -import { findRemovedFiles } from '../removed.js' -import { loadRepository } from '../repository.js' -import { DeploymentRecord } from '../state.js' -import { syncMirror } from '../sync.js' +import { ConfigStore } from '../config.ts' +import type { Context } from '../context.ts' +import { CliError } from '../errors.ts' +import { errnoCode, messageOf } from '../fsutil.ts' +import { plural } from '../output.ts' +import { configfilePaths } from '../paths.ts' +import { findRemovedFiles } from '../removed.ts' +import { loadRepository } from '../repository.ts' +import { DeploymentRecord } from '../state.ts' +import { syncMirror } from '../sync.ts' export function registerUpdateCommand(program: Command, ctx: Context): void { program @@ -32,7 +32,7 @@ async function update(ctx: Context): Promise { if (errnoCode(error) === 'ENOENT') { throw new CliError(`${folderPath} is not a git repository. Run "configfile init --force".`) } - throw new CliError(`Cannot read ${folderPath}: ${messageOf(error)}`) + throw new CliError(`Cannot read ${folderPath}: ${messageOf(error)}`, { cause: error }) } output.info(`Syncing ${folderPath}…`) diff --git a/src/config.ts b/src/config.ts index b724d13d..a725f8a5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,9 +2,9 @@ import { existsSync } from 'node:fs' import { readFile } from 'node:fs/promises' import path from 'node:path' -import { CliError, NotInitializedError } from './errors.js' -import { describeJsonError, messageOf, writeFileAtomic } from './fsutil.js' -import { resolveUserPath } from './paths.js' +import { CliError, NotInitializedError } from './errors.ts' +import { describeJsonError, messageOf, writeFileAtomic } from './fsutil.ts' +import { resolveUserPath } from './paths.ts' export interface Config { /** URL of the dotfiles git repository. */ @@ -124,6 +124,7 @@ export class ConfigStore { } catch (error) { throw new CliError( `Cannot save the configuration to ${this.path}: ${(error as Error).message}`, + { cause: error }, ) } } @@ -147,7 +148,7 @@ export class ConfigStore { content = await readFile(this.path, 'utf8') } catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null - throw new CliError(`Cannot read ${this.path}: ${(error as Error).message}`) + throw new CliError(`Cannot read ${this.path}: ${(error as Error).message}`, { cause: error }) } let data: unknown diff --git a/src/context.ts b/src/context.ts index b5fb9930..c105e56b 100644 --- a/src/context.ts +++ b/src/context.ts @@ -1,5 +1,5 @@ -import type { History } from './history.js' -import type { Output } from './output.js' +import type { History } from './history.ts' +import type { Output } from './output.ts' export interface Prompts { /** `false` when questions cannot be asked (stdin is not a terminal). */ diff --git a/src/deploy.ts b/src/deploy.ts index 103da03e..311111ed 100644 --- a/src/deploy.ts +++ b/src/deploy.ts @@ -2,7 +2,7 @@ import { lstatSync } from 'node:fs' import { cp, mkdir, open, readdir, readlink, realpath, rename, rm, symlink } from 'node:fs/promises' import path from 'node:path' -import { CliError } from './errors.js' +import { CliError } from './errors.ts' import { type Identity, identityOf, @@ -14,11 +14,11 @@ import { sameIdentity, siblingName, statOrNull, -} from './fsutil.js' -import { configfilePaths, contains } from './paths.js' -import type { RecordedFile } from './removed.js' -import type { ModuleFile } from './repository.js' -import { type Backup, type DeploymentRecord, isBackupPathOf } from './state.js' +} from './fsutil.ts' +import { configfilePaths, contains } from './paths.ts' +import type { RecordedFile } from './removed.ts' +import type { ModuleFile } from './repository.ts' +import { type Backup, type DeploymentRecord, isBackupPathOf } from './state.ts' /** * A file undeploy can work on: a file of a module, or one the repository no @@ -268,7 +268,9 @@ export async function undeployFile( await rename(backup.path, file.target) } catch (error) { await rename(removed, file.target).catch(() => {}) - throw new CliError(`Cannot put the backup ${backup.path} back: ${messageOf(error)}`) + throw new CliError(`Cannot put the backup ${backup.path} back: ${messageOf(error)}`, { + cause: error, + }) } } @@ -309,7 +311,9 @@ export function nextBackupPath(target: string): string { */ export async function assertUsableSource(file: ModuleFile): Promise { const stats = await statOrNull(file.source).catch(error => { - throw new CliError(`Cannot read source file ${file.source}: ${messageOf(error)}`) + throw new CliError(`Cannot read source file ${file.source}: ${messageOf(error)}`, { + cause: error, + }) }) if (stats == null) throw new CliError(`Source file ${file.source} does not exist.`) @@ -494,6 +498,7 @@ async function putBackAfterFailure( return new CliError( `${reason} The previous file is in ${backup} (it could not be put back: ` + `${messageOf(restoreError)}).`, + { cause: restoreError }, ) } } @@ -507,7 +512,9 @@ async function checkLatestBackup( if (backup == null || !isBackupPathOf(target, backup.path)) return null const stats = await lstatOrNull(backup.path).catch(error => { - throw new CliError(`Cannot check the backup ${backup.path}: ${messageOf(error)}`) + throw new CliError(`Cannot check the backup ${backup.path}: ${messageOf(error)}`, { + cause: error, + }) }) if (stats == null) return { path: backup.path, status: 'missing' } const replaced = @@ -550,23 +557,20 @@ async function sameContent(source: string, target: string): Promise { /** Compares two files of the same size by chunks, whatever their size. */ async function sameBytes(a: string, b: string): Promise { - const [handleA, handleB] = await Promise.all([open(a, 'r'), open(b, 'r')]) - try { - const size = 64 * 1024 - const bufferA = Buffer.alloc(size) - const bufferB = Buffer.alloc(size) - for (;;) { - const [readA, readB] = await Promise.all([ - handleA.read(bufferA, 0, size, null), - handleB.read(bufferB, 0, size, null), - ]) - if (readA.bytesRead !== readB.bytesRead) return false - if (readA.bytesRead === 0) return true - if (!bufferA.subarray(0, readA.bytesRead).equals(bufferB.subarray(0, readB.bytesRead))) { - return false - } + await using handleA = await open(a, 'r') + await using handleB = await open(b, 'r') + const size = 64 * 1024 + const bufferA = Buffer.alloc(size) + const bufferB = Buffer.alloc(size) + for (;;) { + const [readA, readB] = await Promise.all([ + handleA.read(bufferA, 0, size, null), + handleB.read(bufferB, 0, size, null), + ]) + if (readA.bytesRead !== readB.bytesRead) return false + if (readA.bytesRead === 0) return true + if (!bufferA.subarray(0, readA.bytesRead).equals(bufferB.subarray(0, readB.bytesRead))) { + return false } - } finally { - await Promise.all([handleA.close(), handleB.close()]) } } diff --git a/src/errors.ts b/src/errors.ts index 99dda623..d068516e 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -7,8 +7,12 @@ export class CliError extends Error { /** Always 1–255: an error must never end the process with success. */ readonly exitCode: number - constructor(message: string, exitCode = 1) { - super(message) + /** `cause`: the error behind this one, shown with `DEBUG=1`. */ + constructor( + message: string, + { exitCode = 1, cause }: { exitCode?: number; cause?: unknown } = {}, + ) { + super(message, cause === undefined ? undefined : { cause }) this.exitCode = Number.isInteger(exitCode) && exitCode > 0 && exitCode < 256 ? exitCode : 1 } } diff --git a/src/fsutil.ts b/src/fsutil.ts index ce02259f..cf59222d 100644 --- a/src/fsutil.ts +++ b/src/fsutil.ts @@ -89,11 +89,9 @@ export async function writeFileAtomic( { mode }: { mode: number }, ): Promise { const temporary = siblingName(file, 'write') - const handle = await open(temporary, 'wx', mode) - try { + { + await using handle = await open(temporary, 'wx', mode) await handle.writeFile(content) - } finally { - await handle.close() } try { await rename(temporary, file) diff --git a/src/history.ts b/src/history.ts index fcf463cb..5e61d205 100644 --- a/src/history.ts +++ b/src/history.ts @@ -4,12 +4,12 @@ import path from 'node:path' import { type Command, CommanderError } from 'commander' -import { ConfigStore, DEFAULT_HISTORY_SIZE } from './config.js' -import type { KeptState } from './deploy.js' -import { CliError, isPromptExit } from './errors.js' -import { errnoCode, lstatOrNull, messageOf } from './fsutil.js' -import { redactUrl } from './output.js' -import { configfilePaths } from './paths.js' +import { ConfigStore, DEFAULT_HISTORY_SIZE } from './config.ts' +import type { KeptState } from './deploy.ts' +import { CliError, isPromptExit } from './errors.ts' +import { errnoCode, lstatOrNull, messageOf } from './fsutil.ts' +import { redactUrl } from './output.ts' +import { configfilePaths } from './paths.ts' /** At most this many changes are written per run; the rest are counted. */ const MAX_CHANGES = 1000 @@ -352,6 +352,7 @@ export class History { constants.O_RDWR | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW, 0o600, ) + // Not `await using`: when both fail, the write error must be the one reported. let failure: unknown = null try { // A line left unfinished (a full disk, for example) must not swallow this one. @@ -412,19 +413,12 @@ export class History { /** Reads a file without following a symbolic link in its place. */ async function readRegularFile(file: string): Promise { - let handle: Awaited> - try { - handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW) - } catch (error) { + await using handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW).catch(error => { if (errnoCode(error) === 'ELOOP') throw new Error('it is a symbolic link, not a file') throw error - } - try { - if (!(await handle.stat()).isFile()) throw new Error('it is not a file') - return await handle.readFile('utf8') - } finally { - await handle.close() - } + }) + if (!(await handle.stat()).isFile()) throw new Error('it is not a file') + return await handle.readFile('utf8') } /** diff --git a/src/lock.ts b/src/lock.ts index 394e52f2..290500bb 100644 --- a/src/lock.ts +++ b/src/lock.ts @@ -2,9 +2,9 @@ import { mkdir, open, readFile, rm } from 'node:fs/promises' import path from 'node:path' import { setTimeout as sleep } from 'node:timers/promises' -import { CliError } from './errors.js' -import { errnoCode } from './fsutil.js' -import { configfilePaths } from './paths.js' +import { CliError } from './errors.ts' +import { errnoCode } from './fsutil.ts' +import { configfilePaths } from './paths.ts' const RETRY_DELAY_MS = 100 const MAX_WAIT_MS = 10_000 @@ -26,9 +26,8 @@ export async function withLock( const started = Date.now() for (;;) { try { - const handle = await open(lock, 'wx', 0o600) + await using handle = await open(lock, 'wx', 0o600) await handle.writeFile(String(process.pid)) - await handle.close() break } catch (error) { if (errnoCode(error) !== 'EEXIST') throw error diff --git a/src/output.ts b/src/output.ts index a607e979..cf0fcb1b 100644 --- a/src/output.ts +++ b/src/output.ts @@ -8,10 +8,13 @@ type Style = Parameters[0] * NO_COLOR, NODE_DISABLE_COLORS and FORCE_COLOR. */ export class Output { - constructor( - readonly stdout: NodeJS.WritableStream, - readonly stderr: NodeJS.WritableStream, - ) {} + readonly stdout: NodeJS.WritableStream + readonly stderr: NodeJS.WritableStream + + constructor(stdout: NodeJS.WritableStream, stderr: NodeJS.WritableStream) { + this.stdout = stdout + this.stderr = stderr + } /** Same messages, all on stderr: for commands whose stdout belongs to someone else. */ toStderr(): Output { diff --git a/src/process.ts b/src/process.ts index ec3b8858..619e992c 100644 --- a/src/process.ts +++ b/src/process.ts @@ -1,11 +1,11 @@ -import { spawn } from 'node:child_process' +import { type ChildProcess, spawn } from 'node:child_process' import { constants } from 'node:fs' import { access, open } from 'node:fs/promises' import { constants as osConstants } from 'node:os' import path from 'node:path' -import { CliError } from './errors.js' -import type { Script } from './repository.js' +import { CliError } from './errors.ts' +import type { Script } from './repository.ts' /** * Runs a command with inherited stdio and resolves with its exit code. @@ -17,10 +17,15 @@ import type { Script } from './repository.js' */ export function run(command: string, args: string[], { cwd }: { cwd: string }): Promise { return new Promise((resolve, reject) => { - const child = spawn(command, args, { cwd, stdio: 'inherit' }) - + // Installed before the child starts: a signal arriving in between would + // otherwise end configfile and leave the script running on its own. + let child: ChildProcess | undefined + let pending: NodeJS.Signals | undefined const ignore = () => {} - const forward = (signal: NodeJS.Signals) => child.kill(signal) + const forward = (signal: NodeJS.Signals) => { + if (child == null) pending = signal + else child.kill(signal) + } const handlers: [NodeJS.Signals, (signal: NodeJS.Signals) => void][] = [ ['SIGINT', ignore], ['SIGQUIT', ignore], @@ -32,6 +37,15 @@ export function run(command: string, args: string[], { cwd }: { cwd: string }): for (const [signal, handler] of handlers) process.off(signal, handler) } + try { + child = spawn(command, args, { cwd, stdio: 'inherit' }) + } catch (error) { + cleanup() + reject(error) + return + } + if (pending != null) child.kill(pending) + child.once('error', error => { cleanup() reject(error) @@ -116,31 +130,28 @@ function launchError(script: Script, interpreter: string | undefined, error: unk `Permission denied when running script "${script.name}" (${script.path}).`, ) default: - return new CliError(`Cannot run script "${script.name}": ${(error as Error).message}`) + return new CliError(`Cannot run script "${script.name}": ${(error as Error).message}`, { + cause: error, + }) } } /** Returns the interpreter and its arguments from a `#!` first line, if any. */ async function readShebang(script: Script): Promise<[string, ...string[]] | null> { - let handle: Awaited> - try { - handle = await open(script.path, 'r') - } catch (error) { - throw new CliError(`Cannot read script "${script.name}": ${(error as Error).message}`) - } + await using handle = await open(script.path, 'r').catch(error => { + throw new CliError(`Cannot read script "${script.name}": ${(error as Error).message}`, { + cause: error, + }) + }) - try { - const buffer = Buffer.alloc(512) - const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0) - const [firstLine = ''] = buffer.toString('utf8', 0, bytesRead).split(/\r?\n/) + const buffer = Buffer.alloc(512) + const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0) + const [firstLine = ''] = buffer.toString('utf8', 0, bytesRead).split(/\r?\n/) - if (!firstLine.startsWith('#!')) return null + if (!firstLine.startsWith('#!')) return null - const [interpreter, ...interpreterArgs] = firstLine.slice(2).trim().split(/\s+/) - return interpreter ? [interpreter, ...interpreterArgs] : null - } finally { - await handle.close() - } + const [interpreter, ...interpreterArgs] = firstLine.slice(2).trim().split(/\s+/) + return interpreter ? [interpreter, ...interpreterArgs] : null } async function isExecutable(file: string): Promise { @@ -209,6 +220,6 @@ export async function git(args: string[], { cwd }: { cwd: string }, label: strin } if (code !== 0) { - throw new CliError(`${label} failed (exit code ${code}).`, code) + throw new CliError(`${label} failed (exit code ${code}).`, { exitCode: code }) } } diff --git a/src/program.ts b/src/program.ts index be0e2c64..950de6df 100644 --- a/src/program.ts +++ b/src/program.ts @@ -1,16 +1,17 @@ import { readFileSync } from 'node:fs' +import { inspect } from 'node:util' import { Command, CommanderError } from 'commander' -import { registerHistoryCommand } from './commands/history.js' -import { registerInitCommand } from './commands/init.js' -import { registerModulesCommand } from './commands/modules.js' -import { registerScriptsCommand } from './commands/scripts.js' -import { registerUpdateCommand } from './commands/update.js' -import type { Context } from './context.js' -import { CliError, isPromptExit } from './errors.js' -import { messageOf } from './fsutil.js' -import { describeInvocation, type Invocation, shouldRecord } from './history.js' +import { registerHistoryCommand } from './commands/history.ts' +import { registerInitCommand } from './commands/init.ts' +import { registerModulesCommand } from './commands/modules.ts' +import { registerScriptsCommand } from './commands/scripts.ts' +import { registerUpdateCommand } from './commands/update.ts' +import type { Context } from './context.ts' +import { CliError, isPromptExit } from './errors.ts' +import { messageOf } from './fsutil.ts' +import { describeInvocation, type Invocation, shouldRecord } from './history.ts' const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string @@ -88,6 +89,10 @@ async function execute( if (error instanceof CliError) { ctx.output.error(error.message) + // The error behind it (a system error, for example), for bug reports. + if (process.env.DEBUG != null && error.cause !== undefined) { + ctx.output.stderr.write(`Caused by: ${inspect(error.cause)}\n`) + } return { code: error.exitCode, error } } diff --git a/src/prompts.ts b/src/prompts.ts index 94074906..0b1bac4d 100644 --- a/src/prompts.ts +++ b/src/prompts.ts @@ -1,7 +1,7 @@ import { confirm, input } from '@inquirer/prompts' -import type { Prompts } from './context.js' -import { CliError } from './errors.js' +import type { Prompts } from './context.ts' +import { CliError } from './errors.ts' export const interactivePrompts: Prompts = { interactive: true, confirm, input } diff --git a/src/removed.ts b/src/removed.ts index e561fa39..ef02228d 100644 --- a/src/removed.ts +++ b/src/removed.ts @@ -1,10 +1,10 @@ import { realpath } from 'node:fs/promises' import path from 'node:path' -import { lstatOrNull } from './fsutil.js' -import { contains, resolveUserPath } from './paths.js' -import type { Entry, Module, ModuleFile } from './repository.js' -import type { DeploymentRecord, TargetRecord } from './state.js' +import { lstatOrNull } from './fsutil.ts' +import { contains, resolveUserPath } from './paths.ts' +import type { Entry, Module, ModuleFile } from './repository.ts' +import type { DeploymentRecord, TargetRecord } from './state.ts' /** * A file configfile deployed for an entry the repository no longer deploys, diff --git a/src/repository.ts b/src/repository.ts index 8ae9698c..61f1c8df 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -2,11 +2,11 @@ import type { Dirent, Stats } from 'node:fs' import { readdir, readFile, stat } from 'node:fs/promises' import path from 'node:path' -import { ConfigStore } from './config.js' -import type { Context } from './context.js' -import { CliError } from './errors.js' -import { describeJsonError } from './fsutil.js' -import { configfilePaths, contains, resolveUserPath, slugify } from './paths.js' +import { ConfigStore } from './config.ts' +import type { Context } from './context.ts' +import { CliError } from './errors.ts' +import { describeJsonError } from './fsutil.ts' +import { configfilePaths, contains, resolveUserPath, slugify } from './paths.ts' export interface ModuleFile { /** Absolute path of the file inside its module folder. */ @@ -426,7 +426,7 @@ async function readDirOrFail(dir: string): Promise { if (code === 'ENOTDIR') { throw new CliError(`${dir} is not a folder.`) } - throw new CliError(`Cannot read ${dir}: ${(error as Error).message}`) + throw new CliError(`Cannot read ${dir}: ${(error as Error).message}`, { cause: error }) } return entries.sort((a, b) => a.name.localeCompare(b.name)) diff --git a/src/state.ts b/src/state.ts index 683753a0..26f31dad 100644 --- a/src/state.ts +++ b/src/state.ts @@ -1,7 +1,7 @@ import { mkdir, readFile } from 'node:fs/promises' import path from 'node:path' -import { CliError } from './errors.js' +import { CliError } from './errors.ts' import { describeJsonError, type Identity, @@ -11,9 +11,9 @@ import { realpathOfExisting, sameIdentity, writeFileAtomic, -} from './fsutil.js' -import { configfilePaths } from './paths.js' -import type { Entry } from './repository.js' +} from './fsutil.ts' +import { configfilePaths } from './paths.ts' +import type { Entry } from './repository.ts' /** A file configfile moved aside, as it was when moved. */ export interface Backup { @@ -83,7 +83,7 @@ export class DeploymentRecord { if ((error as NodeJS.ErrnoException).code === 'ENOENT') { return new DeploymentRecord(filePath, {}) } - throw new CliError(`Cannot read ${filePath}: ${messageOf(error)}`) + throw new CliError(`Cannot read ${filePath}: ${messageOf(error)}`, { cause: error }) } let state: unknown @@ -164,7 +164,7 @@ export class DeploymentRecord { await mkdir(path.dirname(this.path), { recursive: true, mode: 0o700 }) await writeFileAtomic(this.path, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 }) } catch (error) { - throw new CliError(`Cannot save ${this.path}: ${messageOf(error)}`) + throw new CliError(`Cannot save ${this.path}: ${messageOf(error)}`, { cause: error }) } this.#state = state } diff --git a/src/sync.ts b/src/sync.ts index e47ff6fa..534d53ed 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -1,9 +1,9 @@ import { mkdir } from 'node:fs/promises' import path from 'node:path' -import { CliError } from './errors.js' -import { writeFileAtomic } from './fsutil.js' -import { git, gitOutput } from './process.js' +import { CliError } from './errors.ts' +import { writeFileAtomic } from './fsutil.ts' +import { git, gitOutput } from './process.ts' export interface SyncResult { /** The remote branch the mirror follows, such as `origin/main`. */ diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 0a8b6d41..7ce0d012 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -18,8 +18,8 @@ import path from 'node:path' import { describe, expect, it } from 'vitest' -import { COMMANDS } from '../src/history.js' -import { buildProgram } from '../src/program.js' +import { COMMANDS } from '../src/history.ts' +import { buildProgram } from '../src/program.ts' import { createContext, createRemote, @@ -28,7 +28,7 @@ import { readHistory, runCli, type Sandbox, -} from './helpers.js' +} from './helpers.ts' async function withModule(sandbox: Sandbox) { await sandbox.configure() diff --git a/tests/config.test.ts b/tests/config.test.ts index 056d07c3..2a088571 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -1,10 +1,10 @@ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' import { describe, expect, it } from 'vitest' -import { ConfigStore } from '../src/config.js' -import { CliError, NotInitializedError } from '../src/errors.js' -import { redactUrl } from '../src/output.js' -import { createSandbox } from './helpers.js' +import { ConfigStore } from '../src/config.ts' +import { CliError, NotInitializedError } from '../src/errors.ts' +import { redactUrl } from '../src/output.ts' +import { createSandbox } from './helpers.ts' describe('ConfigStore', () => { it('reports a missing configuration', async () => { diff --git a/tests/deploy.test.ts b/tests/deploy.test.ts index e933018f..29e101af 100644 --- a/tests/deploy.test.ts +++ b/tests/deploy.test.ts @@ -22,11 +22,11 @@ import { inspectFile, planDeploy, undeployFile, -} from '../src/deploy.js' -import { CliError } from '../src/errors.js' -import type { ModuleFile } from '../src/repository.js' -import { DeploymentRecord } from '../src/state.js' -import { createSandbox, type Sandbox } from './helpers.js' +} from '../src/deploy.ts' +import { CliError } from '../src/errors.ts' +import type { ModuleFile } from '../src/repository.ts' +import { DeploymentRecord } from '../src/state.ts' +import { createSandbox, type Sandbox } from './helpers.ts' const isRoot = process.getuid?.() === 0 diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts index c2f23b6e..b8d32b35 100644 --- a/tests/e2e.test.ts +++ b/tests/e2e.test.ts @@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url' import { afterEach, describe, expect, it } from 'vitest' -import { createSandbox, type Sandbox } from './helpers.js' +import { createSandbox, type Sandbox } from './helpers.ts' // Built by tests/global-setup.ts before the test run. const cli = fileURLToPath(new URL('../dist/cli.js', import.meta.url)) @@ -59,7 +59,8 @@ describe('built CLI', () => { ) }) - describe('signals during scripts run', () => { + // Several processes per test: allow for slow, busy CI machines. + describe('signals during scripts run', { timeout: 20_000 }, () => { // Each test runs in its own process group, killed afterwards: if signal // forwarding ever regresses, no script is left running on the machine. const groups: number[] = [] diff --git a/tests/helpers.ts b/tests/helpers.ts index 141f2012..63d8dab9 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -6,10 +6,10 @@ import { Writable } from 'node:stream' import { afterEach } from 'vitest' -import type { Context, Prompts } from '../src/context.js' -import { History, type HistoryLine } from '../src/history.js' -import { Output } from '../src/output.js' -import { main } from '../src/program.js' +import type { Context, Prompts } from '../src/context.ts' +import { History, type HistoryLine } from '../src/history.ts' +import { Output } from '../src/output.ts' +import { main } from '../src/program.ts' const sandboxes: string[] = [] diff --git a/tests/history.test.ts b/tests/history.test.ts index 9d78d395..c997d31e 100644 --- a/tests/history.test.ts +++ b/tests/history.test.ts @@ -5,7 +5,7 @@ import path from 'node:path' import { Command, CommanderError } from 'commander' import { describe, expect, it } from 'vitest' -import { CliError } from '../src/errors.js' +import { CliError } from '../src/errors.ts' import { describeInvocation, History, @@ -13,8 +13,8 @@ import { parseHistoryLine, redactCredentials, shouldRecord, -} from '../src/history.js' -import { createSandbox } from './helpers.js' +} from '../src/history.ts' +import { createSandbox } from './helpers.ts' const run = (overrides: Partial[0]> = {}) => ({ time: new Date('2026-10-01T09:00:00.000Z'), diff --git a/tests/lock.test.ts b/tests/lock.test.ts index dd3339f4..312308e5 100644 --- a/tests/lock.test.ts +++ b/tests/lock.test.ts @@ -4,8 +4,8 @@ import path from 'node:path' import { describe, expect, it } from 'vitest' -import { withLock } from '../src/lock.js' -import { createSandbox } from './helpers.js' +import { withLock } from '../src/lock.ts' +import { createSandbox } from './helpers.ts' describe('withLock', () => { it('runs the task while holding ~/.configfile/lock, then releases it', async () => { diff --git a/tests/repository.test.ts b/tests/repository.test.ts index 028df607..66efe43c 100644 --- a/tests/repository.test.ts +++ b/tests/repository.test.ts @@ -3,9 +3,9 @@ import path from 'node:path' import { describe, expect, it } from 'vitest' -import { CliError } from '../src/errors.js' -import { listModules, listScripts, type Module } from '../src/repository.js' -import { createSandbox, type Sandbox } from './helpers.js' +import { CliError } from '../src/errors.ts' +import { listModules, listScripts, type Module } from '../src/repository.ts' +import { createSandbox, type Sandbox } from './helpers.ts' const settings = (files: unknown) => JSON.stringify({ files }) diff --git a/tsconfig.json b/tsconfig.json index f1372671..4a0e5c6f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,8 +2,8 @@ "compilerOptions": { "rootDir": ".", "module": "nodenext", - "target": "es2023", - "lib": ["es2023"], + "target": "es2025", + "lib": ["es2025"], "types": ["node"], "strict": true, "noUncheckedIndexedAccess": true, @@ -11,6 +11,9 @@ "noImplicitOverride": true, "noFallthroughCasesInSwitch": true, "verbatimModuleSyntax": true, + "erasableSyntaxOnly": true, + "rewriteRelativeImportExtensions": true, + "noUncheckedSideEffectImports": true, "isolatedModules": true, "moduleDetection": "force", "skipLibCheck": true, diff --git a/vitest.config.ts b/vitest.config.ts index 516d3300..7c01f5f1 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -11,6 +11,8 @@ export default defineConfig({ provider: 'v8', include: ['src/**/*.ts'], exclude: ['src/cli.ts'], + // Just under the current coverage: a drop fails `pnpm test:coverage`. + thresholds: { statements: 90, branches: 87, functions: 88, lines: 91 }, }, }, }) From 957ee9e88dcc4d9d789f0cf8eb22b65056a44af1 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Fri, 2 Oct 2026 17:02:23 +0200 Subject: [PATCH 326/341] feat: say how to install git when it is missing (#289) --- CHANGELOG.md | 2 + README.md | 2 +- src/commands/init.ts | 23 ++-- src/commands/update.ts | 2 + src/process.ts | 269 ++++++++++++++++++++++++++++++++++++----- tests/commands.test.ts | 69 ++++++++++- tests/e2e.test.ts | 73 ++++++++++- tests/git.test.ts | 235 +++++++++++++++++++++++++++++++++++ 8 files changed, 633 insertions(+), 42 deletions(-) create mode 100644 tests/git.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e4a1df1..33c225e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#36](https://github.com/mindsers/configfile/issues/36)). - The `settings.json` format is documented in the README. - Releases are published to npm with a provenance statement, which `npm audit signatures` checks. +- `init` and `update` say how to install git when it is missing, or Apple's command line + developer tools on macOS, before cloning or syncing (`init` checks before asking for the URL). ### Changed - **Breaking:** Node.js 24.11 or later is required, and only macOS and Linux are supported. diff --git a/README.md b/README.md index 7454bd4b..4aa4867a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ - macOS or Linux - Node.js 24.11 or later -- git +- git (when it is missing, *configfile* says how to install it on your system) ## Installation diff --git a/src/commands/init.ts b/src/commands/init.ts index 494ee450..9d32abec 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -9,7 +9,7 @@ import type { Context } from '../context.ts' import { CliError } from '../errors.ts' import { redactUrl } from '../output.ts' import { configfilePaths, resolveUserPath } from '../paths.ts' -import { gitClone } from '../process.ts' +import { ensureGit, gitClone } from '../process.ts' interface InitOptions { force?: boolean @@ -56,6 +56,18 @@ async function init(options: InitOptions, ctx: Context): Promise { } } + // configfile's copy is a mirror it keeps in sync, not a working copy: by + // default it lives in configfile's own folder. An existing one is kept. + const own = configfilePaths(ctx.home) + const folderPath = + options.folder != null + ? resolveUserPath(options.folder.trim(), ctx) + : (previous.folderPath ?? own.dotfiles) + const folder = await inspectFolder(folderPath) + // A clone needs git: checked before asking for the URL, so a missing git is + // found before the URL is typed and before the folder to clone into is created. + if (folder === 'missing' || folder === 'empty') await ensureGit() + const repoUrl = ( options.repo ?? (await prompts.input({ @@ -72,18 +84,11 @@ async function init(options: InitOptions, ctx: Context): Promise { ) } - // configfile's copy is a mirror it keeps in sync, not a working copy: by - // default it lives in configfile's own folder. An existing one is kept. - const own = configfilePaths(ctx.home) - const folderPath = - options.folder != null - ? resolveUserPath(options.folder.trim(), ctx) - : (previous.folderPath ?? own.dotfiles) if (folderPath === own.dotfiles) { await mkdir(own.dir, { recursive: true, mode: 0o700 }) } - switch (await inspectFolder(folderPath)) { + switch (folder) { case 'not-a-directory': throw new CliError(`${folderPath} exists and is not a folder.`) case 'not-empty': diff --git a/src/commands/update.ts b/src/commands/update.ts index 662ec06d..64ff97c5 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -9,6 +9,7 @@ import { CliError } from '../errors.ts' import { errnoCode, messageOf } from '../fsutil.ts' import { plural } from '../output.ts' import { configfilePaths } from '../paths.ts' +import { ensureGit } from '../process.ts' import { findRemovedFiles } from '../removed.ts' import { loadRepository } from '../repository.ts' import { DeploymentRecord } from '../state.ts' @@ -35,6 +36,7 @@ async function update(ctx: Context): Promise { throw new CliError(`Cannot read ${folderPath}: ${messageOf(error)}`, { cause: error }) } + await ensureGit() output.info(`Syncing ${folderPath}…`) const result = await syncMirror(folderPath, configfilePaths(ctx.home).saved, { onSaved: file => ctx.history.record({ kind: 'saved-patch', file }), diff --git a/src/process.ts b/src/process.ts index 619e992c..79ea55aa 100644 --- a/src/process.ts +++ b/src/process.ts @@ -1,10 +1,11 @@ import { type ChildProcess, spawn } from 'node:child_process' -import { constants } from 'node:fs' -import { access, open } from 'node:fs/promises' +import { constants, type Stats } from 'node:fs' +import { access, open, readFile, stat } from 'node:fs/promises' import { constants as osConstants } from 'node:os' import path from 'node:path' import { CliError } from './errors.ts' +import { errnoCode, messageOf } from './fsutil.ts' import type { Script } from './repository.ts' /** @@ -172,39 +173,250 @@ export async function gitClone( await git(['clone', '--', url, folder], { cwd }, 'git clone') } +/** What a command run by `capture` did. */ +interface Captured { + /** `null` when the command was stopped by a signal. */ + code: number | null + signal: NodeJS.Signals | null + /** It did not end within the time allowed, and was killed. */ + timedOut: boolean + stdout: string + stderr: string +} + /** - * Runs git and returns its output, without showing it. Fails with git's own - * message unless `allowFailure` is set (then `null` is returned on failure). + * Runs a command and resolves with what it did, without showing its output. + * Rejects when the command cannot be started (`ENOENT`, `EACCES`…). + * + * With `timeoutMs`, the command runs in its own process group: when the time + * is up, the whole group is killed and the result is given at once, even if + * something it started (outside the group) still holds its output open. The + * terminal's signals no longer reach that group, so while it runs, configfile + * passes Ctrl+C, SIGTERM and SIGHUP on to it before ending as usual. + */ +function capture( + command: string, + args: string[], + { cwd, timeoutMs }: { cwd: string; timeoutMs?: number }, +): Promise { + return new Promise((resolve, reject) => { + const grouped = timeoutMs != null + const child = spawn(command, args, { + cwd, + stdio: ['ignore', 'pipe', 'pipe'], + detached: grouped, + }) + let stdout = '' + let stderr = '' + let settled = false + + const killGroup = (signal: NodeJS.Signals) => { + try { + if (child.pid != null) process.kill(-child.pid, signal) + } catch { + child.kill(signal) + } + } + // Ends configfile the way the signal would have, once the group is gone. + const forward = (signal: NodeJS.Signals) => { + killGroup(signal) + cleanup() + process.kill(process.pid, signal) + } + const signals: NodeJS.Signals[] = grouped ? ['SIGINT', 'SIGTERM', 'SIGHUP'] : [] + for (const signal of signals) process.on(signal, forward) + + const timer = grouped + ? setTimeout(() => { + killGroup('SIGKILL') + finish({ code: null, signal: 'SIGKILL', timedOut: true }) + }, timeoutMs) + : undefined + + function cleanup() { + clearTimeout(timer) + for (const signal of signals) process.off(signal, forward) + } + function finish(end: Pick) { + if (settled) return + settled = true + cleanup() + if (end.timedOut) { + // Something outside the group may still hold the pipes: stop reading them. + child.stdout.destroy() + child.stderr.destroy() + } + resolve({ ...end, stdout, stderr }) + } + + child.stdout.on('data', chunk => { + stdout += chunk + }) + child.stderr.on('data', chunk => { + stderr += chunk + }) + child.once('error', error => { + if (settled) return + settled = true + cleanup() + reject(error) + }) + child.once('close', (code, signal) => finish({ code, signal, timedOut: false })) + }) +} + +/** How a command that ran ended, for messages: "exit code 2" or "stopped by SIGKILL". */ +function describeEnd({ code, signal }: Pick): string { + return code == null ? `stopped by ${signal ?? 'a signal'}` : `exit code ${code}` +} + +/** + * Runs git and returns its output, without showing it. When git exits with an + * error, fails with git's own message, or returns `null` with `allowFailure`. + * Git that cannot be started always fails, saying why (see `startFailure`). */ export async function gitOutput( args: string[], { cwd, allowFailure = false }: { cwd: string; allowFailure?: boolean }, ): Promise { - const result = await new Promise<{ code: number | null; stdout: string; stderr: string }>( - (resolve, reject) => { - const child = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] }) - let stdout = '' - let stderr = '' - child.stdout.on('data', chunk => { - stdout += chunk - }) - child.stderr.on('data', chunk => { - stderr += chunk - }) - child.once('error', error => { - reject( - (error as NodeJS.ErrnoException).code === 'ENOENT' - ? new CliError('git is not installed or not in PATH.') - : error, - ) - }) - child.once('close', code => resolve({ code, stdout, stderr })) - }, - ) + const result = await capture('git', args, { cwd }).catch(async error => { + throw await startFailure(error, cwd) + }) if (result.code === 0) return result.stdout if (allowFailure) return null - throw new CliError(`git ${args[0]} failed: ${result.stderr.trim() || `exit code ${result.code}`}`) + throw new CliError(`git ${args[0]} failed: ${result.stderr.trim() || describeEnd(result)}`) +} + +/** Time allowed to `git --version`: it answers at once unless something is wrong. */ +const VERSION_TIMEOUT_MS = 10_000 + +/** + * Checks that git runs (`git --version`) before configfile needs it, so that + * nothing is started with a git that cannot work. A missing git, and on macOS + * the `/usr/bin/git` that only offers to install Apple's command line developer + * tools, fail with how to install them on this system. Any other failure says + * what went wrong: git's own message when it printed one, otherwise how it + * ended, or the time limit. `command` and `timeoutMs` replace `git` and the + * time allowed, for tests. + */ +export async function ensureGit({ + cwd = '/', + command = 'git', + timeoutMs = VERSION_TIMEOUT_MS, +}: { + /** `git --version` does not depend on it: `/` always exists, unlike a new home folder. */ + cwd?: string + command?: string + timeoutMs?: number +} = {}): Promise { + const result = await capture(command, ['--version'], { cwd, timeoutMs }).catch(async error => { + throw await startFailure(error, cwd) + }) + if (result.code === 0) return + + const output = `${result.stderr}\n${result.stdout}`.trim() + if (result.timedOut) { + throw new CliError( + `git did not answer within ${timeoutMs / 1000} seconds (git --version). ` + + 'Check the git found in PATH, or reinstall it.', + ) + } + // What macOS's git prints when the developer tools are not installed (it may + // also open a window offering to install them). Other xcrun errors, such as a + // wrong DEVELOPER_DIR or a removed Xcode, are reported as they are. + if ( + /invalid active developer path \(\/Library\/Developer\/CommandLineTools\)|No developer tools were found/.test( + output, + ) + ) { + throw new CliError( + `git needs Apple's command line developer tools (${firstLine(output)}). Install them with: ` + + 'xcode-select --install (a window offering to install them may already be open).', + ) + } + throw new CliError(`git does not work: ${output === '' ? describeEnd(result) : output}`) +} + +function firstLine(text: string): string { + return text.split('\n', 1)[0] ?? '' +} + +/** + * Why git could not be started: not installed, or not executable. Node also + * reports a missing working folder as `ENOENT`, so that is checked first. + */ +async function startFailure(error: unknown, cwd: string): Promise { + // Node reports a working folder it cannot enter like a missing or + // forbidden command: the folder is checked first, so git is not blamed. + const folder = await folderProblem(cwd) + if (folder != null) return new CliError(`Cannot run git in ${cwd}: ${folder}.`, { cause: error }) + + const hint = gitInstallHint(process.platform, await osRelease()) + switch (errnoCode(error)) { + case 'ENOENT': + return gitMissing(error) + case 'EACCES': + return new CliError( + 'git cannot be executed (permission denied). Check the git found in PATH and the ' + + `permissions of the folders in PATH, or reinstall git. ${hint}`, + { cause: error }, + ) + default: + return new CliError(`Cannot run git: ${messageOf(error)}`, { cause: error }) + } +} + +/** Why a command cannot run in `folder`, or `null` when it can. */ +async function folderProblem(folder: string): Promise { + const stats = await stat(folder).catch((error: unknown) => error) + if (stats instanceof Error) { + return errnoCode(stats) === 'ENOENT' + ? 'the folder does not exist' + : `the folder cannot be used (${messageOf(stats)})` + } + if (!(stats as Stats).isDirectory()) return 'it is not a folder' + const usable = await access(folder, constants.X_OK).then( + () => true, + () => false, + ) + return usable ? null : 'the folder cannot be opened (permission denied)' +} + +async function gitMissing(cause?: unknown): Promise { + return new CliError( + `git is not installed. ${gitInstallHint(process.platform, await osRelease())}`, + cause === undefined ? {} : { cause }, + ) +} + +/** How to install git on this system; `osRelease` is the content of `/etc/os-release`. */ +export function gitInstallHint(platform: NodeJS.Platform, osRelease: string | null): string { + if (platform === 'darwin') { + return 'Install it with: xcode-select --install (or: brew install git)' + } + const field = (name: string) => + new RegExp(`^${name}=["']?([^"'\n]*)`, 'm').exec(osRelease ?? '')?.[1]?.toLowerCase() ?? '' + const ids = [field('ID'), ...field('ID_LIKE').split(/\s+/)] + const commands: [string[], string][] = [ + [['debian', 'ubuntu'], 'sudo apt install git'], + [['fedora', 'rhel', 'centos'], 'sudo dnf install git'], + [['alpine'], 'sudo apk add git'], + [['arch'], 'sudo pacman -S git'], + [['suse', 'opensuse'], 'sudo zypper install git'], + ] + const known = commands.find(([names]) => names.some(name => ids.includes(name))) + return known == null + ? 'Install it with the package manager of your system.' + : `Install it with: ${known[1]}` +} + +async function osRelease(): Promise { + for (const file of ['/etc/os-release', '/usr/lib/os-release']) { + const content = await readFile(file, 'utf8').catch(() => null) + if (content != null) return content + } + return null } /** Runs git with its output shown to the user. */ @@ -213,10 +425,7 @@ export async function git(args: string[], { cwd }: { cwd: string }, label: strin try { code = await run('git', args, { cwd }) } catch (error) { - if ((error as NodeJS.ErrnoException).code === 'ENOENT') { - throw new CliError('git is not installed or not in PATH.') - } - throw error + throw await startFailure(error, cwd) } if (code !== 0) { diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 7ce0d012..f45f1e9a 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -16,7 +16,7 @@ import { } from 'node:fs/promises' import path from 'node:path' -import { describe, expect, it } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { COMMANDS } from '../src/history.ts' import { buildProgram } from '../src/program.ts' @@ -1449,6 +1449,73 @@ describe('init', () => { expect((await stat(path.join(sandbox.home, '.configfile'))).mode & 0o777).toBe(0o700) }) + it('checks git before asking for the repository URL', async () => { + const sandbox = await createSandbox() + vi.stubEnv('PATH', '/nonexistent') + + try { + const result = await runCli(sandbox, ['init'], ['https://example.com/dotfiles.git']) + + expect(result).toMatchObject({ code: 1, asked: [] }) + expect(result.stderr).toContain('git is not installed.') + expect(existsSync(path.join(sandbox.home, '.configfile/dotfiles'))).toBe(false) + } finally { + vi.unstubAllEnvs() + } + }) + + it('checks git before asking for the URL when the folder to clone into is empty', async () => { + const sandbox = await createSandbox() + const empty = path.join(sandbox.root, 'empty') + await mkdir(empty) + vi.stubEnv('PATH', '/nonexistent') + + try { + const result = await runCli( + sandbox, + ['init', '--folder', empty], + ['https://example.com/r.git'], + ) + + expect(result).toMatchObject({ code: 1, asked: [] }) + expect(result.stderr).toContain('git is not installed.') + } finally { + vi.unstubAllEnvs() + } + }) + + it('works with a home folder that does not exist yet', async () => { + const sandbox = await createSandbox() + const remote = await createRemote(sandbox) + await rm(sandbox.home, { recursive: true }) + + const result = await runCli(sandbox, ['init', '--repo', remote]) + + expect(result.code).toBe(0) + expect(existsSync(path.join(sandbox.home, '.configfile/dotfiles/files/.gitkeep'))).toBe(true) + }) + + it('reuses an existing repository without git', async () => { + const sandbox = await createSandbox() + await mkdir(path.join(sandbox.repo, '.git'), { recursive: true }) + vi.stubEnv('PATH', '/nonexistent') + + try { + const result = await runCli(sandbox, [ + 'init', + '--repo', + 'https://example.com/dotfiles.git', + '--folder', + sandbox.repo, + ]) + + expect(result.code).toBe(0) + expect(result.stdout).toContain('already contains a git repository') + } finally { + vi.unstubAllEnvs() + } + }) + it('can run without prompts', async () => { const sandbox = await createSandbox() const remote = await withRemote(sandbox) diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts index b8d32b35..3dacc41c 100644 --- a/tests/e2e.test.ts +++ b/tests/e2e.test.ts @@ -1,5 +1,6 @@ import { spawn, spawnSync } from 'node:child_process' -import { readdir, readFile } from 'node:fs/promises' +import { existsSync } from 'node:fs' +import { mkdir, readdir, readFile } from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' @@ -119,6 +120,76 @@ describe('built CLI', () => { }) }) + it('says how to install git when it is missing, before changing anything', async () => { + const sandbox = await createSandbox() + + const result = spawnSync( + process.execPath, + [cli, 'init', '--repo', 'https://example.com/dotfiles.git'], + { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1', PATH: '/nonexistent' }, + encoding: 'utf8', + }, + ) + + expect(result.status).toBe(1) + expect(result.stderr).toMatch(/git is not installed\. Install it with/) + expect(result.stdout).not.toContain('Cloning') + expect(existsSync(path.join(sandbox.home, '.configfile/dotfiles'))).toBe(false) + }) + + it('checks git before syncing', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await mkdir(path.join(sandbox.repo, '.git'), { recursive: true }) + + const result = spawnSync(process.execPath, [cli, 'update'], { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1', PATH: '/nonexistent' }, + encoding: 'utf8', + }) + + expect(result.status).toBe(1) + expect(result.stderr).toMatch(/git is not installed\. Install it with/) + expect(result.stdout).not.toContain('Syncing') + }) + + it('stops a hung git check on Ctrl+C, leaving nothing running', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await mkdir(path.join(sandbox.repo, '.git'), { recursive: true }) + const pidFile = path.join(sandbox.root, 'git.pid') + await sandbox.write('bin/git', `#!/bin/sh\necho $$ > "${pidFile}"\nexec sleep 60\n`, 0o755) + + const child = spawn(process.execPath, [cli, 'update'], { + cwd: sandbox.cwd, + env: { + ...process.env, + HOME: sandbox.home, + NO_COLOR: '1', + PATH: `${path.join(sandbox.root, 'bin')}:/usr/bin:/bin`, + }, + stdio: 'ignore', + }) + const ended = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(resolve => + child.on('close', (code, signal) => resolve({ code, signal })), + ) + let gitPid = 0 + while (gitPid === 0) { + await new Promise(resolve => setTimeout(resolve, 50)) + gitPid = Number(await readFile(pidFile, 'utf8').catch(() => '0')) + } + + // Only configfile gets the signal: the hung git is in its own process group. + child.kill('SIGINT') + const result = await ended + + expect(result).toEqual({ code: null, signal: 'SIGINT' }) + await new Promise(resolve => setTimeout(resolve, 100)) + expect(() => process.kill(gitPid, 0)).toThrow() + }) + it('never loses a file when several configfile processes deploy at once', async () => { const sandbox = await createSandbox() await sandbox.configure() diff --git a/tests/git.test.ts b/tests/git.test.ts new file mode 100644 index 00000000..ed2657bd --- /dev/null +++ b/tests/git.test.ts @@ -0,0 +1,235 @@ +import { readFile, symlink } from 'node:fs/promises' +import path from 'node:path' + +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { ensureGit, git, gitInstallHint, gitOutput } from '../src/process.ts' +import { createSandbox } from './helpers.ts' + +/** The os-release file of this machine, as configfile reads it. */ +async function osRelease(): Promise { + return readFile('/etc/os-release', 'utf8') + .catch(() => readFile('/usr/lib/os-release', 'utf8')) + .catch(() => null) +} + +/** What configfile says on this machine when git is missing. */ +async function missingGitMessage(): Promise { + return `git is not installed. ${gitInstallHint(process.platform, await osRelease())}` +} + +const DEBIAN_12 = `PRETTY_NAME="Debian GNU/Linux 12 (bookworm)" +NAME="Debian GNU/Linux" +VERSION_ID="12" +VERSION="12 (bookworm)" +VERSION_CODENAME=bookworm +ID=debian +HOME_URL="https://www.debian.org/" +` + +describe('gitInstallHint', () => { + it.each([ + ['macOS', 'darwin', null, 'xcode-select --install'], + ['Ubuntu', 'linux', 'NAME="Ubuntu"\nID=ubuntu\nID_LIKE=debian\n', 'sudo apt install git'], + ['Linux Mint', 'linux', 'ID=linuxmint\nID_LIKE="ubuntu debian"\n', 'sudo apt install git'], + // VERSION_ID comes before ID, as in the real file. + ['Debian 12', 'linux', DEBIAN_12, 'sudo apt install git'], + ['a commented line', 'linux', '# ID=fedora\nID=debian\n', 'sudo apt install git'], + ['Fedora', 'linux', 'ID=fedora\n', 'sudo dnf install git'], + ['Rocky Linux', 'linux', 'ID="rocky"\nID_LIKE="rhel centos fedora"\n', 'sudo dnf install git'], + ['Alpine', 'linux', 'ID=alpine\n', 'sudo apk add git'], + ['Arch', 'linux', 'ID=arch\n', 'sudo pacman -S git'], + [ + 'openSUSE', + 'linux', + 'ID="opensuse-tumbleweed"\nID_LIKE="opensuse suse"\n', + 'sudo zypper install git', + ], + ['an unknown Linux', 'linux', 'ID=plan9\n', 'the package manager of your system'], + ['a Linux without os-release', 'linux', null, 'the package manager of your system'], + ] as const)('%s', (_, platform, osRelease, expected) => { + expect(gitInstallHint(platform, osRelease)).toContain(expected) + }) +}) + +describe('ensureGit', () => { + /** A fake git: a shell script, executable unless `mode` says otherwise. */ + async function fakeGit(script: string, mode = 0o755) { + const sandbox = await createSandbox() + return { + cwd: sandbox.home, + command: await sandbox.write('bin/git', `#!/bin/sh\n${script}\n`, mode), + } + } + + it('accepts a working git', async () => { + const sandbox = await createSandbox() + + await expect(ensureGit({ cwd: sandbox.home })).resolves.toBeUndefined() + }) + + it('says how to install git on this system when it is missing', async () => { + // Computed first: the rejection must be awaited as soon as it exists. + const message = await missingGitMessage() + + await expect(ensureGit({ command: 'configfile-no-such-git' })).rejects.toThrow(message) + }) + + it('needs no particular folder', async () => { + await expect(ensureGit()).resolves.toBeUndefined() + }) + + it.each([ + [ + 'the xcrun error, on stderr', + 'echo "xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun" >&2; exit 1', + ], + [ + 'the xcode-select note', + 'echo "xcode-select: note: No developer tools were found, requesting install." >&2; exit 1', + ], + [ + 'the xcrun error, on stdout', + 'echo "xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)"; exit 1', + ], + ])("explains macOS's git that needs the developer tools: %s", async (_, script) => { + const options = await fakeGit(script) + + const failure = ensureGit(options) + + await expect(failure).rejects.toThrow( + /^git needs Apple's command line developer tools \(.+\)\. Install them with: xcode-select --install/, + ) + }) + + it('reports a removed Xcode as it is', async () => { + const options = await fakeGit( + 'echo "xcrun: error: invalid active developer path (/Applications/Xcode.app/Contents/Developer)" >&2; exit 1', + ) + + await expect(ensureGit(options)).rejects.toThrow( + 'git does not work: xcrun: error: invalid active developer path (/Applications/Xcode.app/Contents/Developer)', + ) + }) + + it('quotes only the first line of the developer tools message', async () => { + const options = await fakeGit( + 'echo "xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)" >&2; echo "second line" >&2; exit 1', + ) + + const failure = ensureGit(options) + + await expect(failure).rejects.toThrow( + "git needs Apple's command line developer tools (xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)). Install them with: xcode-select --install", + ) + }) + + it('reports other xcrun errors as they are', async () => { + const options = await fakeGit( + 'echo "xcrun: error: missing DEVELOPER_DIR path: /nowhere" >&2; exit 1', + ) + + await expect(ensureGit(options)).rejects.toThrow( + 'git does not work: xcrun: error: missing DEVELOPER_DIR path: /nowhere', + ) + }) + + it('reports a git that fails for another reason', async () => { + const options = await fakeGit('echo "error while loading shared libraries" >&2; exit 127') + + await expect(ensureGit(options)).rejects.toThrow( + 'git does not work: error while loading shared libraries', + ) + }) + + it('names the signal that stopped git', async () => { + const options = await fakeGit('kill -9 $$') + + await expect(ensureGit(options)).rejects.toThrow('git does not work: stopped by SIGKILL') + }) + + it('stops waiting for a git that does not answer', async () => { + const options = await fakeGit('sleep 30') + + await expect(ensureGit({ ...options, timeoutMs: 300 })).rejects.toThrow( + 'git did not answer within 0.3 seconds (git --version).', + ) + }) + + it('stops waiting on time even when something git started keeps its output open', async () => { + const sandbox = await createSandbox() + const pidFile = path.join(sandbox.root, 'escaped.pid') + // A child that leaves git's process group, so the group kill misses it. + const command = await sandbox.write( + 'bin/git', + `#!/bin/sh\nperl -e 'use POSIX; setsid(); sleep 20' &\necho $! > "${pidFile}"\nsleep 30\n`, + 0o755, + ) + const started = Date.now() + + try { + await expect(ensureGit({ command, timeoutMs: 300 })).rejects.toThrow( + 'git did not answer within 0.3 seconds', + ) + expect(Date.now() - started).toBeLessThan(3000) + } finally { + const pid = Number(await readFile(pidFile, 'utf8').catch(() => '')) + if (pid > 0) process.kill(pid, 'SIGKILL') + } + }) + + it('leaves no timer behind once git has answered', async () => { + const timers = () => process.getActiveResourcesInfo().filter(name => name === 'Timeout').length + const before = timers() + + await ensureGit() + + expect(timers()).toBe(before) + }) + + it('says when git cannot be executed', async () => { + const options = await fakeGit('exit 0', 0o644) + const hint = gitInstallHint(process.platform, await osRelease()) + + await expect(ensureGit(options)).rejects.toThrow( + 'git cannot be executed (permission denied). Check the git found in PATH and the ' + + `permissions of the folders in PATH, or reinstall git. ${hint}`, + ) + }) +}) + +describe('git and gitOutput', () => { + afterEach(() => { + vi.unstubAllEnvs() + }) + + it('say how to install git when it is missing', async () => { + const sandbox = await createSandbox() + vi.stubEnv('PATH', '/nonexistent') + const message = await missingGitMessage() + + await expect(gitOutput(['status'], { cwd: sandbox.root })).rejects.toThrow(message) + await expect(gitOutput(['status'], { cwd: sandbox.root, allowFailure: true })).rejects.toThrow( + message, + ) + await expect(git(['status'], { cwd: sandbox.root }, 'git status')).rejects.toThrow(message) + }) + + it('never blame git for a working folder that cannot be used', async () => { + const sandbox = await createSandbox() + const missing = path.join(sandbox.root, 'gone') + const brokenLink = path.join(sandbox.root, 'broken-link') + await symlink(path.join(sandbox.root, 'nowhere'), brokenLink) + const file = await sandbox.write('a-file', '') + + for (const [cwd, problem] of [ + [missing, 'the folder does not exist'], + [brokenLink, 'the folder does not exist'], + [file, 'it is not a folder'], + ] as const) { + const message = `Cannot run git in ${cwd}: ${problem}.` + await expect(gitOutput(['status'], { cwd })).rejects.toThrow(message) + await expect(git(['status'], { cwd }, 'git status')).rejects.toThrow(message) + } + }) +}) From 8d77b36e656f3cb6ab746bda527d1fcf535c268e Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Wed, 7 Oct 2026 19:04:50 +0200 Subject: [PATCH 327/341] chore: merge master back into develop after 1.0.0 (#304) --- .github/workflows/ci.yml | 9 ++++ CHANGELOG.md | 25 +++++++++-- README.md | 36 +++++++++++---- docs/home.md | 10 ++++- package.json | 4 +- src/cli.ts | 1 + src/commands/init.ts | 15 +++++-- src/commands/scripts.ts | 6 ++- src/commands/update.ts | 4 +- src/config.ts | 36 +++++++++++++-- src/context.ts | 10 ++++- src/git-url.ts | 85 +++++++++++++++++++++++++++++++++++ src/repository.ts | 37 +++++++++++++--- tests/commands.test.ts | 95 +++++++++++++++++++++++++++++++++++++--- tests/config.test.ts | 31 ++++++++++++- tests/git.test.ts | 56 +++++++++++++++++++++++ tests/helpers.ts | 31 +++++++++++-- tests/repository.test.ts | 65 ++++++++++++++++++++++++--- 18 files changed, 508 insertions(+), 48 deletions(-) create mode 100644 src/git-url.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1864c6e4..a53df2fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,6 +61,15 @@ jobs: version: 2026.9.18 # mise version, updated by Renovate - run: pnpm install --frozen-lockfile - run: pnpm pack --out "$RUNNER_TEMP/configfile.tgz" + - name: Check npm publishes package.json as written + # npm publish silently drops what it considers invalid (a "./" bin path + # removed the configfile command), which npm pack does not. + run: | + npm publish --dry-run 2>&1 | tee "$RUNNER_TEMP/publish.log" + if grep -q 'auto-corrected' "$RUNNER_TEMP/publish.log"; then + echo '::error::npm publish would change package.json: run "npm pkg fix" and commit.' + exit 1 + fi - name: Install and run the packed package working-directory: ${{ runner.temp }} # Installing the package just built is what this job tests. diff --git a/CHANGELOG.md b/CHANGELOG.md index 33c225e2..6270b32a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] + +## [1.0.0] - 2026-10-05 ### Added - The `modules undeploy` command to remove the files configfile deployed and restore the saved versions it made (recorded in `~/.configfile/`). @@ -20,11 +22,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 or `"none"` to keep a file in the repository without deploying it. - Arguments can be passed to scripts: `configfile scripts run -- `. - A script can be a folder containing an `index` file. +- A script can have a version for macOS or Linux (`setup.macos.sh`, `setup.linux.sh`), used instead + of the generic one (`setup.sh`) on that system. In 0.3.1, `setup.macos.sh` was simply another + `setup` script. - A history of what configfile changed, when, and whether it failed, in `~/.configfile/history.jsonl`, and the `history` command to see it ([#36](https://github.com/mindsers/configfile/issues/36)). - The `settings.json` format is documented in the README. - Releases are published to npm with a provenance statement, which `npm audit signatures` checks. +- configfile can be installed with Homebrew (`brew install mindsers/tap/configfile`), which also + installs Node.js and git, or with mise (`mise use --global npm:configfile`). - `init` and `update` say how to install git when it is missing, or Apple's command line developer tools on macOS, before cloning or syncing (`init` checks before asking for the URL). @@ -43,10 +50,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deploying refuses targets inside the dotfiles repository or the module, targets containing them, and configfile's own files, whatever the path used to reach them. - A `source_path` must stay inside its module folder. +- With `script_extensions`, a file is a script only when its extension is one of the list (`""` + means no extension). 0.3.1 kept any file whose name contained one of them. +- `modules deploy` and `modules undeploy` fail on a module name that does not exist, instead of + doing nothing. - Local copies follow symbolic links: a copy never points into the repository. - `settings.json` files written for configfile 0.3.1 (a plain list) are deprecated; put the list in a `"files"` key. -- `~/.configfilerc` is only readable by its owner. +- `~/.configfilerc` is only readable by its owner, since the repository URL may contain credentials. + A file other users can read, such as one written by 0.3.1, is made private when configfile + reads it, with a warning. - `init` reuses a folder that already contains the repository. - `init` only asks for the repository URL and clones it into `~/.configfile/dotfiles`, a copy configfile keeps in sync; `--folder` chooses another location. @@ -55,7 +68,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `~/.configfile/saved/`. ### Fixed -- Git URL verification in `init` command is less strict. ([#48](https://github.com/mindsers/configfile/issues/48)) +- `init` accepts every repository URL git accepts, such as `https://github.com/me/dotfiles.git`, which + 0.3.1 refused ([#48](https://github.com/mindsers/configfile/issues/48)). It still refuses the ones + git cannot clone from, and asks again in a terminal: a URL without a repository path, an unknown + protocol, or a local folder that does not exist. A local folder is saved as an absolute path. - Script standard outputs are correctly displayed ([!57](https://github.com/mindsers/configfile/pull/57), [#13](https://github.com/mindsers/configfile/issues/13)) - A failed `init` saved the configuration anyway. - Deploying a module could overwrite a previously saved `.old` file. @@ -101,14 +117,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The project adopt a new name: **configfile** instead of **configfiles**. **configfiles** is already reserved on npm. -## 0.1.0 - 2017-09-25 +## [0.1.0] - 2017-09-25 ### Added - The `init` command to initialize configuration files in the user session. - The `deploy` command to deploy modules of custom and saved configuration files. - The `run` command to run custom and saved scripts. Scripts can be write in all languages. - The README file to give first information on the project (installation, usage, etc.). -[Unreleased]: https://github.com/mindsers/configfile/tree/develop +[Unreleased]: https://github.com/mindsers/configfile/compare/1.0.0...HEAD +[1.0.0]: https://github.com/mindsers/configfile/tree/1.0.0 [0.3.1]: https://github.com/mindsers/configfile/tree/0.3.1 [0.3.0]: https://github.com/mindsers/configfile/tree/0.3.0 [0.2.1]: https://github.com/mindsers/configfile/tree/0.2.1 diff --git a/README.md b/README.md index 4aa4867a..ac7d8050 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,31 @@ ## Requirements - macOS or Linux -- Node.js 24.11 or later -- git (when it is missing, *configfile* says how to install it on your system) +- Node.js 24.11 or later (Homebrew installs it for you) +- git (Homebrew installs it for you; otherwise, when it is missing, *configfile* says how to install it on your system) ## Installation +With [Homebrew](https://brew.sh), on macOS or Linux (Node.js and git come with it): + +```bash +brew install mindsers/tap/configfile +``` + +With npm, when Node.js 24.11 or later is installed: + ```bash npm install --global configfile ``` +With [mise](https://mise.jdx.dev), which installs the npm package: + +```bash +mise use --global npm:configfile +``` + +Install it one way only: two copies would compete in your `PATH`. + ## Data storage This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files. @@ -85,7 +101,9 @@ Only one *configfile* at a time changes files: a second one waits for the first Every file of `scripts/`, and every folder of `scripts/` (or symbolic link to a folder) containing an `index` file (`index`, `index.sh`, …), is a **script**. Hidden files are ignored. To only use some extensions, set `script_extensions` in the [configuration](#configuration). -A script's name is its file name up to the first dot, or its folder name, with the same rules as module names: `scripts/setup.sh` and `scripts/setup.macos.py` are both named `setup` (only the first one, alphabetically, is used, with a warning). +A script's name is its file name (or folder name) up to the first dot, with the same rules as module names: `scripts/setup.sh` is named `setup`. When two scripts have the same name, only the first one, alphabetically, is used, with a warning. + +A script can have a version for each system: `macos` or `linux` after the first dot (`scripts/setup.macos.sh`, `scripts/setup.linux.py`, or a folder such as `scripts/setup.macos/`). On macOS, `configfile scripts run setup` runs `setup.macos.sh`; on another system, it runs the generic `setup.sh`, if there is one. A version for another system is ignored. Scripts can be written in any language: @@ -97,7 +115,7 @@ Scripts can be written in any language: ## Usage -- `configfile init` (`i`): ask for the URL of your dotfiles repository, clone it into `~/.configfile/dotfiles` and save the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. +- `configfile init` (`i`): ask for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clone it into `~/.configfile/dotfiles` and save the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. - `-f, --force`: overwrite an existing configuration without asking. - `--repo `: give the URL from the command line, for non-interactive setups. - `--folder `: clone somewhere else than `~/.configfile/dotfiles`. @@ -126,7 +144,7 @@ Scripts can be written in any language: *configfile* keeps its configuration in `~/.configfilerc`, and its working files in the `~/.configfile/` folder: the mirror of your repository (`dotfiles/`), the record of deployments (`state.json`), the [history](#history) (`history.jsonl`), the lock, and saved local changes (`saved/`). -`~/.configfilerc` is a JSON file: +`~/.configfilerc` is a JSON file, readable by you only: the repository URL may contain credentials, so if other users can read it, *configfile* makes it private and warns you. ```json { @@ -143,7 +161,7 @@ Scripts can be written in any language: *configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs and usage errors excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes. -Script arguments, environment variables and file contents are never recorded. In URLs, user names and passwords (`https://user:token@host`) and query parameters that look like secrets (`?private_token=…`) are hidden. Paths are recorded in full, so they include your user name. When *configfile* creates the file, only its owner can read it. A run stopped by a signal (Ctrl+C outside a question) is not recorded. +Script arguments, environment variables and file contents are never recorded. In URLs, user names and passwords (`https://user:token@host`) and query parameters that look like secrets (`?private_token=…`) are hidden. Paths are recorded in full, so they include your user name. When *configfile* creates the file, only its owner can read it. A run stopped by a signal (Ctrl+C outside a question) is not recorded, unless the signal comes while a script or git runs: *configfile* then leaves it to that program, and records the run with its exit code. `configfile history` shows the last runs: @@ -168,16 +186,16 @@ When the file reaches `history_max_size` (1MB by default; a number of bytes, or ## Upgrading from 0.3 -- Node.js 24.11 or later is required, on macOS or Linux. Install again with `npm install --global configfile`. +- Node.js 24.11 or later is required, on macOS or Linux. Install again with `npm install --global configfile`, or switch to [Homebrew](#installation): remove the npm version first (`npm uninstall --global configfile`), then `brew install mindsers/tap/configfile`. - `~/.configfilerc`, the repository layout and `settings.json` work as before, including `settings.json` files that are a plain list (the 0.3.1 format, deprecated: put the list in a `"files"` key). Links deployed by 0.3 are recognised as deployed. - If you installed 0.3 with Yarn, remove it first: `yarn global remove configfile`. - `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. - A **relative** `target_path` of a global file is now relative to your home folder, not to the folder you run *configfile* from. Targets starting with `~/` or `/` are not affected. - Scripts keep their names (up to the first dot) and every file of `scripts/` is still a script. They are no longer made executable by *configfile*: a script needs a shebang line, a `.js`/`.sh` extension, or to be executable. - Targets inside the dotfiles repository, or containing it, are now refused. -- `modules undeploy` only removes what 1.0 or later deployed, and only restores backups it made (recorded in `~/.configfile/state.json`): local copies and `.old` files made by 0.3 stay where they are. +- `modules undeploy` also removes the links made by 0.3 that point to the repository, but it only restores the backups it made itself (recorded in `~/.configfile/state.json`): the `.old` files made by 0.3 are not put back, and local copies made by 0.3 are kept. - A `source_path` must stay inside its module folder. -- `init` clones into `~/.configfile/dotfiles` by default, and an existing `folder_path` is kept. `update` now makes that folder identical to the remote, saving local changes as a patch first. If your configured folder is also your working copy (for example `~/.dotfiles`), give *configfile* its own copy: run `configfile modules undeploy --all` (your previous files come back), then `configfile init --force --repo --folder ~/.configfile/dotfiles`, then `configfile modules deploy --all` (links now point to the copy). +- `init` clones into `~/.configfile/dotfiles` by default, and an existing `folder_path` is kept. `update` now makes that folder identical to the remote, saving local changes as a patch first. If your configured folder is also your working copy (for example `~/.dotfiles`), give *configfile* its own copy: run `configfile modules undeploy --all` (files that 1.0 moved aside come back; links made by 0.3 are removed, and their `.old` files stay where they are), then `configfile init --force --repo --folder ~/.configfile/dotfiles`, then `configfile modules deploy --all` (links now point to the copy). - With `script_extensions` set, only files with one of these extensions are scripts, and `""` means files without extension (0.3 matched any file containing the text). - Commands now exit with a non-zero code on failure. diff --git a/docs/home.md b/docs/home.md index 668a3619..a809ea3b 100644 --- a/docs/home.md +++ b/docs/home.md @@ -4,13 +4,19 @@ Configfile is a command line application that helps developers manage their deve ## Getting Started -To install Configfile: +To install Configfile on macOS or Linux, with [Homebrew](https://brew.sh) (it also installs Node.js and git): + +```bash +brew install mindsers/tap/configfile +``` + +Or with npm, when Node.js 24.11 or later and git are installed: ```bash npm install --global configfile ``` -macOS or Linux, Node.js 24.11 or later and git are required. +Or with [mise](https://mise.jdx.dev): `mise use --global npm:configfile`. Generating first configuration: diff --git a/package.json b/package.json index d3ef5e43..5af20963 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "configfile", - "version": "0.3.1", + "version": "1.0.0", "description": "Manage your dotfiles and setup scripts from a git repository.", "keywords": [ "dotfiles", @@ -19,7 +19,7 @@ "license": "Apache-2.0", "type": "module", "bin": { - "configfile": "./dist/cli.js" + "configfile": "dist/cli.js" }, "files": [ "dist" diff --git a/src/cli.ts b/src/cli.ts index 58056660..60641350 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -11,6 +11,7 @@ const home = os.homedir() process.exitCode = await main(process.argv.slice(2), { home, cwd: process.cwd(), + platform: process.platform, output: new Output(process.stdout, process.stderr), prompts: process.stdin.isTTY ? interactivePrompts : nonInteractivePrompts, history: new History(home), diff --git a/src/commands/init.ts b/src/commands/init.ts index 9d32abec..aa75c8a9 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -7,6 +7,7 @@ import type { Command } from 'commander' import { ConfigStore } from '../config.ts' import type { Context } from '../context.ts' import { CliError } from '../errors.ts' +import { checkRepositoryUrl } from '../git-url.ts' import { redactUrl } from '../output.ts' import { configfilePaths, resolveUserPath } from '../paths.ts' import { ensureGit, gitClone } from '../process.ts' @@ -30,7 +31,7 @@ export function registerInitCommand(program: Command, ctx: Context): void { async function init(options: InitOptions, ctx: Context): Promise { const { output, prompts } = ctx - const store = new ConfigStore(ctx.home) + const store = new ConfigStore(ctx.home, { warn: message => output.warn(message) }) const previous = await store.readPartial() if (!prompts.interactive) { @@ -68,15 +69,21 @@ async function init(options: InitOptions, ctx: Context): Promise { // found before the URL is typed and before the folder to clone into is created. if (folder === 'missing' || folder === 'empty') await ensureGit() - const repoUrl = ( + const validate = (value: string) => { + const checked = checkRepositoryUrl(value, ctx) + return 'error' in checked ? checked.error : true + } + const answer = options.repo ?? (await prompts.input({ message: 'Dotfiles repository URL:', required: true, ...(previous.repoUrl != null && { default: previous.repoUrl }), + validate, })) - ).trim() - if (repoUrl === '') throw new CliError('A repository URL is required.') + const checked = checkRepositoryUrl(answer, ctx) + if ('error' in checked) throw new CliError(checked.error) + const repoUrl = checked.url if (redactUrl(repoUrl) !== repoUrl) { output.warn( 'The repository URL contains credentials: they are saved in the configuration and in ' + diff --git a/src/commands/scripts.ts b/src/commands/scripts.ts index dfe89380..00f7f194 100644 --- a/src/commands/scripts.ts +++ b/src/commands/scripts.ts @@ -29,9 +29,11 @@ export function registerScriptsCommand(program: Command, ctx: Context): void { } async function loadScripts(ctx: Context): Promise { - const config = await new ConfigStore(ctx.home).read() + const config = await new ConfigStore(ctx.home, { + warn: message => ctx.output.warn(message), + }).read() - return listScripts(config.folderPath, config.scriptExtensions, { + return listScripts(config.folderPath, config.scriptExtensions, ctx.platform, { warn: message => ctx.output.warn(message), }) } diff --git a/src/commands/update.ts b/src/commands/update.ts index 64ff97c5..85dd83c3 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -25,7 +25,9 @@ export function registerUpdateCommand(program: Command, ctx: Context): void { async function update(ctx: Context): Promise { const { output } = ctx - const { folderPath } = await new ConfigStore(ctx.home).read() + const { folderPath } = await new ConfigStore(ctx.home, { + warn: message => ctx.output.warn(message), + }).read() try { await lstat(path.join(folderPath, '.git')) diff --git a/src/config.ts b/src/config.ts index a725f8a5..31bc079a 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,5 +1,5 @@ import { existsSync } from 'node:fs' -import { readFile } from 'node:fs/promises' +import { chmod, readFile, stat } from 'node:fs/promises' import path from 'node:path' import { CliError, NotInitializedError } from './errors.ts' @@ -34,9 +34,12 @@ class InvalidConfigError extends CliError { export class ConfigStore { readonly path: string readonly #home: string + readonly #warn: (message: string) => void - constructor(home: string) { + /** `warn` reports a configuration other users could read, made private on reading. */ + constructor(home: string, { warn = () => {} }: { warn?: (message: string) => void } = {}) { this.#home = home + this.#warn = warn this.path = path.join(home, '.configfilerc') } @@ -71,7 +74,13 @@ export class ConfigStore { const partial: { repoUrl?: string; folderPath?: string } = {} if (typeof raw?.repo_url === 'string') partial.repoUrl = raw.repo_url - if (typeof raw?.folder_path === 'string') partial.folderPath = raw.folder_path + if (typeof raw?.folder_path === 'string' && raw.folder_path.trim() !== '') { + // Resolved like `read` does: "~/dotfiles" must not become a folder named "~". + partial.folderPath = resolveUserPath(raw.folder_path.trim(), { + home: this.#home, + cwd: this.#home, + }) + } return partial } @@ -163,8 +172,29 @@ export class ConfigStore { if (data == null || typeof data !== 'object' || Array.isArray(data)) { throw new InvalidConfigError(`Invalid configuration in ${this.path}: not a JSON object.`) } + await this.#makePrivate() return data as RawConfig } + + /** + * The repository URL may contain credentials: a configuration other users + * can read (written by hand, or by configfile 0.3) is made readable by its + * owner only, with a warning. + */ + async #makePrivate(): Promise { + const stats = await stat(this.path).catch(() => null) + if (stats == null || (stats.mode & 0o077) === 0) return + + try { + await chmod(this.path, stats.mode & 0o700) + this.#warn(`${this.path} was readable by other users. It is now only readable by you.`) + } catch (error) { + this.#warn( + `${this.path} is readable by other users, and cannot be made private (${messageOf(error)}). ` + + `Run "chmod 600 ${this.path}".`, + ) + } + } } function ignoreInvalid(error: unknown): null { diff --git a/src/context.ts b/src/context.ts index c105e56b..2a1fb1cd 100644 --- a/src/context.ts +++ b/src/context.ts @@ -5,13 +5,21 @@ export interface Prompts { /** `false` when questions cannot be asked (stdin is not a terminal). */ readonly interactive: boolean confirm(options: { message: string; default?: boolean }): Promise - input(options: { message: string; default?: string; required?: boolean }): Promise + /** `validate` returns `true`, or why the answer is refused: the question is then asked again. */ + input(options: { + message: string + default?: string + required?: boolean + validate?: (value: string) => true | string + }): Promise } /** Everything a command needs from the outside world, injected for testability. */ export interface Context { readonly home: string readonly cwd: string + /** The system configfile runs on, which picks the scripts made for it (see `listScripts`). */ + readonly platform: NodeJS.Platform readonly output: Output readonly prompts: Prompts /** What this run changes, saved to `~/.configfile/history.jsonl` when it ends if it is recorded (see `shouldRecord`). */ diff --git a/src/git-url.ts b/src/git-url.ts new file mode 100644 index 00000000..48d573d8 --- /dev/null +++ b/src/git-url.ts @@ -0,0 +1,85 @@ +import { existsSync } from 'node:fs' + +import { redactUrl } from './output.ts' +import { resolveUserPath } from './paths.ts' + +/** Schemes git can clone from (see "GIT URLS" in `git help clone`). */ +const SCHEMES = new Set([ + 'ssh', + 'git', + 'http', + 'https', + 'ftp', + 'ftps', + 'file', + 'git+ssh', + 'ssh+git', +]) + +/** + * Checks a repository URL as git reads it, and returns it ready to save: + * + * - `scheme://[user@]host[:port]/path`, for the schemes git supports; + * - `[user@]host:path`, the scp-like syntax of SSH (no slash before the colon); + * - `transport::address`, handled by a git remote helper; + * - otherwise a local path, which must exist. It is returned absolute (`~` is + * the home folder), so the saved URL does not depend on the current folder. + * + * Returns a message saying what is wrong instead when git could not use it. + */ +export function checkRepositoryUrl( + input: string, + where: { home: string; cwd: string }, +): { url: string } | { error: string } { + const url = input.trim() + // Messages name the URL: its credentials must not show (or reach the history). + const shown = redactUrl(url) + + if (url === '') return { error: 'A repository URL is required.' } + // git would read it as an option, even where configfile passes it after "--". + if (url.startsWith('-')) return { error: `"${shown}" is not a repository URL.` } + + const scheme = /^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(url)?.[1]?.toLowerCase() + if (scheme != null) { + if (!SCHEMES.has(scheme)) { + return { error: `"${scheme}://" is not a protocol git can clone from.` } + } + let parsed: URL + try { + parsed = new URL(url) + } catch { + return { error: `"${shown}" is not a valid URL.` } + } + if (scheme !== 'file' && parsed.hostname === '') { + return { error: `"${shown}" has no host name.` } + } + if (parsed.pathname === '' || parsed.pathname === '/') { + return { error: `"${shown}" does not name a repository (the path is missing).` } + } + return { url } + } + + if (/^[A-Za-z0-9][A-Za-z0-9+.-]*::./.test(url)) return { url } + + // scp-like: as for git, only when no slash comes before the first colon. + const colon = url.indexOf(':') + const slash = url.indexOf('/') + if (colon > 0 && (slash === -1 || colon < slash)) { + const host = url.slice(0, colon).replace(/^[^@]*@/, '') + if (host === '' || /\s/.test(host)) return { error: `"${shown}" has no valid host name.` } + if (colon === url.length - 1) { + return { error: `"${shown}" does not name a repository (nothing after ":").` } + } + return { url } + } + + const local = resolveUserPath(url, where) + if (!existsSync(local)) { + return { + error: + `"${shown}" is neither a URL (such as https://github.com/me/dotfiles.git or ` + + `git@github.com:me/dotfiles.git) nor an existing folder.`, + } + } + return { url: local } +} diff --git a/src/repository.ts b/src/repository.ts index 61f1c8df..c3b7cd89 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -75,7 +75,9 @@ type Environment = Pick & { warn(message: string): void export async function loadRepository( ctx: Context, ): Promise<{ repository: string; modules: Module[] }> { - const { folderPath } = await new ConfigStore(ctx.home).read() + const { folderPath } = await new ConfigStore(ctx.home, { + warn: message => ctx.output.warn(message), + }).read() const modules = await listModules(folderPath, { home: ctx.home, cwd: ctx.cwd, @@ -303,16 +305,21 @@ export function unsafeTarget( * Hidden files are ignored. When `extensions` is set, only files with one of * these extensions count (`''` means "no extension"). * - * A script is named after its file name up to the first dot: `setup.macos.sh` - * is the `setup` script. + * A script is named after its file name up to the first dot: `setup.sh` is the + * `setup` script. A second part naming a system (`setup.macos.sh`, + * `setup.linux/`) makes it that system's version: used instead of `setup.sh` + * on that system, and ignored on the others. */ export async function listScripts( folderPath: string, extensions: readonly string[] | null, + platform: NodeJS.Platform, env: Pick, ): Promise { const scriptsDir = path.join(folderPath, 'scripts') const scripts: Script[] = [] + /** Names of the scripts that are this system's version. */ + const forSystem = new Set() const allowed = (name: string) => extensions == null || extensions.includes(path.extname(name)) for (const entry of await readDirOrFail(scriptsDir)) { @@ -329,16 +336,36 @@ export async function listScripts( } if (file == null) continue - const [baseName = ''] = entry.name.split('.') + const [baseName = '', tag] = entry.name.split('.') + const system = tag == null ? undefined : SCRIPT_SYSTEMS.get(tag) + if (system != null && system !== platform) continue const name = slugify(baseName) + const script = { name, file, path: path.join(scriptsDir, file) } + + // This system's version replaces the generic one, whichever comes first. + const current = scripts.findIndex(other => other.name === name) + if (current !== -1 && forSystem.has(name) !== (system != null)) { + if (system != null) { + scripts[current] = script + forSystem.add(name) + } + continue + } if (!isUsableName(name, file, scripts, 'script', env)) continue - scripts.push({ name, file, path: path.join(scriptsDir, file) }) + scripts.push(script) + if (system != null) forSystem.add(name) } return scripts } +/** The systems a script can be made for, by the second part of its name. */ +const SCRIPT_SYSTEMS: ReadonlyMap = new Map([ + ['macos', 'darwin'], + ['linux', 'linux'], +]) + /** The `index` file of a script folder (`index`, `index.sh`, …), relative to `scriptsDir`. */ async function findIndex( scriptsDir: string, diff --git a/tests/commands.test.ts b/tests/commands.test.ts index f45f1e9a..921ac451 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -1212,6 +1212,21 @@ describe('files the repository no longer deploys', () => { }) describe('scripts', () => { + it('warns once about a configuration other users can read, and makes it private', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + await sandbox.write('home/dotfiles/scripts/ok.sh') + await chmod(path.join(sandbox.home, '.configfilerc'), 0o644) + + const first = await runCli(sandbox, ['scripts', 'list']) + const second = await runCli(sandbox, ['scripts', 'list']) + + expect(first.code).toBe(0) + expect(first.stderr).toContain('was readable by other users. It is now only readable by you.') + expect(second.stderr).toBe('') + expect((await stat(path.join(sandbox.home, '.configfilerc'))).mode & 0o777).toBe(0o600) + }) + async function withScripts(sandbox: Sandbox) { await sandbox.configure() await sandbox.write( @@ -1381,7 +1396,7 @@ describe('scripts', () => { const sandbox = await createSandbox() await sandbox.configure() await sandbox.write( - 'home/dotfiles/scripts/setup.macos.py', + 'home/dotfiles/scripts/setup.local.py', `#!/usr/bin/env node\nrequire('node:fs').writeFileSync(${JSON.stringify(`${sandbox.root}/ran`)}, 'yes')\n`, 0o644, ) @@ -1530,18 +1545,46 @@ describe('init', () => { const sandbox = await createSandbox() const remote = await withRemote(sandbox) - const result = await runCli(sandbox, ['init', '--repo', 'unused', '--folder', remote]) + const result = await runCli(sandbox, [ + 'init', + '--repo', + 'https://example.com/unused.git', + '--folder', + remote, + ]) expect(result.code).toBe(0) expect(result.stdout).toContain('already contains a git repository') expect((await readConfig(sandbox)).folder_path).toBe(remote) }) + it('reuses a hand-edited folder_path starting with ~ when run again', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) + await sandbox.configure({ repo_url: remote, folder_path: '~/dotfiles' }) + + const result = await runCli(sandbox, ['init', '-f', '--repo', remote], [], { + interactive: false, + }) + + expect(result.code).toBe(0) + expect(result.stdout).toContain('already contains a git repository') + expect((await readConfig(sandbox)).folder_path).toBe(sandbox.repo) + expect(existsSync(path.join(sandbox.cwd, '~'))).toBe(false) + }) + it('does not save the configuration when the folder is not usable', async () => { const sandbox = await createSandbox() await sandbox.write('home/dotfiles/something') - const result = await runCli(sandbox, ['init', '--repo', 'x', '--folder', '~/dotfiles']) + const result = await runCli(sandbox, [ + 'init', + '--repo', + 'https://example.com/dotfiles.git', + '--folder', + '~/dotfiles', + ]) expect(result.code).toBe(1) expect(result.stderr).toContain('is not empty') @@ -1554,7 +1597,8 @@ describe('init', () => { const result = await runCli(sandbox, [ 'init', '--repo', - path.join(sandbox.root, 'no-such-repo'), + // A folder, but not a repository: the URL is valid, the clone fails. + sandbox.cwd, '--folder', '~/dotfiles', ]) @@ -1608,7 +1652,13 @@ describe('init', () => { const sandbox = await createSandbox() await prepare(sandbox) - const result = await runCli(sandbox, ['init', '--repo', 'x', '--folder', '~/dotfiles']) + const result = await runCli(sandbox, [ + 'init', + '--repo', + 'https://example.com/dotfiles.git', + '--folder', + '~/dotfiles', + ]) expect(result.code).toBe(1) expect(result.stderr).toContain(message) @@ -1645,6 +1695,41 @@ describe('init', () => { }, ) + it('asks again for a repository URL git cannot use', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + + const result = await runCli(sandbox, ['init'], ['https://github.com', remote]) + + expect(result.code).toBe(0) + expect(result.asked).toEqual(['Dotfiles repository URL:', 'Dotfiles repository URL:']) + expect(result.refused).toEqual([ + '"https://github.com" does not name a repository (the path is missing).', + ]) + expect((await readConfig(sandbox)).repo_url).toBe(remote) + }) + + it('refuses a --repo git cannot use, before creating anything', async () => { + const sandbox = await createSandbox() + + const result = await runCli(sandbox, ['init', '--repo', 'github.com/me/dotfiles']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('is neither a URL') + expect(existsSync(path.join(sandbox.home, '.configfile/dotfiles'))).toBe(false) + expect(existsSync(path.join(sandbox.home, '.configfilerc'))).toBe(false) + }) + + it('saves a local repository given by a relative path as an absolute path', async () => { + const sandbox = await createSandbox() + await withRemote(sandbox) + + const result = await runCli(sandbox, ['init', '--repo', '../remote']) + + expect(result.code).toBe(0) + expect((await readConfig(sandbox)).repo_url).toBe(path.join(sandbox.root, 'remote')) + }) + it('never lets a repository URL be read as a git option', async () => { const sandbox = await createSandbox() const pwned = path.join(sandbox.root, 'pwned') diff --git a/tests/config.test.ts b/tests/config.test.ts index 2a088571..a01d5ec0 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -1,4 +1,4 @@ -import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' +import { chmod, mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises' import { describe, expect, it } from 'vitest' import { ConfigStore } from '../src/config.ts' @@ -101,6 +101,30 @@ describe('ConfigStore', () => { await expect(store.read()).rejects.toThrow(/"folder_path" is missing/) }) + it('makes a configuration other users can read private, with a warning', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + const warnings: string[] = [] + const store = new ConfigStore(sandbox.home, { warn: message => warnings.push(message) }) + + await chmod(store.path, 0o644) + await store.read() + expect((await stat(store.path)).mode & 0o777).toBe(0o600) + expect(warnings).toEqual([ + `${store.path} was readable by other users. It is now only readable by you.`, + ]) + + // Already private: nothing to say. + await store.read() + expect(warnings).toHaveLength(1) + + // Only the access of others is removed. + await chmod(store.path, 0o640) + await store.readPartial() + expect((await stat(store.path)).mode & 0o777).toBe(0o600) + expect(warnings).toHaveLength(2) + }) + it('reads partial values for prompt defaults, even from an invalid file', async () => { const { home } = await createSandbox() const store = new ConfigStore(home) @@ -110,6 +134,11 @@ describe('ConfigStore', () => { await writeFile(store.path, '{"repo_url": "u"}') await expect(store.readPartial()).resolves.toEqual({ repoUrl: 'u' }) + for (const folder of ['~/dotfiles', 'dotfiles']) { + await writeFile(store.path, JSON.stringify({ folder_path: folder })) + await expect(store.readPartial()).resolves.toEqual({ folderPath: `${home}/dotfiles` }) + } + await writeFile(store.path, 'garbage') await expect(store.readPartial()).resolves.toEqual({}) }) diff --git a/tests/git.test.ts b/tests/git.test.ts index ed2657bd..b0d03a6b 100644 --- a/tests/git.test.ts +++ b/tests/git.test.ts @@ -3,6 +3,7 @@ import path from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' +import { checkRepositoryUrl } from '../src/git-url.ts' import { ensureGit, git, gitInstallHint, gitOutput } from '../src/process.ts' import { createSandbox } from './helpers.ts' @@ -233,3 +234,58 @@ describe('git and gitOutput', () => { } }) }) + +describe('checkRepositoryUrl', () => { + const where = { home: '/home/me', cwd: '/work' } + + it.each([ + 'https://github.com/mindsers/configfile.git', // #48 + 'http://example.com/dotfiles', + 'ssh://git@github.com:22/me/dotfiles.git', + 'git+ssh://git@github.com/me/dotfiles.git', + 'git://example.com/dotfiles.git', + 'file:///srv/git/dotfiles.git', + 'git@github.com:me/dotfiles.git', + 'example.com:dotfiles.git', + 'persistent-https::https://example.com/dotfiles.git', + ])('accepts %s as it is', url => { + expect(checkRepositoryUrl(` ${url} `, where)).toEqual({ url }) + }) + + it.each([ + ['', 'A repository URL is required.'], + ['--upload-pack=touch /tmp/x', 'is not a repository URL'], + ['htps://github.com/me/dotfiles.git', '"htps://" is not a protocol git can clone from.'], + ['https://github.com', 'the path is missing'], + ['https://github.com/', 'the path is missing'], + ['ssh://host:port/repo', 'is not a valid URL'], + ['git@:me/dotfiles.git', 'has no valid host name'], + ['git@github.com:', 'nothing after ":"'], + ['github.com/me/dotfiles', 'nor an existing folder'], + ['dotfiles', 'nor an existing folder'], + ])('refuses %j', (url, error) => { + const result = checkRepositoryUrl(url, where) + expect(result).toHaveProperty('error') + expect((result as { error: string }).error).toContain(error) + }) + + it('hides credentials in its messages', () => { + const result = checkRepositoryUrl('https://me:secret@github.com/', where) + expect(JSON.stringify(result)).not.toContain('secret') + }) + + it('accepts an existing local folder, made absolute', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/repos/dotfiles/.keep') + await sandbox.write('cwd/dotfiles/.keep') + const here = { home: sandbox.home, cwd: sandbox.cwd } + + expect(checkRepositoryUrl('~/repos/dotfiles', here)).toEqual({ + url: path.join(sandbox.home, 'repos/dotfiles'), + }) + expect(checkRepositoryUrl('dotfiles', here)).toEqual({ + url: path.join(sandbox.cwd, 'dotfiles'), + }) + expect(checkRepositoryUrl(sandbox.root, here)).toEqual({ url: sandbox.root }) + }) +}) diff --git a/tests/helpers.ts b/tests/helpers.ts index 63d8dab9..f84cb75f 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -55,6 +55,8 @@ export async function createSandbox(): Promise { await writeFile( path.join(home, '.configfilerc'), JSON.stringify({ repo_url: null, folder_path: sandbox.repo, ...extra }), + // As init writes it: a configuration others can read is made private, with a warning. + { mode: 0o600 }, ) }, } @@ -74,8 +76,10 @@ class Capture extends Writable { export interface FakeContext extends Context { stdout: Capture stderr: Capture - /** Messages of the prompts that were shown, in order. */ + /** Messages of the prompts that were shown, in order (again when an answer is refused). */ asked: string[] + /** Why answers were refused by a prompt's `validate`, in order. */ + refused: string[] } export interface CliOptions { @@ -83,6 +87,8 @@ export interface CliOptions { interactive?: boolean /** The current folder. Defaults to `/cwd`. */ cwd?: string + /** The system configfile believes it runs on. Defaults to `linux`, whatever the host. */ + platform?: NodeJS.Platform } /** @@ -93,7 +99,7 @@ export interface CliOptions { export function createContext( sandbox: Sandbox, answers: Array = [], - { interactive = true, cwd = sandbox.cwd }: CliOptions = {}, + { interactive = true, cwd = sandbox.cwd, platform = 'linux' }: CliOptions = {}, ): FakeContext { const stdout = new Capture() const stderr = new Capture() @@ -109,21 +115,32 @@ export function createContext( return next instanceof Error ? Promise.reject(next) : Promise.resolve(next as T) } + const refused: string[] = [] const prompts: Prompts = { interactive, confirm: ({ message }) => answer(message), - input: ({ message }) => answer(message), + // Like a terminal: a refused answer is explained, and the question asked again. + input: async ({ message, validate }) => { + for (;;) { + const value = await answer(message) + const valid = validate?.(value) ?? true + if (valid === true) return value + refused.push(valid) + } + }, } return { home: sandbox.home, cwd, + platform, output: new Output(stdout, stderr), prompts, history: new History(sandbox.home), stdout, stderr, asked, + refused, } } @@ -137,7 +154,13 @@ export async function runCli( const ctx = createContext(sandbox, answers, options) const code = await main(args, ctx) - return { code, stdout: ctx.stdout.text, stderr: ctx.stderr.text, asked: ctx.asked } + return { + code, + stdout: ctx.stdout.text, + stderr: ctx.stderr.text, + asked: ctx.asked, + refused: ctx.refused, + } } /** diff --git a/tests/repository.test.ts b/tests/repository.test.ts index 66efe43c..2f392627 100644 --- a/tests/repository.test.ts +++ b/tests/repository.test.ts @@ -4,7 +4,7 @@ import path from 'node:path' import { describe, expect, it } from 'vitest' import { CliError } from '../src/errors.ts' -import { listModules, listScripts, type Module } from '../src/repository.ts' +import { listModules, listScripts, type Module, type Script } from '../src/repository.ts' import { createSandbox, type Sandbox } from './helpers.ts' const settings = (files: unknown) => JSON.stringify({ files }) @@ -24,9 +24,13 @@ function usable(module: Module | undefined) { return module } -async function scriptsOf(sandbox: Sandbox, extensions: readonly string[] | null = null) { +async function scriptsOf( + sandbox: Sandbox, + extensions: readonly string[] | null = null, + platform: NodeJS.Platform = 'linux', +) { const warnings: string[] = [] - const scripts = await listScripts(sandbox.repo, extensions, { + const scripts = await listScripts(sandbox.repo, extensions, platform, { warn: message => warnings.push(message), }) return { scripts, warnings } @@ -327,7 +331,7 @@ describe('listScripts', () => { it('lists every file by default, named up to the first dot (as in 0.3)', async () => { const sandbox = await createSandbox() await sandbox.write('home/dotfiles/scripts/setup.sh') - await sandbox.write('home/dotfiles/scripts/install.macos.js') + await sandbox.write('home/dotfiles/scripts/install.node.js') await sandbox.write('home/dotfiles/scripts/bootstrap') await sandbox.write('home/dotfiles/scripts/tool.py') @@ -335,7 +339,7 @@ describe('listScripts', () => { expect(scripts.map(script => [script.name, script.file])).toEqual([ ['bootstrap', 'bootstrap'], - ['install', 'install.macos.js'], + ['install', 'install.node.js'], ['setup', 'setup.sh'], ['tool', 'tool.py'], ]) @@ -359,6 +363,57 @@ describe('listScripts', () => { ]) }) + it("uses this system's version of a script instead of the generic one", async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/setup.sh') + await sandbox.write('home/dotfiles/scripts/setup.macos.sh') + await sandbox.write('home/dotfiles/scripts/setup.linux.py') + await sandbox.write('home/dotfiles/scripts/clean.linux.sh') + await sandbox.write('home/dotfiles/scripts/brew.macos/index.sh') + + const files = (scripts: Script[]) => scripts.map(script => [script.name, script.file]) + + const mac = await scriptsOf(sandbox, null, 'darwin') + expect(files(mac.scripts)).toEqual([ + ['brew', path.join('brew.macos', 'index.sh')], + ['setup', 'setup.macos.sh'], + ]) + expect(mac.warnings).toEqual([]) + + const linux = await scriptsOf(sandbox, null, 'linux') + expect(files(linux.scripts)).toEqual([ + ['clean', 'clean.linux.sh'], + ['setup', 'setup.linux.py'], + ]) + expect(linux.warnings).toEqual([]) + }) + + it('falls back to the generic script when there is no version for this system', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/setup.sh') + await sandbox.write('home/dotfiles/scripts/setup.macos.sh') + await sandbox.write('home/dotfiles/scripts/setup.constructor.sh') + + const { scripts, warnings } = await scriptsOf(sandbox, null, 'linux') + + // "constructor" is not a system: setup.constructor.sh is another generic setup. + expect(scripts.map(script => script.file)).toEqual(['setup.constructor.sh']) + expect(warnings).toEqual(['"setup.sh" is ignored: another script is already named "setup".']) + }) + + it('warns about two versions of a script for the same system', async () => { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/scripts/setup.macos.py') + await sandbox.write('home/dotfiles/scripts/setup.macos.sh') + + const { scripts, warnings } = await scriptsOf(sandbox, null, 'darwin') + + expect(scripts.map(script => script.file)).toEqual(['setup.macos.py']) + expect(warnings).toEqual([ + '"setup.macos.sh" is ignored: another script is already named "setup".', + ]) + }) + it('ignores hidden files', async () => { const sandbox = await createSandbox() await sandbox.write('home/dotfiles/scripts/.DS_Store') From f7c648c30bd3a1a7ad27a6478a72bf37a9ed29ac Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Wed, 7 Oct 2026 19:46:05 +0200 Subject: [PATCH 328/341] chore: merge master back into develop after 1.0.0 (#306) --- .github/workflows/publish.yml | 111 ++++++++++++++++++++++++++++++---- CHANGELOG.md | 5 +- CONTRIBUTING.md | 2 +- README.md | 16 ++--- docs/home.md | 6 +- 5 files changed, 111 insertions(+), 29 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 37635d3c..8559243f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,10 +1,19 @@ name: Publish -# Publishes to npm when a version tag (such as 1.0.0) is pushed on a commit of -# master, the release branch of git-flow. Uses npm trusted publishing: no npm -# token is stored, and the package gets a provenance statement. Set it up once -# on npmjs.com (package settings > Trusted publishing): repository -# mindsers/configfile, workflow publish.yml, environment npm. +# Releases a version when its tag (such as 1.0.0) is pushed on a commit of +# master, the release branch of git-flow: +# +# - build: checks the tag, runs the checks and packs the package once; +# - github-release: publishes that tarball, its SHA256SUMS and the CHANGELOG +# section as a GitHub release, with a build provenance attestation +# (`gh attestation verify configfile-.tgz --repo mindsers/configfile`); +# - npm: publishes the same tarball to npm, with npm trusted publishing (no +# token stored, provenance statement). It only runs when the repository +# variable NPM_PUBLISH is "true", once trusted publishing is set up on +# npmjs.com (package settings > Trusted publishing): repository +# mindsers/configfile, workflow publish.yml, environment npm. To publish a +# version released while it was off, set the variable and re-run this +# workflow for its tag: an existing GitHub release keeps its notes. on: push: @@ -14,12 +23,8 @@ permissions: contents: read jobs: - publish: + build: runs-on: ubuntu-latest - environment: npm - permissions: - contents: read - id-token: write # npm trusted publishing steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: @@ -41,5 +46,87 @@ jobs: echo "::error::package.json is $version, the tag is $TAG."; exit 1; } - run: pnpm install --frozen-lockfile - run: pnpm check - # npm (not pnpm) publishes: trusted publishing needs npm 11.5.1 or later. - - run: npm publish --access public + - name: Pack the package + env: + TAG: ${{ github.ref_name }} + run: | + mkdir release + npm pack --pack-destination release + cd release + [ -f "configfile-$TAG.tgz" ] || { + echo "::error::npm pack did not produce configfile-$TAG.tgz."; exit 1; } + sha256sum "configfile-$TAG.tgz" > SHA256SUMS + cat SHA256SUMS + - name: Extract the release notes from the CHANGELOG + env: + TAG: ${{ github.ref_name }} + run: | + awk -v heading="## [$TAG]" ' + index($0, heading) == 1 { found = 1; next } + found && /^## \[/ { exit } + found { print } + ' CHANGELOG.md > release/notes.md + [ -s release/notes.md ] || { + echo "::error::CHANGELOG.md has no \"## [$TAG]\" section."; exit 1; } + - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: release + path: release/ + if-no-files-found: error + + github-release: + needs: build + runs-on: ubuntu-latest + permissions: + contents: write # create the release + id-token: write # sign the attestation + attestations: write + steps: + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + name: release + - uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2 + with: + subject-path: configfile-${{ github.ref_name }}.tgz + - name: Create the GitHub release + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ github.ref_name }} + run: | + # A release created by hand, or by an earlier run: its notes are kept, + # and the files attested above replace any older ones. + if gh release view "$TAG" --repo "$GITHUB_REPOSITORY" > /dev/null 2>&1; then + gh release upload "$TAG" "configfile-$TAG.tgz" SHA256SUMS \ + --repo "$GITHUB_REPOSITORY" --clobber + echo "::notice::The $TAG release already existed: its notes are kept, its files replaced." + exit 0 + fi + gh release create "$TAG" "configfile-$TAG.tgz" SHA256SUMS \ + --repo "$GITHUB_REPOSITORY" --verify-tag \ + --title "$TAG" --notes-file notes.md + + npm: + needs: build + if: vars.NPM_PUBLISH == 'true' + runs-on: ubuntu-latest + environment: npm + permissions: + contents: read + id-token: write # npm trusted publishing + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + # For the npm of the project's toolchain: trusted publishing needs 11.5.1 or later. + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + cache: false + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + name: release + path: ${{ runner.temp }}/release + # The tarball the GitHub release has, not a new build. + - run: npm publish "$RUNNER_TEMP/release/configfile-$TAG.tgz" --access public + env: + TAG: ${{ github.ref_name }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 6270b32a..c60ad574 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,9 +29,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `~/.configfile/history.jsonl`, and the `history` command to see it ([#36](https://github.com/mindsers/configfile/issues/36)). - The `settings.json` format is documented in the README. -- Releases are published to npm with a provenance statement, which `npm audit signatures` checks. +- Releases are published as GitHub releases: the package tarball, its `SHA256SUMS`, and a build + provenance attestation that `gh attestation verify` checks. - configfile can be installed with Homebrew (`brew install mindsers/tap/configfile`), which also - installs Node.js and git, or with mise (`mise use --global npm:configfile`). + installs Node.js and git, or with npm from the release tarball. - `init` and `update` say how to install git when it is missing, or Apple's command line developer tools on macOS, before cloning or syncing (`init` checks before asking for the URL). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 11d3757a..1751eac3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -97,7 +97,7 @@ The project uses [git-flow](https://nvie.com/posts/a-successful-git-branching-mo * Create your branch from `develop`: `feature/` for a feature or a documentation change, `bugfix/` for a fix. -* Open the pull request against `develop`, never `master`. Releases are handled by the maintainer: a version tag pushed on `master` publishes the package to npm, with provenance (`.github/workflows/publish.yml`). +* Open the pull request against `develop`, never `master`. Releases are handled by the maintainer: a version tag pushed on `master` publishes the package as a GitHub release, with a build provenance attestation, and to npm when it is turned on (`.github/workflows/publish.yml`). * Describe the change for a reviewer who doesn't know the code: why it is needed, what changes for users, how to test it. The pull request template has the sections. diff --git a/README.md b/README.md index ac7d8050..c522e16c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # configfile -[![npm](https://img.shields.io/npm/v/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) +[![Release](https://img.shields.io/github/v/release/mindsers/configfile?style=flat-square)](https://github.com/mindsers/configfile/releases/latest) [![npm](https://img.shields.io/npm/dt/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) [![CI](https://img.shields.io/github/actions/workflow/status/mindsers/configfile/ci.yml?branch=develop&style=flat-square)](https://github.com/mindsers/configfile/actions/workflows/ci.yml) [![npm](https://img.shields.io/npm/l/configfile.svg?style=flat-square)](https://github.com/mindsers/configfile/blob/develop/LICENSE) @@ -22,20 +22,16 @@ With [Homebrew](https://brew.sh), on macOS or Linux (Node.js and git come with i brew install mindsers/tap/configfile ``` -With npm, when Node.js 24.11 or later is installed: +With npm, when Node.js 24.11 or later is installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): ```bash -npm install --global configfile -``` - -With [mise](https://mise.jdx.dev), which installs the npm package: - -```bash -mise use --global npm:configfile +npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz ``` Install it one way only: two copies would compete in your `PATH`. +> Version 1.0 is not on the npm registry yet: `npm install --global configfile` still installs 0.3.1. Each release's tarball comes with a `SHA256SUMS` file and a build provenance attestation, which `gh attestation verify configfile-1.0.0.tgz --repo mindsers/configfile` checks. + ## Data storage This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files. @@ -186,7 +182,7 @@ When the file reaches `history_max_size` (1MB by default; a number of bytes, or ## Upgrading from 0.3 -- Node.js 24.11 or later is required, on macOS or Linux. Install again with `npm install --global configfile`, or switch to [Homebrew](#installation): remove the npm version first (`npm uninstall --global configfile`), then `brew install mindsers/tap/configfile`. +- Node.js 24.11 or later is required, on macOS or Linux. Install again as described in [Installation](#installation). To switch to Homebrew, remove the npm version first (`npm uninstall --global configfile`). - `~/.configfilerc`, the repository layout and `settings.json` work as before, including `settings.json` files that are a plain list (the 0.3.1 format, deprecated: put the list in a `"files"` key). Links deployed by 0.3 are recognised as deployed. - If you installed 0.3 with Yarn, remove it first: `yarn global remove configfile`. - `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. diff --git a/docs/home.md b/docs/home.md index a809ea3b..f5e3086e 100644 --- a/docs/home.md +++ b/docs/home.md @@ -10,14 +10,12 @@ To install Configfile on macOS or Linux, with [Homebrew](https://brew.sh) (it al brew install mindsers/tap/configfile ``` -Or with npm, when Node.js 24.11 or later and git are installed: +Or with npm, when Node.js 24.11 or later and git are installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): ```bash -npm install --global configfile +npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz ``` -Or with [mise](https://mise.jdx.dev): `mise use --global npm:configfile`. - Generating first configuration: ```bash From b030e1df6a9d2610712d057e07cee8acd6490f1a Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Oct 2026 09:49:14 +0200 Subject: [PATCH 329/341] feat(scripts): give scripts the repository, their name and the system (#307) --- CHANGELOG.md | 4 ++++ README.md | 8 ++++++++ src/commands/scripts.ts | 22 ++++++++++++++------ src/process.ts | 19 +++++++++++++---- src/repository.ts | 6 ++++++ tests/commands.test.ts | 44 ++++++++++++++++++++++++++++++++++++++++ tests/repository.test.ts | 16 ++++++++++++++- 7 files changed, 108 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c60ad574..57031c94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Scripts get the repository folder, their name and the system in the `CONFIGFILE_REPO`, + `CONFIGFILE_SCRIPT` and `CONFIGFILE_OS` environment variables + ([#295](https://github.com/mindsers/configfile/issues/295)). ## [1.0.0] - 2026-10-05 ### Added diff --git a/README.md b/README.md index c522e16c..325690b4 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,14 @@ Scripts can be written in any language: *configfile* never changes the permissions of your files. Scripts run in the current folder, their output is not modified (the messages of *configfile* go to stderr), and their exit code is forwarded. +Scripts get these environment variables, in addition to *configfile*'s own environment (they replace variables of the same name): + +| Variable | Value | +| --- | --- | +| `CONFIGFILE_REPO` | the full path of the dotfiles repository (`folder_path`), to reach its files: `"$CONFIGFILE_REPO/Brewfile"` | +| `CONFIGFILE_SCRIPT` | the script's name (`setup`) | +| `CONFIGFILE_OS` | the system: `macos` or `linux`, as in the names of script versions | + ## Usage - `configfile init` (`i`): ask for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clone it into `~/.configfile/dotfiles` and save the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. diff --git a/src/commands/scripts.ts b/src/commands/scripts.ts index 00f7f194..5f39c593 100644 --- a/src/commands/scripts.ts +++ b/src/commands/scripts.ts @@ -5,7 +5,7 @@ import type { Context } from '../context.ts' import { CliError } from '../errors.ts' import { plural } from '../output.ts' import { runScript } from '../process.ts' -import { listScripts, type Script } from '../repository.ts' +import { listScripts, type Script, systemName } from '../repository.ts' export function registerScriptsCommand(program: Command, ctx: Context): void { const scripts = program @@ -28,18 +28,19 @@ export function registerScriptsCommand(program: Command, ctx: Context): void { .action((name: string, args: string[]) => run(name, args, ctx)) } -async function loadScripts(ctx: Context): Promise { +async function loadScripts(ctx: Context): Promise<{ repository: string; scripts: Script[] }> { const config = await new ConfigStore(ctx.home, { warn: message => ctx.output.warn(message), }).read() - return listScripts(config.folderPath, config.scriptExtensions, ctx.platform, { + const scripts = await listScripts(config.folderPath, config.scriptExtensions, ctx.platform, { warn: message => ctx.output.warn(message), }) + return { repository: config.folderPath, scripts } } async function list(ctx: Context): Promise { - const scripts = await loadScripts(ctx) + const { scripts } = await loadScripts(ctx) if (scripts.length === 0) { ctx.output.info('No script found.') @@ -53,7 +54,8 @@ async function list(ctx: Context): Promise { } async function run(name: string, args: string[], ctx: Context): Promise { - const script = (await loadScripts(ctx)).find(candidate => candidate.name === name) + const { repository, scripts } = await loadScripts(ctx) + const script = scripts.find(candidate => candidate.name === name) if (script == null) { throw new CliError( @@ -65,7 +67,15 @@ async function run(name: string, args: string[], ctx: Context): Promise { const output = ctx.output.toStderr() output.info(`Running "${name}"…`) - const code = await runScript(script, args, ctx) + // Scripts run in the current folder, and a folder script is one level + // deeper: this gives them the repository's path, and the system whose + // versions run. Documented in the README ("Scripts"). + const env = { + CONFIGFILE_REPO: repository, + CONFIGFILE_SCRIPT: script.name, + CONFIGFILE_OS: systemName(ctx.platform), + } + const code = await runScript(script, args, { cwd: ctx.cwd, env }) // The arguments are never recorded: they may contain secrets. ctx.history.record({ kind: 'script', name: script.name, file: script.path, exitCode: code }) diff --git a/src/process.ts b/src/process.ts index 79ea55aa..9c1dbff0 100644 --- a/src/process.ts +++ b/src/process.ts @@ -15,8 +15,15 @@ import type { Script } from './repository.ts' * them to both processes) and SIGTERM / SIGHUP are forwarded to it, so the * child is not left running when configfile is asked to stop, and its own exit * code is reported. (Nothing can be done if configfile is killed with SIGKILL.) + * + * `env` is merged over configfile's own environment, which the child inherits: + * its values replace variables of the same name. */ -export function run(command: string, args: string[], { cwd }: { cwd: string }): Promise { +export function run( + command: string, + args: string[], + { cwd, env }: { cwd: string; env?: Readonly> | undefined }, +): Promise { return new Promise((resolve, reject) => { // Installed before the child starts: a signal arriving in between would // otherwise end configfile and leave the script running on its own. @@ -39,7 +46,11 @@ export function run(command: string, args: string[], { cwd }: { cwd: string }): } try { - child = spawn(command, args, { cwd, stdio: 'inherit' }) + child = spawn(command, args, { + cwd, + stdio: 'inherit', + ...(env != null && { env: { ...process.env, ...env } }), + }) } catch (error) { cleanup() reject(error) @@ -84,14 +95,14 @@ const INTERPRETERS: Record = { export async function runScript( script: Script, args: string[], - { cwd }: { cwd: string }, + { cwd, env }: { cwd: string; env?: Readonly> | undefined }, ): Promise { const executable = await isExecutable(script.path) const shebang = await readShebang(script) const launch = async (command: string, commandArgs: string[]) => { try { - return await run(command, commandArgs, { cwd }) + return await run(command, commandArgs, { cwd, env }) } catch (error) { throw launchError(script, shebang?.[0], error) } diff --git a/src/repository.ts b/src/repository.ts index c3b7cd89..3116fc0d 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -360,6 +360,12 @@ export async function listScripts( return scripts } +/** The name of `platform` in script names (`macos`, `linux`), or the platform itself. */ +export function systemName(platform: NodeJS.Platform): string { + for (const [name, system] of SCRIPT_SYSTEMS) if (system === platform) return name + return platform +} + /** The systems a script can be made for, by the second part of its name. */ const SCRIPT_SYSTEMS: ReadonlyMap = new Map([ ['macos', 'darwin'], diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 921ac451..cbec1fdd 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -1263,6 +1263,50 @@ describe('scripts', () => { expect(await readFile(path.join(sandbox.root, 'ran'), 'utf8')).toBe('--flag value\n') }) + it('gives scripts the repository, their name and the system in CONFIGFILE_ variables', async () => { + const sandbox = await createSandbox() + await sandbox.configure() + const env = path.join(sandbox.root, 'env') + // A folder script is one level deeper than a file script: a path to the + // repository written relative to $0 ("$0/../..") would point elsewhere. + await sandbox.write( + 'home/dotfiles/scripts/setup.macos/index.sh', + `printf '%s\n' "$CONFIGFILE_REPO" "$CONFIGFILE_SCRIPT" "$CONFIGFILE_OS" "$INHERITED" > "${env}"\n`, + ) + vi.stubEnv('INHERITED', 'kept') + // A value left over in the environment (a script running configfile) is replaced. + vi.stubEnv('CONFIGFILE_OS', 'stale') + + try { + const result = await runCli(sandbox, ['scripts', 'run', 'setup'], [], { platform: 'darwin' }) + + expect(result.code).toBe(0) + expect(await readFile(env, 'utf8')).toBe(`${sandbox.repo}\nsetup\nmacos\nkept\n`) + // Only the script gets them: git, run later by the same process, must not. + expect(process.env.CONFIGFILE_REPO).toBeUndefined() + expect(process.env.CONFIGFILE_OS).toBe('stale') + } finally { + vi.unstubAllEnvs() + } + }) + + it('gives an executable script the full path of a repository configured with ~', async () => { + const sandbox = await createSandbox() + await sandbox.configure({ folder_path: '~/dotfiles' }) + const env = path.join(sandbox.root, 'env') + // Run directly, through its shebang line, rather than by sh. + await sandbox.write( + 'home/dotfiles/scripts/where', + `#!/bin/sh\nprintf '%s\n' "$CONFIGFILE_REPO" "$CONFIGFILE_OS" > "${env}"\n`, + 0o755, + ) + + const result = await runCli(sandbox, ['scripts', 'run', 'where']) + + expect(result.code).toBe(0) + expect(await readFile(env, 'utf8')).toBe(`${sandbox.repo}\nlinux\n`) + }) + it('runs non-executable .js files with node, in the current folder', async () => { const sandbox = await createSandbox() await withScripts(sandbox) diff --git a/tests/repository.test.ts b/tests/repository.test.ts index 2f392627..84fd1799 100644 --- a/tests/repository.test.ts +++ b/tests/repository.test.ts @@ -4,7 +4,13 @@ import path from 'node:path' import { describe, expect, it } from 'vitest' import { CliError } from '../src/errors.ts' -import { listModules, listScripts, type Module, type Script } from '../src/repository.ts' +import { + listModules, + listScripts, + type Module, + type Script, + systemName, +} from '../src/repository.ts' import { createSandbox, type Sandbox } from './helpers.ts' const settings = (files: unknown) => JSON.stringify({ files }) @@ -327,6 +333,14 @@ describe('listModules', () => { }) }) +describe('systemName', () => { + it('names systems as script versions do', () => { + expect(systemName('darwin')).toBe('macos') + expect(systemName('linux')).toBe('linux') + expect(systemName('freebsd')).toBe('freebsd') + }) +}) + describe('listScripts', () => { it('lists every file by default, named up to the first dot (as in 0.3)', async () => { const sandbox = await createSandbox() From b111e6fc1a0daa937429b3826ae33250bbf27234 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Oct 2026 11:06:40 +0200 Subject: [PATCH 330/341] docs: add a documentation site, from the README's content (#308) --- .github/workflows/ci.yml | 24 +- .github/workflows/docs-deploy.yml | 56 + .github/workflows/publish.yml | 3 +- .gitignore | 3 + CONTRIBUTING.md | 2 +- docs/astro.config.mjs | 28 + docs/home.md | 65 - docs/package.json | 19 + docs/public/favicon.svg | 1 + docs/src/content.config.ts | 7 + .../src/content/docs/concepts/how-it-works.md | 24 + .../docs/getting-started/installation.md | 28 + .../docs/getting-started/quick-start.md | 16 + .../content/docs/guides/upgrading-from-0-3.md | 17 + docs/src/content/docs/index.md | 31 + docs/src/content/docs/reference/commands.md | 29 + .../content/docs/reference/configuration.md | 19 + docs/src/content/docs/reference/history.md | 29 + docs/src/content/docs/reference/modules.md | 41 + docs/src/content/docs/reference/scripts.md | 26 + docs/tsconfig.json | 5 + package.json | 2 + pnpm-lock.yaml | 3078 ++++++++++++++++- pnpm-workspace.yaml | 8 + src/commands/scripts.ts | 2 +- 25 files changed, 3418 insertions(+), 145 deletions(-) create mode 100644 .github/workflows/docs-deploy.yml create mode 100644 docs/astro.config.mjs delete mode 100644 docs/home.md create mode 100644 docs/package.json create mode 100644 docs/public/favicon.svg create mode 100644 docs/src/content.config.ts create mode 100644 docs/src/content/docs/concepts/how-it-works.md create mode 100644 docs/src/content/docs/getting-started/installation.md create mode 100644 docs/src/content/docs/getting-started/quick-start.md create mode 100644 docs/src/content/docs/guides/upgrading-from-0-3.md create mode 100644 docs/src/content/docs/index.md create mode 100644 docs/src/content/docs/reference/commands.md create mode 100644 docs/src/content/docs/reference/configuration.md create mode 100644 docs/src/content/docs/reference/history.md create mode 100644 docs/src/content/docs/reference/modules.md create mode 100644 docs/src/content/docs/reference/scripts.md create mode 100644 docs/tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a53df2fb..efe1c959 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,8 @@ jobs: - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 with: version: 2026.9.18 # mise version, updated by Renovate - - run: pnpm install --frozen-lockfile + # The CLI only: the documentation site (docs/) is built by the docs job. + - run: pnpm install --frozen-lockfile --filter configfile - run: pnpm lint - run: pnpm typecheck - name: Check the workflows @@ -46,7 +47,8 @@ jobs: version: 2026.9.18 # mise version, updated by Renovate # One cache per Node.js version: the override is not part of mise.toml. cache_key_prefix: mise-node-${{ matrix.node }} - - run: pnpm install --frozen-lockfile + # The CLI only: the documentation site (docs/) is built by the docs job. + - run: pnpm install --frozen-lockfile --filter configfile - run: pnpm test:coverage package: @@ -59,7 +61,8 @@ jobs: - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 with: version: 2026.9.18 # mise version, updated by Renovate - - run: pnpm install --frozen-lockfile + # The CLI only: the documentation site (docs/) is built by the docs job. + - run: pnpm install --frozen-lockfile --filter configfile - run: pnpm pack --out "$RUNNER_TEMP/configfile.tgz" - name: Check npm publishes package.json as written # npm publish silently drops what it considers invalid (a "./" bin path @@ -78,3 +81,18 @@ jobs: configfile --version configfile --help HOME="$RUNNER_TEMP/home" configfile history + + docs: + # Builds the documentation site (docs/), as docs-deploy.yml publishes it. + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 # the pages show when they were last updated, from git + persist-credentials: false + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + - run: pnpm install --frozen-lockfile + - run: pnpm --filter configfile-docs typecheck + - run: pnpm docs:build diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml new file mode 100644 index 00000000..c4cffd11 --- /dev/null +++ b/.github/workflows/docs-deploy.yml @@ -0,0 +1,56 @@ +name: Docs + +# Publishes the documentation site (docs/) to GitHub Pages, served at +# https://docs.configfile.sh. It runs on pushes to master, the branch of +# released versions (git-flow), so the site describes the latest release. It +# can also be run by hand from the Actions tab, to publish master again. +# +# Set up once in the repository settings: Pages > Source: GitHub Actions, +# custom domain docs.configfile.sh, Enforce HTTPS. The github-pages +# environment only accepts deployments from master. + +on: + push: + branches: [master] + workflow_dispatch: + +permissions: + contents: read + +# One deployment at a time; a newer one waits instead of cancelling. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 # the pages show when they were last updated, from git + persist-credentials: false + # No cache: nothing restored from another run can end up on the site. + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + cache: false + - run: pnpm install --frozen-lockfile + - run: pnpm docs:build + - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 + with: + path: docs/dist + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + permissions: + pages: write # publish the site + id-token: write # prove the deployment comes from this workflow + steps: + - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 + - id: deployment + uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8559243f..502d7b46 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -44,7 +44,8 @@ jobs: version=$(node -p "require('./package.json').version") [ "$version" = "$TAG" ] || { echo "::error::package.json is $version, the tag is $TAG."; exit 1; } - - run: pnpm install --frozen-lockfile + # The CLI only: the documentation site (docs/) is not part of a release. + - run: pnpm install --frozen-lockfile --filter configfile - run: pnpm check - name: Pack the package env: diff --git a/.gitignore b/.gitignore index 87a215c8..7efa14fb 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,6 @@ dist/ # macOS .DS_Store + +# Astro (docs/) +.astro/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1751eac3..e1036162 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ Everyone taking part in the project follows the [code of conduct](CODE_OF_CONDUC ### Do you want to contribute to the documentation? -The documentation lives with the source code: the [README](README.md) for users, and this file for contributors. +The documentation lives with the source code: the [documentation site](docs/) for users (published at [docs.configfile.sh](https://docs.configfile.sh), run it locally with `pnpm docs:dev`), and this file for contributors. Each page of the site is a Markdown file in `docs/src/content/docs/`. Until the README is shortened to an introduction, it holds the same content: update both. * Please refer to the "Do you intend to add a new feature or change an existing one?" section. diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs new file mode 100644 index 00000000..55b25e68 --- /dev/null +++ b/docs/astro.config.mjs @@ -0,0 +1,28 @@ +// The documentation site, published at https://docs.configfile.sh. +// Everything specific to configfile is in this file; the pages are in +// src/content/docs/, one folder per section listed in `sidebar` below. +import starlight from '@astrojs/starlight' +import { defineConfig } from 'astro/config' + +export default defineConfig({ + site: 'https://docs.configfile.sh', + integrations: [ + starlight({ + title: 'configfile', + description: + 'Manage your dotfiles and setup scripts from a git repository, on macOS and Linux.', + social: [{ icon: 'github', label: 'GitHub', href: 'https://github.com/mindsers/configfile' }], + // Changes are proposed against develop, as for any other change (git-flow). + editLink: { + baseUrl: 'https://github.com/mindsers/configfile/edit/develop/docs/', + }, + lastUpdated: true, + sidebar: [ + { label: 'Getting started', items: [{ autogenerate: { directory: 'getting-started' } }] }, + { label: 'Guides', items: [{ autogenerate: { directory: 'guides' } }] }, + { label: 'Reference', items: [{ autogenerate: { directory: 'reference' } }] }, + { label: 'Concepts', items: [{ autogenerate: { directory: 'concepts' } }] }, + ], + }), + ], +}) diff --git a/docs/home.md b/docs/home.md deleted file mode 100644 index f5e3086e..00000000 --- a/docs/home.md +++ /dev/null @@ -1,65 +0,0 @@ -# Configfile - -Configfile is a command line application that helps developers manage their development setup from a dotfiles git repository. - -## Getting Started - -To install Configfile on macOS or Linux, with [Homebrew](https://brew.sh) (it also installs Node.js and git): - -```bash -brew install mindsers/tap/configfile -``` - -Or with npm, when Node.js 24.11 or later and git are installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): - -```bash -npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz -``` - -Generating first configuration: - -```bash -configfile init -``` - -It asks for your repository URL and clones it into `~/.configfile/dotfiles`, a copy configfile keeps in sync with the remote (edit your dotfiles in your own working copy). To set it up without questions (in a script, for example): - -```bash -configfile init --repo git@github.com:me/dotfiles.git -``` - -### Running the tests - -```bash -pnpm install -pnpm check # lint, type check and tests -``` - -See [How to contribute](../CONTRIBUTING.md) for the development setup. - -### Additional commands - -- [configfile modules list](../README.md#usage) -- [configfile modules status](../README.md#usage) -- [configfile modules deploy](../README.md#usage) -- [configfile modules undeploy](../README.md#usage) -- [configfile scripts list](../README.md#usage) -- [configfile scripts run](../README.md#usage) -- [configfile update](../README.md#usage) -- [configfile history](../README.md#history) - -## Configfiles Configuration - -- [Data folder structure](../README.md#data-storage) -- [Module settings](../README.md#modules) -- [Scripts](../README.md#scripts) -- [~/.configfilerc](../README.md#configuration) -- [History](../README.md#history) - -## Project - -- [How to contribute](../CONTRIBUTING.md) -- [Code of conduct](../CODE_OF_CONDUCT.md) -- [Security policy](../SECURITY.md) -- [Changelog](../CHANGELOG.md) -- [Support configfile on GitHub Sponsors](https://github.com/sponsors/mindsers) diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..dcbec170 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,19 @@ +{ + "name": "configfile-docs", + "private": true, + "type": "module", + "description": "The configfile documentation site (docs.configfile.sh), built with Astro Starlight.", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "typecheck": "astro sync && tsc -p tsconfig.json --noEmit" + }, + "dependencies": { + "@astrojs/starlight": "0.42.5", + "astro": "7.3.6" + }, + "devDependencies": { + "typescript": "7.0.2" + } +} diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 00000000..37e652e1 --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1 @@ +configfile diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts new file mode 100644 index 00000000..9cfdab09 --- /dev/null +++ b/docs/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from 'astro:content' +import { docsLoader } from '@astrojs/starlight/loaders' +import { docsSchema } from '@astrojs/starlight/schema' + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +} diff --git a/docs/src/content/docs/concepts/how-it-works.md b/docs/src/content/docs/concepts/how-it-works.md new file mode 100644 index 00000000..b76d58a8 --- /dev/null +++ b/docs/src/content/docs/concepts/how-it-works.md @@ -0,0 +1,24 @@ +--- +title: How it works +description: Your dotfiles repository, the mirror configfile keeps, and what it deploys from it. +--- + +This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files. + +You edit your dotfiles in your own working copy of that repository and push them. *configfile* keeps its own copy, a mirror of the remote repository in `~/.configfile/dotfiles`, and deploys from it: `configfile update` makes the mirror identical to the remote, so unpushed or conflicting work never blocks it. Don't edit the mirror (or deployed links, which point into it): see [`update`](/reference/commands/) for what happens to such changes. + +The repository must have this structure: + +```txt +files/ + zsh/ + settings.json + zshrc + git/ + settings.json + gitconfig +scripts/ + setup.sh + macos/ + index.sh +``` diff --git a/docs/src/content/docs/getting-started/installation.md b/docs/src/content/docs/getting-started/installation.md new file mode 100644 index 00000000..8f265974 --- /dev/null +++ b/docs/src/content/docs/getting-started/installation.md @@ -0,0 +1,28 @@ +--- +title: Installation +description: Install configfile on macOS or Linux, with Homebrew or npm. +--- + +## Requirements + +- macOS or Linux +- Node.js 24.11 or later (Homebrew installs it for you) +- git (Homebrew installs it for you; otherwise, when it is missing, *configfile* says how to install it on your system) + +## Install + +With [Homebrew](https://brew.sh), on macOS or Linux (Node.js and git come with it): + +```bash +brew install mindsers/tap/configfile +``` + +With npm, when Node.js 24.11 or later is installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): + +```bash +npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz +``` + +Install it one way only: two copies would compete in your `PATH`. + +> Version 1.0 is not on the npm registry yet: `npm install --global configfile` still installs 0.3.1. Each release's tarball comes with a `SHA256SUMS` file and a build provenance attestation, which `gh attestation verify configfile-1.0.0.tgz --repo mindsers/configfile` checks. diff --git a/docs/src/content/docs/getting-started/quick-start.md b/docs/src/content/docs/getting-started/quick-start.md new file mode 100644 index 00000000..514aebeb --- /dev/null +++ b/docs/src/content/docs/getting-started/quick-start.md @@ -0,0 +1,16 @@ +--- +title: Quick start +description: Point configfile to your dotfiles repository. +--- + +To generate the first configuration, run: + +```bash +configfile init +``` + +It asks for your repository URL and clones it into `~/.configfile/dotfiles`, a copy *configfile* keeps in sync with the remote (edit your dotfiles in your own working copy). To set it up without questions (in a script, for example): + +```bash +configfile init --repo git@github.com:me/dotfiles.git +``` diff --git a/docs/src/content/docs/guides/upgrading-from-0-3.md b/docs/src/content/docs/guides/upgrading-from-0-3.md new file mode 100644 index 00000000..c6137878 --- /dev/null +++ b/docs/src/content/docs/guides/upgrading-from-0-3.md @@ -0,0 +1,17 @@ +--- +title: Upgrading from 0.3 +description: What changes for users of configfile 0.3. +--- + +- Node.js 24.11 or later is required, on macOS or Linux. Install again as described in [Installation](/getting-started/installation/). To switch to Homebrew, remove the npm version first (`npm uninstall --global configfile`). +- `~/.configfilerc`, the repository layout and `settings.json` work as before, including `settings.json` files that are a plain list (the 0.3.1 format, deprecated: put the list in a `"files"` key). Links deployed by 0.3 are recognised as deployed. +- If you installed 0.3 with Yarn, remove it first: `yarn global remove configfile`. +- `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. +- A **relative** `target_path` of a global file is now relative to your home folder, not to the folder you run *configfile* from. Targets starting with `~/` or `/` are not affected. +- Scripts keep their names (up to the first dot) and every file of `scripts/` is still a script. They are no longer made executable by *configfile*: a script needs a shebang line, a `.js`/`.sh` extension, or to be executable. +- Targets inside the dotfiles repository, or containing it, are now refused. +- `modules undeploy` also removes the links made by 0.3 that point to the repository, but it only restores the backups it made itself (recorded in `~/.configfile/state.json`): the `.old` files made by 0.3 are not put back, and local copies made by 0.3 are kept. +- A `source_path` must stay inside its module folder. +- `init` clones into `~/.configfile/dotfiles` by default, and an existing `folder_path` is kept. `update` now makes that folder identical to the remote, saving local changes as a patch first. If your configured folder is also your working copy (for example `~/.dotfiles`), give *configfile* its own copy: run `configfile modules undeploy --all` (files that 1.0 moved aside come back; links made by 0.3 are removed, and their `.old` files stay where they are), then `configfile init --force --repo --folder ~/.configfile/dotfiles`, then `configfile modules deploy --all` (links now point to the copy). +- With `script_extensions` set, only files with one of these extensions are scripts, and `""` means files without extension (0.3 matched any file containing the text). +- Commands now exit with a non-zero code on failure. diff --git a/docs/src/content/docs/index.md b/docs/src/content/docs/index.md new file mode 100644 index 00000000..dc8dc40b --- /dev/null +++ b/docs/src/content/docs/index.md @@ -0,0 +1,31 @@ +--- +title: configfile +description: Manage your dotfiles and setup scripts from a git repository, on macOS and Linux. +--- + +*configfile* is a command line tool that helps you manage your configuration files (dotfiles) and setup scripts from a git repository. + +- [Install configfile](/getting-started/installation/), then [point it to your dotfiles repository](/getting-started/quick-start/). +- [How it works](/concepts/how-it-works/): your repository, the mirror configfile keeps, and what it deploys. +- Reference: [commands](/reference/commands/), [modules and `settings.json`](/reference/modules/), [scripts](/reference/scripts/), [configuration](/reference/configuration/), [history](/reference/history/). +- [Upgrading from 0.3](/guides/upgrading-from-0-3/). +- [Changelog](https://github.com/mindsers/configfile/blob/develop/CHANGELOG.md): what changed in each version. + +## Contribution + +Contributions are welcome and greatly appreciated. Read [How to contribute to configfile](https://github.com/mindsers/configfile/blob/develop/CONTRIBUTING.md) before opening a pull request, and follow the [code of conduct](https://github.com/mindsers/configfile/blob/develop/CODE_OF_CONDUCT.md). + +- **Questions and bugs:** [open an issue](https://github.com/mindsers/configfile/issues/new/choose). +- **Security vulnerabilities:** never in a public issue. See the [security policy](https://github.com/mindsers/configfile/blob/develop/SECURITY.md). + +## Support + +*configfile* is free and open source software, under the Apache-2.0 license, built on my free time. + +If you use it and want to support its development, you can sponsor me on [GitHub Sponsors](https://github.com/sponsors/mindsers). Thank you! + +The people who support *configfile* are listed in [SPONSORS.md](https://github.com/mindsers/configfile/blob/develop/SPONSORS.md). + +## License + +This project is under the Apache-2.0 license. See the [LICENSE](https://github.com/mindsers/configfile/blob/develop/LICENSE) file. diff --git a/docs/src/content/docs/reference/commands.md b/docs/src/content/docs/reference/commands.md new file mode 100644 index 00000000..6f238d24 --- /dev/null +++ b/docs/src/content/docs/reference/commands.md @@ -0,0 +1,29 @@ +--- +title: Commands +description: Every configfile command and option, exit codes, and use without a terminal. +--- + +- `configfile init` (`i`): ask for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clone it into `~/.configfile/dotfiles` and save the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. + - `-f, --force`: overwrite an existing configuration without asking. + - `--repo `: give the URL from the command line, for non-interactive setups. + - `--folder `: clone somewhere else than `~/.configfile/dotfiles`. +- `configfile modules list` (`m l`, or just `configfile modules`): list available modules. +- `configfile modules status [modules...]` (`m st`): show whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. Without module names, it also lists the deployed files the repository no longer deploys. + - `-l, --local`: check the local files, in the current folder. +- `configfile modules deploy [modules...]` (`m d`): deploy the global files of the given modules. Without module names, asks to deploy all modules. + - `-l, --local`: copy the local files of the modules instead. + - `-a, --all`: deploy every module without asking. + - `-f, --force`: replace existing local files without asking (they are moved to `.old`). + - `-n, --dry-run`: show what would be done, without changing anything. +- `configfile modules undeploy [modules...]` (`m u`): remove the deployed global files of the given modules and restore their backups. Without module names, asks to undeploy all modules. + - `-a, --all`: undeploy every module without asking, and the files the repository no longer deploys. + - `--removed`: only undeploy the files the repository no longer deploys (see [Modules](/reference/modules/)); with `--local`, the copies made in the current folder. + - `-l, --local` and `-n, --dry-run`: as for `deploy`. +- `configfile scripts list` (`s l`, or just `configfile scripts`): list available scripts. +- `configfile scripts run [-- args...]` (`s r`): run a script. Arguments after `--` are passed to the script. +- `configfile update` (`u`): sync *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. It warns about deployed files the repository no longer deploys. +- `configfile history`: show what *configfile* changed, most recent last (see [History](/reference/history/)). + - `-n, --limit `: number of runs to show (20 by default). + - `--json`: print the raw history lines (JSON Lines), for scripts. + +*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. Each run of a command that changes files, and any unexpected error, is also recorded in the [history](/reference/history/). diff --git a/docs/src/content/docs/reference/configuration.md b/docs/src/content/docs/reference/configuration.md new file mode 100644 index 00000000..6e8ed0ad --- /dev/null +++ b/docs/src/content/docs/reference/configuration.md @@ -0,0 +1,19 @@ +--- +title: Configuration +description: The ~/.configfilerc file and the ~/.configfile/ folder. +--- + +*configfile* keeps its configuration in `~/.configfilerc`, and its working files in the `~/.configfile/` folder: the mirror of your repository (`dotfiles/`), the record of deployments (`state.json`), the [history](/reference/history/) (`history.jsonl`), the lock, and saved local changes (`saved/`). + +`~/.configfilerc` is a JSON file, readable by you only: the repository URL may contain credentials, so if other users can read it, *configfile* makes it private and warns you. + +```json +{ + "repo_url": "git@github.com:me/dotfiles.git", + "folder_path": "/Users/me/.configfile/dotfiles", + "script_extensions": [".js", ".sh", ""], + "history_max_size": "1MB" +} +``` + +`folder_path` may start with `~`; a relative path is relative to your home folder. `script_extensions` is optional: without it, every file of `scripts/` is a script. With it, only files with one of these extensions are; the dot may be omitted (`"py"`), and `""` means files without extension. `history_max_size` is optional: see [History](/reference/history/). diff --git a/docs/src/content/docs/reference/history.md b/docs/src/content/docs/reference/history.md new file mode 100644 index 00000000..1f7be1b8 --- /dev/null +++ b/docs/src/content/docs/reference/history.md @@ -0,0 +1,29 @@ +--- +title: History +description: What configfile records about each run, and how to read it. +--- + +*configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs and usage errors excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes. + +Script arguments, environment variables and file contents are never recorded. In URLs, user names and passwords (`https://user:token@host`) and query parameters that look like secrets (`?private_token=…`) are hidden. Paths are recorded in full, so they include your user name. When *configfile* creates the file, only its owner can read it. A run stopped by a signal (Ctrl+C outside a question) is not recorded, unless the signal comes while a script or git runs: *configfile* then leaves it to that program, and records the run with its exit code. + +`configfile history` shows the last runs: + +```txt +2026-10-01 11:12 modules deploy zsh ok + linked ~/.zshrc (previous file moved to ~/.zshrc.old) + 2 unchanged + +2026-10-01 11:15 update exit 128 + error git fetch failed (exit code 128). +``` + +`-n ` shows another number of runs, and `--json` prints the lines as they are written. + +The file is also easy to query with `jq`, for example to list the failed runs: + +```bash +jq 'select(.exitCode != 0)' ~/.configfile/history.jsonl +``` + +When the file reaches `history_max_size` (1MB by default; a number of bytes, or a size such as `"512KB"` or `"5MB"` in `~/.configfilerc`), it is renamed to `history.1.jsonl`, replacing the previous one, so the history takes about twice that size at most. `"history_max_size": 0` turns the history off. An invalid value gives the default and a warning; when `~/.configfilerc` cannot be read, nothing is recorded. diff --git a/docs/src/content/docs/reference/modules.md b/docs/src/content/docs/reference/modules.md new file mode 100644 index 00000000..19676fc6 --- /dev/null +++ b/docs/src/content/docs/reference/modules.md @@ -0,0 +1,41 @@ +--- +title: Modules and settings.json +description: Module folders, the settings.json format, and how files are deployed and undeployed. +--- + +Every folder of `files/` (or symbolic link to a folder) that contains a `settings.json` is a **module**. Its name is the folder name, lowercased, with spaces replaced by `-` and other characters than ASCII letters, digits, `_` and `-` removed: `My Zsh.d` is the `my-zshd` module. Hidden folders are ignored. + +`settings.json` lists the files of the module: + +```json +{ + "files": [ + { "source_path": "zshrc", "target_path": "~/.zshrc", "deploy": "global" }, + { "source_path": "editorconfig", "target_path": ".editorconfig", "deploy": "local" }, + { "source_path": "old-aliases", "target_path": "~/.aliases", "deploy": "none" } + ] +} +``` + +| Key | Description | +| --- | --- | +| `source_path` | Path of the file (or folder), relative to the module folder. It must stay inside the module folder, symbolic links included. | +| `target_path` | Where the file is deployed. `~` is your home folder. A relative path is relative to your home folder for global files (`.zshrc` is `~/.zshrc`) and to the current folder for local files. Targets can be anywhere you can write, except: your home folder, the current folder, the dotfiles repository, the module folder, *configfile*'s own files (`~/.configfilerc`, `~/.configfile/`), one of their parents, or anything inside the repository. These are recognised whatever the path used to reach them (letter case, symbolic links). | +| `deploy` | `"global"`: the file is **symlinked** by `configfile modules deploy`. `"local"`: the file is **copied** by `configfile modules deploy --local`, typically into a project folder (symbolic links in the source are followed, so the copy never points into the repository). `"none"`: the file is **never deployed**, which keeps it in the repository for later. | +| `global` | **Deprecated**, removed in 2.0: older spelling of `deploy`. `true` is `"global"`, `false` is `"local"`. It still works in 1.x, with a warning. Use one or the other, not both. | + +An entry without `deploy` or `global` is not deployed, and `modules deploy` warns about it. + +When a global file is deployed and something else already exists at its target (a file, a folder or another link), it is moved to `.old` (or `.old.1`, …). A link that already points to the right file is left as is, so deploying twice is safe. + +When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. + +*configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links and the local copies *configfile* made (unless they were modified since), and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), local copies that were modified or saved again by an editor since, and `.old` files you made yourself. + +When an entry leaves the repository (removed, set to `"deploy": "none"`, given another `target_path`, or its module deleted), what *configfile* deployed for it stays in place until it is undeployed: `modules status` lists these files, `update` warns about them, and `modules undeploy --removed` (or `--all`) removes them and restores the files they replaced. Local copies are handled from the folder they were copied into, like `modules deploy --local`. A removed file that *configfile* cannot remove safely (replaced by your own file, a modified copy, a copy whose source is gone) is left where it is, and *configfile* stops tracking it. + +To stay safe, *configfile* never undeploys a file when it cannot tell whether the repository still deploys it: files of a module whose `settings.json` cannot be used or has invalid entries, of a module folder that is not usable (a broken symbolic link, a name another folder uses), and entries without a deployment strategy. `modules status` lists them separately. Links deployed by 0.3 and not deployed again since were not recorded, so they are not found either. + +Only one *configfile* at a time changes files: a second one waits for the first to finish (the lock is `~/.configfile/lock`). + +> **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. diff --git a/docs/src/content/docs/reference/scripts.md b/docs/src/content/docs/reference/scripts.md new file mode 100644 index 00000000..c9677eac --- /dev/null +++ b/docs/src/content/docs/reference/scripts.md @@ -0,0 +1,26 @@ +--- +title: Scripts +description: Script files and folders, per-system versions, interpreters and environment variables. +--- + +Every file of `scripts/`, and every folder of `scripts/` (or symbolic link to a folder) containing an `index` file (`index`, `index.sh`, …), is a **script**. Hidden files are ignored. To only use some extensions, set `script_extensions` in the [configuration](/reference/configuration/). + +A script's name is its file name (or folder name) up to the first dot, with the same rules as [module names](/reference/modules/): `scripts/setup.sh` is named `setup`. When two scripts have the same name, only the first one, alphabetically, is used, with a warning. + +A script can have a version for each system: `macos` or `linux` after the first dot (`scripts/setup.macos.sh`, `scripts/setup.linux.py`, or a folder such as `scripts/setup.macos/`). On macOS, `configfile scripts run setup` runs `setup.macos.sh`; on another system, it runs the generic `setup.sh`, if there is one. A version for another system is ignored. + +Scripts can be written in any language: + +- a script with a shebang line (such as `#!/usr/bin/env python3`) is run directly when it is executable, and with that interpreter otherwise; +- a `.js` (or `.mjs`, `.cjs`) or `.sh` script without shebang line is run with `node` or `sh`; +- any other executable file (such as a compiled program) is run directly. + +*configfile* never changes the permissions of your files. Scripts run in the current folder, their output is not modified (the messages of *configfile* go to stderr), and their exit code is forwarded. + +Scripts get these environment variables, in addition to *configfile*'s own environment (they replace variables of the same name): + +| Variable | Value | +| --- | --- | +| `CONFIGFILE_REPO` | the full path of the dotfiles repository (`folder_path`), to reach its files: `"$CONFIGFILE_REPO/Brewfile"` | +| `CONFIGFILE_SCRIPT` | the script's name (`setup`) | +| `CONFIGFILE_OS` | the system: `macos` or `linux`, as in the names of script versions | diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 00000000..8bf91d3b --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} diff --git a/package.json b/package.json index 5af20963..44db16c6 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,8 @@ "test:watch": "vitest", "test:coverage": "vitest run --coverage", "check": "pnpm lint && pnpm typecheck && pnpm test", + "docs:dev": "pnpm --filter configfile-docs dev", + "docs:build": "pnpm --filter configfile-docs build", "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"", "prepack": "node --run clean && tsc -p tsconfig.build.json" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f77b364..8f424f22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -187,10 +187,131 @@ importers: version: 7.0.2 vitest: specifier: 5.0.3 - version: 5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)) + version: 5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1)) + + docs: + dependencies: + '@astrojs/starlight': + specifier: 0.42.5 + version: 0.42.5(astro@7.3.6(@types/node@24.19.0)(yaml@2.9.1))(typescript@7.0.2) + astro: + specifier: 7.3.6 + version: 7.3.6(@types/node@24.19.0)(yaml@2.9.1) + devDependencies: + typescript: + specifier: 7.0.2 + version: 7.0.2 packages: + '@astrojs/compiler-binding-android-arm64@0.5.1': + resolution: {integrity: sha512-nMb2nMIJtcWLNH+fV75Enmi+jp4tIOYOfsv4XtpgdOWkqc9P4uSSdK5u1xb340AzrXo5V18SxLl/nc3vcqtamQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@astrojs/compiler-binding-darwin-arm64@0.5.1': + resolution: {integrity: sha512-5k4+nZ/WRt+dcVow4z7rBuI7iv9A58h/uQ91YJe1PrTivbcCkq3u2Ynx/AZJwII4CsZawBCeGpojkFjutZBhBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@astrojs/compiler-binding-darwin-x64@0.5.1': + resolution: {integrity: sha512-0Buw+YST9Ff2EqQyhRMQujuFq/dijLw3zXWhsvI0dJ2pGrT38iVoxTEca2eBX/PfhlwkVWSRJEKO5gMqKHyeHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': + resolution: {integrity: sha512-x5LRpyCoMKuu3INr18cn42YhwSOaRpp9b5Ny3eJJ/sWVeejC16Zeshu1JlvlSmEZACLeWxU5JM0RX6T6nI+YyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': + resolution: {integrity: sha512-mL7tQEuDk3rGfaKmrO63nw6WBy1TPVioQGmVyjcAr+C+a/k3SVMYBytNSMqH9mZPT/Swj30JaZ2N842Z1NnOEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': + resolution: {integrity: sha512-uLGc9jtxwiDe4cQyhNPQim4ECiB/YzbWlXssfLAv8r374kArfTwBHjwR2+j+XVyF71yCx5mF9YNRclRqdNBgeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@astrojs/compiler-binding-linux-x64-musl@0.5.1': + resolution: {integrity: sha512-G0cywinaQUc8v1MrytvYKUX7svTDMmYtOCZfxjwKPbJi59zIqM+Ll0rWgO0GQWLZH3XoPYo19ZwlP3Xt9ep9YA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@astrojs/compiler-binding-wasm32-wasi@0.5.1': + resolution: {integrity: sha512-yMhLL8asmLydoAdnEZxAw6eLfNDs3YJl6jqn0pjPt6zrb2U5qIDLnii4/twThpIFODKkQ6YDpBRTOz/vSfZCxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': + resolution: {integrity: sha512-aClIG6poFt3Wf/bZykrEAX2nAnKvBHW6RXiKUa69QjBtWH0/FOlOAjnFcxRNlhej2AMWNYFx0o+LGjwMcH8P7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': + resolution: {integrity: sha512-/E6uBCagY70YpWqssBC+/FuniNSloeQPRgj7l3LDWiqjxIyTLnIgX1sTt18FU7jrigetpSnC9cHAM6b6IxSgPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@astrojs/compiler-binding@0.5.1': + resolution: {integrity: sha512-oczyolLUl9mNrtuBuNjuvn5thpHrFLXAHAWGTRg0JDHQ8cGVsVeFekOu2uSoQGgainJIi+A3/9m0DyYwz3Nlnw==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@astrojs/compiler-rs@0.5.1': + resolution: {integrity: sha512-1k1acnX7DepIiea9U9/Y+d1hdAFfylu1ZQQkkYgRSwBOBAsXInolyZuh/2tax+83vu/A+hOYP6P3+265RvMTvw==} + engines: {node: '>=22.12.0'} + + '@astrojs/internal-helpers@0.12.0': + resolution: {integrity: sha512-pKPuwCDtO0L7zgmt1JGd9X4Aes1+0SX3IEBSqBNPHsScYdPMlfmed3Y7DTbXyF7E+8ylnb563o/0OzGQPOFehw==} + + '@astrojs/markdown-satteri@0.4.3': + resolution: {integrity: sha512-PFbEHPnwUlLvpXd7RXrrKM+j12akF4bG+DSuNuoN+3eiwjOwp4HaPi+QQdbkBV7QEYXmzyKca50OJsmGxhNIUA==} + + '@astrojs/mdx@8.0.3': + resolution: {integrity: sha512-SmwnVrGZSohDG0B9LXiAPbR6fe9TOumli9Vw/9zo815xGTeB1T3Fqt6HEClmBsVwIKFg/ccos4TgjZAedvg7zA==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + '@astrojs/markdown-satteri': ^0.4.0 + astro: ^7.2.10 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + + '@astrojs/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} + + '@astrojs/sitemap@3.7.4': + resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} + + '@astrojs/starlight@0.42.5': + resolution: {integrity: sha512-S6hjUexk9rrKtjJF3WR8T9dM1woNR7X2XU8e3wj4OpRT4X15AXk/mzPjWe/Qd5+P8whHj2+ves+k06qirBzimg==} + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + astro: ^7.2.10 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + + '@astrojs/telemetry@3.3.3': + resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} @@ -236,36 +357,449 @@ packages: os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.15': - resolution: {integrity: sha512-XaG7P7eeSLYETD3K9grfB0mQmpLQZjygdbsxekWBJAg4am79fGAtRpfRyNnTvXB2fZFNnJZG3nXm7HBat0+VUw==} - engines: {node: '>=14.21.3'} + '@biomejs/cli-linux-arm64@2.5.15': + resolution: {integrity: sha512-XaG7P7eeSLYETD3K9grfB0mQmpLQZjygdbsxekWBJAg4am79fGAtRpfRyNnTvXB2fZFNnJZG3nXm7HBat0+VUw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.5.15': + resolution: {integrity: sha512-IlxUcyxilVGPsE008x13pWdkTbU3nQpP2i9b5UrbOYj6goBkKsRX1XB7yJLcV+O1H9LBchIIm4adOaVLZBX0ZQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.5.15': + resolution: {integrity: sha512-xE4iEW/3LqlYj9GFgGrFsFSH51dEEpUbYWBfeOv0q87WkUDxK2o/HhreSb7qMJqck70RVM6Lg96hgedcAYcOkA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.5.15': + resolution: {integrity: sha512-2kPKzhNlm8C+Ru3GcO0Me2ODkCBLrVOUNuyi84RJyWDVKAA4+Kjj3jMjL938lF6BRfvltC4vB2nPY9SvN51Ovg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.5.15': + resolution: {integrity: sha512-yAzh4UqEImV6Hcy0zjUqNfJAsUhoD64FBQCdTG8Md/Z2wQeVP/ZmJ3XRYAs1g8J9fjTFyl2fCtc5FB5til47+g==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@bruits/satteri-darwin-arm64@0.10.5': + resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} + cpu: [arm64] + os: [darwin] + + '@bruits/satteri-darwin-x64@0.10.5': + resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + cpu: [x64] + os: [darwin] + + '@bruits/satteri-linux-arm64-gnu@0.10.5': + resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-arm64-musl@0.10.5': + resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@bruits/satteri-linux-x64-gnu@0.10.5': + resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-x64-musl@0.10.5': + resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@bruits/satteri-wasm32-wasi@0.10.5': + resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@bruits/satteri-win32-arm64-msvc@0.10.5': + resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + cpu: [arm64] + os: [win32] + + '@bruits/satteri-win32-x64-msvc@0.10.5': + resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@4.0.1': + resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} + engines: {node: '>=18'} + + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} + + '@ctrl/tinycolor@4.2.1': + resolution: {integrity: sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==} + engines: {node: '>=14'} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@expressive-code/core@0.44.2': + resolution: {integrity: sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==} + + '@expressive-code/plugin-frames@0.44.2': + resolution: {integrity: sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==} + + '@expressive-code/plugin-shiki@0.44.2': + resolution: {integrity: sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==} + + '@expressive-code/plugin-text-markers@0.44.2': + resolution: {integrity: sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==} + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.5': + resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.5': + resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-freebsd-wasm32@0.35.5': + resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.4': + resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.4': + resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.4': + resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.3.4': + resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.3.4': + resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.3.4': + resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.3.4': + resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.3.4': + resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.35.5': + resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.15': - resolution: {integrity: sha512-IlxUcyxilVGPsE008x13pWdkTbU3nQpP2i9b5UrbOYj6goBkKsRX1XB7yJLcV+O1H9LBchIIm4adOaVLZBX0ZQ==} - engines: {node: '>=14.21.3'} + '@img/sharp-linux-arm@0.35.5': + resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.35.5': + resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.35.5': + resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.35.5': + resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.35.5': + resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.35.5': + resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.15': - resolution: {integrity: sha512-xE4iEW/3LqlYj9GFgGrFsFSH51dEEpUbYWBfeOv0q87WkUDxK2o/HhreSb7qMJqck70RVM6Lg96hgedcAYcOkA==} - engines: {node: '>=14.21.3'} + '@img/sharp-linuxmusl-x64@0.35.5': + resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] - libc: [glibc] + libc: [musl] - '@biomejs/cli-win32-arm64@2.5.15': - resolution: {integrity: sha512-2kPKzhNlm8C+Ru3GcO0Me2ODkCBLrVOUNuyi84RJyWDVKAA4+Kjj3jMjL938lF6BRfvltC4vB2nPY9SvN51Ovg==} - engines: {node: '>=14.21.3'} + '@img/sharp-wasm32@0.35.5': + resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.5': + resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.5': + resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.15': - resolution: {integrity: sha512-yAzh4UqEImV6Hcy0zjUqNfJAsUhoD64FBQCdTG8Md/Z2wQeVP/ZmJ3XRYAs1g8J9fjTFyl2fCtc5FB5til47+g==} - engines: {node: '>=14.21.3'} + '@img/sharp-win32-ia32@0.35.5': + resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.5': + resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -413,9 +947,57 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@napi-rs/wasm-runtime@1.2.5': + resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@oxc-project/types@0.152.0': resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==} + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + cpu: [x64] + os: [darwin] + + '@pagefind/default-ui@1.5.2': + resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==} + + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + cpu: [arm64] + os: [win32] + + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} + cpu: [x64] + os: [win32] + '@rolldown/binding-android-arm-eabi@1.2.12': resolution: {integrity: sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -515,18 +1097,82 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@shikijs/core@4.5.0': + resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.5.0': + resolution: {integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.5.0': + resolution: {integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==} + engines: {node: '>=20'} + + '@shikijs/langs@4.5.0': + resolution: {integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.5.0': + resolution: {integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==} + engines: {node: '>=20'} + + '@shikijs/themes@4.5.0': + resolution: {integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==} + engines: {node: '>=20'} + + '@shikijs/types@4.5.0': + resolution: {integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@24.19.0': resolution: {integrity: sha512-zY+5tKxXdhGh1PYI0ac+7juvEu4OI6vWtVVoj5i2m42jxAY1U+zHGt6QCyOFwykdP62sM3MJ9stoYYUw5aCWew==} + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} @@ -647,6 +1293,9 @@ packages: cpu: [x64] os: [win32] + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@vitest/coverage-v8@5.0.3': resolution: {integrity: sha512-+klsyz7BvT1vCU28Zkfzms1Ia78XD0V41U3FUtRaa3S+vOr/EXvK1O6BvVD7l1RzEjm6SONR2aybOvDDf9u0mQ==} peerDependencies: @@ -678,6 +1327,24 @@ packages: '@vitest/spy@5.0.3': resolution: {integrity: sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg==} + am-i-vibing@0.5.0: + resolution: {integrity: sha512-KLcsDhqf1XRrJmJr+9I/C0EX2K+sGrAGZFgkmd84c8TJO9zJBu+/kFInjazu1KfJWFhWDKdRWkpBzEs7s35DVA==} + hasBin: true + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -685,35 +1352,215 @@ packages: ast-v8-to-istanbul@1.0.7: resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==} + astro-expressive-code@0.44.2: + resolution: {integrity: sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0 + + astro@7.3.6: + resolution: {integrity: sha512-3q0MKxfE4cpr5IoQ9EWrN0gwxeT5tkCaSVe3SrGlLR5fnTIywHqjVqFokQkQiZexfwpNtB9dtBdUcXV9FuD+4w==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47@2.1.1: + resolution: {integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@6.3.0: resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} engines: {node: '>=18'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@2.2.0: resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie@2.0.1: + resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + engines: {node: '>=22'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + es-module-lexer@3.0.3: + resolution: {integrity: sha512-yWGe1O/j+almnV4hOYrmZo8u58JdnmXEMneRQAYkWtqSiT86yoMIEKF4rpqEDj52tbYl3xceBD3DQIBwcsC9Pw==} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + expressive-code@0.44.2: + resolution: {integrity: sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-string-truncated-width@3.0.3: resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} @@ -732,18 +1579,140 @@ packages: picomatch: optional: true + find-proc@0.2.0: + resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==} + engines: {node: ^20.19.0 || >=22.12.0} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + + http-cache-semantics@4.3.0: + resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} + + i18next@26.4.2: + resolution: {integrity: sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==} + peerDependencies: + typescript: ^5 || ^6 || ^7 + peerDependenciesMeta: + typescript: + optional: true + iconv-lite@0.7.3: resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} @@ -818,12 +1787,119 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} + magic-string@1.4.2: resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} magicast@0.5.5: resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} + mdast-util-directive@3.1.1: + resolution: {integrity: sha512-Gqpa3MHorXYEZ0VfbroyvBlVKUfz371V6mIERqOYMcb0W1D3LwmFq1ZW4O2TDrbn+4ZmGLwMWeFRJgYZ+bc5fQ==} + + mdast-util-from-markdown@2.1.0: + resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.2.0: + resolution: {integrity: sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + micromark-core-commonmark@2.0.4: + resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} + + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.1.0: + resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-edit-map@1.0.0: + resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.3: + resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} + + micromark@4.0.3: + resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@3.0.0: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} @@ -833,21 +1909,135 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + neotraverse@1.0.1: + resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + obug@2.2.1: resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} engines: {node: '>=12.20.0'} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + p-limit@7.3.3: + resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} + engines: {node: '>=20'} + + p-queue@9.3.3: + resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==} + engines: {node: '>=20'} + + p-timeout@7.0.2: + resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} + engines: {node: '>=20'} + + package-manager-detector@1.9.0: + resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==} + + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + picomatch@4.0.7: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.4: + resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} + engines: {node: '>=4'} + postcss@8.5.28: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-ancestry@0.1.0: + resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==} + engines: {node: '>=18.0.0'} + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-expressive-code@0.44.2: + resolution: {integrity: sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==} + + remark-directive@4.0.0: + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + rolldown@1.2.12: resolution: {integrity: sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -856,21 +2046,76 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + satteri@0.10.5: + resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.35.5: + resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + shiki@4.5.0: + resolution: {integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==} + engines: {node: '>=20'} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@9.0.1: + resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} + engines: {node: '>=20.19.5', npm: '>=10.8.2'} + hasBin: true + + smol-toml@1.9.0: + resolution: {integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==} + engines: {node: '>= 18'} + source-map-js@1.2.2: resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + std-env@4.3.0: resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + svgo@4.1.0: + resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} + engines: {node: '>=16'} + hasBin: true + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinybench@6.2.0: resolution: {integrity: sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==} engines: {node: '>=20.0.0'} + tinyclip@1.0.3: + resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@1.3.1: resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} @@ -883,14 +2128,139 @@ packages: resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + typescript@7.0.2: resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} engines: {node: '>=16.20.0'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@8.11.2: + resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} + engines: {node: '>=22.19.0'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.5: + resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + url-extras@0.1.0: + resolution: {integrity: sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==} + engines: {node: '>=20'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verkit@0.5.0: + resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} + engines: {node: '>=18.12.0'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@8.3.1: resolution: {integrity: sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -934,6 +2304,14 @@ packages: yaml: optional: true + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@5.0.3: resolution: {integrity: sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} @@ -975,61 +2353,501 @@ packages: jsdom: optional: true - why-is-node-running@3.2.1: - resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} - engines: {node: '>=20.11'} - hasBin: true + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} + engines: {node: '>=20.11'} + hasBin: true + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@astrojs/compiler-binding-android-arm64@0.5.1': + optional: true + + '@astrojs/compiler-binding-darwin-arm64@0.5.1': + optional: true + + '@astrojs/compiler-binding-darwin-x64@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-x64-musl@0.5.1': + optional: true + + '@astrojs/compiler-binding-wasm32-wasi@0.5.1': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + optional: true + + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': + optional: true + + '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': + optional: true + + '@astrojs/compiler-binding@0.5.1': + optionalDependencies: + '@astrojs/compiler-binding-android-arm64': 0.5.1 + '@astrojs/compiler-binding-darwin-arm64': 0.5.1 + '@astrojs/compiler-binding-darwin-x64': 0.5.1 + '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.1 + '@astrojs/compiler-binding-linux-arm64-musl': 0.5.1 + '@astrojs/compiler-binding-linux-x64-gnu': 0.5.1 + '@astrojs/compiler-binding-linux-x64-musl': 0.5.1 + '@astrojs/compiler-binding-wasm32-wasi': 0.5.1 + '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.1 + '@astrojs/compiler-binding-win32-x64-msvc': 0.5.1 + + '@astrojs/compiler-rs@0.5.1': + dependencies: + '@astrojs/compiler-binding': 0.5.1 + + '@astrojs/internal-helpers@0.12.0': + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + picomatch: 4.0.7 + retext-smartypants: 6.2.0 + shiki: 4.5.0 + smol-toml: 1.9.0 + unified: 11.0.5 + yaml: 2.9.1 + + '@astrojs/markdown-satteri@0.4.3': + dependencies: + '@astrojs/internal-helpers': 0.12.0 + '@astrojs/prism': 4.0.2 + github-slugger: 2.0.0 + satteri: 0.10.5 + + '@astrojs/mdx@8.0.3(@astrojs/markdown-satteri@0.4.3)(astro@7.3.6(@types/node@24.19.0)(yaml@2.9.1))': + dependencies: + '@astrojs/internal-helpers': 0.12.0 + '@astrojs/markdown-satteri': 0.4.3 + astro: 7.3.6(@types/node@24.19.0)(yaml@2.9.1) + es-module-lexer: 3.0.3 + + '@astrojs/prism@4.0.2': + dependencies: + prismjs: 1.30.0 + + '@astrojs/sitemap@3.7.4': + dependencies: + sitemap: 9.0.1 + zod: 4.6.5 + + '@astrojs/starlight@0.42.5(astro@7.3.6(@types/node@24.19.0)(yaml@2.9.1))(typescript@7.0.2)': + dependencies: + '@astrojs/markdown-satteri': 0.4.3 + '@astrojs/mdx': 8.0.3(@astrojs/markdown-satteri@0.4.3)(astro@7.3.6(@types/node@24.19.0)(yaml@2.9.1)) + '@astrojs/sitemap': 3.7.4 + '@pagefind/default-ui': 1.5.2 + '@types/hast': 3.0.5 + '@types/js-yaml': 4.0.9 + '@types/mdast': 4.0.4 + astro: 7.3.6(@types/node@24.19.0)(yaml@2.9.1) + astro-expressive-code: 0.44.2(astro@7.3.6(@types/node@24.19.0)(yaml@2.9.1)) + bcp-47: 2.1.1 + hast-util-format: 1.1.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-string: 3.0.1 + hastscript: 9.0.1 + i18next: 26.4.2(typescript@7.0.2) + js-yaml: 4.3.2 + klona: 2.0.6 + magic-string: 1.4.2 + mdast-util-directive: 3.1.1 + mdast-util-to-markdown: 2.2.0 + mdast-util-to-string: 4.0.0 + pagefind: 1.5.2 + remark-directive: 4.0.0 + satteri: 0.10.5 + ultrahtml: 1.7.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@astrojs/telemetry@3.3.3': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + package-manager-detector: 1.9.0 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bcoe/v8-coverage@1.0.2': {} + + '@biomejs/biome@2.5.15': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.5.15 + '@biomejs/cli-darwin-x64': 2.5.15 + '@biomejs/cli-linux-arm64': 2.5.15 + '@biomejs/cli-linux-arm64-musl': 2.5.15 + '@biomejs/cli-linux-x64': 2.5.15 + '@biomejs/cli-linux-x64-musl': 2.5.15 + '@biomejs/cli-win32-arm64': 2.5.15 + '@biomejs/cli-win32-x64': 2.5.15 + + '@biomejs/cli-darwin-arm64@2.5.15': + optional: true + + '@biomejs/cli-darwin-x64@2.5.15': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.5.15': + optional: true + + '@biomejs/cli-linux-arm64@2.5.15': + optional: true + + '@biomejs/cli-linux-x64-musl@2.5.15': + optional: true + + '@biomejs/cli-linux-x64@2.5.15': + optional: true + + '@biomejs/cli-win32-arm64@2.5.15': + optional: true + + '@biomejs/cli-win32-x64@2.5.15': + optional: true + + '@bruits/satteri-darwin-arm64@0.10.5': + optional: true + + '@bruits/satteri-darwin-x64@0.10.5': + optional: true + + '@bruits/satteri-linux-arm64-gnu@0.10.5': + optional: true + + '@bruits/satteri-linux-arm64-musl@0.10.5': + optional: true + + '@bruits/satteri-linux-x64-gnu@0.10.5': + optional: true + + '@bruits/satteri-linux-x64-musl@0.10.5': + optional: true + + '@bruits/satteri-wasm32-wasi@0.10.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@bruits/satteri-win32-arm64-msvc@0.10.5': + optional: true + + '@bruits/satteri-win32-x64-msvc@0.10.5': + optional: true + + '@capsizecss/unpack@4.0.1': + dependencies: + fontkitten: 1.0.3 + + '@clack/core@1.5.1': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.8.1': + dependencies: + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@ctrl/tinycolor@4.2.1': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true -snapshots: + '@esbuild/linux-mips64el@0.28.2': + optional: true - '@babel/helper-string-parser@7.29.7': {} + '@esbuild/linux-ppc64@0.28.2': + optional: true - '@babel/helper-validator-identifier@7.29.7': {} + '@esbuild/linux-riscv64@0.28.2': + optional: true - '@babel/parser@7.29.9': + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@expressive-code/core@0.44.2': dependencies: - '@babel/types': 7.29.8 + '@ctrl/tinycolor': 4.2.1 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.28 + postcss-nested: 6.2.0(postcss@8.5.28) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 - '@babel/types@7.29.8': + '@expressive-code/plugin-frames@0.44.2': dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 + '@expressive-code/core': 0.44.2 - '@bcoe/v8-coverage@1.0.2': {} + '@expressive-code/plugin-shiki@0.44.2': + dependencies: + '@expressive-code/core': 0.44.2 + shiki: 4.5.0 - '@biomejs/biome@2.5.15': + '@expressive-code/plugin-text-markers@0.44.2': + dependencies: + '@expressive-code/core': 0.44.2 + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.35.5': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.15 - '@biomejs/cli-darwin-x64': 2.5.15 - '@biomejs/cli-linux-arm64': 2.5.15 - '@biomejs/cli-linux-arm64-musl': 2.5.15 - '@biomejs/cli-linux-x64': 2.5.15 - '@biomejs/cli-linux-x64-musl': 2.5.15 - '@biomejs/cli-win32-arm64': 2.5.15 - '@biomejs/cli-win32-x64': 2.5.15 + '@img/sharp-libvips-darwin-arm64': 1.3.4 + optional: true - '@biomejs/cli-darwin-arm64@2.5.15': + '@img/sharp-darwin-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.4 optional: true - '@biomejs/cli-darwin-x64@2.5.15': + '@img/sharp-freebsd-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 optional: true - '@biomejs/cli-linux-arm64-musl@2.5.15': + '@img/sharp-libvips-darwin-arm64@1.3.4': optional: true - '@biomejs/cli-linux-arm64@2.5.15': + '@img/sharp-libvips-darwin-x64@1.3.4': optional: true - '@biomejs/cli-linux-x64-musl@2.5.15': + '@img/sharp-libvips-linux-arm64@1.3.4': optional: true - '@biomejs/cli-linux-x64@2.5.15': + '@img/sharp-libvips-linux-arm@1.3.4': optional: true - '@biomejs/cli-win32-arm64@2.5.15': + '@img/sharp-libvips-linux-ppc64@1.3.4': optional: true - '@biomejs/cli-win32-x64@2.5.15': + '@img/sharp-libvips-linux-riscv64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + optional: true + + '@img/sharp-linux-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.4 + optional: true + + '@img/sharp-linux-arm@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.4 + optional: true + + '@img/sharp-linux-ppc64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.4 + optional: true + + '@img/sharp-linux-riscv64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.4 + optional: true + + '@img/sharp-linux-s390x@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.4 + optional: true + + '@img/sharp-linux-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + optional: true + + '@img/sharp-wasm32@0.35.5': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 + optional: true + + '@img/sharp-win32-arm64@0.35.5': + optional: true + + '@img/sharp-win32-ia32@0.35.5': + optional: true + + '@img/sharp-win32-x64@0.35.5': optional: true '@inquirer/ansi@2.0.8': {} @@ -1160,8 +2978,47 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.4 + optional: true + + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.4 + optional: true + + '@oslojs/encoding@1.1.0': {} + '@oxc-project/types@0.152.0': {} + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/default-ui@1.5.2': {} + + '@pagefind/freebsd-x64@1.5.2': + optional: true + + '@pagefind/linux-arm64@1.5.2': + optional: true + + '@pagefind/linux-x64@1.5.2': + optional: true + + '@pagefind/windows-arm64@1.5.2': + optional: true + + '@pagefind/windows-x64@1.5.2': + optional: true + '@rolldown/binding-android-arm-eabi@1.2.12': optional: true @@ -1209,19 +3066,96 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@shikijs/core@4.5.0': + dependencies: + '@shikijs/primitive': 4.5.0 + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + + '@shikijs/primitive@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/themes@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + + '@shikijs/types@4.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.8.1 + optional: true + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + '@types/estree@1.0.9': {} + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/js-yaml@4.0.9': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + '@types/node@24.19.0': dependencies: undici-types: 7.24.6 + '@types/sax@1.2.7': + dependencies: + '@types/node': 24.19.0 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -1282,6 +3216,8 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true + '@ungap/structured-clone@1.4.0': {} + '@vitest/coverage-v8@5.0.3(vitest@5.0.3)': dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -1292,51 +3228,323 @@ snapshots: obug: 2.2.1 std-env: 4.3.0 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)) + vitest: 5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1)) + + '@vitest/istanbul-lib-coverage@1.0.2': {} + + '@vitest/istanbul-lib-report@1.0.2': + dependencies: + '@vitest/istanbul-lib-coverage': 1.0.2 + + '@vitest/mocker@5.0.3(vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1))': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.3 + estree-walker: 3.0.3 + magic-string: 1.4.2 + optionalDependencies: + vite: 8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1) + + '@vitest/spy@5.0.3': {} + + am-i-vibing@0.5.0: + dependencies: + process-ancestry: 0.1.0 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.7: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + astro-expressive-code@0.44.2(astro@7.3.6(@types/node@24.19.0)(yaml@2.9.1)): + dependencies: + astro: 7.3.6(@types/node@24.19.0)(yaml@2.9.1) + rehype-expressive-code: 0.44.2 + url-extras: 0.1.0 + + astro@7.3.6(@types/node@24.19.0)(yaml@2.9.1): + dependencies: + '@astrojs/compiler-rs': 0.5.1 + '@astrojs/internal-helpers': 0.12.0 + '@astrojs/markdown-satteri': 0.4.3 + '@astrojs/telemetry': 3.3.3 + '@capsizecss/unpack': 4.0.1 + '@clack/prompts': 1.8.1 + '@oslojs/encoding': 1.1.0 + am-i-vibing: 0.5.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 2.0.1 + devalue: 5.9.4 + diff: 9.0.0 + dset: 3.1.4 + es-module-lexer: 3.0.3 + esbuild: 0.28.2 + find-proc: 0.2.0 + flattie: 1.1.1 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.6 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.3.0 + jsonc-parser: 3.3.1 + magic-string: 1.4.2 + magicast: 0.5.5 + mrmime: 2.0.1 + neotraverse: 1.0.1 + obug: 3.0.0 + p-limit: 7.3.3 + p-queue: 9.3.3 + package-manager-detector: 1.9.0 + piccolore: 0.1.3 + picomatch: 4.0.7 + rolldown: 1.2.12 + shiki: 4.5.0 + smol-toml: 1.9.0 + svgo: 4.1.0 + tinyclip: 1.0.3 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + ultrahtml: 1.7.0 + unifont: 0.7.5 + unstorage: 1.17.5 + verkit: 0.5.0 + vite: 8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.6.5 + optionalDependencies: + sharp: 0.35.5(@types/node@24.19.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + bcp-47-match@2.0.3: {} + + bcp-47@2.1.1: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + + boolbase@1.0.0: {} + + ccount@2.0.1: {} + + chai@6.3.0: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chardet@2.2.0: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + + ci-info@4.4.0: {} + + cli-width@4.1.0: {} + + clsx@2.1.1: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.1.0: {} + + commander@15.0.0: {} + + common-ancestor-path@2.0.0: {} + + cookie-es@1.2.3: {} + + cookie@2.0.1: {} + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@6.0.0: + dependencies: + boolbase: 1.0.0 + css-what: 7.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.3.0: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.2 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.2 + + css-what@7.0.0: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + defu@6.1.7: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} - '@vitest/istanbul-lib-coverage@1.0.2': {} + detect-libc@2.1.2: {} - '@vitest/istanbul-lib-report@1.0.2': - dependencies: - '@vitest/istanbul-lib-coverage': 1.0.2 + devalue@5.9.4: {} - '@vitest/mocker@5.0.3(vite@8.3.1(@types/node@24.19.0))': + devlop@1.1.0: dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.3 - estree-walker: 3.0.3 - magic-string: 1.4.2 - optionalDependencies: - vite: 8.3.1(@types/node@24.19.0) + dequal: 2.0.3 - '@vitest/spy@5.0.3': {} + diff@9.0.0: {} - assertion-error@2.0.1: {} + direction@2.0.1: {} - ast-v8-to-istanbul@1.0.7: + dom-serializer@2.0.0: dependencies: - '@jridgewell/trace-mapping': 0.3.31 - estree-walker: 3.0.3 - js-tokens: 10.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 - chai@6.3.0: {} + domelementtype@2.3.0: {} - chardet@2.2.0: {} + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 - cli-width@4.1.0: {} + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 - commander@15.0.0: {} + dset@3.1.4: {} - detect-libc@2.1.2: {} + entities@4.5.0: {} es-module-lexer@2.3.2: {} + es-module-lexer@3.0.3: {} + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 + eventemitter3@5.0.4: {} + expect-type@1.4.0: {} + expressive-code@0.44.2: + dependencies: + '@expressive-code/core': 0.44.2 + '@expressive-code/plugin-frames': 0.44.2 + '@expressive-code/plugin-shiki': 0.44.2 + '@expressive-code/plugin-text-markers': 0.44.2 + + extend@3.0.2: {} + fast-string-truncated-width@3.0.3: {} fast-string-width@3.0.2: @@ -1351,15 +3559,184 @@ snapshots: optionalDependencies: picomatch: 4.0.7 + find-proc@0.2.0: {} + + flattie@1.1.1: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + fsevents@2.3.3: optional: true + get-tsconfig@5.0.0-beta.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.5 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.2 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.5 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.5 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + + http-cache-semantics@4.3.0: {} + + i18next@26.4.2(typescript@7.0.2): + optionalDependencies: + typescript: 7.0.2 + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-docker@4.0.0: {} + + is-hexadecimal@2.0.1: {} + + is-plain-obj@4.1.0: {} + js-tokens@10.0.0: {} + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsonc-parser@3.3.1: {} + + klona@2.0.6: {} + lightningcss-android-arm64@1.33.0: optional: true @@ -1409,6 +3786,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + longest-streak@3.1.0: {} + + lru-cache@11.5.3: {} + magic-string@1.4.2: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -1419,22 +3800,368 @@ snapshots: '@babel/types': 7.29.8 source-map-js: 1.2.2 + mdast-util-directive@3.1.1: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + micromark-util-character: 2.1.1 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.3 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.4.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.2.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-character: 2.1.1 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + micromark-core-commonmark@2.0.4: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.1.0 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-edit-map: 1.0.0 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-directive@4.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.1.0 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + parse-entities: 4.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-space@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.3 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-edit-map@1.0.0: + dependencies: + micromark-util-types: 2.0.3 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.3 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.3: {} + + micromark@4.0.3: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-edit-map: 1.0.0 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + transitivePeerDependencies: + - supports-color + + mrmime@2.0.1: {} + + ms@2.1.3: {} + mute-stream@3.0.0: {} nanoid@3.3.19: {} + neotraverse@1.0.1: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-fetch-native@1.6.7: {} + + node-mock-http@1.0.5: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + obug@2.2.1: {} + obug@3.0.0: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + ohash@2.0.12: {} + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + p-limit@7.3.3: + dependencies: + yocto-queue: 1.2.2 + + p-queue@9.3.3: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.2 + + p-timeout@7.0.2: {} + + package-manager-detector@1.9.0: {} + + pagefind@1.5.2: + optionalDependencies: + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + piccolore@0.1.3: {} + picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.7: {} + postcss-nested@6.2.0(postcss@8.5.28): + dependencies: + postcss: 8.5.28 + postcss-selector-parser: 6.1.4 + + postcss-selector-parser@6.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss@8.5.28: dependencies: nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.2 + prismjs@1.30.0: {} + + process-ancestry@0.1.0: {} + + property-information@7.2.0: {} + + radix3@1.1.2: {} + + readdirp@5.1.1: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-expressive-code@0.44.2: + dependencies: + expressive-code: 0.44.2 + + remark-directive@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.1 + micromark-extension-directive: 4.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + resolve-pkg-maps@1.0.0: {} + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + rolldown@1.2.12: dependencies: '@oxc-project/types': 0.152.0 @@ -1458,14 +4185,113 @@ snapshots: safer-buffer@2.1.2: {} + satteri@0.10.5: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + optionalDependencies: + '@bruits/satteri-darwin-arm64': 0.10.5 + '@bruits/satteri-darwin-x64': 0.10.5 + '@bruits/satteri-linux-arm64-gnu': 0.10.5 + '@bruits/satteri-linux-arm64-musl': 0.10.5 + '@bruits/satteri-linux-x64-gnu': 0.10.5 + '@bruits/satteri-linux-x64-musl': 0.10.5 + '@bruits/satteri-wasm32-wasi': 0.10.5 + '@bruits/satteri-win32-arm64-msvc': 0.10.5 + '@bruits/satteri-win32-x64-msvc': 0.10.5 + + sax@1.6.1: {} + + semver@7.8.5: + optional: true + + sharp@0.35.5(@types/node@24.19.0): + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.5 + '@img/sharp-darwin-x64': 0.35.5 + '@img/sharp-freebsd-wasm32': 0.35.5 + '@img/sharp-libvips-darwin-arm64': 1.3.4 + '@img/sharp-libvips-darwin-x64': 1.3.4 + '@img/sharp-libvips-linux-arm': 1.3.4 + '@img/sharp-libvips-linux-arm64': 1.3.4 + '@img/sharp-libvips-linux-ppc64': 1.3.4 + '@img/sharp-libvips-linux-riscv64': 1.3.4 + '@img/sharp-libvips-linux-s390x': 1.3.4 + '@img/sharp-libvips-linux-x64': 1.3.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + '@img/sharp-linux-arm': 0.35.5 + '@img/sharp-linux-arm64': 0.35.5 + '@img/sharp-linux-ppc64': 0.35.5 + '@img/sharp-linux-riscv64': 0.35.5 + '@img/sharp-linux-s390x': 0.35.5 + '@img/sharp-linux-x64': 0.35.5 + '@img/sharp-linuxmusl-arm64': 0.35.5 + '@img/sharp-linuxmusl-x64': 0.35.5 + '@img/sharp-webcontainers-wasm32': 0.35.5 + '@img/sharp-win32-arm64': 0.35.5 + '@img/sharp-win32-ia32': 0.35.5 + '@img/sharp-win32-x64': 0.35.5 + '@types/node': 24.19.0 + optional: true + + shiki@4.5.0: + dependencies: + '@shikijs/core': 4.5.0 + '@shikijs/engine-javascript': 4.5.0 + '@shikijs/engine-oniguruma': 4.5.0 + '@shikijs/langs': 4.5.0 + '@shikijs/themes': 4.5.0 + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + + sitemap@9.0.1: + dependencies: + '@types/node': 24.19.0 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.6.1 + + smol-toml@1.9.0: {} + source-map-js@1.2.2: {} + space-separated-tokens@2.0.2: {} + std-env@4.3.0: {} + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + svgo@4.1.0: + dependencies: + commander: 11.1.0 + css-select: 6.0.0 + css-tree: 3.2.1 + css-what: 7.0.0 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.1 + + tiny-inflate@1.0.3: {} + tinybench@6.2.0: {} + tinyclip@1.0.3: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: @@ -1475,6 +4301,13 @@ snapshots: tinyrainbow@3.2.0: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tslib@2.8.1: + optional: true + typescript@7.0.2: optionalDependencies: '@typescript/typescript-aix-ppc64': 7.0.2 @@ -1498,9 +4331,88 @@ snapshots: '@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-x64': 7.0.2 + ufo@1.6.4: {} + + ultrahtml@1.7.0: {} + + uncrypto@0.1.3: {} + undici-types@7.24.6: {} - vite@8.3.1(@types/node@24.19.0): + undici@8.11.2: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.5: + dependencies: + css-tree: 3.2.1 + ohash: 2.0.12 + undici: 8.11.2 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.3 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + url-extras@0.1.0: {} + + util-deprecate@1.0.2: {} + + verkit@0.5.0: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -1509,12 +4421,18 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.19.0 + esbuild: 0.28.2 fsevents: 2.3.3 + yaml: 2.9.1 - vitest@5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)): + vitefu@1.1.3(vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1)): + optionalDependencies: + vite: 8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1) + + vitest@5.0.3(@types/node@24.19.0)(@vitest/coverage-v8@5.0.3)(vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.3(vite@8.3.1(@types/node@24.19.0)) + '@vitest/mocker': 5.0.3(vite@8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -1525,7 +4443,7 @@ snapshots: tinybench: 6.2.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.1(@types/node@24.19.0) + vite: 8.3.1(@types/node@24.19.0)(esbuild@0.28.2)(yaml@2.9.1) why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 24.19.0 @@ -1534,3 +4452,15 @@ snapshots: - msw why-is-node-running@3.2.1: {} + + xxhash-wasm@1.1.0: {} + + yaml@2.9.1: {} + + yargs-parser@22.0.0: {} + + yocto-queue@1.2.2: {} + + zod@4.6.5: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3476775c..260e5bd4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,7 @@ +# The documentation site (docs/) is a workspace package: one lockfile for both. +packages: + - docs + # Supply-chain protections for installing dependencies. # Wait a day before installing a newly published version: most malicious @@ -9,3 +13,7 @@ trustPolicy: no-downgrade # No dependency may run install scripts unless listed here. strictDepBuilds: true onlyBuiltDependencies: [] +# Install scripts not needed: these packages ship their binaries as +# platform-specific optional dependencies (esbuild comes with Astro, for docs/). +allowBuilds: + esbuild: false diff --git a/src/commands/scripts.ts b/src/commands/scripts.ts index 5f39c593..34016b99 100644 --- a/src/commands/scripts.ts +++ b/src/commands/scripts.ts @@ -69,7 +69,7 @@ async function run(name: string, args: string[], ctx: Context): Promise { output.info(`Running "${name}"…`) // Scripts run in the current folder, and a folder script is one level // deeper: this gives them the repository's path, and the system whose - // versions run. Documented in the README ("Scripts"). + // versions run. Documented in docs/src/content/docs/reference/scripts.md. const env = { CONFIGFILE_REPO: repository, CONFIGFILE_SCRIPT: script.name, From d1309fa6f818108da9237ceb8699a55a80b8ca3b Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Oct 2026 11:38:58 +0200 Subject: [PATCH 331/341] docs: add a getting started tutorial (#309) --- .../docs/getting-started/installation.md | 2 + .../docs/getting-started/quick-start.md | 16 -- .../content/docs/getting-started/tutorial.md | 205 ++++++++++++++++++ docs/src/content/docs/index.md | 2 +- 4 files changed, 208 insertions(+), 17 deletions(-) delete mode 100644 docs/src/content/docs/getting-started/quick-start.md create mode 100644 docs/src/content/docs/getting-started/tutorial.md diff --git a/docs/src/content/docs/getting-started/installation.md b/docs/src/content/docs/getting-started/installation.md index 8f265974..2190254e 100644 --- a/docs/src/content/docs/getting-started/installation.md +++ b/docs/src/content/docs/getting-started/installation.md @@ -1,6 +1,8 @@ --- title: Installation description: Install configfile on macOS or Linux, with Homebrew or npm. +sidebar: + order: 1 --- ## Requirements diff --git a/docs/src/content/docs/getting-started/quick-start.md b/docs/src/content/docs/getting-started/quick-start.md deleted file mode 100644 index 514aebeb..00000000 --- a/docs/src/content/docs/getting-started/quick-start.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Quick start -description: Point configfile to your dotfiles repository. ---- - -To generate the first configuration, run: - -```bash -configfile init -``` - -It asks for your repository URL and clones it into `~/.configfile/dotfiles`, a copy *configfile* keeps in sync with the remote (edit your dotfiles in your own working copy). To set it up without questions (in a script, for example): - -```bash -configfile init --repo git@github.com:me/dotfiles.git -``` diff --git a/docs/src/content/docs/getting-started/tutorial.md b/docs/src/content/docs/getting-started/tutorial.md new file mode 100644 index 00000000..7ff2f0b7 --- /dev/null +++ b/docs/src/content/docs/getting-started/tutorial.md @@ -0,0 +1,205 @@ +--- +title: Your first dotfiles repository +description: From an empty repository to a deployed configuration file and a setup script, in ten minutes. +sidebar: + order: 2 +--- + +This tutorial takes you from nothing to a working setup: a dotfiles repository with one configuration file and one setup script, deployed on your machine by *configfile*. It takes about ten minutes. + +You need *configfile* [installed](/getting-started/installation/) and a GitHub account (any git hosting works the same way). + +## 1. Create your dotfiles repository + +*configfile* doesn't store your files: they live in a git repository that you own, usually called `dotfiles`. + +Create an empty repository named `dotfiles` on GitHub, then clone it. This clone is your **working copy**: it's where you edit your dotfiles. + +```sh +git clone git@github.com:me/dotfiles.git ~/dotfiles +cd ~/dotfiles +``` + +## 2. Add a first module + +A **module** is a folder of `files/` that groups the configuration of one tool. Create one for zsh, with the file you want on every machine: + +```sh +mkdir -p files/zsh +echo 'alias ll="ls -la"' > files/zsh/zshrc +``` + +Then tell *configfile* where this file goes, in the module's `settings.json`: + +```json title="files/zsh/settings.json" +{ + "files": [ + { "source_path": "zshrc", "target_path": "~/.zshrc", "deploy": "global" } + ] +} +``` + +`"deploy": "global"` means the file is linked into your home folder. The [modules reference](/reference/modules/) lists every option. + +## 3. Add a setup script + +Scripts go in `scripts/`. They're handy for what files alone can't do, such as installing tools: + +```sh title="scripts/setup.sh" +#!/bin/sh +echo "Setting up $CONFIGFILE_OS from $CONFIGFILE_REPO" +``` + +`CONFIGFILE_OS` and `CONFIGFILE_REPO` are set by *configfile* when it runs the script (see [Scripts](/reference/scripts/)). + +Commit and push: + +```sh +git add . +git commit -m "First module" +git push +``` + +Your repository now looks like this: + +```txt +files/ + zsh/ + settings.json + zshrc +scripts/ + setup.sh +``` + +## 4. Connect configfile to the repository + +```sh +configfile init --repo git@github.com:me/dotfiles.git +``` + +```txt + Info Cloning git@github.com:me/dotfiles.git into ~/.configfile/dotfiles… +Cloning into '/Users/me/.configfile/dotfiles'... +done. + Done configfile is ready. Configuration saved to ~/.configfilerc. +``` + +*configfile* keeps its own copy of the repository in `~/.configfile/dotfiles`, and deploys from it. You never edit this copy: you edit your working copy, push, and *configfile* follows. [How it works](/concepts/how-it-works/) explains why. + +## 5. Deploy the module + +Check where things stand: + +```sh +configfile modules status +``` + +```txt +zsh: + ~/.zshrc (not deployed: a file is in the way) +``` + +You probably already have a `~/.zshrc`. Preview what deploying would do, without changing anything: + +```sh +configfile modules deploy zsh --dry-run +``` + +```txt + Info Dry run, nothing is changed. Deploying zsh would do: +- ~/.zshrc (would be linked, the existing file moved to ~/.zshrc.old) + Done Dry run finished. +``` + +Your current file is kept, as `~/.zshrc.old`. Deploy: + +```sh +configfile modules deploy zsh +``` + +```txt + Info Deploying zsh… +- ~/.zshrc (deployed, previous file moved to ~/.zshrc.old) + Done Deployment finished. +``` + +`~/.zshrc` is now a link to the file in the repository: + +```sh +ls -l ~/.zshrc +# ~/.zshrc -> ~/.configfile/dotfiles/files/zsh/zshrc +``` + +## 6. Run the setup script + +```sh +configfile scripts run setup +``` + +```txt + Info Running "setup"… +Setting up macos from ~/.configfile/dotfiles + Done Script "setup" finished. +``` + +## 7. Change a file and sync + +Edit the file in your working copy, then push, as for any git repository: + +```sh +cd ~/dotfiles +echo 'alias gs="git status"' >> files/zsh/zshrc +git commit -am "Add gs alias" +git push +``` + +Then bring the change to this machine: + +```sh +configfile update +``` + +```txt + Info Syncing ~/.configfile/dotfiles… + Done Synced with origin/main (117f764). Global files are links, so they are up to date; run "configfile modules deploy --all" for new files. +``` + +Because `~/.zshrc` is a link, the new alias is there right away. On your other machines, `configfile update` does the same. + +:::tip +To set up a new machine, install *configfile*, then run `configfile init`, `configfile modules deploy --all` and your setup script. +::: + +## 8. See what happened, and undo it + +*configfile* records every change it makes. In `configfile history`, the deployment and the sync look like this: + +```sh +configfile history +``` + +```txt +2026-10-08 11:29 modules deploy zsh ok + linked ~/.zshrc (previous file moved to ~/.zshrc.old) + +2026-10-08 11:29 update ok + synced ~/.configfile/dotfiles with origin/main (f9a3f1e → 117f764) +``` + +And every deployment can be reverted. `undeploy` removes the link and puts your previous file back: + +```sh +configfile modules undeploy zsh +``` + +```txt + Info Undeploying zsh… +- ~/.zshrc (removed, ~/.zshrc.old restored) + Done Undeployment finished. +``` + +## Next steps + +- [Modules and `settings.json`](/reference/modules/): local files copied into a project, files kept in the repository without being deployed, and every rule for targets. +- [Scripts](/reference/scripts/): scripts in any language, folder scripts, and versions per system (`setup.macos.sh`). +- [Commands](/reference/commands/): every command and option, including the ones for running *configfile* from scripts and CI. diff --git a/docs/src/content/docs/index.md b/docs/src/content/docs/index.md index dc8dc40b..a708f431 100644 --- a/docs/src/content/docs/index.md +++ b/docs/src/content/docs/index.md @@ -5,7 +5,7 @@ description: Manage your dotfiles and setup scripts from a git repository, on ma *configfile* is a command line tool that helps you manage your configuration files (dotfiles) and setup scripts from a git repository. -- [Install configfile](/getting-started/installation/), then [point it to your dotfiles repository](/getting-started/quick-start/). +- [Install configfile](/getting-started/installation/), then follow [Your first dotfiles repository](/getting-started/tutorial/), a ten-minute tutorial. - [How it works](/concepts/how-it-works/): your repository, the mirror configfile keeps, and what it deploys. - Reference: [commands](/reference/commands/), [modules and `settings.json`](/reference/modules/), [scripts](/reference/scripts/), [configuration](/reference/configuration/), [history](/reference/history/). - [Upgrading from 0.3](/guides/upgrading-from-0-3/). From bcf15dec754a397ecebff590bd1c43e28818234d Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Oct 2026 16:07:26 +0200 Subject: [PATCH 332/341] docs: generate the usage and options of the commands reference (#310) --- CONTRIBUTING.md | 2 +- docs/src/content/docs/reference/commands.md | 168 ++++++++++++++--- package.json | 1 + tests/docs.test.ts | 84 +++++++++ tools/docs-commands.ts | 192 ++++++++++++++++++++ tsconfig.json | 2 +- 6 files changed, 425 insertions(+), 24 deletions(-) create mode 100644 tests/docs.test.ts create mode 100644 tools/docs-commands.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e1036162..e97c48b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ Everyone taking part in the project follows the [code of conduct](CODE_OF_CONDUC ### Do you want to contribute to the documentation? -The documentation lives with the source code: the [documentation site](docs/) for users (published at [docs.configfile.sh](https://docs.configfile.sh), run it locally with `pnpm docs:dev`), and this file for contributors. Each page of the site is a Markdown file in `docs/src/content/docs/`. Until the README is shortened to an introduction, it holds the same content: update both. +The documentation lives with the source code: the [documentation site](docs/) for users (published at [docs.configfile.sh](https://docs.configfile.sh), run it locally with `pnpm docs:dev`), and this file for contributors. Each page of the site is a Markdown file in `docs/src/content/docs/`. Until the README is shortened to an introduction, it holds the same content: update both. The usage lines and option tables of the commands page are generated from the commands' definitions: after adding or changing a command, an argument or an option, run `pnpm docs:commands` (a test fails until the page is up to date). A new command first needs its section and an empty `` / `` block on the page, which the script then fills. * Please refer to the "Do you intend to add a new feature or change an existing one?" section. diff --git a/docs/src/content/docs/reference/commands.md b/docs/src/content/docs/reference/commands.md index 6f238d24..e968e51e 100644 --- a/docs/src/content/docs/reference/commands.md +++ b/docs/src/content/docs/reference/commands.md @@ -3,27 +3,151 @@ title: Commands description: Every configfile command and option, exit codes, and use without a terminal. --- -- `configfile init` (`i`): ask for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clone it into `~/.configfile/dotfiles` and save the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. - - `-f, --force`: overwrite an existing configuration without asking. - - `--repo `: give the URL from the command line, for non-interactive setups. - - `--folder `: clone somewhere else than `~/.configfile/dotfiles`. -- `configfile modules list` (`m l`, or just `configfile modules`): list available modules. -- `configfile modules status [modules...]` (`m st`): show whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. Without module names, it also lists the deployed files the repository no longer deploys. - - `-l, --local`: check the local files, in the current folder. -- `configfile modules deploy [modules...]` (`m d`): deploy the global files of the given modules. Without module names, asks to deploy all modules. - - `-l, --local`: copy the local files of the modules instead. - - `-a, --all`: deploy every module without asking. - - `-f, --force`: replace existing local files without asking (they are moved to `.old`). - - `-n, --dry-run`: show what would be done, without changing anything. -- `configfile modules undeploy [modules...]` (`m u`): remove the deployed global files of the given modules and restore their backups. Without module names, asks to undeploy all modules. - - `-a, --all`: undeploy every module without asking, and the files the repository no longer deploys. - - `--removed`: only undeploy the files the repository no longer deploys (see [Modules](/reference/modules/)); with `--local`, the copies made in the current folder. - - `-l, --local` and `-n, --dry-run`: as for `deploy`. -- `configfile scripts list` (`s l`, or just `configfile scripts`): list available scripts. -- `configfile scripts run [-- args...]` (`s r`): run a script. Arguments after `--` are passed to the script. -- `configfile update` (`u`): sync *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. It warns about deployed files the repository no longer deploys. -- `configfile history`: show what *configfile* changed, most recent last (see [History](/reference/history/)). - - `-n, --limit `: number of runs to show (20 by default). - - `--json`: print the raw history lines (JSON Lines), for scripts. +Every command prints its own help with `--help`, and most have a short form, shown under their usage. The usage lines and the tables of arguments and options below are generated from *configfile* itself. + +## `configfile init` + +Asks for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clones it into `~/.configfile/dotfiles` and saves the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. + + +```sh +configfile init [options] +``` + +Short form: `configfile i`. + +| Argument or option | Description | +| --- | --- | +| `-f, --force` | overwrite the existing configuration without asking | +| `--repo ` | dotfiles repository URL (skips the question) | +| `--folder ` | where to clone the repository (default: ~/.configfile/dotfiles) | + + +## `configfile modules list` + +Lists the available modules. `configfile modules` alone does the same. + + +```sh +configfile modules list +``` + +Short form: `configfile m l`. + + +## `configfile modules status` + +Shows whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. Without module names, it also lists the deployed files the repository no longer deploys. + + +```sh +configfile modules status [options] [modules...] +``` + +Short form: `configfile m st`. + +| Argument or option | Description | +| --- | --- | +| `modules` | modules to check (all when omitted) | +| `-l, --local` | check the local files of the modules, in the current folder | + + +## `configfile modules deploy` + +Deploys the global files of the given modules. Without module names, asks to deploy all modules. + + +```sh +configfile modules deploy [options] [modules...] +``` + +Short form: `configfile m d`. + +| Argument or option | Description | +| --- | --- | +| `modules` | modules to deploy (use --all, or answer a question, when omitted) | +| `-l, --local` | copy the local files of the modules instead of linking global files | +| `-a, --all` | deploy every module without asking | +| `-f, --force` | replace existing local files without asking (they are moved to .old) | +| `-n, --dry-run` | show what would be done, without changing anything | + + +## `configfile modules undeploy` + +Removes the deployed global files of the given modules and restores their backups. Without module names, asks to undeploy all modules. `--local` and `--dry-run` work as for `deploy`. [Modules](/reference/modules/) explains which files `--removed` covers; with `--local`, it covers the copies made in the current folder. + + +```sh +configfile modules undeploy [options] [modules...] +``` + +Short form: `configfile m u`. + +| Argument or option | Description | +| --- | --- | +| `modules` | modules to undeploy (use --all, or answer a question, when omitted) | +| `-l, --local` | remove the local copies of the modules instead of global links | +| `-a, --all` | undeploy every module without asking, and the files the repository no longer deploys | +| `--removed` | only undeploy the files the repository no longer deploys | +| `-n, --dry-run` | show what would be done, without changing anything | + + +## `configfile scripts list` + +Lists the available scripts. `configfile scripts` alone does the same. + + +```sh +configfile scripts list +``` + +Short form: `configfile s l`. + + +## `configfile scripts run` + +Runs a script. Arguments after `--` are passed to the script. + + +```sh +configfile scripts run [args...] +``` + +Short form: `configfile s r`. + +| Argument or option | Description | +| --- | --- | +| `name` | script to run | +| `args` | arguments passed to the script (put them after "--") | + + +## `configfile update` + +Syncs *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. It warns about deployed files the repository no longer deploys. + + +```sh +configfile update +``` + +Short form: `configfile u`. + + +## `configfile history` + +Shows what *configfile* changed, most recent last (see [History](/reference/history/)). + + +```sh +configfile history [options] +``` + +| Argument or option | Description | +| --- | --- | +| `-n, --limit ` | number of runs to show (default: 20) | +| `--json` | print the raw history lines (JSON Lines), for scripts | + + +## Exit codes and use in scripts *configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. Each run of a command that changes files, and any unexpected error, is also recorded in the [history](/reference/history/). diff --git a/package.json b/package.json index 44db16c6..d192d1eb 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "check": "pnpm lint && pnpm typecheck && pnpm test", "docs:dev": "pnpm --filter configfile-docs dev", "docs:build": "pnpm --filter configfile-docs build", + "docs:commands": "node tools/docs-commands.ts", "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"", "prepack": "node --run clean && tsc -p tsconfig.build.json" }, diff --git a/tests/docs.test.ts b/tests/docs.test.ts new file mode 100644 index 00000000..ecdc474e --- /dev/null +++ b/tests/docs.test.ts @@ -0,0 +1,84 @@ +import { execFileSync } from 'node:child_process' +import { readFile } from 'node:fs/promises' +import { fileURLToPath } from 'node:url' + +import { describe, expect, it } from 'vitest' + +import { COMMANDS_PAGE, renderCommandsPage } from '../tools/docs-commands.ts' + +const page = await readFile(COMMANDS_PAGE, 'utf8') +const block = (name: string, content = '') => + `\n${content}` + +describe('commands reference', () => { + it('documents every command, with its current usage and options', () => { + // On failure, run "pnpm docs:commands" and commit the page (a new command + // first needs its block, see CONTRIBUTING.md). + expect(renderCommandsPage(page)).toBe(page) + }) + + it('rewrites stale blocks, and leaves everything else as it is', () => { + const stale = page + .replace( + /(\n)[\s\S]*?()/, + '$1STALE\n$2', + ) + .replace('', '') + expect(stale).toContain('STALE') + + const rendered = renderCommandsPage(stale) + + expect(rendered).not.toContain('STALE') + expect(rendered).toBe( + // Only the stale content changed: the marker keeps its spacing. + page.replace( + '', + '', + ), + ) + }) + + it('keeps Windows line endings', () => { + const crlf = page.replaceAll('\n', '\r\n') + + expect(renderCommandsPage(crlf)).toBe(crlf) + }) + + it('refuses unknown, missing and duplicate commands, listing every problem', () => { + const wrong = `${block('configfile nope')}\n${page}\n${block('configfile init')}\n` + + const error = (() => { + try { + renderCommandsPage( + wrong.replace(/[\s\S]*?/, ''), + ) + } catch (thrown) { + return (thrown as Error).message + } + return '' + })() + + expect(error).toContain('"configfile nope" is not a command.') + expect(error).toContain('"configfile history" has no [\s\S]*?)/, + '$1', + ) + + expect(() => renderCommandsPage(broken)).toThrow( + 'The block of "configfile modules list" has no .', + ) + }) + + it('can be run to check the page', () => { + const script = fileURLToPath(new URL('../tools/docs-commands.ts', import.meta.url)) + + const output = execFileSync(process.execPath, [script, '--check'], { encoding: 'utf8' }) + + expect(output).toContain('is up to date.') + }) +}) diff --git a/tools/docs-commands.ts b/tools/docs-commands.ts new file mode 100644 index 00000000..97ecedaa --- /dev/null +++ b/tools/docs-commands.ts @@ -0,0 +1,192 @@ +// Generates the usage, arguments and options of each command in the commands +// reference (docs/src/content/docs/reference/commands.md) from the commands' +// own definitions, so that the page cannot drift from the code. +// +// node tools/docs-commands.ts updates the page +// node tools/docs-commands.ts --check fails if the page is out of date +// +// The page holds the prose; each command has a block between +// +// +// which this script fills. A new command needs its block added by hand first. +// tests/docs.test.ts makes the same comparison as --check. + +import { readFileSync, writeFileSync } from 'node:fs' +import { Writable } from 'node:stream' +import { fileURLToPath } from 'node:url' + +import type { Command } from 'commander' + +import type { Context } from '../src/context.ts' +import { History } from '../src/history.ts' +import { Output } from '../src/output.ts' +import { buildProgram } from '../src/program.ts' +import { nonInteractivePrompts } from '../src/prompts.ts' + +export const COMMANDS_PAGE = fileURLToPath( + new URL('../docs/src/content/docs/reference/commands.md', import.meta.url), +) + +const MARKER = //g + +interface Block { + name: string + /** Offsets of the opening marker's end and of the closing marker's start. */ + contentStart: number + contentEnd: number +} + +/** The page with every generated block rewritten from the commands' definitions. */ +export function renderCommandsPage(page: string): string { + const commands = new Map(listCommands(buildProgram(inertContext())).map(c => [path(c), c])) + const blocks = findBlocks(page) + + const problems: string[] = [] + const names = blocks.map(block => block.name) + for (const name of commands.keys()) { + if (!names.includes(name)) problems.push(`"${name}" has no block.`) + } + for (const [index, name] of names.entries()) { + if (!commands.has(name)) problems.push(`"${name}" is not a command.`) + else if (names.indexOf(name) !== index) problems.push(`"${name}" has more than one block.`) + } + for (const command of commands.values()) problems.push(...undocumented(command)) + if (problems.length > 0) throw new Error(problems.join('\n')) + + // The page's own line endings, so that a CRLF checkout stays as it is. + const eol = page.includes('\r\n') ? '\r\n' : '\n' + let result = '' + let offset = 0 + for (const block of blocks) { + const generated = describe(commands.get(block.name) as Command).replaceAll('\n', eol) + result += page.slice(offset, block.contentStart) + eol + generated + offset = block.contentEnd + } + return result + page.slice(offset) +} + +/** The generated blocks of the page, in order; throws on a malformed marker. */ +function findBlocks(page: string): Block[] { + const blocks: Block[] = [] + let open: { name: string; end: number } | null = null + + for (const match of page.matchAll(MARKER)) { + const [marker, closing, rawName] = match + const start = match.index + if (closing == null) { + const name = (rawName ?? '').trim() + if (name === '') throw new Error(`A marker names no command.`) + if (open != null) throw new Error(`The block of "${open.name}" has no .`) + open = { name, end: start + marker.length } + } else { + if (open == null) throw new Error('A marker closes no block.') + blocks.push({ name: open.name, contentStart: open.end, contentEnd: start }) + open = null + } + } + if (open != null) throw new Error(`The block of "${open.name}" has no .`) + return blocks +} + +/** Every command users run, nested ones included, but not their groups or `help`. */ +function listCommands(program: Command): Command[] { + return program.commands.flatMap(command => + command.commands.length > 0 ? listCommands(command) : [command], + ) +} + +function path(command: Command): string { + const names: string[] = [] + for (let current: Command | null = command; current != null; current = current.parent) { + names.unshift(current.name()) + } + return names.join(' ') +} + +/** Arguments and options without a description, which the page could not explain. */ +function undocumented(command: Command): string[] { + return [ + ...command.registeredArguments + .filter(arg => arg.description.trim() === '') + .map(arg => `Argument "${arg.name()}" of "${path(command)}" has no description.`), + ...command.options + .filter(option => option.description.trim() === '') + .map(option => `Option "${option.flags}" of "${path(command)}" has no description.`), + ] +} + +function describe(command: Command): string { + const help = command.createHelp() + // All arguments, documented or not: commander's visibleArguments hides them all + // when none has a description. + const args = command.registeredArguments + // --help is shown once for all commands, in the page's introduction. + const options = help.visibleOptions(command).filter(option => option.long !== '--help') + + // As --help prints it, without the alias ("deploy|d") and without + // "[options]" when --help is the only option. + const alias = command.aliases()[0] + let usage = help.commandUsage(command) + if (alias != null) usage = usage.replace(`${command.name()}|${alias}`, command.name()) + if (options.length === 0) usage = usage.replace(' [options]', '') + const lines = ['```sh', usage, '```', ''] + + const short = shortForm(command) + if (short != null) lines.push(`Short form: \`${short}\`.`, '') + + const rows = [ + ...args.map(arg => [help.argumentTerm(arg), help.argumentDescription(arg)]), + ...options.map(option => [help.optionTerm(option), help.optionDescription(option)]), + ] + if (rows.length > 0) { + lines.push('| Argument or option | Description |', '| --- | --- |') + for (const [term = '', description = ''] of rows) { + lines.push(`| \`${cell(term)}\` | ${cell(description)} |`) + } + lines.push('') + } + return lines.join('\n') +} + +/** `configfile m d` for `configfile modules deploy`, or null without aliases. */ +function shortForm(command: Command): string | null { + const names: string[] = [] + let aliased = false + for (let current: Command | null = command; current != null; current = current.parent) { + const alias = current.parent == null ? undefined : current.aliases()[0] + if (alias != null) aliased = true + names.unshift(alias ?? current.name()) + } + return aliased ? names.join(' ') : null +} + +function cell(text: string): string { + return text.replace(/\|/g, '\\|').replace(/\r?\n/g, ' ') +} + +/** A context for building the program only: nothing is read, written or asked. */ +function inertContext(): Context { + const sink = new Writable({ write: (_chunk, _encoding, done) => done() }) + return { + home: '/nonexistent', + cwd: '/nonexistent', + platform: 'linux', + output: new Output(sink, sink), + prompts: nonInteractivePrompts, + history: new History('/nonexistent'), + } +} + +if (import.meta.main) { + const page = readFileSync(COMMANDS_PAGE, 'utf8') + const rendered = renderCommandsPage(page) + if (rendered === page) { + console.log(`${COMMANDS_PAGE} is up to date.`) + } else if (process.argv.includes('--check')) { + console.error(`${COMMANDS_PAGE} is out of date: run "pnpm docs:commands".`) + process.exit(1) + } else { + writeFileSync(COMMANDS_PAGE, rendered) + console.log(`Updated ${COMMANDS_PAGE}.`) + } +} diff --git a/tsconfig.json b/tsconfig.json index 4a0e5c6f..6346d98d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,5 +19,5 @@ "skipLibCheck": true, "noEmit": true }, - "include": ["src/**/*.ts", "tests/**/*.ts", "vitest.config.ts"] + "include": ["src/**/*.ts", "tests/**/*.ts", "tools/**/*.ts", "vitest.config.ts"] } From aeeeee72f61eeb0c365148758664a9e558984bf0 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Oct 2026 16:42:19 +0200 Subject: [PATCH 333/341] docs: describe settings.json with a JSON Schema (#311) --- CHANGELOG.md | 2 + CONTRIBUTING.md | 2 +- docs/public/schemas/settings.json | 83 +++++++++++++++++++ docs/src/content/docs/reference/modules.md | 14 ++++ package.json | 1 + pnpm-lock.yaml | 34 ++++++++ tests/settings-schema.test.ts | 94 ++++++++++++++++++++++ 7 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 docs/public/schemas/settings.json create mode 100644 tests/settings-schema.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 57031c94..b1fdddd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Scripts get the repository folder, their name and the system in the `CONFIGFILE_REPO`, `CONFIGFILE_SCRIPT` and `CONFIGFILE_OS` environment variables ([#295](https://github.com/mindsers/configfile/issues/295)). +- A JSON Schema for `settings.json`, at `https://docs.configfile.sh/schemas/settings.json`: with + `"$schema"` at the top of the file, editors complete and check it as you type. ## [1.0.0] - 2026-10-05 ### Added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e97c48b4..b93db8d9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ Everyone taking part in the project follows the [code of conduct](CODE_OF_CONDUC ### Do you want to contribute to the documentation? -The documentation lives with the source code: the [documentation site](docs/) for users (published at [docs.configfile.sh](https://docs.configfile.sh), run it locally with `pnpm docs:dev`), and this file for contributors. Each page of the site is a Markdown file in `docs/src/content/docs/`. Until the README is shortened to an introduction, it holds the same content: update both. The usage lines and option tables of the commands page are generated from the commands' definitions: after adding or changing a command, an argument or an option, run `pnpm docs:commands` (a test fails until the page is up to date). A new command first needs its section and an empty `` / `` block on the page, which the script then fills. +The documentation lives with the source code: the [documentation site](docs/) for users (published at [docs.configfile.sh](https://docs.configfile.sh), run it locally with `pnpm docs:dev`), and this file for contributors. Each page of the site is a Markdown file in `docs/src/content/docs/`. Until the README is shortened to an introduction, it holds the same content: update both. The usage lines and option tables of the commands page are generated from the commands' definitions: after adding or changing a command, an argument or an option, run `pnpm docs:commands` (a test fails until the page is up to date). A new command first needs its section and an empty `` / `` block on the page, which the script then fills. The format of `settings.json` is also described by a JSON Schema, `docs/public/schemas/settings.json`: when configfile starts accepting or refusing something new there, update the schema and the examples of `tests/settings-schema.test.ts`, which check that both agree. * Please refer to the "Do you intend to add a new feature or change an existing one?" section. diff --git a/docs/public/schemas/settings.json b/docs/public/schemas/settings.json new file mode 100644 index 00000000..229a65df --- /dev/null +++ b/docs/public/schemas/settings.json @@ -0,0 +1,83 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://docs.configfile.sh/schemas/settings.json", + "title": "configfile module settings", + "description": "The settings.json file of a configfile module: the files of the module and how each one is deployed. See https://docs.configfile.sh/reference/modules/", + "oneOf": [ + { + "type": "object", + "properties": { + "$schema": { + "description": "The JSON Schema of this file, for editor completion and validation. configfile ignores it.", + "type": "string" + }, + "files": { + "description": "The files of the module.", + "type": "array", + "items": { "$ref": "#/$defs/entry" } + } + }, + "required": ["files"], + "additionalProperties": false + }, + { + "description": "Deprecated: the configfile 0.3 format, a plain list of entries. Put the list in a \"files\" key instead. It will stop working in 2.0.", + "deprecated": true, + "type": "array", + "items": { "$ref": "#/$defs/entry" } + } + ], + "$defs": { + "path": { + "type": "string", + "pattern": "\\S" + }, + "entry": { + "type": "object", + "properties": { + "source_path": { + "$ref": "#/$defs/path", + "description": "Path of the file or folder, relative to the module folder. It must stay inside the module folder." + }, + "target_path": { + "$ref": "#/$defs/path", + "description": "Where the file is deployed. ~ is your home folder. A relative path is relative to the home folder for global files, and to the current folder for local files." + }, + "deploy": { + "description": "How the file is deployed: \"global\" links it (configfile modules deploy), \"local\" copies it into the current folder (configfile modules deploy --local), \"none\" keeps it in the repository without deploying it.", + "enum": ["global", "local", "none"] + }, + "global": { + "description": "Deprecated: the older spelling of \"deploy\" (true is \"global\", false is \"local\"). It will stop working in 2.0.", + "deprecated": true, + "type": "boolean" + } + }, + "additionalProperties": false, + "not": { + "description": "\"deploy\" and \"global\" cannot be used together.", + "required": ["deploy", "global"] + }, + "allOf": [ + { + "description": "Every entry names its file, except those that are never deployed.", + "if": { "properties": { "deploy": { "const": "none" } }, "required": ["deploy"] }, + "else": { "required": ["source_path"] } + }, + { + "description": "Deployed files need a target.", + "if": { + "anyOf": [ + { + "properties": { "deploy": { "enum": ["global", "local"] } }, + "required": ["deploy"] + }, + { "required": ["global"] } + ] + }, + "then": { "required": ["target_path"] } + } + ] + } + } +} diff --git a/docs/src/content/docs/reference/modules.md b/docs/src/content/docs/reference/modules.md index 19676fc6..2696e5c7 100644 --- a/docs/src/content/docs/reference/modules.md +++ b/docs/src/content/docs/reference/modules.md @@ -39,3 +39,17 @@ To stay safe, *configfile* never undeploys a file when it cannot tell whether th Only one *configfile* at a time changes files: a second one waits for the first to finish (the lock is `~/.configfile/lock`). > **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. + +## Completion and validation in your editor + +A [JSON Schema](https://docs.configfile.sh/schemas/settings.json) describes `settings.json`. Add it at the top of the file, and editors that support JSON Schema (VS Code, Zed, JetBrains IDEs, and others) suggest the keys and their values, show their descriptions, and flag mistakes as you type: + +```json +{ + "$schema": "https://docs.configfile.sh/schemas/settings.json", + "files": [] +} +``` + +*configfile* ignores the `$schema` key. The schema checks the structure of the file; the rules about where paths may point are checked by *configfile* when it reads the module. It is also stricter, to catch typos: it flags keys *configfile* doesn't know (such as `target-path`), which *configfile* ignores. + diff --git a/package.json b/package.json index d192d1eb..1556839e 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "@biomejs/biome": "2.5.15", "@types/node": "24.19.0", "@vitest/coverage-v8": "5.0.3", + "ajv": "8.20.0", "typescript": "7.0.2", "vitest": "5.0.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f424f22..ca1b2279 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -182,6 +182,9 @@ importers: '@vitest/coverage-v8': specifier: 5.0.3 version: 5.0.3(vitest@5.0.3) + ajv: + specifier: 8.20.0 + version: 8.20.0 typescript: specifier: 7.0.2 version: 7.0.2 @@ -1327,6 +1330,9 @@ packages: '@vitest/spy@5.0.3': resolution: {integrity: sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + am-i-vibing@0.5.0: resolution: {integrity: sha512-KLcsDhqf1XRrJmJr+9I/C0EX2K+sGrAGZFgkmd84c8TJO9zJBu+/kFInjazu1KfJWFhWDKdRWkpBzEs7s35DVA==} hasBin: true @@ -1561,12 +1567,18 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-string-truncated-width@3.0.3: resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -1706,6 +1718,9 @@ packages: resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} @@ -2032,6 +2047,10 @@ packages: remark-directive@4.0.0: resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -3247,6 +3266,13 @@ snapshots: '@vitest/spy@5.0.3': {} + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + am-i-vibing@0.5.0: dependencies: process-ancestry: 0.1.0 @@ -3545,12 +3571,16 @@ snapshots: extend@3.0.2: {} + fast-deep-equal@3.1.3: {} + fast-string-truncated-width@3.0.3: {} fast-string-width@3.0.2: dependencies: fast-string-truncated-width: 3.0.3 + fast-uri@3.1.8: {} + fast-wrap-ansi@0.2.2: dependencies: fast-string-width: 3.0.2 @@ -3733,6 +3763,8 @@ snapshots: dependencies: argparse: 2.0.1 + json-schema-traverse@1.0.0: {} + jsonc-parser@3.3.1: {} klona@2.0.6: {} @@ -4154,6 +4186,8 @@ snapshots: transitivePeerDependencies: - supports-color + require-from-string@2.0.2: {} + resolve-pkg-maps@1.0.0: {} retext-smartypants@6.2.0: diff --git a/tests/settings-schema.test.ts b/tests/settings-schema.test.ts new file mode 100644 index 00000000..17a9dbc4 --- /dev/null +++ b/tests/settings-schema.test.ts @@ -0,0 +1,94 @@ +// The JSON Schema of settings.json (docs/public/schemas/settings.json, served at +// https://docs.configfile.sh/schemas/settings.json) must accept what configfile +// accepts and refuse what it refuses: each example below goes through both. + +import { readFile } from 'node:fs/promises' + +import { Ajv2020 } from 'ajv/dist/2020.js' +import { describe, expect, it } from 'vitest' + +import { listModules } from '../src/repository.ts' +import { createSandbox } from './helpers.ts' + +const schemaFile = new URL('../docs/public/schemas/settings.json', import.meta.url) +const schema = JSON.parse(await readFile(schemaFile, 'utf8')) +const validate = new Ajv2020({ allErrors: true }).compile(schema) + +/** Whether configfile uses every entry of this settings.json, with no error. */ +async function configfileAccepts(settings: unknown): Promise { + const sandbox = await createSandbox() + await sandbox.write('home/dotfiles/files/zsh/zshrc') + await sandbox.write('home/dotfiles/files/zsh/settings.json', JSON.stringify(settings)) + + const [module] = await listModules(sandbox.repo, { ...sandbox, warn: () => {} }) + if (module == null) throw new Error('no module') + return module.error == null && module.invalidEntries.length === 0 +} + +const zshrc = { source_path: 'zshrc', target_path: '~/.zshrc' } + +const accepted: [string, unknown][] = [ + ['a global file', { files: [{ ...zshrc, deploy: 'global' }] }], + ['a local file', { files: [{ source_path: 'zshrc', target_path: '.zshrc', deploy: 'local' }] }], + ['a file never deployed, without target', { files: [{ source_path: 'zshrc', deploy: 'none' }] }], + ['a file never deployed, without source', { files: [{ deploy: 'none' }] }], + ['a file without strategy (deployed nowhere, with a warning)', { files: [zshrc] }], + ['the deprecated "global": true', { files: [{ ...zshrc, global: true }] }], + ['the deprecated "global": false', { files: [{ ...zshrc, global: false }] }], + ['the deprecated 0.3 list format', [{ ...zshrc, deploy: 'global' }]], + ['no files', { files: [] }], + ['a "$schema" key', { $schema: 'https://docs.configfile.sh/schemas/settings.json', files: [] }], +] + +const refused: [string, unknown][] = [ + ['no "files" key', {}], + ['"files" that is not a list', { files: {} }], + ['an entry that is not an object', { files: ['zshrc'] }], + ['an unknown strategy', { files: [{ ...zshrc, deploy: 'linked' }] }], + ['both "deploy" and "global"', { files: [{ ...zshrc, deploy: 'global', global: true }] }], + ['a "global" that is not a boolean', { files: [{ ...zshrc, global: 'yes' }] }], + ['a deployed file without source', { files: [{ target_path: '~/.zshrc', deploy: 'global' }] }], + ['an empty source', { files: [{ ...zshrc, source_path: ' ', deploy: 'global' }] }], + ['a global file without target', { files: [{ source_path: 'zshrc', deploy: 'global' }] }], + ['a local file without target', { files: [{ source_path: 'zshrc', deploy: 'local' }] }], + ['an empty target', { files: [{ ...zshrc, target_path: '', deploy: 'global' }] }], + ['a source that is not a string', { files: [{ ...zshrc, source_path: 42, deploy: 'global' }] }], +] + +// Stricter on purpose, to catch mistakes in an editor: configfile ignores these. +const refusedByTheSchemaOnly: [string, unknown][] = [ + ['an unknown key in an entry (a typo)', { files: [{ ...zshrc, deploy: 'global', target: 'x' }] }], + ['an unknown top-level key', { files: [], file: [] }], + ['a wrong type in an entry never deployed', { files: [{ source_path: 42, deploy: 'none' }] }], +] + +describe('settings.json schema', () => { + it.each(accepted)('accepts %s, as configfile does', async (_, settings) => { + expect(await configfileAccepts(settings)).toBe(true) + expect(validate(settings), JSON.stringify(validate.errors)).toBe(true) + }) + + it.each(refused)('refuses %s, as configfile does', async (_, settings) => { + expect(await configfileAccepts(settings)).toBe(false) + expect(validate(settings)).toBe(false) + }) + + it.each(refusedByTheSchemaOnly)('refuses %s, which configfile ignores', async (_, settings) => { + expect(await configfileAccepts(settings)).toBe(true) + expect(validate(settings)).toBe(false) + }) + + it('describes the keys the modules reference documents', async () => { + const page = await readFile( + new URL('../docs/src/content/docs/reference/modules.md', import.meta.url), + 'utf8', + ) + const documented = [...page.matchAll(/^\| `(\w+)` \|/gm)].map(match => match[1]) + + expect(Object.keys(schema.$defs.entry.properties).sort()).toEqual(documented.sort()) + }) + + it('is served where its $id says, from the documentation site', () => { + expect(schema.$id).toBe('https://docs.configfile.sh/schemas/settings.json') + }) +}) From fac8605e1329fac8c1efb594e7c9c38dfdf3a924 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Thu, 8 Oct 2026 23:16:13 +0200 Subject: [PATCH 334/341] docs: explain how configfile works, and how it keeps files safe (#312) --- README.md | 4 +- .../src/content/docs/concepts/how-it-works.md | 72 ++++++++++++++++--- docs/src/content/docs/concepts/safety.md | 46 ++++++++++++ docs/src/content/docs/index.md | 1 + docs/src/content/docs/reference/modules.md | 6 +- 5 files changed, 116 insertions(+), 13 deletions(-) create mode 100644 docs/src/content/docs/concepts/safety.md diff --git a/README.md b/README.md index 325690b4..93465a01 100644 --- a/README.md +++ b/README.md @@ -83,13 +83,13 @@ When a global file is deployed and something else already exists at its target ( When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. -*configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links and the local copies *configfile* made (unless they were modified since), and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), local copies that were modified or saved again by an editor since, and `.old` files you made yourself. +*configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links that point to the repository's files and the local copies *configfile* made, as long as a copy is still the file it made and matches the repository's current version, and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), apart from links to the repository's files, local copies that differ from the repository (changed by you, or because the repository changed since) or were saved again by an editor, and `.old` files you made yourself. When an entry leaves the repository (removed, set to `"deploy": "none"`, given another `target_path`, or its module deleted), what *configfile* deployed for it stays in place until it is undeployed: `modules status` lists these files, `update` warns about them, and `modules undeploy --removed` (or `--all`) removes them and restores the files they replaced. Local copies are handled from the folder they were copied into, like `modules deploy --local`. A removed file that *configfile* cannot remove safely (replaced by your own file, a modified copy, a copy whose source is gone) is left where it is, and *configfile* stops tracking it. To stay safe, *configfile* never undeploys a file when it cannot tell whether the repository still deploys it: files of a module whose `settings.json` cannot be used or has invalid entries, of a module folder that is not usable (a broken symbolic link, a name another folder uses), and entries without a deployment strategy. `modules status` lists them separately. Links deployed by 0.3 and not deployed again since were not recorded, so they are not found either. -Only one *configfile* at a time changes files: a second one waits for the first to finish (the lock is `~/.configfile/lock`). +`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error (the lock is `~/.configfile/lock`). Other commands, such as `update`, don't wait for it. > **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. diff --git a/docs/src/content/docs/concepts/how-it-works.md b/docs/src/content/docs/concepts/how-it-works.md index b76d58a8..8cd1d808 100644 --- a/docs/src/content/docs/concepts/how-it-works.md +++ b/docs/src/content/docs/concepts/how-it-works.md @@ -1,24 +1,80 @@ --- title: How it works -description: Your dotfiles repository, the mirror configfile keeps, and what it deploys from it. +description: Where your dotfiles live, how configfile deploys them, and how it keeps track of what it did. +sidebar: + order: 1 --- -This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files. +*configfile* doesn't store your configuration files. They live in a git repository that you own, usually called `dotfiles` ([plenty of people share theirs](https://github.com/topics/dotfiles)). *configfile* puts the files of that repository where your tools expect them, runs your setup scripts, and keeps each machine in sync with the repository. -You edit your dotfiles in your own working copy of that repository and push them. *configfile* keeps its own copy, a mirror of the remote repository in `~/.configfile/dotfiles`, and deploys from it: `configfile update` makes the mirror identical to the remote, so unpushed or conflicting work never blocks it. Don't edit the mirror (or deployed links, which point into it): see [`update`](/reference/commands/) for what happens to such changes. +## Where your files live -The repository must have this structure: +Your dotfiles exist in up to four places: ```txt -files/ +your working copy ~/dotfiles + │ + │ git push + ▼ +remote repository GitHub, GitLab… + │ + │ configfile update + ▼ +configfile's mirror ~/.configfile/dotfiles + │ + │ configfile modules deploy (once per file) + ▼ +your home folder ~/.zshrc → link into the mirror +``` + +- **Your working copy** is a clone of the repository, wherever you like. It's the only place where you edit your dotfiles, commit and push, as for any git repository. +- **The remote repository** is the reference that every machine follows. +- **configfile's mirror** is a copy of the remote repository that *configfile* keeps for itself, in `~/.configfile/dotfiles` unless you chose another folder with `configfile init --folder`. [`configfile update`](/reference/commands/#configfile-update) makes it identical to the remote. +- **Your home folder** receives the files your tools read, such as `~/.zshrc`; project folders receive local copies. + +### Why a mirror, and not your working copy + +If *configfile* deployed from your working copy, uncommitted edits, a branch you're working on or a conflict would block syncing, and changes you haven't pushed yet would reach your configuration before your other machines have them. + +The mirror only follows the remote. `update` doesn't merge anything, so your work in progress never blocks it: it fetches the remote and makes the mirror identical to it. It still needs the remote to be reachable, and stops with an error if fetching fails. + +You don't edit the mirror. If something changes in it anyway, for example an edit made through a deployed link, `update` first saves the uncommitted changes and unpushed commits as a patch in `~/.configfile/saved/`, so that you can recover them: apply the patch in your working copy with `git am`. + +:::caution +`update` resets the mirror's folder, whatever it is. A configuration made with *configfile* 0.3 may point to your own working copy (for example `~/.dotfiles`): `update` would then reset your working copy to the remote, after saving its uncommitted changes and unpushed commits as a patch. [Upgrading from 0.3](/guides/upgrading-from-0-3/) explains how to give *configfile* its own copy. +::: + +## The repository's layout + +```txt +files/ one folder per module zsh/ settings.json zshrc git/ settings.json gitconfig -scripts/ +scripts/ setup scripts, run with configfile scripts run setup.sh - macos/ - index.sh ``` + +A **module** is a folder of `files/` that groups the configuration of one tool. Its `settings.json` lists the module's files: each **entry** names a file of the module, where it goes, and how it's deployed. Scripts in `scripts/` do what files alone can't, such as installing tools. The [modules](/reference/modules/) and [scripts](/reference/scripts/) references describe both folders in detail, and [Your first dotfiles repository](/getting-started/tutorial/) builds one step by step. + +## How files are deployed + +Each entry says how its file is deployed: + +- **Global files are linked.** `~/.zshrc` becomes a symbolic link to the file in the mirror. You deploy a file once: when `update` brings a new version, the link already points to it. +- **Local files are copied** into the current folder by `configfile modules deploy --local`. They suit files that belong in each project, such as an `.editorconfig`, and that a project may change. A copy doesn't follow the repository: deploy it again to refresh it, and *configfile* asks before replacing a copy that differs. + +An entry with `"deploy": "none"` stays in the repository without being deployed. + +## Keeping track + +*configfile* records each file it deploys, and each file it moves aside, in `~/.configfile/state.json`. That record is what lets it: + +- show what is deployed, with [`configfile modules status`](/reference/commands/#configfile-modules-status); +- undo a deployment, with [`configfile modules undeploy`](/reference/commands/#configfile-modules-undeploy), putting back the file it replaced; +- find the files it deployed for entries that have since left the repository, which `update` warns about and `configfile modules undeploy --removed` removes. + +It also logs each run of the commands that change things (`init`, `modules deploy` and `undeploy` except dry runs, `update`, `scripts run`) in `~/.configfile/history.jsonl`, along with any command that fails unexpectedly; [`configfile history`](/reference/history/) shows them. [Safety and trust](/concepts/safety/) explains how *configfile* avoids losing or overwriting your files. diff --git a/docs/src/content/docs/concepts/safety.md b/docs/src/content/docs/concepts/safety.md new file mode 100644 index 00000000..41986174 --- /dev/null +++ b/docs/src/content/docs/concepts/safety.md @@ -0,0 +1,46 @@ +--- +title: Safety and trust +description: What deploying a repository means, how configfile keeps a copy of what it replaces, and what it refuses to touch. +sidebar: + order: 2 +--- + +*configfile* replaces files in your home folder, where your shell, editor and tools keep their configuration. This page explains what you trust when you deploy a repository, the precautions *configfile* takes before replacing a file, and the cases where it refuses to act. The [modules reference](/reference/modules/) gives the exact rules. + +## Deploying a repository means trusting it + +The files of a repository end up in your shell's and your tools' configuration, and its scripts run on your machine with your permissions. Treat deploying a dotfiles repository like running its code: only deploy repositories you trust, and read a shared one before using it. + +## A copy of what is replaced + +- **Global files:** when something already exists where a file is deployed (a file, a folder or another link), it is moved aside to `.old` (or `.old.1`, `.old.2`…) before the link is created. A link that already points to the right file is left as it is, so deploying twice is safe; an outdated link *configfile* made itself is simply replaced. +- **Local files:** an existing file that differs from the repository, whether *configfile* copied it or not, is only replaced after you answer yes (or with `--force`), and it is moved aside to `.old` the same way. Without a terminal to ask in, it is skipped and the command exits with an error. +- **Preview:** `--dry-run` on `modules deploy` and `modules undeploy` shows what would happen, without changing anything. + +Apart from the backup that `undeploy` puts back in place, `.old` files stay where they are: delete the ones you no longer need. + +## What undeploy removes + +`configfile modules undeploy` uses the record *configfile* keeps (see [Keeping track](/concepts/how-it-works/#keeping-track)): + +- it removes the links that point to the repository's files, including those made by *configfile* 0.3, and the local copies it made, as long as a copy is still the file it made and matches the repository's current version; +- it moves the most recent backup it made back in place, if that backup is unchanged. + +Everything else stays: files it didn't create, even when they are identical to the repository (links to the repository's files excepted, as above); local copies that differ from the repository (because you changed them, or because the repository changed since) or that an editor saved again; and `.old` files it didn't make. + +## When in doubt, nothing is removed + +*configfile* doesn't remove a deployed file when it cannot tell whether the repository still deploys it, for example when the file's module cannot be read, or when it doesn't know which entry the file comes from. `modules status` lists such files separately, so that you can fix the module. + +## Refused targets + +A `target_path` can't put something important at risk: your home folder, the current folder, the dotfiles repository and its modules, or *configfile*'s own files (`~/.configfilerc`, `~/.configfile/`). Targets are checked by what they are, not by how they are written, so a symbolic link or different letter case doesn't get around the check. In the same way, a `source_path` must stay inside its module. + +## Deployments don't overlap + +`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error, which names the other process when it can. The lock is `~/.configfile/lock`; the lock of a process that no longer exists is taken over. Other commands, such as `update`, don't wait for it, so don't run them during a deployment. + +## Your configuration and history stay private + +- `~/.configfilerc` is readable by you only, since the repository URL may contain credentials. If other users can read it, *configfile* makes it private and warns you. `init` also warns when the URL contains credentials; an SSH key or a git credential helper is safer. +- The [history](/reference/history/) never records script arguments, environment variables or file contents. It hides passwords and tokens in URLs (an SSH user name such as `git` is kept) and query parameters that look like secrets. It does record full paths, which include your user name. diff --git a/docs/src/content/docs/index.md b/docs/src/content/docs/index.md index a708f431..8c45d060 100644 --- a/docs/src/content/docs/index.md +++ b/docs/src/content/docs/index.md @@ -7,6 +7,7 @@ description: Manage your dotfiles and setup scripts from a git repository, on ma - [Install configfile](/getting-started/installation/), then follow [Your first dotfiles repository](/getting-started/tutorial/), a ten-minute tutorial. - [How it works](/concepts/how-it-works/): your repository, the mirror configfile keeps, and what it deploys. +- [Safety and trust](/concepts/safety/): what configfile protects, and what it refuses to touch. - Reference: [commands](/reference/commands/), [modules and `settings.json`](/reference/modules/), [scripts](/reference/scripts/), [configuration](/reference/configuration/), [history](/reference/history/). - [Upgrading from 0.3](/guides/upgrading-from-0-3/). - [Changelog](https://github.com/mindsers/configfile/blob/develop/CHANGELOG.md): what changed in each version. diff --git a/docs/src/content/docs/reference/modules.md b/docs/src/content/docs/reference/modules.md index 2696e5c7..07537a7d 100644 --- a/docs/src/content/docs/reference/modules.md +++ b/docs/src/content/docs/reference/modules.md @@ -30,15 +30,15 @@ When a global file is deployed and something else already exists at its target ( When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. -*configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links and the local copies *configfile* made (unless they were modified since), and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), local copies that were modified or saved again by an editor since, and `.old` files you made yourself. +*configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links that point to the repository's files and the local copies *configfile* made, as long as a copy is still the file it made and matches the repository's current version, and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), apart from links to the repository's files, local copies that differ from the repository (changed by you, or because the repository changed since) or were saved again by an editor, and `.old` files you made yourself. When an entry leaves the repository (removed, set to `"deploy": "none"`, given another `target_path`, or its module deleted), what *configfile* deployed for it stays in place until it is undeployed: `modules status` lists these files, `update` warns about them, and `modules undeploy --removed` (or `--all`) removes them and restores the files they replaced. Local copies are handled from the folder they were copied into, like `modules deploy --local`. A removed file that *configfile* cannot remove safely (replaced by your own file, a modified copy, a copy whose source is gone) is left where it is, and *configfile* stops tracking it. To stay safe, *configfile* never undeploys a file when it cannot tell whether the repository still deploys it: files of a module whose `settings.json` cannot be used or has invalid entries, of a module folder that is not usable (a broken symbolic link, a name another folder uses), and entries without a deployment strategy. `modules status` lists them separately. Links deployed by 0.3 and not deployed again since were not recorded, so they are not found either. -Only one *configfile* at a time changes files: a second one waits for the first to finish (the lock is `~/.configfile/lock`). +`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error (the lock is `~/.configfile/lock`). Other commands, such as `update`, don't wait for it. -> **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. +> **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. [Safety and trust](/concepts/safety/) explains what *configfile* protects, and what it refuses to touch. ## Completion and validation in your editor From acc537a162fb9ff854b95cabe7c7af55f0cd689f Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Fri, 9 Oct 2026 06:58:22 +0200 Subject: [PATCH 335/341] fix(modules): say "settings entries", not "settings entrys" (#315) plural() added an s to every noun, so a deployment with several failed entries reported "2 files, module or settings entrys failed". plural() now takes an irregular plural, and the two failure messages pass theirs. Tests cover plural() itself, and a deployment with two failed entries. --- CHANGELOG.md | 4 ++++ src/commands/modules.ts | 6 ++++-- src/output.ts | 9 ++++++--- tests/commands.test.ts | 19 +++++++++++++++++++ tests/output.test.ts | 13 +++++++++++++ 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 tests/output.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index b1fdddd3..5c796ec7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - A JSON Schema for `settings.json`, at `https://docs.configfile.sh/schemas/settings.json`: with `"$schema"` at the top of the file, editors complete and check it as you type. +### Fixed +- When more than one settings entry failed, `modules deploy` and `undeploy` reported "settings + entrys" instead of "settings entries". + ## [1.0.0] - 2026-10-05 ### Added - The `modules undeploy` command to remove the files configfile deployed and restore the saved diff --git a/src/commands/modules.ts b/src/commands/modules.ts index fb200bef..7dd4e8ea 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -465,7 +465,7 @@ async function prepare( if (files.length === 0) { if (failures > 0) throw new CliError( - `Nothing could be ${verb}ed. ${plural(failures, 'module or settings entry')} failed.`, + `Nothing could be ${verb}ed. ${plural(failures, 'module or settings entry', 'modules or settings entries')} failed.`, ) output.info(`No ${options.strategy} file to ${verb} in ${moduleNames}.`) return { files, failures, all } @@ -558,7 +558,9 @@ function skippedProblems(skipped: number, interactive: boolean): string[] { function finish(failures: number, problems: string[], success: string, ctx: Context): void { if (failures > 0) { - problems.push(`${plural(failures, 'file, module or settings entry')} failed.`) + problems.push( + `${plural(failures, 'file, module or settings entry', 'files, modules or settings entries')} failed.`, + ) } if (problems.length > 0) { throw new CliError(problems.join(' ')) diff --git a/src/output.ts b/src/output.ts index cf0fcb1b..a87584cc 100644 --- a/src/output.ts +++ b/src/output.ts @@ -57,9 +57,12 @@ export class Output { } } -/** `plural(1, 'file')` → "1 file", `plural(2, 'file')` → "2 files". */ -export function plural(count: number, noun: string): string { - return `${count} ${noun}${count === 1 ? '' : 's'}` +/** + * `plural(1, 'file')` → "1 file", `plural(2, 'file')` → "2 files". Irregular + * plurals are given: `plural(2, 'entry', 'entries')` → "2 entries". + */ +export function plural(count: number, noun: string, nouns = `${noun}s`): string { + return `${count} ${count === 1 ? noun : nouns}` } /** diff --git a/tests/commands.test.ts b/tests/commands.test.ts index cbec1fdd..4222ac8f 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -482,6 +482,25 @@ describe('modules status, dry run and undeploy', () => { expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(true) }) + it('counts the failures in the plural', async () => { + const sandbox = await createSandbox() + await withModule(sandbox) + await sandbox.write( + 'home/dotfiles/files/other/settings.json', + JSON.stringify({ + files: [ + { source_path: 'x', deploy: 'global' }, + { source_path: 'y', deploy: 'global' }, + ], + }), + ) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('2 files, modules or settings entries failed.') + }) + it('gives a dry run the exit code of the real run', async () => { const sandbox = await createSandbox() await withModule(sandbox) diff --git a/tests/output.test.ts b/tests/output.test.ts new file mode 100644 index 00000000..6c8008b6 --- /dev/null +++ b/tests/output.test.ts @@ -0,0 +1,13 @@ +import { describe, expect, it } from 'vitest' + +import { plural } from '../src/output.ts' + +describe('plural', () => { + it('adds an s, or uses the plural given', () => { + expect(plural(1, 'file')).toBe('1 file') + expect(plural(0, 'file')).toBe('0 files') + expect(plural(2, 'file')).toBe('2 files') + expect(plural(1, 'entry', 'entries')).toBe('1 entry') + expect(plural(2, 'entry', 'entries')).toBe('2 entries') + }) +}) From 48cc6e07d74fc8b384a0f2f6331cf69727ae6ce9 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Fri, 9 Oct 2026 07:16:44 +0200 Subject: [PATCH 336/341] docs: add guides for new machines, scripts and CI (#314) --- docs/src/content/docs/guides/new-machine.md | 94 +++++++++++++++++++ .../src/content/docs/guides/scripts-and-ci.md | 94 +++++++++++++++++++ .../content/docs/guides/upgrading-from-0-3.md | 2 + docs/src/content/docs/index.md | 2 +- 4 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 docs/src/content/docs/guides/new-machine.md create mode 100644 docs/src/content/docs/guides/scripts-and-ci.md diff --git a/docs/src/content/docs/guides/new-machine.md b/docs/src/content/docs/guides/new-machine.md new file mode 100644 index 00000000..089259af --- /dev/null +++ b/docs/src/content/docs/guides/new-machine.md @@ -0,0 +1,94 @@ +--- +title: Set up a new machine +description: Bring your configuration to a new computer, by hand or with a bootstrap script. +sidebar: + order: 1 +--- + +This guide takes a machine from nothing to your configuration, using a dotfiles repository you already have. If you don't have one yet, start with [Your first dotfiles repository](/getting-started/tutorial/). + +## 1. Install configfile + +On macOS, install [Homebrew](https://brew.sh) first if it isn't there yet, then: + +```sh +brew install mindsers/tap/configfile +``` + +Homebrew also installs Node.js and git. [Installation](/getting-started/installation/) lists the other ways. + +## 2. Give the machine access to your repository + +For a private repository, the machine needs your git credentials before *configfile* can clone it: add an SSH key to your git host, or sign in with its command line tool (`gh auth login` for GitHub). A public repository can be cloned with its `https://` URL without credentials. + +Avoid putting a token in the repository URL: *configfile* saves the URL in `~/.configfilerc`, and warns when it contains credentials. + +## 3. Connect configfile to the repository + +```sh +configfile init +``` + +*configfile* asks for the repository's URL and clones it into `~/.configfile/dotfiles`. + +## 4. Deploy your modules + +See what would be deployed, and what is in the way: + +```sh +configfile modules status +configfile modules deploy --all --dry-run +``` + +Then deploy every module: + +```sh +configfile modules deploy --all +``` + +Files that already exist where yours go, such as the default `~/.zshrc` of a new machine, are moved aside to `.old`, so you can compare them or bring them back with `configfile modules undeploy`. + +## 5. Run your setup script + +If your repository has a setup script, for example to install your tools, run it: + +```sh +configfile scripts run setup +``` + +With a version per system (`setup.macos.sh`, `setup.linux.sh`), *configfile* picks the one for this machine. See [Scripts](/reference/scripts/). + +## 6. Copy local files into your projects + +Local files, such as an `.editorconfig`, are copied into the current folder rather than linked. In each project that needs them: + +```sh +cd ~/projects/my-project +configfile modules deploy --all --local +``` + +## Do it all with one script + +To set up machines regularly, put the steps in a script. Without a terminal to ask questions in, *configfile* needs everything as options: `--repo` for `init`, and module names or `--all` for `modules deploy`. [Use configfile in scripts and CI](/guides/scripts-and-ci/) lists them. + +```sh title="bootstrap.sh" +#!/bin/sh +set -e + +brew install mindsers/tap/configfile +configfile init --repo git@github.com:me/dotfiles.git +configfile modules deploy --all +configfile scripts run setup +``` + +`set -e` stops the script at the first step that fails: *configfile* exits with a non-zero code when a command fails. On a machine that already has a configuration, `init` refuses to replace it without `--force`. + +## Keep the machine in sync + +When you push changes to your repository, bring them to the machine with: + +```sh +configfile update +``` + +Linked files are up to date right away. Run `configfile modules deploy --all` again when you add files or modules, as `update` reminds you, and `configfile modules undeploy --removed` to remove what the repository no longer deploys, which `update` warns about. diff --git a/docs/src/content/docs/guides/scripts-and-ci.md b/docs/src/content/docs/guides/scripts-and-ci.md new file mode 100644 index 00000000..5aee4dc6 --- /dev/null +++ b/docs/src/content/docs/guides/scripts-and-ci.md @@ -0,0 +1,94 @@ +--- +title: Use configfile in scripts and CI +description: Run configfile without a terminal, rely on its exit codes, and check a dotfiles repository on every push. +sidebar: + order: 2 +--- + +Every *configfile* command can run without anyone at the keyboard: in a bootstrap script, a cron job, or a CI workflow. This guide covers what changes without a terminal, and how to check your dotfiles repository automatically. + +## Answering questions with options + +When it runs in a terminal, *configfile* asks for what it needs. When its input is not a terminal, it can't ask: a command that would need an answer stops with an error that names the option to pass instead. + +```txt +$ configfile modules deploy < /dev/null + Error No module given. Pass module names, or --all to deploy every module. +``` + +| Command | Question in a terminal | Option to pass instead | +| --- | --- | --- | +| `configfile init` | the repository's URL | `--repo ` | +| `configfile init` | whether to replace an existing configuration | `--force` | +| `configfile modules deploy` and `undeploy` | whether to use every module | module names, or `--all` | +| `configfile modules deploy --local` | whether to replace an existing file that differs | `--force` (without it, the file is skipped and the command fails) | + +`configfile init --folder ` also lets a script choose where the repository is cloned. The [commands reference](/reference/commands/) lists every option. + +## Exit codes + +*configfile* exits with: + +- `0` when the command succeeded; +- another code when it failed, with an error message saying why: usually `1`, or git's own code when a git command fails (for example `128` when the repository can't be fetched); +- the script's own exit code with `configfile scripts run`, so a failing setup script fails the step that runs it; +- `130` when you press Ctrl+C at a question. + +In a shell script, `set -e` therefore stops at the first *configfile* command that fails. + +## Output + +With `configfile scripts run`, *configfile*'s own messages go to stderr and the script's output to stdout, unchanged: you can pipe or redirect the script's output as if you had run it directly. + +`configfile history --json` prints the [history](/reference/history/) as JSON Lines, one run per line, for scripts that need to know what *configfile* did. + +## Check your dotfiles repository on every push + +A mistake in a `settings.json`, such as invalid JSON, a missing `target_path`, or a target *configfile* refuses, is usually found on the next machine you set up. A CI workflow can find it when you push, by deploying the repository into a throwaway home folder with `--dry-run`: *configfile* reads every module and entry, checks every target, and exits with `1` if anything can't be deployed. + +With GitHub Actions, add this workflow to your dotfiles repository: + +```yaml title=".github/workflows/check.yml" +name: Check dotfiles + +on: [push, pull_request] + +permissions: + contents: read + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-node@v7 + with: + node-version: 24 + - run: npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz + # The following steps use a throwaway home folder, not the runner's. + - run: | + mkdir -p "$RUNNER_TEMP/home" + echo "HOME=$RUNNER_TEMP/home" >> "$GITHUB_ENV" + - run: configfile init --repo "$GITHUB_WORKSPACE" + - run: configfile modules deploy --all --dry-run +``` + +`init` accepts a local folder as the repository, here the checkout of the commit being tested. Nothing is deployed for real, and the runner's home folder isn't touched. The dry run fails if any module or entry is invalid, even when the others are fine, local files included. A file whose entry has no `deploy` strategy only produces a warning, as it does on your machines. + +To also test your setup script, add a step that runs it, on the systems it supports: + +```yaml + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + # … the steps above, then: + - run: configfile scripts run setup +``` + +Run it only if the script is safe to run on a fresh CI machine: it installs and changes things for real, as on your own computer. + +:::tip +In your editor, the [JSON Schema of `settings.json`](/reference/modules/#completion-and-validation-in-your-editor) catches most of these mistakes before you even commit. +::: diff --git a/docs/src/content/docs/guides/upgrading-from-0-3.md b/docs/src/content/docs/guides/upgrading-from-0-3.md index c6137878..7adb3ce0 100644 --- a/docs/src/content/docs/guides/upgrading-from-0-3.md +++ b/docs/src/content/docs/guides/upgrading-from-0-3.md @@ -1,6 +1,8 @@ --- title: Upgrading from 0.3 description: What changes for users of configfile 0.3. +sidebar: + order: 3 --- - Node.js 24.11 or later is required, on macOS or Linux. Install again as described in [Installation](/getting-started/installation/). To switch to Homebrew, remove the npm version first (`npm uninstall --global configfile`). diff --git a/docs/src/content/docs/index.md b/docs/src/content/docs/index.md index 8c45d060..e0990600 100644 --- a/docs/src/content/docs/index.md +++ b/docs/src/content/docs/index.md @@ -9,7 +9,7 @@ description: Manage your dotfiles and setup scripts from a git repository, on ma - [How it works](/concepts/how-it-works/): your repository, the mirror configfile keeps, and what it deploys. - [Safety and trust](/concepts/safety/): what configfile protects, and what it refuses to touch. - Reference: [commands](/reference/commands/), [modules and `settings.json`](/reference/modules/), [scripts](/reference/scripts/), [configuration](/reference/configuration/), [history](/reference/history/). -- [Upgrading from 0.3](/guides/upgrading-from-0-3/). +- Guides: [set up a new machine](/guides/new-machine/), [use configfile in scripts and CI](/guides/scripts-and-ci/), [upgrade from 0.3](/guides/upgrading-from-0-3/). - [Changelog](https://github.com/mindsers/configfile/blob/develop/CHANGELOG.md): what changed in each version. ## Contribution From 8c7c050fb4ecd7d0a84c01a3ac4d0c5af3244d62 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Mon, 12 Oct 2026 09:00:43 +0200 Subject: [PATCH 337/341] docs: shorten the README to an introduction to the documentation site (#316) --- CHANGELOG.md | 2 + CONTRIBUTING.md | 2 +- README.md | 194 +++++++----------------------------------------- package.json | 2 +- 4 files changed, 31 insertions(+), 169 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c796ec7..80ffca37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#295](https://github.com/mindsers/configfile/issues/295)). - A JSON Schema for `settings.json`, at `https://docs.configfile.sh/schemas/settings.json`: with `"$schema"` at the top of the file, editors complete and check it as you type. +- A documentation site, [docs.configfile.sh](https://docs.configfile.sh), with a tutorial, guides, + a reference and explanations. The README is now a short introduction that links to it. ### Fixed - When more than one settings entry failed, `modules deploy` and `undeploy` reported "settings diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b93db8d9..14539dad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ Everyone taking part in the project follows the [code of conduct](CODE_OF_CONDUC ### Do you want to contribute to the documentation? -The documentation lives with the source code: the [documentation site](docs/) for users (published at [docs.configfile.sh](https://docs.configfile.sh), run it locally with `pnpm docs:dev`), and this file for contributors. Each page of the site is a Markdown file in `docs/src/content/docs/`. Until the README is shortened to an introduction, it holds the same content: update both. The usage lines and option tables of the commands page are generated from the commands' definitions: after adding or changing a command, an argument or an option, run `pnpm docs:commands` (a test fails until the page is up to date). A new command first needs its section and an empty `` / `` block on the page, which the script then fills. The format of `settings.json` is also described by a JSON Schema, `docs/public/schemas/settings.json`: when configfile starts accepting or refusing something new there, update the schema and the examples of `tests/settings-schema.test.ts`, which check that both agree. +The documentation lives with the source code: the [documentation site](docs/) for users (published at [docs.configfile.sh](https://docs.configfile.sh), run it locally with `pnpm docs:dev`), and this file for contributors. Each page of the site is a Markdown file in `docs/src/content/docs/`. The README only introduces configfile and links to the site: document behavior on the site. The usage lines and option tables of the commands page are generated from the commands' definitions: after adding or changing a command, an argument or an option, run `pnpm docs:commands` (a test fails until the page is up to date). A new command first needs its section and an empty `` / `` block on the page, which the script then fills. The format of `settings.json` is also described by a JSON Schema, `docs/public/schemas/settings.json`: when configfile starts accepting or refusing something new there, update the schema and the examples of `tests/settings-schema.test.ts`, which check that both agree. * Please refer to the "Do you intend to add a new feature or change an existing one?" section. diff --git a/README.md b/README.md index 93465a01..08bb66b9 100644 --- a/README.md +++ b/README.md @@ -1,207 +1,67 @@ # configfile [![Release](https://img.shields.io/github/v/release/mindsers/configfile?style=flat-square)](https://github.com/mindsers/configfile/releases/latest) -[![npm](https://img.shields.io/npm/dt/configfile.svg?style=flat-square)](https://www.npmjs.com/package/configfile) [![CI](https://img.shields.io/github/actions/workflow/status/mindsers/configfile/ci.yml?branch=develop&style=flat-square)](https://github.com/mindsers/configfile/actions/workflows/ci.yml) -[![npm](https://img.shields.io/npm/l/configfile.svg?style=flat-square)](https://github.com/mindsers/configfile/blob/develop/LICENSE) +[![License](https://img.shields.io/github/license/mindsers/configfile?style=flat-square)](https://github.com/mindsers/configfile/blob/develop/LICENSE) [![GitHub Sponsors](https://img.shields.io/github/sponsors/mindsers?logo=githubsponsors&style=flat-square)](https://github.com/sponsors/mindsers) -*configfile* is a command line tool that helps you manage your configuration files (dotfiles) and setup scripts from a git repository. +*configfile* manages your configuration files (dotfiles) and setup scripts from a git repository you own. It links each file where your tools expect it, runs your setup scripts, and keeps every machine in sync with the repository, on macOS and Linux. -## Requirements +**Documentation: [docs.configfile.sh](https://docs.configfile.sh)** -- macOS or Linux -- Node.js 24.11 or later (Homebrew installs it for you) -- git (Homebrew installs it for you; otherwise, when it is missing, *configfile* says how to install it on your system) +## How it looks -## Installation - -With [Homebrew](https://brew.sh), on macOS or Linux (Node.js and git come with it): - -```bash -brew install mindsers/tap/configfile -``` - -With npm, when Node.js 24.11 or later is installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): - -```bash -npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz -``` - -Install it one way only: two copies would compete in your `PATH`. - -> Version 1.0 is not on the npm registry yet: `npm install --global configfile` still installs 0.3.1. Each release's tarball comes with a `SHA256SUMS` file and a build provenance attestation, which `gh attestation verify configfile-1.0.0.tgz --repo mindsers/configfile` checks. - -## Data storage - -This tool **does not store** configuration files for you. A git repository ([dotfiles](https://github.com/topics/dotfiles)) is needed to store your configuration files. - -You edit your dotfiles in your own working copy of that repository and push them. *configfile* keeps its own copy, a mirror of the remote repository in `~/.configfile/dotfiles`, and deploys from it: `configfile update` makes the mirror identical to the remote, so unpushed or conflicting work never blocks it. Don't edit the mirror (or deployed links, which point into it): see [`update`](#usage) for what happens to such changes. - -The repository must have this structure: +Your repository groups files by tool, and says where each one goes: ```txt files/ zsh/ settings.json zshrc - git/ - settings.json - gitconfig scripts/ setup.sh - macos/ - index.sh ``` -### Modules - -Every folder of `files/` (or symbolic link to a folder) that contains a `settings.json` is a **module**. Its name is the folder name, lowercased, with spaces replaced by `-` and other characters than ASCII letters, digits, `_` and `-` removed: `My Zsh.d` is the `my-zshd` module. Hidden folders are ignored. - -`settings.json` lists the files of the module: - ```json { "files": [ - { "source_path": "zshrc", "target_path": "~/.zshrc", "deploy": "global" }, - { "source_path": "editorconfig", "target_path": ".editorconfig", "deploy": "local" }, - { "source_path": "old-aliases", "target_path": "~/.aliases", "deploy": "none" } + { "source_path": "zshrc", "target_path": "~/.zshrc", "deploy": "global" } ] } ``` -| Key | Description | -| --- | --- | -| `source_path` | Path of the file (or folder), relative to the module folder. It must stay inside the module folder, symbolic links included. | -| `target_path` | Where the file is deployed. `~` is your home folder. A relative path is relative to your home folder for global files (`.zshrc` is `~/.zshrc`) and to the current folder for local files. Targets can be anywhere you can write, except: your home folder, the current folder, the dotfiles repository, the module folder, *configfile*'s own files (`~/.configfilerc`, `~/.configfile/`), one of their parents, or anything inside the repository. These are recognised whatever the path used to reach them (letter case, symbolic links). | -| `deploy` | `"global"`: the file is **symlinked** by `configfile modules deploy`. `"local"`: the file is **copied** by `configfile modules deploy --local`, typically into a project folder (symbolic links in the source are followed, so the copy never points into the repository). `"none"`: the file is **never deployed**, which keeps it in the repository for later. | -| `global` | **Deprecated**, removed in 2.0: older spelling of `deploy`. `true` is `"global"`, `false` is `"local"`. It still works in 1.x, with a warning. Use one or the other, not both. | - -An entry without `deploy` or `global` is not deployed, and `modules deploy` warns about it. - -When a global file is deployed and something else already exists at its target (a file, a folder or another link), it is moved to `.old` (or `.old.1`, …). A link that already points to the right file is left as is, so deploying twice is safe. - -When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. - -*configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links that point to the repository's files and the local copies *configfile* made, as long as a copy is still the file it made and matches the repository's current version, and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), apart from links to the repository's files, local copies that differ from the repository (changed by you, or because the repository changed since) or were saved again by an editor, and `.old` files you made yourself. - -When an entry leaves the repository (removed, set to `"deploy": "none"`, given another `target_path`, or its module deleted), what *configfile* deployed for it stays in place until it is undeployed: `modules status` lists these files, `update` warns about them, and `modules undeploy --removed` (or `--all`) removes them and restores the files they replaced. Local copies are handled from the folder they were copied into, like `modules deploy --local`. A removed file that *configfile* cannot remove safely (replaced by your own file, a modified copy, a copy whose source is gone) is left where it is, and *configfile* stops tracking it. - -To stay safe, *configfile* never undeploys a file when it cannot tell whether the repository still deploys it: files of a module whose `settings.json` cannot be used or has invalid entries, of a module folder that is not usable (a broken symbolic link, a name another folder uses), and entries without a deployment strategy. `modules status` lists them separately. Links deployed by 0.3 and not deployed again since were not recorded, so they are not found either. - -`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error (the lock is `~/.configfile/lock`). Other commands, such as `update`, don't wait for it. - -> **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. - -### Scripts +On each machine: -Every file of `scripts/`, and every folder of `scripts/` (or symbolic link to a folder) containing an `index` file (`index`, `index.sh`, …), is a **script**. Hidden files are ignored. To only use some extensions, set `script_extensions` in the [configuration](#configuration). - -A script's name is its file name (or folder name) up to the first dot, with the same rules as module names: `scripts/setup.sh` is named `setup`. When two scripts have the same name, only the first one, alphabetically, is used, with a warning. - -A script can have a version for each system: `macos` or `linux` after the first dot (`scripts/setup.macos.sh`, `scripts/setup.linux.py`, or a folder such as `scripts/setup.macos/`). On macOS, `configfile scripts run setup` runs `setup.macos.sh`; on another system, it runs the generic `setup.sh`, if there is one. A version for another system is ignored. - -Scripts can be written in any language: - -- a script with a shebang line (such as `#!/usr/bin/env python3`) is run directly when it is executable, and with that interpreter otherwise; -- a `.js` (or `.mjs`, `.cjs`) or `.sh` script without shebang line is run with `node` or `sh`; -- any other executable file (such as a compiled program) is run directly. - -*configfile* never changes the permissions of your files. Scripts run in the current folder, their output is not modified (the messages of *configfile* go to stderr), and their exit code is forwarded. - -Scripts get these environment variables, in addition to *configfile*'s own environment (they replace variables of the same name): - -| Variable | Value | -| --- | --- | -| `CONFIGFILE_REPO` | the full path of the dotfiles repository (`folder_path`), to reach its files: `"$CONFIGFILE_REPO/Brewfile"` | -| `CONFIGFILE_SCRIPT` | the script's name (`setup`) | -| `CONFIGFILE_OS` | the system: `macos` or `linux`, as in the names of script versions | - -## Usage - -- `configfile init` (`i`): ask for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clone it into `~/.configfile/dotfiles` and save the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. - - `-f, --force`: overwrite an existing configuration without asking. - - `--repo `: give the URL from the command line, for non-interactive setups. - - `--folder `: clone somewhere else than `~/.configfile/dotfiles`. -- `configfile modules list` (`m l`, or just `configfile modules`): list available modules. -- `configfile modules status [modules...]` (`m st`): show whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. Without module names, it also lists the deployed files the repository no longer deploys. - - `-l, --local`: check the local files, in the current folder. -- `configfile modules deploy [modules...]` (`m d`): deploy the global files of the given modules. Without module names, asks to deploy all modules. - - `-l, --local`: copy the local files of the modules instead. - - `-a, --all`: deploy every module without asking. - - `-f, --force`: replace existing local files without asking (they are moved to `.old`). - - `-n, --dry-run`: show what would be done, without changing anything. -- `configfile modules undeploy [modules...]` (`m u`): remove the deployed global files of the given modules and restore their backups. Without module names, asks to undeploy all modules. - - `-a, --all`: undeploy every module without asking, and the files the repository no longer deploys. - - `--removed`: only undeploy the files the repository no longer deploys (see [Modules](#modules)); with `--local`, the copies made in the current folder. - - `-l, --local` and `-n, --dry-run`: as for `deploy`. -- `configfile scripts list` (`s l`, or just `configfile scripts`): list available scripts. -- `configfile scripts run [-- args...]` (`s r`): run a script. Arguments after `--` are passed to the script. -- `configfile update` (`u`): sync *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. It warns about deployed files the repository no longer deploys. -- `configfile history`: show what *configfile* changed, most recent last (see [History](#history)). - - `-n, --limit `: number of runs to show (20 by default). - - `--json`: print the raw history lines (JSON Lines), for scripts. - -*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. Each run of a command that changes files, and any unexpected error, is also recorded in the [history](#history). - -### Configuration - -*configfile* keeps its configuration in `~/.configfilerc`, and its working files in the `~/.configfile/` folder: the mirror of your repository (`dotfiles/`), the record of deployments (`state.json`), the [history](#history) (`history.jsonl`), the lock, and saved local changes (`saved/`). - -`~/.configfilerc` is a JSON file, readable by you only: the repository URL may contain credentials, so if other users can read it, *configfile* makes it private and warns you. - -```json -{ - "repo_url": "git@github.com:me/dotfiles.git", - "folder_path": "/Users/me/.configfile/dotfiles", - "script_extensions": [".js", ".sh", ""], - "history_max_size": "1MB" -} +```sh +configfile init --repo git@github.com:me/dotfiles.git # once +configfile modules deploy --all # links ~/.zshrc, keeping the old one as ~/.zshrc.old +configfile scripts run setup # runs scripts/setup.sh +configfile update # later: brings the changes you pushed ``` -`folder_path` may start with `~`; a relative path is relative to your home folder. `script_extensions` is optional: without it, every file of `scripts/` is a script. With it, only files with one of these extensions are; the dot may be omitted (`"py"`), and `""` means files without extension. `history_max_size` is optional: see [History](#history). - -### History - -*configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs and usage errors excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes. - -Script arguments, environment variables and file contents are never recorded. In URLs, user names and passwords (`https://user:token@host`) and query parameters that look like secrets (`?private_token=…`) are hidden. Paths are recorded in full, so they include your user name. When *configfile* creates the file, only its owner can read it. A run stopped by a signal (Ctrl+C outside a question) is not recorded, unless the signal comes while a script or git runs: *configfile* then leaves it to that program, and records the run with its exit code. - -`configfile history` shows the last runs: +## Installation -```txt -2026-10-01 11:12 modules deploy zsh ok - linked ~/.zshrc (previous file moved to ~/.zshrc.old) - 2 unchanged +With [Homebrew](https://brew.sh), on macOS or Linux (Node.js and git come with it): -2026-10-01 11:15 update exit 128 - error git fetch failed (exit code 128). +```bash +brew install mindsers/tap/configfile ``` -`-n ` shows another number of runs, and `--json` prints the lines as they are written. - -The file is also easy to query with `jq`, for example to list the failed runs: +With npm, when Node.js 24.11 or later is installed: ```bash -jq 'select(.exitCode != 0)' ~/.configfile/history.jsonl +npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz ``` -When the file reaches `history_max_size` (1MB by default; a number of bytes, or a size such as `"512KB"` or `"5MB"` in `~/.configfilerc`), it is renamed to `history.1.jsonl`, replacing the previous one, so the history takes about twice that size at most. `"history_max_size": 0` turns the history off. An invalid value gives the default and a warning; when `~/.configfilerc` cannot be read, nothing is recorded. - -## Upgrading from 0.3 - -- Node.js 24.11 or later is required, on macOS or Linux. Install again as described in [Installation](#installation). To switch to Homebrew, remove the npm version first (`npm uninstall --global configfile`). -- `~/.configfilerc`, the repository layout and `settings.json` work as before, including `settings.json` files that are a plain list (the 0.3.1 format, deprecated: put the list in a `"files"` key). Links deployed by 0.3 are recognised as deployed. -- If you installed 0.3 with Yarn, remove it first: `yarn global remove configfile`. -- `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. -- A **relative** `target_path` of a global file is now relative to your home folder, not to the folder you run *configfile* from. Targets starting with `~/` or `/` are not affected. -- Scripts keep their names (up to the first dot) and every file of `scripts/` is still a script. They are no longer made executable by *configfile*: a script needs a shebang line, a `.js`/`.sh` extension, or to be executable. -- Targets inside the dotfiles repository, or containing it, are now refused. -- `modules undeploy` also removes the links made by 0.3 that point to the repository, but it only restores the backups it made itself (recorded in `~/.configfile/state.json`): the `.old` files made by 0.3 are not put back, and local copies made by 0.3 are kept. -- A `source_path` must stay inside its module folder. -- `init` clones into `~/.configfile/dotfiles` by default, and an existing `folder_path` is kept. `update` now makes that folder identical to the remote, saving local changes as a patch first. If your configured folder is also your working copy (for example `~/.dotfiles`), give *configfile* its own copy: run `configfile modules undeploy --all` (files that 1.0 moved aside come back; links made by 0.3 are removed, and their `.old` files stay where they are), then `configfile init --force --repo --folder ~/.configfile/dotfiles`, then `configfile modules deploy --all` (links now point to the copy). -- With `script_extensions` set, only files with one of these extensions are scripts, and `""` means files without extension (0.3 matched any file containing the text). -- Commands now exit with a non-zero code on failure. +[Installation](https://docs.configfile.sh/getting-started/installation/) has the details, including how to verify a download. + +## Learn more + +- [Your first dotfiles repository](https://docs.configfile.sh/getting-started/tutorial/): a ten-minute tutorial. +- [How it works](https://docs.configfile.sh/concepts/how-it-works/) and [Safety and trust](https://docs.configfile.sh/concepts/safety/): what *configfile* does with your files, and what it refuses to touch. +- Guides: [set up a new machine](https://docs.configfile.sh/guides/new-machine/), [use configfile in scripts and CI](https://docs.configfile.sh/guides/scripts-and-ci/), [upgrade from 0.3](https://docs.configfile.sh/guides/upgrading-from-0-3/). +- Reference: [commands](https://docs.configfile.sh/reference/commands/), [modules and `settings.json`](https://docs.configfile.sh/reference/modules/), [scripts](https://docs.configfile.sh/reference/scripts/), [configuration](https://docs.configfile.sh/reference/configuration/), [history](https://docs.configfile.sh/reference/history/). +- [Changelog](https://github.com/mindsers/configfile/blob/develop/CHANGELOG.md). ## Contribution diff --git a/package.json b/package.json index 1556839e..93383fba 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "cli", "symlink" ], - "homepage": "https://github.com/mindsers/configfile#readme", + "homepage": "https://docs.configfile.sh", "bugs": "https://github.com/mindsers/configfile/issues", "funding": "https://github.com/sponsors/mindsers", "repository": { From 35d3e2146180b07cadaf19656f7b9b24874d60bc Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Tue, 13 Oct 2026 21:40:00 +0200 Subject: [PATCH 338/341] feat(modules): run scripts when a module is deployed or undeployed (#318) --- CHANGELOG.md | 14 + README.md | 2 +- docs/public/schemas/settings.json | 18 +- .../src/content/docs/concepts/how-it-works.md | 4 +- docs/src/content/docs/concepts/safety.md | 4 +- .../content/docs/getting-started/tutorial.md | 1 + .../src/content/docs/guides/module-scripts.md | 122 +++ docs/src/content/docs/guides/new-machine.md | 2 + .../src/content/docs/guides/scripts-and-ci.md | 9 +- .../content/docs/guides/upgrading-from-0-3.md | 2 +- docs/src/content/docs/index.md | 2 +- docs/src/content/docs/reference/commands.md | 12 +- docs/src/content/docs/reference/history.md | 4 +- docs/src/content/docs/reference/modules.md | 44 +- docs/src/content/docs/reference/scripts.md | 10 +- src/commands/history.ts | 13 +- src/commands/modules.ts | 666 +++++++++++-- src/commands/scripts.ts | 23 +- src/history.ts | 21 +- src/lock.ts | 10 +- src/process.ts | 19 +- src/repository.ts | 65 +- tests/commands.test.ts | 889 ++++++++++++++++++ tests/e2e.test.ts | 118 ++- tests/lock.test.ts | 29 +- tests/repository.test.ts | 27 +- tests/settings-schema.test.ts | 18 +- 27 files changed, 2018 insertions(+), 130 deletions(-) create mode 100644 docs/src/content/docs/guides/module-scripts.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 80ffca37..793343bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `"$schema"` at the top of the file, editors complete and check it as you type. - A documentation site, [docs.configfile.sh](https://docs.configfile.sh), with a tutorial, guides, a reference and explanations. The README is now a short introduction that links to it. +- Modules can name scripts to run when they are deployed or undeployed, with `"pre_deploy"`, + `"post_deploy"`, `"pre_undeploy"` and `"post_undeploy"` in `settings.json`. A script that fails + stops the command there, unless `--keep-going` is given, and a `pre_` script that fails leaves + the files of its module as they are; `--no-hooks` runs none. A name that matches no script + fails the command before anything is changed. `modules status` shows the scripts + ([#298](https://github.com/mindsers/configfile/issues/298)). + +### Changed +- `modules deploy` and `modules undeploy` work on one module at a time, taking the lock for each + module in turn instead of the whole run. When a local file already exists, the question to + replace it is asked once the other files of its module are deployed, no longer at the very end. ### Fixed +- When `~/.configfile` or its lock file cannot be created or written, `modules deploy` and + `modules undeploy` say that the lock cannot be taken, and why, instead of reporting an + unexpected error. - When more than one settings entry failed, `modules deploy` and `undeploy` reported "settings entrys" instead of "settings entries". diff --git a/README.md b/README.md index 08bb66b9..63f16f2d 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ npm install --global https://github.com/mindsers/configfile/releases/download/1. - [Your first dotfiles repository](https://docs.configfile.sh/getting-started/tutorial/): a ten-minute tutorial. - [How it works](https://docs.configfile.sh/concepts/how-it-works/) and [Safety and trust](https://docs.configfile.sh/concepts/safety/): what *configfile* does with your files, and what it refuses to touch. -- Guides: [set up a new machine](https://docs.configfile.sh/guides/new-machine/), [use configfile in scripts and CI](https://docs.configfile.sh/guides/scripts-and-ci/), [upgrade from 0.3](https://docs.configfile.sh/guides/upgrading-from-0-3/). +- Guides: [set up a new machine](https://docs.configfile.sh/guides/new-machine/), [use configfile in scripts and CI](https://docs.configfile.sh/guides/scripts-and-ci/), [run scripts when a module is deployed](https://docs.configfile.sh/guides/module-scripts/), [upgrade from 0.3](https://docs.configfile.sh/guides/upgrading-from-0-3/). - Reference: [commands](https://docs.configfile.sh/reference/commands/), [modules and `settings.json`](https://docs.configfile.sh/reference/modules/), [scripts](https://docs.configfile.sh/reference/scripts/), [configuration](https://docs.configfile.sh/reference/configuration/), [history](https://docs.configfile.sh/reference/history/). - [Changelog](https://github.com/mindsers/configfile/blob/develop/CHANGELOG.md). diff --git a/docs/public/schemas/settings.json b/docs/public/schemas/settings.json index 229a65df..69d57496 100644 --- a/docs/public/schemas/settings.json +++ b/docs/public/schemas/settings.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://docs.configfile.sh/schemas/settings.json", "title": "configfile module settings", - "description": "The settings.json file of a configfile module: the files of the module and how each one is deployed. See https://docs.configfile.sh/reference/modules/", + "description": "The settings.json file of a configfile module: the files of the module, how each one is deployed, and the scripts run when the module is deployed or undeployed. See https://docs.configfile.sh/reference/modules/", "oneOf": [ { "type": "object", @@ -15,6 +15,22 @@ "description": "The files of the module.", "type": "array", "items": { "$ref": "#/$defs/entry" } + }, + "pre_deploy": { + "$ref": "#/$defs/path", + "description": "The name of a script of the repository (as listed by configfile scripts list), run by configfile modules deploy before the files of the module are deployed. When it fails, the module is not deployed." + }, + "post_deploy": { + "$ref": "#/$defs/path", + "description": "The name of a script of the repository (as listed by configfile scripts list), run by configfile modules deploy once the files of the module are deployed." + }, + "pre_undeploy": { + "$ref": "#/$defs/path", + "description": "The name of a script of the repository, run by configfile modules undeploy before the files of the module are removed. When it fails, the module stays deployed." + }, + "post_undeploy": { + "$ref": "#/$defs/path", + "description": "The name of a script of the repository, run by configfile modules undeploy once the files of the module are removed." } }, "required": ["files"], diff --git a/docs/src/content/docs/concepts/how-it-works.md b/docs/src/content/docs/concepts/how-it-works.md index 8cd1d808..f9044d1b 100644 --- a/docs/src/content/docs/concepts/how-it-works.md +++ b/docs/src/content/docs/concepts/how-it-works.md @@ -54,11 +54,11 @@ files/ one folder per module git/ settings.json gitconfig -scripts/ setup scripts, run with configfile scripts run +scripts/ scripts, run with configfile scripts run , or when a module is deployed setup.sh ``` -A **module** is a folder of `files/` that groups the configuration of one tool. Its `settings.json` lists the module's files: each **entry** names a file of the module, where it goes, and how it's deployed. Scripts in `scripts/` do what files alone can't, such as installing tools. The [modules](/reference/modules/) and [scripts](/reference/scripts/) references describe both folders in detail, and [Your first dotfiles repository](/getting-started/tutorial/) builds one step by step. +A **module** is a folder of `files/` that groups the configuration of one tool. Its `settings.json` lists the module's files: each **entry** names a file of the module, where it goes, and how it's deployed. Scripts in `scripts/` do what files alone can't, such as installing tools: you run them yourself, or a module names the ones to [run when it is deployed or undeployed](/guides/module-scripts/). The [modules](/reference/modules/) and [scripts](/reference/scripts/) references describe both folders in detail, and [Your first dotfiles repository](/getting-started/tutorial/) builds one step by step. ## How files are deployed diff --git a/docs/src/content/docs/concepts/safety.md b/docs/src/content/docs/concepts/safety.md index 41986174..a4cdf431 100644 --- a/docs/src/content/docs/concepts/safety.md +++ b/docs/src/content/docs/concepts/safety.md @@ -9,7 +9,7 @@ sidebar: ## Deploying a repository means trusting it -The files of a repository end up in your shell's and your tools' configuration, and its scripts run on your machine with your permissions. Treat deploying a dotfiles repository like running its code: only deploy repositories you trust, and read a shared one before using it. +The files of a repository end up in your shell's and your tools' configuration, and its scripts run on your machine with your permissions, including the scripts a module names, which `modules deploy` and `modules undeploy` run by themselves (`--dry-run` lists them, `--no-hooks` skips them). Treat deploying a dotfiles repository like running its code: only deploy repositories you trust, and read a shared one before using it. ## A copy of what is replaced @@ -38,7 +38,7 @@ A `target_path` can't put something important at risk: your home folder, the cur ## Deployments don't overlap -`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error, which names the other process when it can. The lock is `~/.configfile/lock`; the lock of a process that no longer exists is taken over. Other commands, such as `update`, don't wait for it, so don't run them during a deployment. +`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error, which names the other process when it can. The lock is `~/.configfile/lock`; the lock of a process that no longer exists is taken over. Both take it for the files of each module in turn, and release it while a script of the module runs, so that script can run *configfile* itself. Another deployment can therefore take its turn between two modules; files are still never changed by two processes at once. Other commands, such as `update`, don't wait for it, so don't run them during a deployment. ## Your configuration and history stay private diff --git a/docs/src/content/docs/getting-started/tutorial.md b/docs/src/content/docs/getting-started/tutorial.md index 7ff2f0b7..f5984fef 100644 --- a/docs/src/content/docs/getting-started/tutorial.md +++ b/docs/src/content/docs/getting-started/tutorial.md @@ -202,4 +202,5 @@ configfile modules undeploy zsh - [Modules and `settings.json`](/reference/modules/): local files copied into a project, files kept in the repository without being deployed, and every rule for targets. - [Scripts](/reference/scripts/): scripts in any language, folder scripts, and versions per system (`setup.macos.sh`). +- [Run scripts when a module is deployed](/guides/module-scripts/): install plugins or start a service each time a module is deployed, and clean up when it is undeployed. - [Commands](/reference/commands/): every command and option, including the ones for running *configfile* from scripts and CI. diff --git a/docs/src/content/docs/guides/module-scripts.md b/docs/src/content/docs/guides/module-scripts.md new file mode 100644 index 00000000..8a31b490 --- /dev/null +++ b/docs/src/content/docs/guides/module-scripts.md @@ -0,0 +1,122 @@ +--- +title: Run scripts when a module is deployed +description: Install plugins, rebuild a cache or start a service each time a module is deployed, and clean up when it is undeployed. +sidebar: + order: 3 +--- + +Linking a configuration file is often half of the job: tmux needs its plugins installed, `mise` needs to install the tools its configuration lists, a font cache needs rebuilding. A module can name scripts for these steps, and *configfile* runs them when it deploys or undeploys the module. This guide sets one up for tmux; the [modules reference](/reference/modules/#run-scripts-when-a-module-is-deployed-or-undeployed) has every rule. + +## 1. Write the script + +Scripts go in `scripts/`, like the ones you run with `configfile scripts run`. This one installs the tmux plugin manager, then the plugins listed in `~/.tmux.conf`: + +```sh title="scripts/tmux-plugins.sh" +#!/bin/sh +set -e + +tpm="$HOME/.tmux/plugins/tpm" +[ -d "$tpm" ] || git clone https://github.com/tmux-plugins/tpm "$tpm" +"$tpm/bin/install_plugins" +``` + +The script runs **every time** the module is deployed, so it must be safe to run again: here it only clones the plugin manager when it isn't there yet. + +## 2. Name it in the module + +In the module's `settings.json`, next to `files`: + +```json title="files/tmux/settings.json" {5} +{ + "files": [ + { "source_path": "tmux.conf", "target_path": "~/.tmux.conf", "deploy": "global" } + ], + "post_deploy": "tmux-plugins" +} +``` + +`post_deploy` is the script's name, as `configfile scripts list` shows it, not its path. Push the change and run `configfile update`, as for any change to your dotfiles. + +## 3. Check, then deploy + +`modules status` shows the scripts of each module, and says when a name matches no script: + +```txt +$ configfile modules status tmux +tmux: + ~/.tmux.conf (not deployed) + post_deploy: script "tmux-plugins" +``` + +A dry run shows when the script would run, without running it: + +```txt +$ configfile modules deploy --all --dry-run + Info Dry run, nothing is changed. Deploying tmux, zsh would do: +- ~/.tmux.conf (would be linked) +- script "tmux-plugins" (post_deploy of tmux: would run) +- ~/.zshrc (would be linked) + Done Dry run finished. +``` + +Then deploy. Modules are deployed one at a time: the files of `tmux`, its script, then `zsh`. + +```txt +$ configfile modules deploy --all + Info Deploying tmux, zsh… +- ~/.tmux.conf (deployed) + Info Running "tmux-plugins", the post_deploy script of tmux… +- ~/.zshrc (deployed) + Done Deployment finished. +``` + +The output of the script appears where it runs. `configfile modules deploy tmux` alone now leaves the module fully set up, and you can still run the script by hand with `configfile scripts run tmux-plugins`. + +## When a script fails + +When the script exits with an error, the command stops there and fails: the modules after it are not deployed. What is already deployed stays in place. + +```txt + Error tmux: post_deploy script "tmux-plugins" exited with code 1. + Error The post_deploy script of tmux failed. 1 module was not deployed: zsh. Use --keep-going to go on after a script that fails. +``` + +Fix the cause and deploy again: files already in place are left as they are, and the script runs again. + +A name that matches no script is caught earlier: *configfile* checks the names before it changes anything, and fails without deploying any module. To deploy the other modules anyway, pass `--keep-going`; the command still fails, so a bootstrap script notices. To deploy the files without running any script, pass `--no-hooks`. + +## Clean up when the module is undeployed + +`configfile modules undeploy tmux` removes the link, not what the script installed. Name a second script for that: + +```sh title="scripts/tmux-plugins-remove.sh" +#!/bin/sh +rm -rf "$HOME/.tmux/plugins" +``` + +```json title="files/tmux/settings.json" {6} +{ + "files": [ + { "source_path": "tmux.conf", "target_path": "~/.tmux.conf", "deploy": "global" } + ], + "post_deploy": "tmux-plugins", + "pre_undeploy": "tmux-plugins-remove" +} +``` + +## Which setting to use + +| Setting | The script runs | Typical use | +| --- | --- | --- | +| `pre_deploy` | before the files are deployed | install the tool the configuration is for; when the script fails, the module is not deployed | +| `post_deploy` | once all the files are in place | install plugins, rebuild a cache, start or reload a service | +| `pre_undeploy` | before the files are removed, while they are still in place | stop a service, remove what `post_deploy` installed; when the script fails, the module stays deployed | +| `post_undeploy` | once the files are removed | reload a tool that now uses its defaults | + +## Good to know + +- **One script for several settings or modules.** A script gets the setting that named it in `CONFIGFILE_HOOK`, the module in `CONFIGFILE_MODULE`, and `global` or `local` in `CONFIGFILE_DEPLOY`, in addition to the [variables every script gets](/reference/scripts/). +- **Local files.** `configfile modules deploy --local` runs the scripts too, in the project folder, for the modules that have local files. A script that only makes sense once per machine can leave early: `[ "$CONFIGFILE_DEPLOY" = global ] || exit 0`. +- **Versions per system.** As for any script, `tmux-plugins.macos.sh` is used on macOS instead of `tmux-plugins.sh`. A script that only has a version for another system is skipped on this one, and the module is deployed all the same: a step that only makes sense on macOS needs no empty script for Linux. +- **Scripts that run configfile.** They can: no deployment is in progress while a script runs. +- **Trust.** These scripts run without a question, as part of `modules deploy` and `modules undeploy`. Read the scripts of a repository that isn't yours before deploying it, or use `--dry-run` to see which ones would run. See [Safety and trust](/concepts/safety/). diff --git a/docs/src/content/docs/guides/new-machine.md b/docs/src/content/docs/guides/new-machine.md index 089259af..f51d3932 100644 --- a/docs/src/content/docs/guides/new-machine.md +++ b/docs/src/content/docs/guides/new-machine.md @@ -48,6 +48,8 @@ configfile modules deploy --all Files that already exist where yours go, such as the default `~/.zshrc` of a new machine, are moved aside to `.old`, so you can compare them or bring them back with `configfile modules undeploy`. +Modules that [name a script to run when they are deployed](/guides/module-scripts/), for example to install plugins, run it at this step, and the dry run lists it. If one fails, the modules after it are not deployed: fix the cause and run the command again. + ## 5. Run your setup script If your repository has a setup script, for example to install your tools, run it: diff --git a/docs/src/content/docs/guides/scripts-and-ci.md b/docs/src/content/docs/guides/scripts-and-ci.md index 5aee4dc6..8fd76882 100644 --- a/docs/src/content/docs/guides/scripts-and-ci.md +++ b/docs/src/content/docs/guides/scripts-and-ci.md @@ -23,6 +23,8 @@ $ configfile modules deploy < /dev/null | `configfile modules deploy` and `undeploy` | whether to use every module | module names, or `--all` | | `configfile modules deploy --local` | whether to replace an existing file that differs | `--force` (without it, the file is skipped and the command fails) | +Two more options matter in a script, although no question stands behind them: `--keep-going` deploys (or undeploys) the remaining modules when a [script named by a module](/guides/module-scripts/) fails, and `--no-hooks` runs none of these scripts. + `configfile init --folder ` also lets a script choose where the repository is cloned. The [commands reference](/reference/commands/) lists every option. ## Exit codes @@ -32,13 +34,14 @@ $ configfile modules deploy < /dev/null - `0` when the command succeeded; - another code when it failed, with an error message saying why: usually `1`, or git's own code when a git command fails (for example `128` when the repository can't be fetched); - the script's own exit code with `configfile scripts run`, so a failing setup script fails the step that runs it; -- `130` when you press Ctrl+C at a question. +- `1` when a [script named by a module](/guides/module-scripts/) fails during `modules deploy` or `undeploy` (its own exit code is in the [history](/reference/history/)); +- `130` when you press Ctrl+C at a question, or while a script named by a module runs (`143` when *configfile* gets SIGTERM during such a script). In a shell script, `set -e` therefore stops at the first *configfile* command that fails. ## Output -With `configfile scripts run`, *configfile*'s own messages go to stderr and the script's output to stdout, unchanged: you can pipe or redirect the script's output as if you had run it directly. +With `configfile scripts run`, *configfile*'s own messages go to stderr and the script's output to stdout, unchanged: you can pipe or redirect the script's output as if you had run it directly. During `modules deploy` and `undeploy`, the output of the scripts named by the modules is mixed with *configfile*'s on stdout. `configfile history --json` prints the [history](/reference/history/) as JSON Lines, one run per line, for scripts that need to know what *configfile* did. @@ -73,7 +76,7 @@ jobs: - run: configfile modules deploy --all --dry-run ``` -`init` accepts a local folder as the repository, here the checkout of the commit being tested. Nothing is deployed for real, and the runner's home folder isn't touched. The dry run fails if any module or entry is invalid, even when the others are fine, local files included. A file whose entry has no `deploy` strategy only produces a warning, as it does on your machines. +`init` accepts a local folder as the repository, here the checkout of the commit being tested. Nothing is deployed for real, and the runner's home folder isn't touched. The dry run fails if any module or entry is invalid, even when the others are fine, local files included. It lists the scripts the modules name to run when they are deployed, without running them, and fails before listing anything if one of them doesn't exist. A file whose entry has no `deploy` strategy only produces a warning, as it does on your machines. To also test your setup script, add a step that runs it, on the systems it supports: diff --git a/docs/src/content/docs/guides/upgrading-from-0-3.md b/docs/src/content/docs/guides/upgrading-from-0-3.md index 7adb3ce0..3a5eee4c 100644 --- a/docs/src/content/docs/guides/upgrading-from-0-3.md +++ b/docs/src/content/docs/guides/upgrading-from-0-3.md @@ -2,7 +2,7 @@ title: Upgrading from 0.3 description: What changes for users of configfile 0.3. sidebar: - order: 3 + order: 4 --- - Node.js 24.11 or later is required, on macOS or Linux. Install again as described in [Installation](/getting-started/installation/). To switch to Homebrew, remove the npm version first (`npm uninstall --global configfile`). diff --git a/docs/src/content/docs/index.md b/docs/src/content/docs/index.md index e0990600..4ebd3d15 100644 --- a/docs/src/content/docs/index.md +++ b/docs/src/content/docs/index.md @@ -9,7 +9,7 @@ description: Manage your dotfiles and setup scripts from a git repository, on ma - [How it works](/concepts/how-it-works/): your repository, the mirror configfile keeps, and what it deploys. - [Safety and trust](/concepts/safety/): what configfile protects, and what it refuses to touch. - Reference: [commands](/reference/commands/), [modules and `settings.json`](/reference/modules/), [scripts](/reference/scripts/), [configuration](/reference/configuration/), [history](/reference/history/). -- Guides: [set up a new machine](/guides/new-machine/), [use configfile in scripts and CI](/guides/scripts-and-ci/), [upgrade from 0.3](/guides/upgrading-from-0-3/). +- Guides: [set up a new machine](/guides/new-machine/), [use configfile in scripts and CI](/guides/scripts-and-ci/), [run scripts when a module is deployed](/guides/module-scripts/), [upgrade from 0.3](/guides/upgrading-from-0-3/). - [Changelog](https://github.com/mindsers/configfile/blob/develop/CHANGELOG.md): what changed in each version. ## Contribution diff --git a/docs/src/content/docs/reference/commands.md b/docs/src/content/docs/reference/commands.md index e968e51e..b97ded0f 100644 --- a/docs/src/content/docs/reference/commands.md +++ b/docs/src/content/docs/reference/commands.md @@ -37,7 +37,7 @@ Short form: `configfile m l`. ## `configfile modules status` -Shows whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file. Without module names, it also lists the deployed files the repository no longer deploys. +Shows whether each global file of the modules (all modules by default) is deployed, not deployed, or blocked by another file, and the scripts each module runs when it is deployed or undeployed. Without module names, it also lists the deployed files the repository no longer deploys. ```sh @@ -54,7 +54,7 @@ Short form: `configfile m st`. ## `configfile modules deploy` -Deploys the global files of the given modules. Without module names, asks to deploy all modules. +Deploys the global files of the given modules, one module at a time, and runs the [`pre_deploy` and `post_deploy` scripts](/reference/modules/#run-scripts-when-a-module-is-deployed-or-undeployed) of the modules that have them. Without module names, asks to deploy all modules. ```sh @@ -70,11 +70,13 @@ Short form: `configfile m d`. | `-a, --all` | deploy every module without asking | | `-f, --force` | replace existing local files without asking (they are moved to .old) | | `-n, --dry-run` | show what would be done, without changing anything | +| `--no-hooks` | do not run the pre_deploy and post_deploy scripts of the modules | +| `--keep-going` | deploy the remaining modules when a pre_deploy or post_deploy script fails | ## `configfile modules undeploy` -Removes the deployed global files of the given modules and restores their backups. Without module names, asks to undeploy all modules. `--local` and `--dry-run` work as for `deploy`. [Modules](/reference/modules/) explains which files `--removed` covers; with `--local`, it covers the copies made in the current folder. +Removes the deployed global files of the given modules and restores their backups, one module at a time, and runs the [`pre_undeploy` and `post_undeploy` scripts](/reference/modules/#run-scripts-when-a-module-is-deployed-or-undeployed) of the modules that have them. Without module names, asks to undeploy all modules. `--local` and `--dry-run` work as for `deploy`. [Modules](/reference/modules/) explains which files `--removed` covers; with `--local`, it covers the copies made in the current folder. ```sh @@ -90,6 +92,8 @@ Short form: `configfile m u`. | `-a, --all` | undeploy every module without asking, and the files the repository no longer deploys | | `--removed` | only undeploy the files the repository no longer deploys | | `-n, --dry-run` | show what would be done, without changing anything | +| `--no-hooks` | do not run the pre_undeploy and post_undeploy scripts of the modules | +| `--keep-going` | undeploy the remaining modules when a pre_undeploy or post_undeploy script fails | ## `configfile scripts list` @@ -150,4 +154,4 @@ configfile history [options] ## Exit codes and use in scripts -*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script fails, so it can be used from other scripts. When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question exits with code 130. Each run of a command that changes files, and any unexpected error, is also recorded in the [history](/reference/history/). +*configfile* exits with a non-zero code when a command fails, and with the script's exit code when a script run with `scripts run` fails, so it can be used from other scripts (a script named by a module that fails makes `modules deploy` or `undeploy` exit with `1`). When stdin is not a terminal, a command that would ask a question fails and names the option to pass instead (`--repo`, `--folder` and `--force` for `init`; module names or `--all` for `modules deploy` and `undeploy`). Without a terminal, `modules deploy --local` skips existing local files and exits with an error, unless `--force` is given. Ctrl+C at a question, or while a script named by a module runs, exits with code 130. Each run of a command that changes files, and any unexpected error, is also recorded in the [history](/reference/history/). diff --git a/docs/src/content/docs/reference/history.md b/docs/src/content/docs/reference/history.md index 1f7be1b8..0d4d8bb1 100644 --- a/docs/src/content/docs/reference/history.md +++ b/docs/src/content/docs/reference/history.md @@ -3,9 +3,9 @@ title: History description: What configfile records about each run, and how to read it. --- -*configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs and usage errors excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes. +*configfile* records what each command changed, when, and whether it failed, in `~/.configfile/history.jsonl`: one JSON line per run of `init`, `modules deploy`, `modules undeploy`, `update` and `scripts run` (dry runs and usage errors excepted), and per unexpected error of any command. Each line has the time, the *configfile* version, the command and its options, the current folder, the exit code, the error message, and the changes: files linked, copied, moved aside to `.old`, removed, restored, kept or skipped, syncs (from which commit to which, and saved patches), scripts and their exit codes (with the module and the setting, for a script a module names, and the scripts a module names that were not run on purpose). -Script arguments, environment variables and file contents are never recorded. In URLs, user names and passwords (`https://user:token@host`) and query parameters that look like secrets (`?private_token=…`) are hidden. Paths are recorded in full, so they include your user name. When *configfile* creates the file, only its owner can read it. A run stopped by a signal (Ctrl+C outside a question) is not recorded, unless the signal comes while a script or git runs: *configfile* then leaves it to that program, and records the run with its exit code. +Script arguments, environment variables and file contents are never recorded. In URLs, user names and passwords (`https://user:token@host`) and query parameters that look like secrets (`?private_token=…`) are hidden. Paths are recorded in full, so they include your user name. When *configfile* creates the file, only its owner can read it. A run stopped by a signal (Ctrl+C outside a question) is not recorded, unless the signal comes while a script or git runs: *configfile* then leaves it to that program, and records the run with its exit code (for a deployment or undeployment stopped during a script a module names: `130` after Ctrl+C, `143` after SIGTERM, whatever the script's own exit code). `configfile history` shows the last runs: diff --git a/docs/src/content/docs/reference/modules.md b/docs/src/content/docs/reference/modules.md index 07537a7d..b19aab7d 100644 --- a/docs/src/content/docs/reference/modules.md +++ b/docs/src/content/docs/reference/modules.md @@ -28,7 +28,7 @@ An entry without `deploy` or `global` is not deployed, and `modules deploy` warn When a global file is deployed and something else already exists at its target (a file, a folder or another link), it is moved to `.old` (or `.old.1`, …). A link that already points to the right file is left as is, so deploying twice is safe. -When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. +When a local file already exists and differs from the one in the repository, *configfile* asks whether to replace it, once the other files of its module are deployed. The existing file or folder is then moved to `.old` (or `.old.1`, …) before the copy, so nothing is lost. *configfile* records what it deploys and the backups it makes in `~/.configfile/state.json`. `configfile modules undeploy` reverts a deployment: it removes the links that point to the repository's files and the local copies *configfile* made, as long as a copy is still the file it made and matches the repository's current version, and moves the most recent backup it made back in place, if that backup is unchanged. Anything else is left untouched: files it did not create (even when identical to the repository), apart from links to the repository's files, local copies that differ from the repository (changed by you, or because the repository changed since) or were saved again by an editor, and `.old` files you made yourself. @@ -36,10 +36,50 @@ When an entry leaves the repository (removed, set to `"deploy": "none"`, given a To stay safe, *configfile* never undeploys a file when it cannot tell whether the repository still deploys it: files of a module whose `settings.json` cannot be used or has invalid entries, of a module folder that is not usable (a broken symbolic link, a name another folder uses), and entries without a deployment strategy. `modules status` lists them separately. Links deployed by 0.3 and not deployed again since were not recorded, so they are not found either. -`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error (the lock is `~/.configfile/lock`). Other commands, such as `update`, don't wait for it. +`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error (the lock is `~/.configfile/lock`). Both take the lock for the files of each module in turn, and release it while a [script of the module](#run-scripts-when-a-module-is-deployed-or-undeployed) runs: another deployment can take its turn between two modules, and a deployment that cannot take the lock again stops there, saying which modules were left out. Other commands, such as `update`, don't wait for it. > **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. [Safety and trust](/concepts/safety/) explains what *configfile* protects, and what it refuses to touch. +## Run scripts when a module is deployed or undeployed + +[Run scripts when a module is deployed](/guides/module-scripts/) is a step-by-step guide. Some modules need a step around their files: installing what the configuration needs, installing the plugins it lists, rebuilding a cache, starting a service, and the reverse when the module is removed. Name [scripts](/reference/scripts/) of the repository next to `files`: + +```json +{ + "files": [ + { "source_path": "tmux.conf", "target_path": "~/.tmux.conf", "deploy": "global" } + ], + "post_deploy": "tmux-plugins", + "pre_undeploy": "tmux-plugins-remove" +} +``` + +| Setting | The script runs | +| --- | --- | +| `pre_deploy` | before `modules deploy` deploys the files of the module | +| `post_deploy` | once `modules deploy` has deployed all of them | +| `pre_undeploy` | before `modules undeploy` removes the files of the module, while they are still in place | +| `post_undeploy` | once `modules undeploy` has removed them | + +Each one is a script's name, as `configfile scripts list` shows it: here `scripts/tmux-plugins.sh`, or `scripts/tmux-plugins.macos.sh` on macOS. It is run the way `configfile scripts run tmux-plugins` runs it (same interpreters, in the current folder, with the same variables), without arguments, and also gets the setting's name in `CONFIGFILE_HOOK`, the module's name in `CONFIGFILE_MODULE` and `global` or `local` in `CONFIGFILE_DEPLOY`. + +`modules deploy` and `modules undeploy` work on one module at a time, in the order of `modules list`: the `pre_` script of a module, its files, its `post_` script, then the next module. + +- The scripts run **every time** the module is deployed or undeployed, including when its files were already up to date or not deployed, so write them to be safe to run again. +- They only run when the module has files of the kind the command works on (local files with `--local`, global files otherwise). When you name such a module on the command line, the command says, with a warning, that its script was not run. +- When a `pre_` script fails, the files of the module are **left as they are** (not deployed, or still deployed) and its `post_` script is not run. +- The `post_deploy` script only runs when all the files of the module are in place. When a file fails or is skipped, or an entry is invalid, it is not run, with a warning. In the same way, the `post_undeploy` script is not run when a file could not be undeployed; a file that `undeploy` keeps on purpose (a copy you modified, a file it did not create) does not prevent it. +- When a script fails (it exits with an error or cannot be started), the modules after it are **left as they are** and the command fails. What was already done stays done. `--keep-going` goes on with the remaining modules anyway; the command still fails. It exits with `1`, not with the script's exit code, which is in the [history](/reference/history/). +- A name that matches no script is found **before anything is changed**: the command names every such script and fails. With `--keep-going`, it starts anyway, and the script fails when its turn comes. +- A script that only has versions for other systems (`tmux-plugins.macos.sh` alone, on Linux) is not a mistake: it is skipped, the command says so, and the module is deployed or undeployed as if it named no script. +- Ctrl+C while a script runs is left to the script, as with `scripts run`; once it ends, the command stops there, with or without `--keep-going`, and exits with `130`. +- `--no-hooks` deploys or undeploys the files without running any script. +- `--dry-run` shows the scripts that would run, and those that would not because a file would fail or be skipped, or an entry is invalid, without running them. It fails like the real command when a script does not exist. +- A setting that is not a script name (not text, or empty) is ignored: no script runs for it. The command it belongs to reports it as an error and fails, once the files are deployed or undeployed, even with `--no-hooks` (`modules deploy` for `pre_deploy` and `post_deploy`, `modules undeploy` for the other two). The other one only warns about it; `modules list` and `status` show it as an error. +- `modules list` names the settings a module uses, and `modules status` shows the scripts, and says when one does not exist. + +No script runs for the files the repository no longer deploys (`modules undeploy --removed`, or `--all`): their module or entry is gone, with its settings. With `--all`, they are undeployed after the modules; when a script stops the command before that, they are left in place, and the command says so. A `settings.json` in the 0.3 list format cannot have these keys. + ## Completion and validation in your editor A [JSON Schema](https://docs.configfile.sh/schemas/settings.json) describes `settings.json`. Add it at the top of the file, and editors that support JSON Schema (VS Code, Zed, JetBrains IDEs, and others) suggest the keys and their values, show their descriptions, and flag mistakes as you type: diff --git a/docs/src/content/docs/reference/scripts.md b/docs/src/content/docs/reference/scripts.md index c9677eac..48a855a8 100644 --- a/docs/src/content/docs/reference/scripts.md +++ b/docs/src/content/docs/reference/scripts.md @@ -15,7 +15,7 @@ Scripts can be written in any language: - a `.js` (or `.mjs`, `.cjs`) or `.sh` script without shebang line is run with `node` or `sh`; - any other executable file (such as a compiled program) is run directly. -*configfile* never changes the permissions of your files. Scripts run in the current folder, their output is not modified (the messages of *configfile* go to stderr), and their exit code is forwarded. +*configfile* never changes the permissions of your files. Scripts run in the current folder and their output is not modified. With `configfile scripts run`, the messages of *configfile* go to stderr and the script's exit code is forwarded. Scripts get these environment variables, in addition to *configfile*'s own environment (they replace variables of the same name): @@ -24,3 +24,11 @@ Scripts get these environment variables, in addition to *configfile*'s own envir | `CONFIGFILE_REPO` | the full path of the dotfiles repository (`folder_path`), to reach its files: `"$CONFIGFILE_REPO/Brewfile"` | | `CONFIGFILE_SCRIPT` | the script's name (`setup`) | | `CONFIGFILE_OS` | the system: `macos` or `linux`, as in the names of script versions | + +A module can name scripts to run each time it is deployed or undeployed, with [`pre_deploy`, `post_deploy`, `pre_undeploy` and `post_undeploy`](/reference/modules/#run-scripts-when-a-module-is-deployed-or-undeployed) in its `settings.json`. [Run scripts when a module is deployed](/guides/module-scripts/) shows how. Their exit code is not forwarded: when one fails, `modules deploy` or `modules undeploy` exits with `1`. Such a script gets no arguments, and three more variables: + +| Variable | Value | +| --- | --- | +| `CONFIGFILE_HOOK` | the setting that named the script: `pre_deploy`, `post_deploy`, `pre_undeploy` or `post_undeploy` | +| `CONFIGFILE_MODULE` | the name of the module being deployed or undeployed (`tmux`) | +| `CONFIGFILE_DEPLOY` | `global` or `local` (with `--local`) | diff --git a/src/commands/history.ts b/src/commands/history.ts index ba52585f..21fd6d29 100644 --- a/src/commands/history.ts +++ b/src/commands/history.ts @@ -105,6 +105,8 @@ function describeRun(line: HistoryLine): string { for (const flag of ['local', 'all', 'force', 'removed'] as const) { if (options[flag] === true) words.push(`--${flag}`) } + if (options.keepGoing === true) words.push('--keep-going') + if (options.hooks === false) words.push('--no-hooks') if (typeof options.argCount === 'number' && options.argCount > 0) { words.push(`(${plural(options.argCount, 'argument')})`) } @@ -159,7 +161,16 @@ function describeChange(change: Change): string { case 'saved-patch': return line('saved', `local changes to ${change.file}`) case 'script': - return line('script', `${change.name} exit ${change.exitCode}`) + return line( + 'script', + `${change.name} exit ${change.exitCode}` + + (change.module == null ? '' : ` (${change.hook ?? 'hook'} of ${change.module})`), + ) + case 'script-skipped': + return line( + 'skipped', + `${change.name} (${change.hook} of ${change.module}: ${change.reason})`, + ) case 'cloned': return line('cloned', `${change.repository} into ${change.folder}`) case 'reused': diff --git a/src/commands/modules.ts b/src/commands/modules.ts index 7dd4e8ea..a8766691 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -1,3 +1,4 @@ +import { constants as osConstants } from 'node:os' import { inspect } from 'node:util' import type { Command } from 'commander' @@ -20,12 +21,23 @@ import { type UndeployResult, undeployFile, } from '../deploy.ts' -import { CliError } from '../errors.ts' +import { CliError, isPromptExit } from '../errors.ts' import { messageOf } from '../fsutil.ts' import { withLock } from '../lock.ts' import { plural } from '../output.ts' +import { runScript } from '../process.ts' import { findRemovedFiles, type HeldBack, type RecordedFile } from '../removed.ts' -import { loadRepository, type Module, type ModuleFile } from '../repository.ts' +import { + HOOKS, + type Hook, + loadRepository, + loadScripts, + type Module, + type ModuleFile, + type Script, + scriptEnvironment, + systemName, +} from '../repository.ts' import { DeploymentRecord } from '../state.ts' type Strategy = ModuleFile['strategy'] @@ -38,6 +50,8 @@ interface RawOptions { force?: boolean dryRun?: boolean removed?: boolean + hooks?: boolean + keepGoing?: boolean } /** Options once normalized at the command boundary. */ @@ -48,6 +62,10 @@ interface Options { dryRun: boolean /** Undeploy: the files the repository no longer deploys. */ removed: boolean + /** Run the scripts the modules name (`pre_deploy`, `post_undeploy`…). */ + hooks: boolean + /** Go on with the modules that come after a script that failed. */ + keepGoing: boolean } function normalize(options: RawOptions): Options { @@ -57,6 +75,8 @@ function normalize(options: RawOptions): Options { force: options.force === true, dryRun: options.dryRun === true, removed: options.removed === true, + hooks: options.hooks !== false, + keepGoing: options.keepGoing === true, } } @@ -89,6 +109,11 @@ export function registerModulesCommand(program: Command, ctx: Context): void { .option('-a, --all', 'deploy every module without asking') .option('-f, --force', 'replace existing local files without asking (they are moved to .old)') .option('-n, --dry-run', 'show what would be done, without changing anything') + .option('--no-hooks', 'do not run the pre_deploy and post_deploy scripts of the modules') + .option( + '--keep-going', + 'deploy the remaining modules when a pre_deploy or post_deploy script fails', + ) .action((names: string[], options: RawOptions) => deploy(names, normalize(options), ctx)) modules @@ -103,6 +128,11 @@ export function registerModulesCommand(program: Command, ctx: Context): void { ) .option('--removed', 'only undeploy the files the repository no longer deploys') .option('-n, --dry-run', 'show what would be done, without changing anything') + .option('--no-hooks', 'do not run the pre_undeploy and post_undeploy scripts of the modules') + .option( + '--keep-going', + 'undeploy the remaining modules when a pre_undeploy or post_undeploy script fails', + ) .action((names: string[], options: RawOptions) => undeploy(names, normalize(options), ctx)) } @@ -145,11 +175,18 @@ async function list(ctx: Context): Promise { ctx.output.print(`${plural(modules.length, 'module')} found.`) for (const module of modules) { - ctx.output.print(`- ${module.name}${module.error == null ? '' : ` (ignored: ${module.error})`}`) + ctx.output.print(`- ${module.name}${describeListed(module)}`) } for (const module of modules) reportSettings(module, ctx) } +/** What `modules list` adds to a module's name: why it is ignored, or the scripts it names. */ +function describeListed(module: Module): string { + if (module.error != null) return ` (ignored: ${module.error})` + const hooks = HOOKS.filter(hook => module.hooks[hook] != null) + return hooks.length === 0 ? '' : ` (${hooks.join(', ')})` +} + async function status(names: string[], options: Options, ctx: Context): Promise { const { output } = ctx const repo = await loadRepository(ctx) @@ -167,6 +204,20 @@ async function status(names: string[], options: Options, ctx: Context): Promise< return } + // Scripts named by the modules are checked too: a wrong name would stop a deployment. + let scripts: Scripts | null = null + if ( + selected.some(module => module.error == null && HOOKS.some(hook => module.hooks[hook] != null)) + ) { + try { + scripts = await loadScripts(ctx) + } catch (error) { + // Status still shows the files when the scripts cannot be listed. + if (!(error instanceof CliError)) throw error + output.warn(`The scripts the modules name cannot be checked: ${messageOf(error)}`) + } + } + const describeTarget = async (file: Pick) => { try { return describeState(await inspectFile(file, record)) @@ -194,6 +245,17 @@ async function status(names: string[], options: Options, ctx: Context): Promise< if (files.length === 0 && module.undecided.length === 0) { output.print(` no ${options.strategy} file`) } + for (const hook of HOOKS) { + if (module.hooks[hook] == null) continue + const found = scripts == null ? null : findHook(module, hook, scripts) + const note = + found === 'missing' + ? ' (not found in scripts/)' + : found === 'other-system' + ? ' (no version for this system)' + : '' + output.print(` ${hook}: script "${module.hooks[hook]}"${note}`) + } } if (removed.length > 0) { @@ -212,52 +274,159 @@ async function status(names: string[], options: Options, ctx: Context): Promise< } } +type Verb = 'deploy' | 'undeploy' +type Unit = { module: UsableModule; files: ModuleFile[] } +type Scripts = Awaited> + +/** The files of each module a command works on; modules without any are left out. */ +function unitsOf(modules: readonly UsableModule[], strategy: Strategy): Unit[] { + return modules + .map(module => ({ module, files: module.files.filter(file => file.strategy === strategy) })) + .filter(unit => unit.files.length > 0) +} + +/** The settings that name the scripts a command runs, in the order they run. */ +function hooksOf(verb: Verb): readonly [Hook, Hook] { + return [`pre_${verb}`, `post_${verb}`] +} + +/** + * The scripts of the repository, when `--no-hooks` is not given and the + * modules to work on name some to run; `null` otherwise. + * + * A name that matches no script is a mistake in the repository, found here + * before anything is changed: the command fails, unless `--keep-going` is + * given (the script then fails when its turn comes). A script that only has + * versions for other systems is not a mistake: it is skipped in its turn. + * + * `named`: the modules were named on the command line. A named module whose + * script will not run, because it has no file of the kind the command works + * on, is said so; with every module selected, that is the usual case. + */ +async function loadHookScripts( + verb: Verb, + { modules, named: explicit }: { modules: readonly UsableModule[]; named: boolean }, + units: readonly Unit[], + options: Options, + ctx: Context, +): Promise { + if (!options.hooks) return null + + for (const module of explicit ? modules : []) { + if (units.some(unit => unit.module === module)) continue + for (const hook of hooksOf(verb)) { + if (module.hooks[hook] == null) continue + ctx.output.warn( + `${module.name}: ${describeHook(module, hook)} ${options.dryRun ? 'would not run' : 'was not run'}, ` + + `the module has no ${options.strategy} file.`, + ) + } + } + + const named = units.flatMap(({ module }) => + hooksOf(verb).flatMap(hook => (module.hooks[hook] == null ? [] : [{ module, hook }])), + ) + if (named.length === 0) return null + + let scripts: Scripts + try { + scripts = await loadScripts(ctx) + } catch (error) { + if (!(error instanceof CliError)) throw error + const message = messageOf(error) + throw new CliError( + `${message}${/[.!?]$/.test(message) ? '' : '.'} ` + + `Use --no-hooks to ${verb} without running the scripts the modules name.`, + { cause: error }, + ) + } + if (options.keepGoing) return scripts + + const missing = named.filter(({ module, hook }) => findHook(module, hook, scripts) === 'missing') + if (missing.length === 0) return scripts + for (const { module, hook } of missing) reportHookError(module, hookNotFound(module, hook), ctx) + throw new CliError( + `Nothing ${options.dryRun ? 'would be' : 'was'} ${verb}ed: ` + + `${plural(missing.length, 'script')} the modules name ${missing.length === 1 ? 'does' : 'do'} not exist.`, + ) +} + async function deploy(names: string[], options: Options, ctx: Context): Promise { const { output, prompts } = ctx const run = await prepare('deploy', await loadRepository(ctx), names, options, ctx) - if (run == null || run.files.length === 0) return - - const { files } = run + if (run == null) return + + const units = unitsOf(run.modules, options.strategy) + const scripts = await loadHookScripts( + 'deploy', + { modules: run.modules, named: !run.all }, + units, + options, + ctx, + ) + if (units.length === 0) return let failures = run.failures - const reportError = (file: ModuleFile, error: unknown) => { - failures++ - reportFileError(file, error, ctx) - } if (options.dryRun) { const context = await deployContext(ctx) + const failed = new FailedHooks('deploy') let wouldSkip = 0 - for (const file of files) { - try { - const decision = await planDeploy(file, { ...context, force: options.force }) - if (decision.action === 'conflict' && !prompts.interactive) wouldSkip++ - output.print( - `- ${file.target} (${describePlannedDeploy(file, decision, prompts.interactive)})`, - ) - } catch (error) { - reportError(file, error) + for (const { module, files } of units) { + // Without its pre_deploy script, the files of a module would not be deployed. + if (!planHook(module, 'pre_deploy', scripts, ctx)) { + failed.add('pre_deploy', module) + continue + } + + let complete = module.invalidEntries.length === 0 + for (const file of files) { + try { + const decision = await planDeploy(file, { ...context, force: options.force }) + if (decision.action === 'conflict' && !prompts.interactive) { + wouldSkip++ + complete = false + } + output.print( + `- ${file.target} (${describePlannedDeploy(file, decision, prompts.interactive)})`, + ) + } catch (error) { + failures++ + complete = false + reportFileError(file, error, ctx) + } + } + if (!planHook(module, 'post_deploy', scripts, ctx, { complete })) { + failed.add('post_deploy', module) } } - finish(failures, skippedProblems(wouldSkip, prompts.interactive), 'Dry run finished.', ctx) + const problems = [...skippedProblems(wouldSkip, prompts.interactive), ...failed.problems(true)] + finish(failures, problems, 'Dry run finished.', ctx) return } - await withLock(ctx.home, async () => { - const context = await deployContext(ctx) - await deployAll(files, options, context, ctx, failures) + let skipped = 0 + const outcome = await eachModule('deploy', units, scripts, options, ctx, async unit => { + const result = await withLock(ctx.home, async () => + deployFiles(unit.files, options, await deployContext(ctx), ctx), + ) + failures += result.failures + skipped += result.skipped + return result.failures === 0 && result.skipped === 0 && unit.module.invalidEntries.length === 0 }) + + const problems = [...skippedProblems(skipped, prompts.interactive), ...outcome.problems] + finish(failures, problems, 'Deployment finished.', ctx, outcome.exitCode) } -/** Deploys `files` while the lock is held, then reports the outcome. */ -async function deployAll( +/** Deploys the files of a module while the lock is held. */ +async function deployFiles( files: ModuleFile[], options: Options, context: DeployContext, ctx: Context, - initialFailures: number, -): Promise { +): Promise<{ failures: number; skipped: number }> { const { output, prompts } = ctx - let failures = initialFailures + let failures = 0 const reportError = (file: ModuleFile, error: unknown) => { failures++ reportFileError(file, error, ctx) @@ -278,7 +447,7 @@ async function deployAll( } } - // Asked once everything else is deployed, so an answer never blocks other files. + // Asked once the other files of the module are deployed, so an answer never blocks them. let skipped = 0 for (const file of conflicts) { const replace = @@ -307,7 +476,309 @@ async function deployAll( } } - finish(failures, skippedProblems(skipped, prompts.interactive), 'Deployment finished.', ctx) + return { failures, skipped } +} + +/** + * Deploys or undeploys modules one at a time: the `pre_` script of a module, + * its files (`work`, which takes the lock), its `post_` script, then the next + * module. Scripts run without the lock, as they may run configfile themselves. + * + * - A `pre_` script that fails leaves the files of its module untouched. + * - `work` returns whether every file of the module was handled: the `post_` + * script is not run otherwise. When it fails as a whole (the lock or the + * record cannot be used), the run ends there. + * - A script that fails ends the run, unless `--keep-going` is given. A signal + * received while a script runs always ends it, with the signal's exit code. + * + * Returns the problems to report, whether the run ended early, and the exit + * code to use when a signal ended it. + */ +async function eachModule( + verb: Verb, + units: readonly Unit[], + scripts: Scripts | null, + options: Options, + ctx: Context, + work: (unit: Unit) => Promise, +): Promise<{ problems: string[]; stopped: boolean; exitCode?: number }> { + const [pre, post] = hooksOf(verb) + const failed = new FailedHooks(verb) + /** + * Something was attempted already: a script was due to run (even one that + * is missing or could not be started), or the files of a module were handled. + */ + let started = false + /** The modules whose files were left untouched, and why. */ + const leftOut: { name: string; reason: string }[] = [] + let recorded = 0 + let hint = '' + let exitCode: number | undefined + const leaveOut = (from: number, to: number, reason: string) => { + for (const { module } of units.slice(from, to)) leftOut.push({ name: module.name, reason }) + } + /** Writes them to the history: called on every way out, each module once. */ + const recordLeftOut = () => { + for (const { name, reason } of leftOut.slice(recorded)) { + ctx.history.record({ kind: 'failed', module: name, reason: `not ${verb}ed: ${reason}` }) + } + recorded = leftOut.length + } + + /** Runs a script of the module at `index`. `stop`: the run ends there. */ + const runStep = async (hook: Hook, index: number): Promise<'ok' | 'failed' | 'stop'> => { + const { module } = units[index] as Unit + if (scripts == null || module.hooks[hook] == null) return 'ok' + + started = true + const result = await runHook(module, hook, scripts, options.strategy, ctx) + if (!result.ok) failed.add(hook, module) + // Before its files, the module itself is left out too. + const next = hook === pre ? index : index + 1 + + if (result.signal != null) { + // configfile was asked to stop while the script ran: --keep-going does not apply. + const reason = `interrupted (${result.signal}) during the ${hook} script of ${module.name}` + leaveOut(next, units.length, reason) + exitCode = 128 + (osConstants.signals[result.signal] ?? 0) + return 'stop' + } + if (result.ok) return 'ok' + + const reason = `the ${hook} script of ${module.name} failed` + if (options.keepGoing) { + leaveOut(next, index + 1, reason) + return 'failed' + } + leaveOut(next, units.length, reason) + hint = ' Use --keep-going to go on after a script that fails.' + return 'stop' + } + + let stopped = false + for (const [index, unit] of units.entries()) { + const before = await runStep(pre, index) + if (before === 'failed') continue + stopped = before === 'stop' + if (stopped) break + + let complete: boolean + try { + complete = await work(unit) + } catch (error) { + // A question cancelled with Ctrl+C ends the command as usual: only the + // history says what was left out (the files of this module may be done). + if (isPromptExit(error)) leaveOut(index + 1, units.length, 'cancelled') + // The lock is taken again for each module: when it (or the record) can + // no longer be, say what was left out. Before anything was done, the + // error says it all. + if (!(error instanceof CliError) || !started) { + recordLeftOut() + throw error + } + ctx.output.error(messageOf(error)) + leaveOut(index, units.length, messageOf(error)) + stopped = true + break + } + started = true + + if (!complete && scripts != null && unit.module.hooks[post] != null) { + const reason = hookNeedsFiles(verb) + ctx.output.warn( + `${unit.module.name}: ${describeHook(unit.module, post)} was not run, ${reason}.`, + ) + recordSkippedHook(unit.module, post, reason, ctx) + continue + } + stopped = complete && (await runStep(post, index)) === 'stop' + if (stopped) break + } + + const problems = failed.problems(false) + if (exitCode != null) problems.push('Interrupted.') + recordLeftOut() + if (leftOut.length > 0) { + problems.push( + `${plural(leftOut.length, 'module')} ${leftOut.length === 1 ? 'was' : 'were'} ` + + `not ${verb}ed: ${leftOut.map(({ name }) => name).join(', ')}.${hint}`, + ) + } + return { problems, stopped, ...(exitCode != null && { exitCode }) } +} + +/** The modules whose scripts failed, for the summary of a run or of a dry run. */ +class FailedHooks { + readonly #modules = new Map() + + constructor(verb: Verb) { + for (const hook of hooksOf(verb)) this.#modules.set(hook, []) + } + + add(hook: Hook, module: UsableModule): void { + this.#modules.get(hook)?.push(module.name) + } + + problems(dryRun: boolean): string[] { + return [...this.#modules] + .filter(([, modules]) => modules.length > 0) + .map( + ([hook, modules]) => + `The ${hook} script of ${modules.join(', ')} ${dryRun ? 'would fail' : 'failed'}.`, + ) + } +} + +/** A `post_` script only runs once every file of its module is handled. */ +function hookNeedsFiles(verb: Verb): string { + return verb === 'deploy' + ? 'some files of the module are not deployed' + : 'some files of the module could not be undeployed' +} + +function describeHook(module: UsableModule, hook: Hook): string { + return `${hook} script "${module.hooks[hook]}"` +} + +/** + * The script a setting of the module names. `other-system`: it only has + * versions for other systems, so there is nothing to run on this one. + */ +function findHook( + module: UsableModule, + hook: Hook, + { scripts, otherSystems }: Scripts, +): Script | 'other-system' | 'missing' { + const name = module.hooks[hook] + const script = scripts.find(candidate => candidate.name === name) + if (script != null) return script + return name != null && otherSystems.includes(name) ? 'other-system' : 'missing' +} + +/** A script that is not run on purpose: said in the history, without failing the run. */ +function recordSkippedHook(module: UsableModule, hook: Hook, reason: string, ctx: Context): void { + ctx.history.record({ + kind: 'script-skipped', + name: module.hooks[hook] ?? '', + hook, + module: module.name, + reason, + }) +} + +function noVersionFor(ctx: Context): string { + return `no version for ${systemName(ctx.platform)}` +} + +function hookNotFound(module: UsableModule, hook: Hook): string { + return ( + `${describeHook(module, hook)} not found. ` + + 'Run "configfile scripts list" to see available scripts.' + ) +} + +function reportHookError(module: UsableModule, reason: string, ctx: Context): void { + ctx.output.error(`${module.name}: ${reason}`) + ctx.history.record({ kind: 'failed', module: module.name, reason }) +} + +/** + * Dry runs: says whether a script of the module would run. Returns `false` + * when the script does not exist, which only happens with `--keep-going`: + * without it, `loadHookScripts` has already failed the command. + * `complete: false`: some files of the module would not be handled, so its + * `post_` script would not run. + */ +function planHook( + module: UsableModule, + hook: Hook, + scripts: Scripts | null, + ctx: Context, + { complete = true }: { complete?: boolean } = {}, +): boolean { + if (scripts == null || module.hooks[hook] == null) return true + + const describe = (plan: string) => + `- script "${module.hooks[hook]}" (${hook} of ${module.name}: ${plan})` + if (!complete) { + const verb = hook.endsWith('_undeploy') ? 'undeploy' : 'deploy' + ctx.output.print(describe(`would not run, ${hookNeedsFiles(verb)}`)) + return true + } + const script = findHook(module, hook, scripts) + if (script === 'missing') { + reportHookError(module, hookNotFound(module, hook), ctx) + return false + } + ctx.output.print( + describe(script === 'other-system' ? `would be skipped, ${noVersionFor(ctx)}` : 'would run'), + ) + return true +} + +/** + * Runs a script a module names (`pre_deploy`, `post_undeploy`…) the way + * `scripts run` runs it, with the hook, the module's name and the kind of + * files added to its environment. Unlike `scripts run`, configfile's messages + * stay on stdout and the exit code of the script is not the command's. + * + * Returns whether it succeeded, and the signal configfile received while it + * ran, if any (Ctrl+C, SIGTERM…): the script is left to end, then the run + * must stop. A script that only has versions for other systems is skipped, + * which is a success. + */ +async function runHook( + module: UsableModule, + hook: Hook, + scripts: Scripts, + strategy: Strategy, + ctx: Context, +): Promise<{ ok: boolean; signal?: NodeJS.Signals }> { + const script = findHook(module, hook, scripts) + if (script === 'missing') { + reportHookError(module, hookNotFound(module, hook), ctx) + return { ok: false } + } + if (script === 'other-system') { + const reason = noVersionFor(ctx) + ctx.output.info(`${module.name}: ${describeHook(module, hook)} has ${reason}, skipped.`) + recordSkippedHook(module, hook, reason, ctx) + return { ok: true } + } + + ctx.output.info(`Running "${script.name}", the ${hook} script of ${module.name}…`) + let code: number + let signal: NodeJS.Signals | undefined + try { + code = await runScript(script, [], { + cwd: ctx.cwd, + onSignal: received => { + signal ??= received + }, + env: { + ...scriptEnvironment(script, scripts.repository, ctx.platform), + CONFIGFILE_HOOK: hook, + CONFIGFILE_MODULE: module.name, + CONFIGFILE_DEPLOY: strategy, + }, + }) + } catch (error) { + reportHookError(module, messageOf(error), ctx) + return { ok: false } + } + + ctx.history.record({ + kind: 'script', + name: script.name, + file: script.path, + exitCode: code, + hook, + module: module.name, + }) + if (code !== 0) { + ctx.output.error(`${module.name}: ${describeHook(module, hook)} exited with code ${code}.`) + } + return { ok: code === 0, ...(signal != null && { signal }) } } async function undeploy(names: string[], options: Options, ctx: Context): Promise { @@ -321,36 +792,48 @@ async function undeploy(names: string[], options: Options, ctx: Context): Promis const repo = await loadRepository(ctx) const run = options.removed - ? { files: [], failures: 0, all: false } + ? { modules: [], failures: 0, all: false } : await prepare('undeploy', repo, names, options, ctx) // Undeploying every module also undeploys what the repository no longer deploys. const withRemoved = options.removed || options.all || run?.all === true if (run == null && !withRemoved) return - const files = run?.files ?? [] + const units = unitsOf(run?.modules ?? [], options.strategy) + const scripts = await loadHookScripts( + 'undeploy', + { modules: run?.modules ?? [], named: run != null && !run.all }, + units, + options, + ctx, + ) let failures = run?.failures ?? 0 - const undeployOne = async (file: UndeployableFile, context: DeployContext) => { + /** Returns whether the file was handled (removed, kept on purpose, or not deployed). */ + const undeployOne = async (file: UndeployableFile, context: DeployContext): Promise => { try { if (options.dryRun) { output.print( `- ${file.target} (${describePlannedUndeploy(await planUndeploy(file, context))})`, ) - return + return true } const result = await undeployFile(file, context) output.print(`- ${file.target} ${describeUndeploy(result)}`) recordUndeploy(file, result, ctx) + return true } catch (error) { failures++ reportFileError(file, error, ctx) + return false } } + const undeployFiles = async (files: readonly ModuleFile[], context: DeployContext) => { + let complete = true + for (const file of files) complete = (await undeployOne(file, context)) && complete + return complete + } - /** Returns the number of files worked on. */ - const undeployEach = async (context: DeployContext): Promise => { - for (const file of files) await undeployOne(file, context) - if (!withRemoved) return files.length - + /** The files the repository no longer deploys: no module is left to name a script for them. */ + const undeployRemoved = async (context: DeployContext): Promise => { const { removed, heldBack } = await removedFiles(context.record, repo, options.strategy, ctx) for (const { target, reason } of heldBack) { output.warn(`${target} was not checked: ${reason}.`) @@ -359,7 +842,7 @@ async function undeploy(names: string[], options: Options, ctx: Context): Promis if (options.removed && heldBack.length === 0) { output.info(`Every deployed ${options.strategy} file is still deployed by the repository.`) } - return files.length + return 0 } output.info( @@ -391,17 +874,53 @@ async function undeploy(names: string[], options: Options, ctx: Context): Promis reportFileError(file, error, ctx) } } - return files.length + removed.length + return removed.length } - const count = options.dryRun - ? await undeployEach(await deployContext(ctx)) - : await withLock(ctx.home, async () => undeployEach(await deployContext(ctx))) - if (count === 0) { - if (failures > 0) finish(failures, [], '', ctx) + let count = units.reduce((sum, unit) => sum + unit.files.length, 0) + if (options.dryRun) { + const context = await deployContext(ctx) + const failed = new FailedHooks('undeploy') + for (const { module, files } of units) { + // Without its pre_undeploy script, the files of a module would stay deployed. + if (!planHook(module, 'pre_undeploy', scripts, ctx)) { + failed.add('pre_undeploy', module) + continue + } + const complete = await undeployFiles(files, context) + if (!planHook(module, 'post_undeploy', scripts, ctx, { complete })) { + failed.add('post_undeploy', module) + } + } + if (withRemoved) count += await undeployRemoved(context) + const problems = failed.problems(true) + if (count > 0 || failures > 0 || problems.length > 0) { + finish(failures, problems, count > 0 ? 'Dry run finished.' : '', ctx) + } return } - finish(failures, [], options.dryRun ? 'Dry run finished.' : 'Undeployment finished.', ctx) + + const outcome = await eachModule('undeploy', units, scripts, options, ctx, unit => + withLock(ctx.home, async () => undeployFiles(unit.files, await deployContext(ctx))), + ) + const problems = outcome.problems + if (withRemoved) { + if (outcome.stopped) { + problems.push('The files the repository no longer deploys were not checked.') + } else { + try { + count += await withLock(ctx.home, async () => undeployRemoved(await deployContext(ctx))) + } catch (error) { + // After the modules: what they did, and what failed, is still reported. + if (!(error instanceof CliError) || (units.length === 0 && failures === 0)) throw error + problems.push( + `The files the repository no longer deploys were not checked: ${messageOf(error)}`, + ) + } + } + } + if (count === 0 && failures === 0 && problems.length === 0) return + finish(failures, problems, count > 0 ? 'Undeployment finished.' : '', ctx, outcome.exitCode) } /** Loads the record: call it after taking the lock when files are changed. */ @@ -414,24 +933,29 @@ async function deployContext(ctx: Context): Promise { /** * Selects the modules and files a deploy or undeploy works on, and reports - * modules and settings entries that are skipped (they count as failures). - * Returns `null` when there is nothing to do. + * modules and settings entries that are skipped (they count as failures, as + * do the settings that cannot name a script this command would run). + * + * Returns `null` when no module is selected. When the selected modules have + * no file of the kind the command works on, says so and still returns them: + * their scripts are reported as not run. */ async function prepare( - verb: 'deploy' | 'undeploy', + verb: Verb, { modules }: Repository, names: string[], options: Options, ctx: Context, ): Promise<{ - files: ModuleFile[] + /** The selected modules that can be used, in repository order. */ + modules: UsableModule[] failures: number /** Every module was selected (with --all, or at the question), even when there is none. */ all: boolean } | null> { const { output } = ctx const { selected, all } = await selectModules(verb, modules, names, options, ctx) - if (selected.length === 0) return all ? { files: [], failures: 0, all } : null + if (selected.length === 0) return all ? { modules: [], failures: 0, all } : null let failures = 0 const usable: UsableModule[] = [] @@ -448,7 +972,14 @@ async function prepare( for (const problem of module.invalidEntries) { ctx.history.record({ kind: 'failed', module: module.name, reason: problem }) } - reportSettings(module, ctx) + // Only the scripts this command would run. + for (const hook of hooksOf(verb)) { + const problem = module.hookProblems[hook] + if (problem == null) continue + failures++ + ctx.history.record({ kind: 'failed', module: module.name, reason: problem }) + } + reportSettings(module, ctx, verb) for (const source of module.undecided) { output.warn( `${module.name}: "${source}" was not ${verb}ed because no deployment strategy is defined. ` + @@ -468,7 +999,7 @@ async function prepare( `Nothing could be ${verb}ed. ${plural(failures, 'module or settings entry', 'modules or settings entries')} failed.`, ) output.info(`No ${options.strategy} file to ${verb} in ${moduleNames}.`) - return { files, failures, all } + return { modules: usable, failures, all } } const action = verb === 'deploy' ? 'Deploying' : 'Undeploying' @@ -477,7 +1008,7 @@ async function prepare( ? `Dry run, nothing is changed. ${action} ${moduleNames} would do:` : `${action} ${moduleNames}…`, ) - return { files, failures, all } + return { modules: usable, failures, all } } async function selectModules( @@ -539,12 +1070,23 @@ function pickModules(modules: Module[], names: string[]): Module[] { return modules.filter(module => names.includes(module.name)) } -/** Invalid entries are errors (the file is not deployed), deprecations are warnings. */ -function reportSettings(module: Module, ctx: Context): void { +/** + * Invalid entries (the file is not deployed) and settings that cannot name a + * script are errors, deprecations are warnings. With `verb`, the command + * only fails on the scripts it would run: the other settings are warnings. + */ +function reportSettings(module: Module, ctx: Context, verb?: Verb): void { if (module.error != null) return for (const problem of module.invalidEntries) { ctx.output.error(`${module.name}: ${problem}.`) } + for (const hook of HOOKS) { + const problem = module.hookProblems[hook] + if (problem == null) continue + if (verb == null || hooksOf(verb).includes(hook)) + ctx.output.error(`${module.name}: ${problem}.`) + else ctx.output.warn(`${module.name}: ${problem}.`) + } for (const deprecation of module.deprecations) { ctx.output.warn(`${module.name}: ${deprecation}.`) } @@ -556,14 +1098,20 @@ function skippedProblems(skipped: number, interactive: boolean): string[] { : [] } -function finish(failures: number, problems: string[], success: string, ctx: Context): void { +function finish( + failures: number, + problems: string[], + success: string, + ctx: Context, + exitCode?: number, +): void { if (failures > 0) { problems.push( `${plural(failures, 'file, module or settings entry', 'files, modules or settings entries')} failed.`, ) } if (problems.length > 0) { - throw new CliError(problems.join(' ')) + throw new CliError(problems.join(' '), exitCode == null ? {} : { exitCode }) } ctx.output.success(success) } diff --git a/src/commands/scripts.ts b/src/commands/scripts.ts index 34016b99..f1cd0f2a 100644 --- a/src/commands/scripts.ts +++ b/src/commands/scripts.ts @@ -1,11 +1,10 @@ import type { Command } from 'commander' -import { ConfigStore } from '../config.ts' import type { Context } from '../context.ts' import { CliError } from '../errors.ts' import { plural } from '../output.ts' import { runScript } from '../process.ts' -import { listScripts, type Script, systemName } from '../repository.ts' +import { loadScripts, scriptEnvironment } from '../repository.ts' export function registerScriptsCommand(program: Command, ctx: Context): void { const scripts = program @@ -28,17 +27,6 @@ export function registerScriptsCommand(program: Command, ctx: Context): void { .action((name: string, args: string[]) => run(name, args, ctx)) } -async function loadScripts(ctx: Context): Promise<{ repository: string; scripts: Script[] }> { - const config = await new ConfigStore(ctx.home, { - warn: message => ctx.output.warn(message), - }).read() - - const scripts = await listScripts(config.folderPath, config.scriptExtensions, ctx.platform, { - warn: message => ctx.output.warn(message), - }) - return { repository: config.folderPath, scripts } -} - async function list(ctx: Context): Promise { const { scripts } = await loadScripts(ctx) @@ -67,14 +55,7 @@ async function run(name: string, args: string[], ctx: Context): Promise { const output = ctx.output.toStderr() output.info(`Running "${name}"…`) - // Scripts run in the current folder, and a folder script is one level - // deeper: this gives them the repository's path, and the system whose - // versions run. Documented in docs/src/content/docs/reference/scripts.md. - const env = { - CONFIGFILE_REPO: repository, - CONFIGFILE_SCRIPT: script.name, - CONFIGFILE_OS: systemName(ctx.platform), - } + const env = scriptEnvironment(script, repository, ctx.platform) const code = await runScript(script, args, { cwd: ctx.cwd, env }) // The arguments are never recorded: they may contain secrets. ctx.history.record({ kind: 'script', name: script.name, file: script.path, exitCode: code }) diff --git a/src/history.ts b/src/history.ts index 5e61d205..98d4e977 100644 --- a/src/history.ts +++ b/src/history.ts @@ -10,6 +10,7 @@ import { CliError, isPromptExit } from './errors.ts' import { errnoCode, lstatOrNull, messageOf } from './fsutil.ts' import { redactUrl } from './output.ts' import { configfilePaths } from './paths.ts' +import { HOOKS, type Hook } from './repository.ts' /** At most this many changes are written per run; the rest are counted. */ const MAX_CHANGES = 1000 @@ -53,7 +54,10 @@ export type Change = | { kind: 'failed'; module: string; reason: string } | { kind: 'synced'; folder: string; upstream: string; from: string | null; to: string } | { kind: 'saved-patch'; file: string } - | { kind: 'script'; name: string; file: string; exitCode: number } + /** `hook` and `module`: the script ran as that setting (`pre_deploy`, `post_undeploy`…) of that module. */ + | { kind: 'script'; name: string; file: string; exitCode: number; hook?: Hook; module?: string } + /** A script a module names was not run, without this being a failure. */ + | { kind: 'script-skipped'; name: string; hook: Hook; module: string; reason: string } | { kind: 'cloned' | 'reused'; repository: string; folder: string } | { kind: 'configured'; file: string } @@ -135,7 +139,9 @@ export function describeInvocation(action: Command): Invocation { case 'modules undeploy': case 'modules status': options.modules = Array.isArray(args[0]) ? args[0] : [] - copy('local', 'all', 'force', 'dryRun', 'removed') + copy('local', 'all', 'force', 'dryRun', 'removed', 'keepGoing') + // On unless turned off with --no-hooks. + if (given.hooks === false) options.hooks = false break case 'scripts run': options.script = args[0] @@ -514,7 +520,16 @@ function isChange(value: unknown): value is Change { case 'configured': return typeof value.file === 'string' case 'script': - return areStrings(value.name, value.file) && Number.isInteger(value.exitCode) + return ( + areStrings(value.name, value.file) && + Number.isInteger(value.exitCode) && + (value.module === undefined || typeof value.module === 'string') && + (value.hook === undefined || HOOKS.includes(value.hook as Hook)) + ) + case 'script-skipped': + return ( + areStrings(value.name, value.module, value.reason) && HOOKS.includes(value.hook as Hook) + ) case 'cloned': case 'reused': return areStrings(value.repository, value.folder) diff --git a/src/lock.ts b/src/lock.ts index 290500bb..470b6568 100644 --- a/src/lock.ts +++ b/src/lock.ts @@ -3,7 +3,7 @@ import path from 'node:path' import { setTimeout as sleep } from 'node:timers/promises' import { CliError } from './errors.ts' -import { errnoCode } from './fsutil.ts' +import { errnoCode, messageOf } from './fsutil.ts' import { configfilePaths } from './paths.ts' const RETRY_DELAY_MS = 100 @@ -21,7 +21,11 @@ export async function withLock( { maxWaitMs = MAX_WAIT_MS }: { maxWaitMs?: number } = {}, ): Promise { const lock = path.join(configfilePaths(home).dir, 'lock') - await mkdir(path.dirname(lock), { recursive: true, mode: 0o700 }) + const unusable = (error: unknown) => + new CliError(`Cannot take the lock ${lock}: ${messageOf(error)}`, { cause: error }) + await mkdir(path.dirname(lock), { recursive: true, mode: 0o700 }).catch(error => { + throw unusable(error) + }) const started = Date.now() for (;;) { @@ -30,7 +34,7 @@ export async function withLock( await handle.writeFile(String(process.pid)) break } catch (error) { - if (errnoCode(error) !== 'EEXIST') throw error + if (errnoCode(error) !== 'EEXIST') throw unusable(error) } const content = await readFile(lock, 'utf8').catch(() => '') diff --git a/src/process.ts b/src/process.ts index 9c1dbff0..57428d4e 100644 --- a/src/process.ts +++ b/src/process.ts @@ -17,20 +17,23 @@ import type { Script } from './repository.ts' * code is reported. (Nothing can be done if configfile is killed with SIGKILL.) * * `env` is merged over configfile's own environment, which the child inherits: - * its values replace variables of the same name. + * its values replace variables of the same name. `onSignal` is told about each + * of these signals configfile receives meanwhile, for callers that have more + * to do once the child ends. */ export function run( command: string, args: string[], - { cwd, env }: { cwd: string; env?: Readonly> | undefined }, + { cwd, env, onSignal }: RunOptions, ): Promise { return new Promise((resolve, reject) => { // Installed before the child starts: a signal arriving in between would // otherwise end configfile and leave the script running on its own. let child: ChildProcess | undefined let pending: NodeJS.Signals | undefined - const ignore = () => {} + const ignore = (signal: NodeJS.Signals) => onSignal?.(signal) const forward = (signal: NodeJS.Signals) => { + onSignal?.(signal) if (child == null) pending = signal else child.kill(signal) } @@ -75,6 +78,12 @@ export function run( }) } +interface RunOptions { + cwd: string + env?: Readonly> | undefined + onSignal?: ((signal: NodeJS.Signals) => void) | undefined +} + /** Used for scripts that have no shebang line. */ const INTERPRETERS: Record = { '.js': process.execPath, @@ -95,14 +104,14 @@ const INTERPRETERS: Record = { export async function runScript( script: Script, args: string[], - { cwd, env }: { cwd: string; env?: Readonly> | undefined }, + { cwd, env, onSignal }: RunOptions, ): Promise { const executable = await isExecutable(script.path) const shebang = await readShebang(script) const launch = async (command: string, commandArgs: string[]) => { try { - return await run(command, commandArgs, { cwd, env }) + return await run(command, commandArgs, { cwd, env, onSignal }) } catch (error) { throw launchError(script, shebang?.[0], error) } diff --git a/src/repository.ts b/src/repository.ts index 3116fc0d..7ff2407a 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -55,6 +55,10 @@ export type Module = ModuleBase & readonly invalidEntries: readonly string[] /** Deprecated settings used by the module. */ readonly deprecations: readonly string[] + /** The names of the scripts run before and after the module is deployed or undeployed. */ + readonly hooks: Readonly>> + /** Why some of these settings cannot be used (not a string, or empty). */ + readonly hookProblems: Readonly>> } | { /** Why settings.json could not be used. Such a module has no files. */ @@ -62,6 +66,10 @@ export type Module = ModuleBase & } ) +/** The settings that name a script run when the module is deployed or undeployed. */ +export const HOOKS = ['pre_deploy', 'post_deploy', 'pre_undeploy', 'post_undeploy'] as const +export type Hook = (typeof HOOKS)[number] + export interface Script { readonly name: string /** Path relative to the `scripts/` folder. */ @@ -86,6 +94,36 @@ export async function loadRepository( return { repository: folderPath, modules } } +/** The scripts, and the folder of the repository they come from. */ +export async function loadScripts( + ctx: Context, +): Promise<{ repository: string; scripts: Script[]; otherSystems: string[] }> { + const warn = (message: string) => ctx.output.warn(message) + const config = await new ConfigStore(ctx.home, { warn }).read() + const listed = await listScripts(config.folderPath, config.scriptExtensions, ctx.platform, { + warn, + }) + return { repository: config.folderPath, ...listed } +} + +/** + * The variables every script gets. Scripts run in the current folder, and a + * folder script is one level deeper: this gives them the repository's path, + * and the system whose versions run. Documented in + * docs/src/content/docs/reference/scripts.md. + */ +export function scriptEnvironment( + script: Script, + repository: string, + platform: NodeJS.Platform, +): Record { + return { + CONFIGFILE_REPO: repository, + CONFIGFILE_SCRIPT: script.name, + CONFIGFILE_OS: systemName(platform), + } +} + /** * Reads the modules of a dotfiles repository: every folder of `files/` * (symlinks to folders included) that contains a `settings.json`. @@ -257,7 +295,18 @@ async function readModuleFiles( ) } - return { error: null, files, undecided, invalidEntries, deprecations } + // The 0.3 list format has no place for it. + const hooks: Partial> = {} + const hookProblems: Partial> = {} + for (const hook of legacyList ? [] : HOOKS) { + const name = (settings as Record)[hook] + if (name === undefined) continue + if (typeof name === 'string' && name.trim() !== '') hooks[hook] = name.trim() + else + hookProblems[hook] = `"${hook}" is ignored: it must be the name of a script of the repository` + } + + return { error: null, files, undecided, invalidEntries, deprecations, hooks, hookProblems } } /** @@ -309,17 +358,21 @@ export function unsafeTarget( * `setup` script. A second part naming a system (`setup.macos.sh`, * `setup.linux/`) makes it that system's version: used instead of `setup.sh` * on that system, and ignored on the others. + * + * `otherSystems` names the scripts that only have versions for other systems: + * they are not scripts here, but their name is not a mistake either. */ export async function listScripts( folderPath: string, extensions: readonly string[] | null, platform: NodeJS.Platform, env: Pick, -): Promise { +): Promise<{ scripts: Script[]; otherSystems: string[] }> { const scriptsDir = path.join(folderPath, 'scripts') const scripts: Script[] = [] /** Names of the scripts that are this system's version. */ const forSystem = new Set() + const elsewhere = new Set() const allowed = (name: string) => extensions == null || extensions.includes(path.extname(name)) for (const entry of await readDirOrFail(scriptsDir)) { @@ -338,8 +391,11 @@ export async function listScripts( const [baseName = '', tag] = entry.name.split('.') const system = tag == null ? undefined : SCRIPT_SYSTEMS.get(tag) - if (system != null && system !== platform) continue const name = slugify(baseName) + if (system != null && system !== platform) { + elsewhere.add(name) + continue + } const script = { name, file, path: path.join(scriptsDir, file) } // This system's version replaces the generic one, whichever comes first. @@ -357,7 +413,8 @@ export async function listScripts( if (system != null) forSystem.add(name) } - return scripts + const otherSystems = [...elsewhere].filter(name => !scripts.some(script => script.name === name)) + return { scripts, otherSystems } } /** The name of `platform` in script names (`macos`, `linux`), or the platform itself. */ diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 4222ac8f..08d6e445 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -2619,6 +2619,895 @@ describe('history', () => { }) }) +describe('scripts run when a module is deployed or undeployed', () => { + /** + * Modules `a` and `b`, one global and one local file each. `hooks` gives + * them a `post_deploy`, `before` a `pre_deploy`, and `others` any setting. + */ + async function withHooks( + sandbox: Sandbox, + hooks: Record = {}, + before: Record = {}, + others: Record> = {}, + ) { + await sandbox.configure() + for (const name of ['a', 'b']) { + await sandbox.write(`home/dotfiles/files/${name}/rc`, name) + await sandbox.write( + `home/dotfiles/files/${name}/settings.json`, + JSON.stringify({ + files: [ + { source_path: 'rc', target_path: `~/.${name}rc`, deploy: 'global' }, + { source_path: 'rc', target_path: `${name}rc`, deploy: 'local' }, + ], + ...(name in hooks && { post_deploy: hooks[name] }), + ...(name in before && { pre_deploy: before[name] }), + ...others[name], + }), + ) + } + } + + /** A script that adds a line to `/log`, then exits with `code`. */ + const logging = (sandbox: Sandbox, line: string, code = 0) => + `printf '%s\\n' "${line}" >> "${sandbox.root}/log"\nexit ${code}\n` + const logOf = (sandbox: Sandbox) => + readFile(path.join(sandbox.root, 'log'), 'utf8').catch(() => '') + + it('runs the script of a module once its files are deployed, on every deploy', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + // The link is there, and the lock is released: the script may run configfile. + await sandbox.write( + 'home/dotfiles/scripts/plugins.sh', + `test -L "$HOME_DIR/.arc" && test ! -e "$HOME_DIR/.configfile/lock" || exit 9\n${logging( + sandbox, + '$CONFIGFILE_SCRIPT $CONFIGFILE_MODULE $CONFIGFILE_DEPLOY $CONFIGFILE_OS', + )}`, + ) + vi.stubEnv('HOME_DIR', sandbox.home) + + try { + const first = await runCli(sandbox, ['modules', 'deploy', '--all']) + const second = await runCli(sandbox, ['modules', 'deploy', 'a']) + + expect(first.code, first.stderr).toBe(0) + expect(first.stdout).toContain('Running "plugins", the post_deploy script of a…') + expect(first.stdout).toContain('Deployment finished.') + expect(second.code).toBe(0) + expect(await logOf(sandbox)).toBe('plugins a global linux\nplugins a global linux\n') + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + } finally { + vi.unstubAllEnvs() + } + }) + + it('runs the pre_deploy script before the files, and the post_deploy script after', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'step' }, { a: 'step' }) + const link = path.join(sandbox.home, '.arc') + const lock = path.join(sandbox.home, '.configfile/lock') + await sandbox.write( + 'home/dotfiles/scripts/step.sh', + `test -e "${lock}" && exit 9\nif test -L "${link}"; then files=deployed; else files=missing; fi\n` + + logging(sandbox, '$CONFIGFILE_HOOK $CONFIGFILE_MODULE $CONFIGFILE_DEPLOY $files'), + ) + + const planned = await runCli(sandbox, ['modules', 'deploy', 'a', '--dry-run']) + const result = await runCli(sandbox, ['modules', 'deploy', 'a']) + + expect(planned.stdout).toMatch( + /- script "step" \(pre_deploy of a: would run\)\n- .*\.arc \(would be linked\)\n- script "step" \(post_deploy of a: would run\)/, + ) + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain('Running "step", the pre_deploy script of a…') + expect(await logOf(sandbox)).toBe( + 'pre_deploy a global missing\npost_deploy a global deployed\n', + ) + const [line] = await readHistory(sandbox) + expect(line?.changes).toMatchObject([ + { kind: 'script', hook: 'pre_deploy', module: 'a', exitCode: 0 }, + { kind: 'deployed' }, + { kind: 'script', hook: 'post_deploy', module: 'a', exitCode: 0 }, + ]) + const history = await runCli(sandbox, ['history']) + expect(history.stdout).toMatch(/script\s+step {2}exit 0 {2}\(pre_deploy of a\)/) + }) + + it('does not deploy a module whose pre_deploy script fails, nor the modules after it', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'after' }, { a: 'check' }) + await sandbox.write('home/dotfiles/scripts/check.sh', logging(sandbox, 'check', 2)) + await sandbox.write('home/dotfiles/scripts/after.sh', logging(sandbox, 'after')) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('a: pre_deploy script "check" exited with code 2.') + expect(result.stderr).toContain( + 'The pre_deploy script of a failed. 2 modules were not deployed: a, b. Use --keep-going', + ) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + expect(await logOf(sandbox)).toBe('check\n') + + const kept = await runCli(sandbox, ['modules', 'deploy', '--all', '--keep-going']) + + expect(kept.code).toBe(1) + expect(kept.stderr).toContain('1 module was not deployed: a.') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + // The post_deploy script of a module that was not deployed is not run. + expect(await logOf(sandbox)).toBe('check\ncheck\n') + }) + + it('fails before changing anything when a script does not exist', async () => { + const sandbox = await createSandbox() + // "b" comes last: without the check, "a" would be deployed first. + await withHooks(sandbox, { b: 'scripts/plugins' }, { b: 'missing' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, 'ran')) + + const planned = await runCli(sandbox, ['modules', 'deploy', '--all', '--dry-run']) + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + for (const run of [planned, result]) { + expect(run.code).toBe(1) + expect(run.stderr).toContain('b: pre_deploy script "missing" not found.') + // The name of a script, not its path. + expect(run.stderr).toContain( + 'b: post_deploy script "scripts/plugins" not found. Run "configfile scripts list"', + ) + expect(run.stdout).not.toContain('.arc') + } + expect(planned.stderr).toContain( + 'Nothing would be deployed: 2 scripts the modules name do not exist.', + ) + expect(result.stderr).toContain( + 'Nothing was deployed: 2 scripts the modules name do not exist.', + ) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + const [line] = await readHistory(sandbox) + expect(line?.changes).toMatchObject([ + { kind: 'failed', module: 'b', reason: expect.stringContaining('pre_deploy') }, + { kind: 'failed', module: 'b', reason: expect.stringContaining('post_deploy') }, + ]) + + const skipped = await runCli(sandbox, ['modules', 'deploy', '--all', '--no-hooks']) + + expect(skipped.code, skipped.stderr).toBe(0) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + expect(await logOf(sandbox)).toBe('') + }) + it("runs this system's version of the script", async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, 'generic')) + await sandbox.write('home/dotfiles/scripts/plugins.macos.sh', logging(sandbox, 'macos')) + + const result = await runCli(sandbox, ['modules', 'deploy', 'a'], [], { platform: 'darwin' }) + + expect(result.code).toBe(0) + expect(await logOf(sandbox)).toBe('macos\n') + }) + + it('stops at the first script that fails, leaving the next modules undeployed', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'broken', b: 'fine' }) + await sandbox.write('home/dotfiles/scripts/broken.sh', logging(sandbox, 'broken', 3)) + await sandbox.write('home/dotfiles/scripts/fine.sh', logging(sandbox, 'fine')) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('a: post_deploy script "broken" exited with code 3.') + expect(result.stderr).toContain( + 'The post_deploy script of a failed. 1 module was not deployed: b. ' + + 'Use --keep-going to go on after a script that fails.', + ) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + expect(await logOf(sandbox)).toBe('broken\n') + + const [line] = await readHistory(sandbox) + expect(line).toMatchObject({ + exitCode: 1, + changes: [ + { kind: 'deployed', target: path.join(sandbox.home, '.arc') }, + { kind: 'script', name: 'broken', exitCode: 3, hook: 'post_deploy', module: 'a' }, + { kind: 'failed', module: 'b' }, + ], + }) + }) + + it('deploys the next modules anyway with --keep-going, and still fails', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'broken', b: 'fine' }) + await sandbox.write('home/dotfiles/scripts/broken.sh', logging(sandbox, 'broken', 3)) + await sandbox.write('home/dotfiles/scripts/fine.sh', logging(sandbox, 'fine')) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all', '--keep-going']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('The post_deploy script of a failed.') + expect(result.stderr).not.toContain('not deployed') + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + expect(await logOf(sandbox)).toBe('broken\nfine\n') + }) + + it('runs no script with --no-hooks', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, 'ran')) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all', '--no-hooks']) + + expect(result.code, result.stderr).toBe(0) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + expect(await logOf(sandbox)).toBe('') + const [line] = await readHistory(sandbox) + expect(line?.options).toMatchObject({ hooks: false }) + const history = await runCli(sandbox, ['history']) + expect(history.stdout).toContain('modules deploy --all --no-hooks ok') + }) + it('with --keep-going, a script that does not exist only fails when its turn comes', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { b: 'fine' }, { a: 'missing' }) + await sandbox.write('home/dotfiles/scripts/fine.sh', logging(sandbox, 'fine')) + + const planned = await runCli(sandbox, [ + 'modules', + 'deploy', + '--all', + '--keep-going', + '--dry-run', + ]) + const result = await runCli(sandbox, ['modules', 'deploy', '--all', '--keep-going']) + + // The files of "a" are left out, as its pre_deploy script cannot run. + expect(planned.code).toBe(1) + expect(planned.stderr).toContain('a: pre_deploy script "missing" not found.') + expect(planned.stderr).toContain('The pre_deploy script of a would fail.') + expect(planned.stdout).not.toContain('.arc') + expect(planned.stdout).toContain('.brc (would be linked)') + expect(planned.stdout).toContain('- script "fine" (post_deploy of b: would run)') + expect(result.code).toBe(1) + expect(result.stderr).toContain( + 'The pre_deploy script of a failed. 1 module was not deployed: a.', + ) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + expect(await logOf(sandbox)).toBe('fine\n') + }) + it('reports a script that cannot be started', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins', 'echo no shebang\n', 0o644) + + const result = await runCli(sandbox, ['modules', 'deploy', 'a']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('a: Script "plugins" has no shebang line') + expect(result.stderr).toContain('The post_deploy script of a failed.') + }) + + it('does not run the script of a module whose files are not all deployed', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins', b: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, '$CONFIGFILE_MODULE')) + await sandbox.write('cwd/arc', 'mine') + + const result = await runCli(sandbox, ['modules', 'deploy', '--local', '--all'], [], { + interactive: false, + }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + 'a: post_deploy script "plugins" was not run, some files of the module are not deployed.', + ) + // The other modules are not held back: no script failed. + expect(await logOf(sandbox)).toBe('b\n') + }) + + it('does not run the script of a module that has an invalid entry or a file that fails', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { b: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, '$CONFIGFILE_MODULE')) + const settings = (files: unknown[]) => + JSON.stringify({ + files: [{ source_path: 'rc', target_path: '~/.arc', deploy: 'global' }, ...files], + post_deploy: 'plugins', + }) + const moduleA = 'home/dotfiles/files/a/settings.json' + + await sandbox.write(moduleA, settings([{ source_path: 'rc', deploy: 'global' }])) + const invalid = await runCli(sandbox, ['modules', 'deploy', '--all']) + const planned = await runCli(sandbox, ['modules', 'deploy', 'a', '--dry-run']) + await sandbox.write( + moduleA, + settings([{ source_path: 'gone', target_path: '~/.gone', deploy: 'global' }]), + ) + const failed = await runCli(sandbox, ['modules', 'deploy', 'a']) + + for (const result of [invalid, failed]) { + expect(result.code).toBe(1) + expect(result.stderr).toContain('a: post_deploy script "plugins" was not run') + } + expect(planned.stdout).toContain('(post_deploy of a: would not run,') + expect(await logOf(sandbox)).toBe('b\n') + }) + + it('runs the script when the user agrees to replace a file, not when they refuse', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write( + 'home/dotfiles/scripts/plugins.sh', + logging(sandbox, '$CONFIGFILE_DEPLOY $CONFIGFILE_REPO $PWD'), + ) + await sandbox.write('cwd/arc', 'mine') + + const refused = await runCli(sandbox, ['modules', 'deploy', '--local', 'a'], [false]) + expect(refused.code).toBe(0) + expect(refused.stderr).toContain('a: post_deploy script "plugins" was not run') + expect(await logOf(sandbox)).toBe('') + // The run succeeded: the script that was not run is not a failure. + const [line] = await readHistory(sandbox) + expect(line?.changes).toMatchObject([ + { kind: 'skipped' }, + { kind: 'script-skipped', name: 'plugins', hook: 'post_deploy', module: 'a' }, + ]) + const history = await runCli(sandbox, ['history']) + expect(history.stdout).toMatch(/skipped\s+plugins {2}\(post_deploy of a: some files/) + + const agreed = await runCli(sandbox, ['modules', 'deploy', '--local', 'a'], [true]) + expect(agreed.code, agreed.stderr).toBe(0) + expect(await logOf(sandbox)).toBe(`local ${sandbox.repo} ${sandbox.cwd}\n`) + }) + + it('with --keep-going, goes on after a post_deploy script that does not exist', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'missing', b: 'fine' }) + await sandbox.write('home/dotfiles/scripts/fine.sh', logging(sandbox, 'fine')) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all', '--keep-going']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('The post_deploy script of a failed.') + expect(result.stderr).not.toContain('not deployed') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + expect(await logOf(sandbox)).toBe('fine\n') + const [line] = await readHistory(sandbox) + expect(line?.changes).toMatchObject([ + { kind: 'deployed' }, + { kind: 'failed', module: 'a', reason: expect.stringContaining('not found') }, + { kind: 'deployed' }, + { kind: 'script', module: 'b' }, + ]) + }) + it('says which modules were left out when the next one cannot be deployed', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'breaks' }) + // The record is read again, under the lock, for each module. + await sandbox.write( + 'home/dotfiles/scripts/breaks.sh', + `echo broken > "${sandbox.home}/.configfile/state.json"\n`, + ) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('state.json') + expect(result.stderr).toContain('1 module was not deployed: b.') + expect(result.stderr).not.toContain('--keep-going') + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + const [line] = await readHistory(sandbox) + expect(line?.changes).toMatchObject([ + { kind: 'deployed' }, + { kind: 'script', module: 'a', exitCode: 0 }, + { kind: 'failed', module: 'b' }, + ]) + }) + + it('only runs the scripts of the modules that have files to deploy', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, 'ran')) + await sandbox.write( + 'home/dotfiles/files/a/settings.json', + JSON.stringify({ + files: [{ source_path: 'rc', target_path: '~/.arc', deploy: 'global' }], + post_deploy: 'plugins', + }), + ) + + // With every module, a module without local files is the usual case: nothing is said. + const all = await runCli(sandbox, ['modules', 'deploy', '--local', '--all']) + const planned = await runCli(sandbox, ['modules', 'deploy', '--local', 'a', '--dry-run']) + const named = await runCli(sandbox, ['modules', 'deploy', '--local', 'a']) + + expect(all.code, all.stderr).toBe(0) + expect(all.stderr).not.toContain('post_deploy') + expect(planned.stderr).toContain( + 'a: post_deploy script "plugins" would not run, the module has no local file.', + ) + expect(named.code, named.stderr).toBe(0) + expect(named.stderr).toContain( + 'a: post_deploy script "plugins" was not run, the module has no local file.', + ) + expect(await logOf(sandbox)).toBe('') + }) + it('shows the scripts in a dry run, without running them', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, 'ran')) + + const result = await runCli(sandbox, ['modules', 'deploy', '--all', '--dry-run']) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain('- script "plugins" (post_deploy of a: would run)') + expect(await logOf(sandbox)).toBe('') + + const quiet = await runCli(sandbox, ['modules', 'deploy', 'a', '--dry-run', '--no-hooks']) + expect(quiet.code).toBe(0) + expect(quiet.stdout).not.toContain('post_deploy') + }) + it('says in a dry run when a script would not run', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, 'ran')) + await sandbox.write('cwd/arc', 'mine') + + const result = await runCli(sandbox, ['modules', 'deploy', '--local', 'a', '--dry-run'], [], { + interactive: false, + }) + + expect(result.code).toBe(1) + expect(result.stdout).toContain( + '- script "plugins" (post_deploy of a: would not run, some files of the module are not deployed)', + ) + }) + + it('refuses a "post_deploy" that is not a script name, and deploys the files', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: ['plugins'] }) + + const result = await runCli(sandbox, ['modules', 'deploy', 'a']) + const listed = await runCli(sandbox, ['modules', 'list']) + const undeployed = await runCli(sandbox, ['modules', 'undeploy', 'a']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + 'a: "post_deploy" is ignored: it must be the name of a script of the repository.', + ) + expect(result.stdout).toContain(`${path.join(sandbox.home, '.arc')} (deployed)`) + expect(listed.stderr).toContain('"post_deploy" is ignored') + // Undeploying does not need it. + expect(undeployed.code).toBe(0) + }) + + it('runs pre_undeploy before the files are removed, and post_undeploy after', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { pre_undeploy: 'step', post_undeploy: 'step' } }) + const link = path.join(sandbox.home, '.arc') + const lock = path.join(sandbox.home, '.configfile/lock') + await sandbox.write( + 'home/dotfiles/scripts/step.sh', + `test -e "${lock}" && exit 9\nif test -L "${link}"; then files=deployed; else files=removed; fi\n` + + logging(sandbox, '$CONFIGFILE_HOOK $CONFIGFILE_MODULE $CONFIGFILE_DEPLOY $files'), + ) + await runCli(sandbox, ['modules', 'deploy', '--all']) + expect(await logOf(sandbox)).toBe('') + + const planned = await runCli(sandbox, ['modules', 'undeploy', 'a', '--dry-run']) + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(planned.stdout).toMatch( + /- script "step" \(pre_undeploy of a: would run\)\n- .*\.arc \(would be removed\)\n- script "step" \(post_undeploy of a: would run\)/, + ) + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain('Running "step", the pre_undeploy script of a…') + expect(result.stdout).toContain('Undeployment finished.') + expect(await logOf(sandbox)).toBe( + 'pre_undeploy a global deployed\npost_undeploy a global removed\n', + ) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + const history = await readHistory(sandbox) + expect(history.at(-1)?.changes).toMatchObject([ + { kind: 'script', hook: 'pre_undeploy', module: 'a', exitCode: 0 }, + { kind: 'removed', target: link }, + { kind: 'script', hook: 'post_undeploy', module: 'a', exitCode: 0 }, + { kind: 'removed' }, + ]) + }) + + it('leaves a module deployed when its pre_undeploy script fails, and the modules after it', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { pre_undeploy: 'stop', post_undeploy: 'clean' } }) + await sandbox.write('home/dotfiles/scripts/stop.sh', logging(sandbox, 'stop', 4)) + await sandbox.write('home/dotfiles/scripts/clean.sh', logging(sandbox, 'clean')) + await runCli(sandbox, ['modules', 'deploy', '--all']) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('a: pre_undeploy script "stop" exited with code 4.') + expect(result.stderr).toContain( + 'The pre_undeploy script of a failed. 2 modules were not undeployed: a, b. Use --keep-going', + ) + // --all also covers them, but the run stopped before. + expect(result.stderr).toContain('The files the repository no longer deploys were not checked.') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + + const kept = await runCli(sandbox, ['modules', 'undeploy', '--all', '--keep-going']) + + expect(kept.code).toBe(1) + expect(kept.stderr).toContain('1 module was not undeployed: a.') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + expect(await logOf(sandbox)).toBe('stop\nstop\n') + + const skipped = await runCli(sandbox, ['modules', 'undeploy', 'a', '--no-hooks']) + + expect(skipped.code, skipped.stderr).toBe(0) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + }) + + it('stops after a post_undeploy script that fails, unless --keep-going is given', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { post_undeploy: 'clean' } }) + const link = path.join(sandbox.home, '.arc') + // It runs once the link is gone. + await sandbox.write( + 'home/dotfiles/scripts/clean.sh', + `test -e "${link}" && exit 9\n${logging(sandbox, 'clean', 3)}`, + ) + await runCli(sandbox, ['modules', 'deploy', '--all']) + + const result = await runCli(sandbox, ['modules', 'undeploy', 'a', 'b']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('a: post_undeploy script "clean" exited with code 3.') + expect(result.stderr).toContain( + 'The post_undeploy script of a failed. 1 module was not undeployed: b.', + ) + expect(existsSync(link)).toBe(false) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + + await runCli(sandbox, ['modules', 'deploy', 'a', '--no-hooks']) + const kept = await runCli(sandbox, ['modules', 'undeploy', 'a', 'b', '--keep-going']) + + expect(kept.code).toBe(1) + expect(kept.stderr).not.toContain('not undeployed') + expect(existsSync(link)).toBe(false) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + }) + + it('fails before undeploying anything when a script does not exist', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { b: { pre_undeploy: 'missing' } }) + await runCli(sandbox, ['modules', 'deploy', '--all']) + + const planned = await runCli(sandbox, ['modules', 'undeploy', '--all', '--dry-run']) + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + for (const run of [planned, result]) { + expect(run.code).toBe(1) + expect(run.stderr).toContain('b: pre_undeploy script "missing" not found.') + expect(run.stdout).not.toContain('.arc') + } + expect(result.stderr).toContain('Nothing was undeployed: 1 script the modules name does not') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + + const kept = await runCli(sandbox, [ + 'modules', + 'undeploy', + '--all', + '--keep-going', + '--dry-run', + ]) + + expect(kept.code).toBe(1) + expect(kept.stdout).toContain('.arc (would be removed)') + expect(kept.stdout).not.toContain('.brc') + }) + + // root removes files from a folder whatever its permissions. + it.skipIf(process.getuid?.() === 0)( + 'does not run post_undeploy when a file of the module cannot be undeployed', + async () => { + const sandbox = await createSandbox() + await withHooks( + sandbox, + {}, + {}, + { a: { post_undeploy: 'clean' }, b: { post_undeploy: 'clean' } }, + ) + await sandbox.write('home/dotfiles/scripts/clean.sh', logging(sandbox, '$CONFIGFILE_MODULE')) + await sandbox.write( + 'home/dotfiles/files/a/settings.json', + JSON.stringify({ + files: [{ source_path: 'rc', target_path: '~/locked/.arc', deploy: 'global' }], + post_undeploy: 'clean', + }), + ) + await runCli(sandbox, ['modules', 'deploy', '--all']) + const locked = path.join(sandbox.home, 'locked') + await chmod(locked, 0o555) + + try { + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + 'a: post_undeploy script "clean" was not run, some files of the module could not be undeployed.', + ) + // The other modules are not held back: no script failed. + expect(await logOf(sandbox)).toBe('b\n') + const history = await readHistory(sandbox) + expect(history.at(-1)?.changes).toContainEqual({ + kind: 'script-skipped', + name: 'clean', + hook: 'post_undeploy', + module: 'a', + reason: 'some files of the module could not be undeployed', + }) + } finally { + await chmod(locked, 0o755) + } + }, + ) + + it('undeploys the files the repository no longer deploys only when the run was not stopped', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { pre_undeploy: 'stop' } }) + await sandbox.write('home/dotfiles/scripts/stop.sh', 'exit 4\n') + await runCli(sandbox, ['modules', 'deploy', '--all']) + // The entry of "b" leaves the repository: its link is one of these files. + await sandbox.write('home/dotfiles/files/b/settings.json', JSON.stringify({ files: [] })) + const removed = path.join(sandbox.home, '.brc') + + const stopped = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(stopped.code).toBe(1) + expect(stopped.stderr).toContain('The files the repository no longer deploys were not checked.') + expect(existsSync(removed)).toBe(true) + + const kept = await runCli(sandbox, ['modules', 'undeploy', '--all', '--keep-going']) + + expect(kept.code).toBe(1) + expect(kept.stderr).not.toContain('were not checked') + expect(existsSync(removed)).toBe(false) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + }) + + it('says which modules were left out when the next one cannot be undeployed', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { pre_undeploy: 'breaks', post_undeploy: 'clean' } }) + await sandbox.write( + 'home/dotfiles/scripts/breaks.sh', + `echo broken > "${sandbox.home}/.configfile/state.json"\n`, + ) + await sandbox.write('home/dotfiles/scripts/clean.sh', logging(sandbox, 'clean')) + await runCli(sandbox, ['modules', 'deploy', '--all']) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('2 modules were not undeployed: a, b.') + expect(result.stderr).toContain('The files the repository no longer deploys were not checked.') + expect(result.stderr).not.toContain('--keep-going') + expect(await logOf(sandbox)).toBe('') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + }) + + it('runs the undeploy scripts of the modules that have files of the kind, deployed or not', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { pre_undeploy: 'clean', post_undeploy: 'clean' } }) + await sandbox.write('home/dotfiles/scripts/clean.sh', logging(sandbox, '$CONFIGFILE_HOOK')) + await sandbox.write( + 'home/dotfiles/files/a/settings.json', + JSON.stringify({ + files: [{ source_path: 'rc', target_path: '~/.arc', deploy: 'global' }], + pre_undeploy: 'clean', + post_undeploy: 'clean', + }), + ) + + const local = await runCli(sandbox, ['modules', 'undeploy', '--local', 'a']) + + expect(local.code, local.stderr).toBe(0) + expect(local.stderr).toContain( + 'a: pre_undeploy script "clean" was not run, the module has no local file.', + ) + expect(await logOf(sandbox)).toBe('') + + // Never deployed: "not deployed" is a file handled. + const global = await runCli(sandbox, ['modules', 'undeploy', 'a']) + + expect(global.code, global.stderr).toBe(0) + expect(global.stdout).toContain('(not deployed)') + expect(await logOf(sandbox)).toBe('pre_undeploy\npost_undeploy\n') + }) + it('runs post_undeploy when a file is kept on purpose', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { post_undeploy: 'clean' } }) + await sandbox.write('home/dotfiles/scripts/clean.sh', logging(sandbox, 'clean')) + // Not deployed by configfile: undeploy leaves it where it is. + await sandbox.write('cwd/arc', 'mine') + + const result = await runCli(sandbox, ['modules', 'undeploy', '--local', 'a']) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain('(kept:') + expect(await logOf(sandbox)).toBe('clean\n') + }) + + it('only fails on the unusable settings of the scripts a command would run', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { a: { pre_undeploy: 42 } }) + + const deployed = await runCli(sandbox, ['modules', 'deploy', 'a']) + const status = await runCli(sandbox, ['modules', 'status', 'a']) + const undeployed = await runCli(sandbox, ['modules', 'undeploy', 'a']) + + // A warning for deploy, which does not run it; an error elsewhere. + expect(deployed.code).toBe(0) + expect(deployed.stderr).toContain(' Warn a: "pre_undeploy" is ignored') + expect(deployed.stderr).not.toContain('Error') + expect(status.code).toBe(0) + expect(status.stderr).toContain(' Error a: "pre_undeploy" is ignored') + expect(undeployed.code).toBe(1) + expect(undeployed.stderr).toContain(' Error a: "pre_undeploy" is ignored') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + }) + it('lists the scripts of a module, and says in status when one does not exist', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }, {}, { a: { pre_undeploy: 'missing' } }) + await sandbox.write('home/dotfiles/scripts/plugins.macos.sh', 'exit 0\n') + + const listed = await runCli(sandbox, ['modules', 'list']) + const status = await runCli(sandbox, ['modules', 'status', '--local'], [], { + platform: 'darwin', + }) + const elsewhere = await runCli(sandbox, ['modules', 'status', 'a']) + + expect(listed.stdout).toContain('- a (post_deploy, pre_undeploy)\n- b\n') + expect(status.code).toBe(0) + expect(status.stdout).toContain(' post_deploy: script "plugins"\n') + expect(status.stdout).toContain(' pre_undeploy: script "missing" (not found in scripts/)\n') + // The script only has a version for macOS. + expect(elsewhere.stdout).toContain( + ' post_deploy: script "plugins" (no version for this system)\n', + ) + }) + + it('still shows the status of the files when the scripts cannot be listed', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts', 'not a folder') + + const status = await runCli(sandbox, ['modules', 'status']) + const deployed = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(status.code).toBe(0) + expect(status.stderr).toContain('The scripts the modules name cannot be checked:') + expect(status.stdout).toContain(`${path.join(sandbox.home, '.arc')} (not deployed)`) + expect(status.stdout).toContain(' post_deploy: script "plugins"\n') + expect(deployed.code).toBe(1) + expect(deployed.stderr).toContain('Use --no-hooks to deploy without running the scripts') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + }) + + it('ends as usual when a question is cancelled, and records the modules left out', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins', b: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', logging(sandbox, 'ran')) + await sandbox.write('cwd/arc', 'mine') + + const result = await runCli( + sandbox, + ['modules', 'deploy', '--local', '--all'], + [exitPromptError()], + ) + + expect(result.code).toBe(130) + expect(result.stderr).not.toContain('not deployed') + expect(existsSync(path.join(sandbox.cwd, 'brc'))).toBe(false) + expect(await logOf(sandbox)).toBe('') + const [line] = await readHistory(sandbox) + expect(line?.changes).toEqual([ + { kind: 'failed', module: 'b', reason: 'not deployed: cancelled' }, + ]) + }) + it('reports a lock that cannot be used as an expected error, when nothing was done yet', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox) + await sandbox.write('home/.configfile', 'not a folder') + + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + `Cannot take the lock ${path.join(sandbox.home, '.configfile/lock')}:`, + ) + expect(result.stderr).not.toContain('Unexpected error') + expect(result.stderr).not.toContain('not deployed') + }) + + it('skips a script that only has versions for other systems', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.macos.sh', logging(sandbox, 'ran')) + + const planned = await runCli(sandbox, ['modules', 'deploy', '--all', '--dry-run']) + const result = await runCli(sandbox, ['modules', 'deploy', '--all']) + + expect(planned.code, planned.stderr).toBe(0) + expect(planned.stdout).toContain( + '- script "plugins" (pre_deploy of a: would be skipped, no version for linux)', + ) + // Not a mistake in the repository: every module is deployed. + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain( + 'a: post_deploy script "plugins" has no version for linux, skipped.', + ) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(true) + expect(await logOf(sandbox)).toBe('') + const [line] = await readHistory(sandbox) + expect(line?.changes).toMatchObject([ + { kind: 'script-skipped', hook: 'pre_deploy', module: 'a', reason: 'no version for linux' }, + { kind: 'deployed' }, + { kind: 'script-skipped', hook: 'post_deploy', module: 'a' }, + { kind: 'deployed' }, + ]) + + const onMac = await runCli(sandbox, ['modules', 'deploy', 'a'], [], { platform: 'darwin' }) + + expect(onMac.code, onMac.stderr).toBe(0) + expect(await logOf(sandbox)).toBe('ran\nran\n') + }) + + it('keeps the summary of an undeployment when the removed files cannot be checked', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, {}, {}, { b: { post_undeploy: 'breaks' } }) + // The record is read again for the files the repository no longer deploys. + await sandbox.write( + 'home/dotfiles/scripts/breaks.sh', + `echo broken > "${sandbox.home}/.configfile/state.json"\n`, + ) + await runCli(sandbox, ['modules', 'deploy', '--all']) + + const result = await runCli(sandbox, ['modules', 'undeploy', '--all']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('The files the repository no longer deploys were not checked: ') + expect(result.stderr).toContain('state.json') + expect(result.stderr).not.toContain('Unexpected error') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + + // Alone, the error says it all. + const alone = await runCli(sandbox, ['modules', 'undeploy', '--removed']) + + expect(alone.code).toBe(1) + expect(alone.stderr).toContain('state.json') + expect(alone.stderr).not.toContain('were not checked') + }) + it('shows which module a script ran for in the history', async () => { + const sandbox = await createSandbox() + await withHooks(sandbox, { a: 'plugins' }) + await sandbox.write('home/dotfiles/scripts/plugins.sh', 'exit 0\n') + await runCli(sandbox, ['modules', 'deploy', 'a', '--keep-going']) + + const result = await runCli(sandbox, ['history']) + + expect(result.stdout).toContain('modules deploy a --keep-going ok') + expect(result.stdout).toMatch(/script\s+plugins {2}exit 0 {2}\(post_deploy of a\)/) + }) +}) + describe('program', () => { it('prints the version', async () => { const sandbox = await createSandbox() diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts index 3dacc41c..0636e475 100644 --- a/tests/e2e.test.ts +++ b/tests/e2e.test.ts @@ -76,11 +76,16 @@ describe('built CLI', () => { }) /** Starts a long-running script, sends `signal` to configfile only once it runs. */ - async function interrupt(sandbox: Sandbox, script: string, signal: NodeJS.Signals) { + async function interrupt( + sandbox: Sandbox, + script: string, + signal: NodeJS.Signals, + args = ['scripts', 'run', 'long'], + ) { await sandbox.configure() await sandbox.write('home/dotfiles/scripts/long.sh', script) - const child = spawn(process.execPath, [cli, 'scripts', 'run', 'long'], { + const child = spawn(process.execPath, [cli, ...args], { cwd: sandbox.cwd, env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, detached: true, @@ -88,13 +93,23 @@ describe('built CLI', () => { if (child.pid != null) groups.push(child.pid) let stdout = '' + let stderr = '' + child.stderr.on('data', chunk => { + stderr += chunk + }) + let sent = false child.stdout.on('data', chunk => { stdout += chunk - if (stdout.includes('ready')) child.kill(signal) + // Once: a deployment goes on writing to stdout. + if (stdout.includes('ready') && !sent) sent = child.kill(signal) }) - return new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(resolve => { - child.on('close', (code, closeSignal) => resolve({ code, signal: closeSignal })) + return new Promise<{ + code: number | null + signal: NodeJS.Signals | null + stderr: string + }>(resolve => { + child.on('close', (code, closeSignal) => resolve({ code, signal: closeSignal, stderr })) }) } @@ -102,9 +117,91 @@ describe('built CLI', () => { const sandbox = await createSandbox() // Only configfile receives SIGINT here; in a terminal the script gets it too. - const result = await interrupt(sandbox, 'echo ready\nsleep 0.3\nexit 5\n', 'SIGINT') + const result = await interrupt(sandbox, 'echo ready\nsleep 1\nexit 5\n', 'SIGINT') + + expect(result).toMatchObject({ code: 5, signal: null }) + }) + + it('stops a deployment interrupted during a post_deploy script, even with --keep-going', async () => { + const sandbox = await createSandbox() + for (const name of ['a', 'b']) { + await sandbox.write(`home/dotfiles/files/${name}/rc`) + await sandbox.write( + `home/dotfiles/files/${name}/settings.json`, + JSON.stringify({ + files: [{ source_path: 'rc', target_path: `~/.${name}rc`, deploy: 'global' }], + post_deploy: 'long', + }), + ) + } - expect(result).toEqual({ code: 5, signal: null }) + // The script ends by itself with success: configfile was still asked to stop. + const result = await interrupt(sandbox, "trap '' INT\necho ready\nsleep 1\n", 'SIGINT', [ + 'modules', + 'deploy', + '--all', + '--keep-going', + ]) + + expect(result).toMatchObject({ code: 130, signal: null }) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + }) + + /** Modules `a` and `b`, one global file each, with `settings` in both. */ + async function withModules(sandbox: Sandbox, settings: Record) { + for (const name of ['a', 'b']) { + await sandbox.write(`home/dotfiles/files/${name}/rc`) + await sandbox.write( + `home/dotfiles/files/${name}/settings.json`, + JSON.stringify({ + files: [{ source_path: 'rc', target_path: `~/.${name}rc`, deploy: 'global' }], + ...settings, + }), + ) + } + } + + it('deploys nothing more when interrupted during a pre_deploy script', async () => { + const sandbox = await createSandbox() + await withModules(sandbox, { pre_deploy: 'long' }) + + const result = await interrupt(sandbox, "trap '' INT\necho ready\nsleep 1\n", 'SIGINT', [ + 'modules', + 'deploy', + '--all', + '--keep-going', + ]) + + expect(result).toMatchObject({ code: 130, signal: null }) + expect(result.stderr).toContain('Interrupted. 2 modules were not deployed: a, b.') + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(false) + expect(existsSync(path.join(sandbox.home, '.brc'))).toBe(false) + }) + + it('stops an undeployment interrupted during a script, with the exit code of the signal', async () => { + const sandbox = await createSandbox() + await withModules(sandbox, { pre_undeploy: 'long' }) + await sandbox.configure() + spawnSync(process.execPath, [cli, 'modules', 'deploy', '--all'], { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home }, + }) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) + + const result = await interrupt( + sandbox, + "trap 'exit 0' TERM\necho ready\nwhile true; do sleep 0.05; done\n", + 'SIGTERM', + ['modules', 'undeploy', '--all'], + ) + + expect(result).toMatchObject({ code: 143, signal: null }) + expect(result.stderr).toContain('Interrupted. 2 modules were not undeployed: a, b.') + expect(result.stderr).toContain( + 'The files the repository no longer deploys were not checked.', + ) + expect(existsSync(path.join(sandbox.home, '.arc'))).toBe(true) }) it('forwards SIGTERM to the script', async () => { @@ -116,7 +213,7 @@ describe('built CLI', () => { 'SIGTERM', ) - expect(result).toEqual({ code: 7, signal: null }) + expect(result).toMatchObject({ code: 7, signal: null }) }) }) @@ -190,7 +287,10 @@ describe('built CLI', () => { expect(() => process.kill(gitPid, 0)).toThrow() }) - it('never loses a file when several configfile processes deploy at once', async () => { + // Eight processes: allow for slow, busy CI machines. + it('never loses a file when several configfile processes deploy at once', { + timeout: 30_000, + }, async () => { const sandbox = await createSandbox() await sandbox.configure() const modules = ['a', 'b', 'c', 'd'] diff --git a/tests/lock.test.ts b/tests/lock.test.ts index 312308e5..f67a125c 100644 --- a/tests/lock.test.ts +++ b/tests/lock.test.ts @@ -1,9 +1,10 @@ import { spawn } from 'node:child_process' -import { readFile } from 'node:fs/promises' +import { chmod, mkdir, readFile } from 'node:fs/promises' import path from 'node:path' import { describe, expect, it } from 'vitest' +import { CliError } from '../src/errors.ts' import { withLock } from '../src/lock.ts' import { createSandbox } from './helpers.ts' @@ -25,6 +26,32 @@ describe('withLock', () => { await expect(withLock(home, async () => 'again')).resolves.toBe('again') }) + it('says why when its folder cannot be created', async () => { + const { home, write } = await createSandbox() + await write('home/.configfile', 'not a folder') + + const result = withLock(home, async () => 'done') + + await expect(result).rejects.toThrow(CliError) + await expect(result).rejects.toThrow(/^Cannot take the lock .*\.configfile\/lock: /) + }) + + // root writes to a folder whatever its permissions. + it.skipIf(process.getuid?.() === 0)('says why when the lock cannot be written', async () => { + const { home } = await createSandbox() + const folder = path.join(home, '.configfile') + await mkdir(folder, { mode: 0o555 }) + + try { + const result = withLock(home, async () => 'done') + + await expect(result).rejects.toThrow(CliError) + await expect(result).rejects.toThrow(/^Cannot take the lock .*: EACCES/) + } finally { + await chmod(folder, 0o755) + } + }) + it('takes over the lock of a process that no longer exists', async () => { const { home, write } = await createSandbox() const dead = spawn(process.execPath, ['-e', '']) diff --git a/tests/repository.test.ts b/tests/repository.test.ts index 84fd1799..efdbe121 100644 --- a/tests/repository.test.ts +++ b/tests/repository.test.ts @@ -36,10 +36,10 @@ async function scriptsOf( platform: NodeJS.Platform = 'linux', ) { const warnings: string[] = [] - const scripts = await listScripts(sandbox.repo, extensions, platform, { + const { scripts, otherSystems } = await listScripts(sandbox.repo, extensions, platform, { warn: message => warnings.push(message), }) - return { scripts, warnings } + return { scripts, otherSystems, warnings } } describe('listModules', () => { @@ -269,6 +269,29 @@ describe('listModules', () => { ]) }) + it('reads the scripts to run before and after the module is deployed', async () => { + const sandbox = await createSandbox() + const write = (module: string, content: unknown) => + sandbox.write(`home/dotfiles/files/${module}/settings.json`, JSON.stringify(content)) + await write('a', { files: [], pre_deploy: 'check', post_deploy: ' plugins ' }) + await write('b', { files: [] }) + await write('c', { files: [], pre_deploy: '', post_deploy: 42 }) + + const { modules } = await modulesOf(sandbox) + + expect(modules.map(usable)).toMatchObject([ + { hooks: { pre_deploy: 'check', post_deploy: 'plugins' }, hookProblems: {} }, + { hooks: {}, hookProblems: {} }, + { + hooks: {}, + hookProblems: { + pre_deploy: expect.stringContaining('"pre_deploy" is ignored'), + post_deploy: expect.stringContaining('"post_deploy" is ignored'), + }, + }, + ]) + }) + it('refuses a target that contains the repository', async () => { const sandbox = await createSandbox() // The repository lives in ~/.config/dot and a module targets ~/.config. diff --git a/tests/settings-schema.test.ts b/tests/settings-schema.test.ts index 17a9dbc4..eee88bcb 100644 --- a/tests/settings-schema.test.ts +++ b/tests/settings-schema.test.ts @@ -22,7 +22,11 @@ async function configfileAccepts(settings: unknown): Promise { const [module] = await listModules(sandbox.repo, { ...sandbox, warn: () => {} }) if (module == null) throw new Error('no module') - return module.error == null && module.invalidEntries.length === 0 + return ( + module.error == null && + module.invalidEntries.length === 0 && + Object.keys(module.hookProblems).length === 0 + ) } const zshrc = { source_path: 'zshrc', target_path: '~/.zshrc' } @@ -37,6 +41,8 @@ const accepted: [string, unknown][] = [ ['the deprecated "global": false', { files: [{ ...zshrc, global: false }] }], ['the deprecated 0.3 list format', [{ ...zshrc, deploy: 'global' }]], ['no files', { files: [] }], + ['scripts to run when deployed', { files: [], pre_deploy: 'check', post_deploy: 'setup' }], + ['scripts to run when undeployed', { files: [], pre_undeploy: 'stop', post_undeploy: 'clean' }], ['a "$schema" key', { $schema: 'https://docs.configfile.sh/schemas/settings.json', files: [] }], ] @@ -52,6 +58,10 @@ const refused: [string, unknown][] = [ ['a global file without target', { files: [{ source_path: 'zshrc', deploy: 'global' }] }], ['a local file without target', { files: [{ source_path: 'zshrc', deploy: 'local' }] }], ['an empty target', { files: [{ ...zshrc, target_path: '', deploy: 'global' }] }], + ['a "post_deploy" that is not a string', { files: [], post_deploy: ['setup'] }], + ['an empty "post_deploy"', { files: [], post_deploy: ' ' }], + ['a "pre_deploy" that is not a string', { files: [], pre_deploy: 42 }], + ['an empty "post_undeploy"', { files: [], post_undeploy: '' }], ['a source that is not a string', { files: [{ ...zshrc, source_path: 42, deploy: 'global' }] }], ] @@ -85,7 +95,11 @@ describe('settings.json schema', () => { ) const documented = [...page.matchAll(/^\| `(\w+)` \|/gm)].map(match => match[1]) - expect(Object.keys(schema.$defs.entry.properties).sort()).toEqual(documented.sort()) + // The keys of an entry, and those of the file itself next to "files". + const { $schema, files, ...settings } = schema.oneOf[0].properties + const described = [...Object.keys(schema.$defs.entry.properties), ...Object.keys(settings)] + + expect(described.sort()).toEqual(documented.sort()) }) it('is served where its $id says, from the documentation site', () => { From df75fb0932678fa1f77571b27dd93992cc906ba0 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Wed, 14 Oct 2026 15:58:26 +0200 Subject: [PATCH 339/341] fix: make update and init wait for deployments, and the reverse (#319) --- CHANGELOG.md | 16 +- docs/src/content/docs/concepts/safety.md | 4 +- .../src/content/docs/guides/scripts-and-ci.md | 4 + docs/src/content/docs/reference/commands.md | 4 +- docs/src/content/docs/reference/modules.md | 2 +- docs/src/content/docs/reference/scripts.md | 2 +- src/commands/init.ts | 43 +- src/commands/modules.ts | 8 +- src/commands/update.ts | 10 +- src/lock.ts | 279 +++++++++++-- tests/commands.test.ts | 366 +++++++++++++++++- tests/lock-fallback.test.ts | 38 ++ tests/lock.test.ts | 272 ++++++++++++- 13 files changed, 992 insertions(+), 56 deletions(-) create mode 100644 tests/lock-fallback.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 793343bd..d07820d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,9 +26,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 replace it is asked once the other files of its module are deployed, no longer at the very end. ### Fixed -- When `~/.configfile` or its lock file cannot be created or written, `modules deploy` and - `modules undeploy` say that the lock cannot be taken, and why, instead of reporting an - unexpected error. +- `update` and `init` take the lock that `modules deploy` and `undeploy` use, so files are never + deployed while a sync or a new configuration replaces them: each waits for the other, and says + so ([#313](https://github.com/mindsers/configfile/issues/313)). +- Two configfile commands started together could both take over the lock of a process that no + longer exists, and change files at the same time. The lock is now created with its owner's pid + already in it (where the filesystem supports hard links), and taken over by one process at a + time. A lock that cannot be read, or that holds no process number, is no longer taken over. +- A lock that cannot be removed at the end of a command no longer hides the command's result: a + warning says to delete it. A lock replaced or removed by someone else while a command held it is + reported too. +- When `~/.configfile` or its lock file cannot be created, written or read, the commands that take + the lock (`init`, `update`, `modules deploy` and `undeploy`) say that the lock cannot be taken, + and why, instead of reporting an unexpected error or waiting. - When more than one settings entry failed, `modules deploy` and `undeploy` reported "settings entrys" instead of "settings entries". diff --git a/docs/src/content/docs/concepts/safety.md b/docs/src/content/docs/concepts/safety.md index a4cdf431..e1d4d329 100644 --- a/docs/src/content/docs/concepts/safety.md +++ b/docs/src/content/docs/concepts/safety.md @@ -38,7 +38,9 @@ A `target_path` can't put something important at risk: your home folder, the cur ## Deployments don't overlap -`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error, which names the other process when it can. The lock is `~/.configfile/lock`; the lock of a process that no longer exists is taken over. Both take it for the files of each module in turn, and release it while a script of the module runs, so that script can run *configfile* itself. Another deployment can therefore take its turn between two modules; files are still never changed by two processes at once. Other commands, such as `update`, don't wait for it, so don't run them during a deployment. +`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, saying `Waiting for another configfile (process N) to finish…`, up to 10 seconds, then stops with an error, which names the other process when it can. The lock is `~/.configfile/lock`; the lock of a process that no longer exists is taken over, by one process at a time (`~/.configfile/lock.takeover` marks the one doing it). A lock without a process number, as configfile 1.0 leaves for a moment while it creates the lock, is waited for, never taken over. A lock that cannot be read is never taken over: its owner cannot be checked, so the command stops and says why. Both take it for the files of each module in turn, and release it while a script of the module runs, so that script can run *configfile* itself. Another deployment can therefore take its turn between two modules; files are still never changed by two processes at once. + +`update` takes the same lock for the whole sync, from fetching the remote to resetting the mirror, and `init` while it clones or reuses the repository and saves the configuration. A git prompt for a password or a passphrase during the fetch or the clone holds the lock too: run `update` and `init` where you can answer, or use an SSH key or a git credential helper. Files are therefore never deployed while a sync replaces them: one waits for the other. As the lock is released between two modules, an `update` can still run in the middle of `modules deploy --all`; the modules after it are then deployed from the synced repository, with the settings read when the deployment started. `scripts run` doesn't take the lock, as a script can run for a long time and run *configfile* itself: don't run scripts during an `update`. ## Your configuration and history stay private diff --git a/docs/src/content/docs/guides/scripts-and-ci.md b/docs/src/content/docs/guides/scripts-and-ci.md index 8fd76882..f5417c5d 100644 --- a/docs/src/content/docs/guides/scripts-and-ci.md +++ b/docs/src/content/docs/guides/scripts-and-ci.md @@ -39,6 +39,10 @@ Two more options matter in a script, although no question stands behind them: `- In a shell script, `set -e` therefore stops at the first *configfile* command that fails. +Commands that change files (`init`, `update`, `modules deploy` and `undeploy`) never change files at the same time: a command started while another holds the lock waits for it, saying `Waiting for another configfile (process N) to finish…`, and fails with `1` after 10 seconds. `modules deploy` and `undeploy` release the lock between two modules, so another command can run in between. In a script, run them one after the other, for example `update`, then `modules deploy --all`. + +A git prompt for a password or a passphrase makes `update` and `init` wait for an answer, and holds the lock meanwhile: without a terminal it fails. Give scripts a way to reach the repository without a question, such as an SSH key loaded in an agent or a git credential helper. + ## Output With `configfile scripts run`, *configfile*'s own messages go to stderr and the script's output to stdout, unchanged: you can pipe or redirect the script's output as if you had run it directly. During `modules deploy` and `undeploy`, the output of the scripts named by the modules is mixed with *configfile*'s on stdout. diff --git a/docs/src/content/docs/reference/commands.md b/docs/src/content/docs/reference/commands.md index b97ded0f..97c99f26 100644 --- a/docs/src/content/docs/reference/commands.md +++ b/docs/src/content/docs/reference/commands.md @@ -7,7 +7,7 @@ Every command prints its own help with `--help`, and most have a short form, sho ## `configfile init` -Asks for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clones it into `~/.configfile/dotfiles` and saves the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. +Asks for the URL of your dotfiles repository (any URL git can clone, such as `https://github.com/me/dotfiles.git` or `git@github.com:me/dotfiles.git`, or an existing local folder), clones it into `~/.configfile/dotfiles` and saves the configuration in `~/.configfilerc`. If the folder already contains a git repository, it is used as is. When you run `init` again, the existing folder is kept. After its questions, it waits for a deployment or `update` in progress, saying `Waiting for another configfile (process N) to finish…`, up to 10 seconds; it then checks the folder and the configuration again: it reuses a repository another configfile cloned meanwhile, and stops if another configfile saved a configuration meanwhile (unless `--force`). ```sh @@ -127,7 +127,7 @@ Short form: `configfile s r`. ## `configfile update` -Syncs *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. It warns about deployed files the repository no longer deploys. +Syncs *configfile*'s copy of your dotfiles repository with the remote: it fetches the remote and makes the copy identical to it, whatever happened to the copy. Local changes found in the copy (uncommitted edits, new files or unpushed commits, for example edits made through a deployed link) are first saved as a patch in `~/.configfile/saved/`; apply it in your own working copy with `git am ` to keep them. Global files are symbolic links, so they are up to date right away; run `modules deploy --all` for new files, and `modules deploy --local` to refresh local copies. It warns about deployed files the repository no longer deploys. It waits for a deployment or `init` in progress, saying `Waiting for another configfile (process N) to finish…`, up to 10 seconds, and deployments started during the sync wait for it, up to 10 seconds: a slow fetch can make them fail. ```sh diff --git a/docs/src/content/docs/reference/modules.md b/docs/src/content/docs/reference/modules.md index b19aab7d..214b33e9 100644 --- a/docs/src/content/docs/reference/modules.md +++ b/docs/src/content/docs/reference/modules.md @@ -36,7 +36,7 @@ When an entry leaves the repository (removed, set to `"deploy": "none"`, given a To stay safe, *configfile* never undeploys a file when it cannot tell whether the repository still deploys it: files of a module whose `settings.json` cannot be used or has invalid entries, of a module folder that is not usable (a broken symbolic link, a name another folder uses), and entries without a deployment strategy. `modules status` lists them separately. Links deployed by 0.3 and not deployed again since were not recorded, so they are not found either. -`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, up to 10 seconds, then stops with an error (the lock is `~/.configfile/lock`). Both take the lock for the files of each module in turn, and release it while a [script of the module](#run-scripts-when-a-module-is-deployed-or-undeployed) runs: another deployment can take its turn between two modules, and a deployment that cannot take the lock again stops there, saying which modules were left out. Other commands, such as `update`, don't wait for it. +`modules deploy` and `modules undeploy` change files one at a time across processes: while one runs, another one (except a dry run) waits for it, saying `Waiting for another configfile (process N) to finish…`, up to 10 seconds, then stops with an error (the lock is `~/.configfile/lock`). Both take the lock for the files of each module in turn, and release it while a [script of the module](#run-scripts-when-a-module-is-deployed-or-undeployed) runs: another deployment can take its turn between two modules, and a deployment that cannot take the lock again stops there, saying which modules were left out. `update` and `init` take the same lock while they change configfile's copy of the repository or its configuration, so files are never deployed from a repository being synced. The modules and their settings are read when the deployment starts, before it takes the lock. > **Deploying a repository means trusting it**, like code you run: its files end up in your shell configuration, and its scripts run on your machine. Only deploy repositories you trust. [Safety and trust](/concepts/safety/) explains what *configfile* protects, and what it refuses to touch. diff --git a/docs/src/content/docs/reference/scripts.md b/docs/src/content/docs/reference/scripts.md index 48a855a8..fce0434b 100644 --- a/docs/src/content/docs/reference/scripts.md +++ b/docs/src/content/docs/reference/scripts.md @@ -15,7 +15,7 @@ Scripts can be written in any language: - a `.js` (or `.mjs`, `.cjs`) or `.sh` script without shebang line is run with `node` or `sh`; - any other executable file (such as a compiled program) is run directly. -*configfile* never changes the permissions of your files. Scripts run in the current folder and their output is not modified. With `configfile scripts run`, the messages of *configfile* go to stderr and the script's exit code is forwarded. +*configfile* never changes the permissions of your files. Scripts run in the current folder and their output is not modified. `scripts run` doesn't wait for other *configfile* commands: don't run a script while `update` syncs the repository, as it could read files being replaced. With `configfile scripts run`, the messages of *configfile* go to stderr and the script's exit code is forwarded. Scripts get these environment variables, in addition to *configfile*'s own environment (they replace variables of the same name): diff --git a/src/commands/init.ts b/src/commands/init.ts index aa75c8a9..2c049497 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -8,6 +8,7 @@ import { ConfigStore } from '../config.ts' import type { Context } from '../context.ts' import { CliError } from '../errors.ts' import { checkRepositoryUrl } from '../git-url.ts' +import { withCommandLock } from '../lock.ts' import { redactUrl } from '../output.ts' import { configfilePaths, resolveUserPath } from '../paths.ts' import { ensureGit, gitClone } from '../process.ts' @@ -64,10 +65,10 @@ async function init(options: InitOptions, ctx: Context): Promise { options.folder != null ? resolveUserPath(options.folder.trim(), ctx) : (previous.folderPath ?? own.dotfiles) - const folder = await inspectFolder(folderPath) // A clone needs git: checked before asking for the URL, so a missing git is // found before the URL is typed and before the folder to clone into is created. - if (folder === 'missing' || folder === 'empty') await ensureGit() + if (needsClone(await inspectFolder(folderPath))) await ensureGit() + const configured = store.exists() const validate = (value: string) => { const checked = checkRepositoryUrl(value, ctx) @@ -95,6 +96,43 @@ async function init(options: InitOptions, ctx: Context): Promise { await mkdir(own.dir, { recursive: true, mode: 0o700 }) } + // After the questions: the folder and the configuration that deployments + // and syncs read change here. + await withCommandLock(ctx, () => + setUp({ folderPath, repoUrl, configured, force: options.force === true }, store, ctx), + ) + output.success(`configfile is ready. Configuration saved to ${store.path}.`) +} + +function needsClone(folder: Awaited>): boolean { + return folder === 'missing' || folder === 'empty' +} + +/** + * Clones the repository or reuses the folder, then saves the configuration. + * Runs with the lock held: what was seen before waiting for it is checked + * again, as another configfile may have cloned or configured meanwhile. + * `configured`: a configuration existed when the user answered. + */ +async function setUp( + { + folderPath, + repoUrl, + configured, + force, + }: { folderPath: string; repoUrl: string; configured: boolean; force: boolean }, + store: ConfigStore, + ctx: Context, +): Promise { + const { output } = ctx + if (!configured && !force && store.exists()) { + throw new CliError( + `Another configfile saved a configuration to ${store.path} meanwhile. ` + + 'Run "configfile init" again to replace it.', + ) + } + const folder = await inspectFolder(folderPath) + if (needsClone(folder)) await ensureGit() switch (folder) { case 'not-a-directory': throw new CliError(`${folderPath} exists and is not a folder.`) @@ -129,7 +167,6 @@ async function init(options: InitOptions, ctx: Context): Promise { ) } ctx.history.record({ kind: 'configured', file: store.path }) - output.success(`configfile is ready. Configuration saved to ${store.path}.`) } async function inspectFolder(folderPath: string) { diff --git a/src/commands/modules.ts b/src/commands/modules.ts index a8766691..ceae777c 100644 --- a/src/commands/modules.ts +++ b/src/commands/modules.ts @@ -23,7 +23,7 @@ import { } from '../deploy.ts' import { CliError, isPromptExit } from '../errors.ts' import { messageOf } from '../fsutil.ts' -import { withLock } from '../lock.ts' +import { withCommandLock } from '../lock.ts' import { plural } from '../output.ts' import { runScript } from '../process.ts' import { findRemovedFiles, type HeldBack, type RecordedFile } from '../removed.ts' @@ -406,7 +406,7 @@ async function deploy(names: string[], options: Options, ctx: Context): Promise< let skipped = 0 const outcome = await eachModule('deploy', units, scripts, options, ctx, async unit => { - const result = await withLock(ctx.home, async () => + const result = await withCommandLock(ctx, async () => deployFiles(unit.files, options, await deployContext(ctx), ctx), ) failures += result.failures @@ -901,7 +901,7 @@ async function undeploy(names: string[], options: Options, ctx: Context): Promis } const outcome = await eachModule('undeploy', units, scripts, options, ctx, unit => - withLock(ctx.home, async () => undeployFiles(unit.files, await deployContext(ctx))), + withCommandLock(ctx, async () => undeployFiles(unit.files, await deployContext(ctx))), ) const problems = outcome.problems if (withRemoved) { @@ -909,7 +909,7 @@ async function undeploy(names: string[], options: Options, ctx: Context): Promis problems.push('The files the repository no longer deploys were not checked.') } else { try { - count += await withLock(ctx.home, async () => undeployRemoved(await deployContext(ctx))) + count += await withCommandLock(ctx, async () => undeployRemoved(await deployContext(ctx))) } catch (error) { // After the modules: what they did, and what failed, is still reported. if (!(error instanceof CliError) || (units.length === 0 && failures === 0)) throw error diff --git a/src/commands/update.ts b/src/commands/update.ts index 85dd83c3..758c1a8a 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -7,6 +7,7 @@ import { ConfigStore } from '../config.ts' import type { Context } from '../context.ts' import { CliError } from '../errors.ts' import { errnoCode, messageOf } from '../fsutil.ts' +import { withCommandLock } from '../lock.ts' import { plural } from '../output.ts' import { configfilePaths } from '../paths.ts' import { ensureGit } from '../process.ts' @@ -39,9 +40,12 @@ async function update(ctx: Context): Promise { } await ensureGit() - output.info(`Syncing ${folderPath}…`) - const result = await syncMirror(folderPath, configfilePaths(ctx.home).saved, { - onSaved: file => ctx.history.record({ kind: 'saved-patch', file }), + // Deployments read the mirror, which the sync replaces: they never overlap. + const result = await withCommandLock(ctx, () => { + output.info(`Syncing ${folderPath}…`) + return syncMirror(folderPath, configfilePaths(ctx.home).saved, { + onSaved: file => ctx.history.record({ kind: 'saved-patch', file }), + }) }) ctx.history.record({ kind: 'synced', diff --git a/src/lock.ts b/src/lock.ts index 470b6568..dd4afd1a 100644 --- a/src/lock.ts +++ b/src/lock.ts @@ -1,7 +1,9 @@ -import { mkdir, open, readFile, rm } from 'node:fs/promises' +import { randomUUID } from 'node:crypto' +import { link, mkdir, open, readdir, readFile, rename, rm, writeFile } from 'node:fs/promises' import path from 'node:path' import { setTimeout as sleep } from 'node:timers/promises' +import type { Context } from './context.ts' import { CliError } from './errors.ts' import { errnoCode, messageOf } from './fsutil.ts' import { configfilePaths } from './paths.ts' @@ -9,63 +11,274 @@ import { configfilePaths } from './paths.ts' const RETRY_DELAY_MS = 100 const MAX_WAIT_MS = 10_000 +/** The locks this process holds: a lock naming this process that is not here was left behind. */ +const held = new Set() +/** Calls of this process waiting for a lock, in order: one at a time, whatever the file says. */ +const queues = new Map>() + /** * Runs `task` while holding `~/.configfile/lock`, so that two configfile - * processes never change the same files or the deployment record at once. - * Waits a little for another process to finish, and takes over the lock of a - * process that no longer exists. + * processes never change the same files, the deployment record, the mirror of + * the repository or the configuration at once. Waits a little for another + * process to finish, and takes over the lock of a process that no longer + * exists. + * + * The lock always holds the pid of its owner: it is written to a draft file + * first, then linked as the lock, which fails when a lock exists. A lock that + * cannot be read stops the command: its owner cannot be checked. Calls made + * by the same process take their turn: the file cannot tell them apart. */ export async function withLock( home: string, task: () => Promise, - { maxWaitMs = MAX_WAIT_MS }: { maxWaitMs?: number } = {}, + { + maxWaitMs = MAX_WAIT_MS, + onWait, + onLeftBehind, + }: { + maxWaitMs?: number + /** Called once, when another process holds the lock: `who` names it. */ + onWait?: (who: string) => void + /** + * Called when the lock cannot be released as it should at the end (the + * task's result stands), with what to tell the user. + */ + onLeftBehind?: (message: string) => void + } = {}, ): Promise { const lock = path.join(configfilePaths(home).dir, 'lock') + const previous = queues.get(lock) ?? Promise.resolve() + let done = () => {} + const turn = previous.then(() => new Promise(resolve => (done = resolve))) + queues.set(lock, turn) + await previous + try { + await acquire(lock, maxWaitMs, onWait) + held.add(lock) + try { + await sweepDrafts(lock) + return await task() + } finally { + held.delete(lock) + await release(lock, onLeftBehind) + } + } finally { + done() + if (queues.get(lock) === turn) queues.delete(lock) + } +} + +/** `withLock` for a command: says so when it has to wait, or when the lock is left behind. */ +export function withCommandLock( + ctx: Pick, + task: () => Promise, +): Promise { + return withLock(ctx.home, task, { + onWait: who => ctx.output.info(`Waiting for ${who} to finish…`), + onLeftBehind: message => ctx.output.warn(message), + }) +} + +async function acquire( + lock: string, + maxWaitMs: number, + onWait: ((who: string) => void) | undefined, +): Promise { const unusable = (error: unknown) => new CliError(`Cannot take the lock ${lock}: ${messageOf(error)}`, { cause: error }) - await mkdir(path.dirname(lock), { recursive: true, mode: 0o700 }).catch(error => { - throw unusable(error) - }) + const guarded = (promise: Promise) => + promise.catch(error => Promise.reject(unusable(error))) + await guarded(mkdir(path.dirname(lock), { recursive: true, mode: 0o700 })) const started = Date.now() + let waiting = false for (;;) { - try { - await using handle = await open(lock, 'wx', 0o600) - await handle.writeFile(String(process.pid)) - break - } catch (error) { - if (errnoCode(error) !== 'EEXIST') throw unusable(error) - } + if (await guarded(createExclusive(lock))) return - const content = await readFile(lock, 'utf8').catch(() => '') - const owner = Number.parseInt(content, 10) - // An empty lock is being created by another process: wait for its pid. - if (content !== '' && !isRunning(owner)) { - // Re-read just before removing, so a lock another process has just taken is kept. - if ((await readFile(lock, 'utf8').catch(() => '')) === content) { - await rm(lock, { force: true }) - } - continue + const owner = await guarded(readOwner(lock)) + if (owner === 'gone') continue + let blocker = { file: lock, owner } + if (owner != null && isLeftBehind(lock, owner)) { + const taken = await guarded(takeOver(lock, owner)) + if (taken === 'removed') continue + // Another process is taking it over: waited for like a lock. + blocker = taken } + + const who = + blocker.owner == null ? 'another configfile' : `another configfile (process ${blocker.owner})` if (Date.now() - started > maxWaitMs) { - const who = Number.isNaN(owner) - ? 'Another configfile' - : `Another configfile (process ${owner})` throw new CliError( - `${who} is changing files. Try again when it is done, ` + - `or delete ${lock} if no configfile is running.`, + `${who[0]?.toUpperCase()}${who.slice(1)} is changing files. Try again when it is done, ` + + `or delete ${blocker.file} if no configfile is running.`, ) } + if (!waiting) { + waiting = true + onWait?.(who) + } await sleep(RETRY_DELAY_MS) } +} +/** + * Removes our own lock. Anything else is said, never thrown: the task's + * result stands, and the next command takes over a lock whose owner is gone. + */ +async function release( + lock: string, + onLeftBehind: ((message: string) => void) | undefined, +): Promise { try { - return await task() - } finally { - // Only remove our own lock. - if ((await readFile(lock, 'utf8').catch(() => '')) === String(process.pid)) { + const owner = await readOwner(lock) + if (owner === process.pid) { await rm(lock, { force: true }) + return } + onLeftBehind?.( + owner === 'gone' + ? `${lock} was removed while this configfile held it: another configfile may have changed files at the same time.` + : `${lock} was replaced while this configfile held it: another configfile may have changed files at the same time. ` + + `Delete ${lock} if no configfile is running.`, + ) + } catch (error) { + onLeftBehind?.( + `${lock} could not be removed (${messageOf(error)}). Delete it if no configfile is running.`, + ) + } +} + +/** + * Creates `file` holding this process's pid, unless it exists. It never + * exists empty or half written: the pid is written to a draft file, which is + * then linked under the name `file` (this fails when it exists). Where hard + * links are not supported, `file` is created and written in two steps, as + * configfile 1.0 did. + */ +async function createExclusive(file: string): Promise { + const draft = draftOf(file) + await writeFile(draft, String(process.pid), { flag: 'wx', mode: 0o600 }) + try { + await link(draft, file) + return true + } catch (error) { + const code = errnoCode(error) + if (code === 'EEXIST') return false + if (code !== 'EPERM' && code !== 'ENOTSUP' && code !== 'ENOSYS') throw error + } finally { + await rm(draft, { force: true }).catch(() => {}) + } + + try { + await using handle = await open(file, 'wx', 0o600) + await handle.writeFile(String(process.pid)) + return true + } catch (error) { + if (errnoCode(error) === 'EEXIST') return false + throw error + } +} + +/** A file name of its own, next to `file`: `..`. */ +function draftOf(file: string): string { + return `${file}.${process.pid}.${randomUUID()}` +} + +/** + * Removes the drafts of processes that no longer exist (killed between + * writing a draft and removing it). Called with the lock held; never fails. + */ +async function sweepDrafts(lock: string): Promise { + const folder = path.dirname(lock) + const pattern = new RegExp( + `^${path.basename(lock).replace('.', '\\.')}(?:\\.takeover)?\\.(\\d+)\\.[0-9a-f-]{36}$`, + ) + const names = await readdir(folder).catch(() => []) + for (const name of names) { + const pid = Number(pattern.exec(name)?.[1]) + if (Number.isInteger(pid) && pid !== process.pid && !isRunning(pid)) { + await rm(path.join(folder, name), { force: true }).catch(() => {}) + } + } +} + +/** + * The pid in a lock: `null` when it holds none (being written by configfile + * 1.0, or damaged), `gone` when the lock no longer exists. Any other error is + * thrown: a lock that cannot be read is never taken over. + */ +async function readOwner(file: string): Promise { + let content: string + try { + content = await readFile(file, 'utf8') + } catch (error) { + if (errnoCode(error) === 'ENOENT') return 'gone' + throw error + } + const pid = Number.parseInt(content, 10) + return Number.isInteger(pid) && pid > 0 ? pid : null +} + +/** + * Whether the lock was left behind: by a process that no longer exists, or by + * this one, which does not hold it (its calls take their turn, so none is + * holding it while this one asks). A lock without pid is never: configfile + * 1.0 may be writing it, as it created the lock empty and wrote its pid after. + */ +function isLeftBehind(lock: string, owner: number): boolean { + if (owner === process.pid) return !held.has(lock) + return !isRunning(owner) +} + +/** + * Removes a lock left behind by `owner`. Only one process at a time does it, + * holding `.takeover`: two of them could otherwise both see the old + * lock, and one remove the lock the other has just taken. Returns `removed` + * once done (by this process or another), or the guard file and its owner + * when another process is taking it over. + * + * A guard left by a process that no longer exists is moved aside, then + * checked: one moved by mistake (a new one, created meanwhile) is put back. + * That leaves one rare case, a guard left behind and found by several + * processes at the very same moment, where two of them may take over at once. + */ +async function takeOver( + lock: string, + owner: number, +): Promise<'removed' | { file: string; owner: number | null }> { + const guard = `${lock}.takeover` + if (!(await createExclusive(guard))) { + const other = await readOwner(guard) + if (other === 'gone') return 'removed' + // Our own guard can only have been left behind: this process takes its turn. + if (other != null && other !== process.pid && isRunning(other)) { + return { file: guard, owner: other } + } + await removeStale(guard, other) + return 'removed' + } + try { + // Checked again: another process may have taken it over meanwhile. + if ((await readOwner(lock)) === owner) await rm(lock, { force: true }) + } finally { + await rm(guard, { force: true }).catch(() => {}) + } + return 'removed' +} + +/** Removes `file` if it still names `owner`; puts it back otherwise. */ +async function removeStale(file: string, owner: number | null): Promise { + const aside = draftOf(file) + try { + await rename(file, aside) + } catch (error) { + if (errnoCode(error) === 'ENOENT') return + throw error + } + try { + if ((await readOwner(aside)) !== owner) await link(aside, file).catch(() => {}) + } finally { + await rm(aside, { force: true }).catch(() => {}) } } diff --git a/tests/commands.test.ts b/tests/commands.test.ts index 08d6e445..4d89efa4 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -1,4 +1,4 @@ -import { execFileSync } from 'node:child_process' +import { execFileSync, spawn } from 'node:child_process' import { existsSync } from 'node:fs' import { chmod, @@ -16,10 +16,10 @@ import { } from 'node:fs/promises' import path from 'node:path' -import { describe, expect, it, vi } from 'vitest' +import { afterEach, describe, expect, it, vi } from 'vitest' import { COMMANDS } from '../src/history.ts' -import { buildProgram } from '../src/program.ts' +import { buildProgram, main } from '../src/program.ts' import { createContext, createRemote, @@ -30,6 +30,48 @@ import { type Sandbox, } from './helpers.ts' +/** + * Runs the CLI in-process, and calls `then` once `when` holds for its context + * (for example once it says it waits), then returns what `runCli` returns. + */ +async function runWhile( + sandbox: Sandbox, + args: string[], + answers: Array, + when: (ctx: ReturnType) => boolean, + then: () => unknown, +) { + const ctx = createContext(sandbox, answers) + const run = main(args, ctx) + const until = Date.now() + 10_000 + while (!when(ctx) && Date.now() < until) await new Promise(resolve => setTimeout(resolve, 10)) + await then() + const code = await run + return { code, stdout: ctx.stdout.text, stderr: ctx.stderr.text, asked: ctx.asked } +} + +const waiting = (ctx: ReturnType) => ctx.stdout.text.includes('Waiting for') + +/** A process that runs until it is killed, at the end of the test at the latest. */ +const others: ReturnType[] = [] +function startOther() { + const other = spawn(process.execPath, ['-e', 'setTimeout(() => {}, 30000)']) + others.push(other) + return other +} +afterEach(() => { + for (const other of others.splice(0)) other.kill() +}) + +/** Whether git runs the reference-transaction hook (git 2.28 or later). */ +const gitHasReferenceHook = (() => { + const [major = 0, minor = 0] = execFileSync('git', ['--version'], { encoding: 'utf8' }) + .replace(/^\D*/, '') + .split('.') + .map(Number) + return major > 2 || (major === 2 && minor >= 28) +})() + async function withModule(sandbox: Sandbox) { await sandbox.configure() await sandbox.write('home/dotfiles/files/zsh/zshrc', 'zshrc') @@ -1513,6 +1555,94 @@ describe('init', () => { const readConfig = async (sandbox: Sandbox) => JSON.parse(await readFile(path.join(sandbox.home, '.configfilerc'), 'utf8')) + it('waits for another configfile that holds the lock, after its questions', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + const other = startOther() + await sandbox.write('home/.configfile/lock', String(other.pid)) + let askedBeforeWaiting: string[] = [] + + const result = await runWhile(sandbox, ['init'], [remote], waiting, function release() { + other.kill() + }) + askedBeforeWaiting = result.asked + + expect(result.code, result.stderr).toBe(0) + expect(askedBeforeWaiting).toEqual(['Dotfiles repository URL:']) + // The question comes first: the wait is only said once it is answered. + expect(result.stdout.indexOf('Waiting for')).toBeGreaterThan(-1) + expect(result.stdout).toContain( + `Waiting for another configfile (process ${other.pid}) to finish…`, + ) + expect(existsSync(path.join(sandbox.home, '.configfile/dotfiles/.git'))).toBe(true) + }) + + it('checks the folder again once it has waited: another configfile may have cloned it', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + const folder = path.join(sandbox.home, '.configfile/dotfiles') + const other = startOther() + await sandbox.write('home/.configfile/lock', String(other.pid)) + + // While this one waits, the other clones the repository. + const result = await runWhile(sandbox, ['init', '--repo', remote], [], waiting, () => { + git(sandbox.root, 'clone', '--quiet', remote, folder) + other.kill() + }) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain( + `${folder} already contains a git repository. It is used as is.`, + ) + }) + + it('does not replace a configuration saved while it waited, without --force', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + const other = startOther() + await sandbox.write('home/.configfile/lock', String(other.pid)) + + const result = await runWhile(sandbox, ['init', '--repo', remote], [], waiting, async () => { + await sandbox.configure() + other.kill() + }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Another configfile saved a configuration to') + expect( + JSON.parse(await readFile(path.join(sandbox.home, '.configfilerc'), 'utf8')), + ).toMatchObject({ + folder_path: sandbox.repo, + }) + // Stopped before cloning anything. + expect(existsSync(path.join(sandbox.home, '.configfile/dotfiles'))).toBe(false) + }) + + it('replaces a configuration saved while it waited, with --force', async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + const other = startOther() + await sandbox.write('home/.configfile/lock', String(other.pid)) + + const result = await runWhile( + sandbox, + ['init', '--repo', remote, '--force'], + [], + waiting, + async () => { + await sandbox.configure() + other.kill() + }, + ) + + expect(result.code, result.stderr).toBe(0) + expect( + JSON.parse(await readFile(path.join(sandbox.home, '.configfilerc'), 'utf8')), + ).toMatchObject({ + folder_path: path.join(sandbox.home, '.configfile/dotfiles'), + }) + }) + it('clones the repository and saves the configuration', async () => { const sandbox = await createSandbox() const remote = await withRemote(sandbox) @@ -1743,6 +1873,8 @@ describe('init', () => { const sandbox = await createSandbox() const remote = await withRemote(sandbox) const folder = path.join(sandbox.root, 'clone') + // configfile's own folder can be written (its lock is there), not the home folder. + await mkdir(path.join(sandbox.home, '.configfile')) await chmod(sandbox.home, 0o555) try { @@ -1758,6 +1890,27 @@ describe('init', () => { }, ) + // root writes to a folder whatever its permissions. + it.skipIf(process.getuid?.() === 0)( + 'fails before cloning when the lock cannot be taken', + async () => { + const sandbox = await createSandbox() + const remote = await withRemote(sandbox) + const folder = path.join(sandbox.root, 'clone') + await chmod(sandbox.home, 0o555) + + try { + const result = await runCli(sandbox, ['init', '--repo', remote, '--folder', folder]) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Cannot take the lock') + expect(existsSync(folder)).toBe(false) + } finally { + await chmod(sandbox.home, 0o755) + } + }, + ) + it('asks again for a repository URL git cannot use', async () => { const sandbox = await createSandbox() const remote = await withRemote(sandbox) @@ -1855,6 +2008,151 @@ describe('update', () => { return existsSync(folder) ? (await readdir(folder)).map(name => path.join(folder, name)) : [] } + /** Holds the lock as another configfile would, until the returned function is called. */ + async function holdLock(sandbox: Sandbox) { + const other = spawn(process.execPath, ['-e', 'setTimeout(() => {}, 30000)']) + held.push(other) + await sandbox.write('home/.configfile/lock', String(other.pid)) + return () => other.kill() + } + // Never left running, whatever the outcome of a test. + const held: ReturnType[] = [] + afterEach(() => { + for (const other of held.splice(0)) other.kill() + }) + + it('waits for another configfile that holds the lock, then syncs', async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/zsh/zshrc', 'new') + const release = await holdLock(sandbox) + setTimeout(release, 500) + + const started = Date.now() + const result = await runCli(sandbox, ['update']) + + expect(result.code, result.stderr).toBe(0) + expect(Date.now() - started).toBeGreaterThanOrEqual(400) + expect(result.stdout).toMatch(/Waiting for another configfile \(process \d+\) to finish…\n/) + expect(result.stdout.match(/Waiting for/g)).toHaveLength(1) + expect(await readFile(path.join(sandbox.repo, 'files/zsh/zshrc'), 'utf8')).toBe('new') + }) + + it.skipIf(!gitHasReferenceHook)( + 'holds the lock for the whole sync, the fetch included', + async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/zsh/zshrc', 'new') + const lock = path.join(sandbox.home, '.configfile/lock') + const seen = path.join(sandbox.root, 'seen') + // Run by git each time it updates references: by the fetch first, then the reset. + await sandbox.write( + 'hooks/reference-transaction', + `#!/bin/sh\n[ "$1" = committed ] || exit 0\n` + + `if [ -f "${lock}" ]; then cat "${lock}"; else printf none; fi >> "${seen}"\necho >> "${seen}"\n`, + 0o755, + ) + git(sandbox.repo, 'config', 'core.hooksPath', path.join(sandbox.root, 'hooks')) + + const result = await runCli(sandbox, ['update']) + + expect(result.code, result.stderr).toBe(0) + const lines = (await readFile(seen, 'utf8')).trim().split('\n') + expect(lines.length).toBeGreaterThanOrEqual(2) + expect(lines).toEqual(lines.map(() => String(process.pid))) + expect(existsSync(lock)).toBe(false) + }, + ) + + it.skipIf(!gitHasReferenceHook)( + 'makes a deployment started during the sync wait for it', + async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote( + 'files/zsh/settings.json', + JSON.stringify({ + files: [{ source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }], + }), + ) + await commitInRemote('files/zsh/zshrc', 'old') + git(sandbox.repo, 'pull', '--quiet') + await commitInRemote('files/zsh/zshrc', 'new') + const lock = path.join(sandbox.home, '.configfile/lock') + // The fetch, first to update references, takes a second: long enough to + // start a deployment meanwhile. + const slowed = path.join(sandbox.root, 'slowed') + await sandbox.write( + 'hooks/reference-transaction', + `#!/bin/sh\n[ "$1" = prepared ] && [ ! -e "${slowed}" ] && touch "${slowed}" && sleep 1\nexit 0\n`, + 0o755, + ) + git(sandbox.repo, 'config', 'core.hooksPath', path.join(sandbox.root, 'hooks')) + + const update = runCli(sandbox, ['update']) + const until = Date.now() + 10_000 + while (!existsSync(lock) && Date.now() < until) { + await new Promise(resolve => setTimeout(resolve, 20)) + } + // Another configfile process, as when started from another terminal. + const deploy = await new Promise<{ code: number | null; stdout: string }>(resolve => { + const child = spawn( + process.execPath, + [path.resolve('src/cli.ts'), 'modules', 'deploy', 'zsh'], + { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, + }, + ) + let stdout = '' + child.stdout.on('data', chunk => { + stdout += chunk + }) + child.on('close', code => resolve({ code, stdout })) + }) + const synced = await update + + expect(synced.code, synced.stderr).toBe(0) + expect(deploy.code, deploy.stdout).toBe(0) + expect(deploy.stdout).toContain( + `Waiting for another configfile (process ${process.pid}) to finish…`, + ) + // Deployed once the sync was done: the link leads to the synced file. + expect(await readFile(path.join(sandbox.home, '.zshrc'), 'utf8')).toBe('new') + }, + ) + + // root writes to a folder whatever its permissions. + it.skipIf(process.getuid?.() === 0)( + 'fails before syncing when the lock cannot be taken, and records it', + async () => { + const sandbox = await createSandbox() + const { commitInRemote } = await withMirror(sandbox) + await commitInRemote('files/zsh/zshrc', 'new') + const folder = path.join(sandbox.home, '.configfile') + // The history can still be appended to; the lock cannot be created. + await sandbox.write('home/.configfile/history.jsonl', '') + await chmod(folder, 0o555) + + try { + const result = await runCli(sandbox, ['update']) + + expect(result.code).toBe(1) + expect(result.stderr).toContain('Cannot take the lock') + } finally { + await chmod(folder, 0o755) + } + expect(existsSync(path.join(sandbox.repo, 'files/zsh/zshrc'))).toBe(false) + const [line] = await readHistory(sandbox) + expect(line).toMatchObject({ + command: 'update', + exitCode: 1, + error: { message: expect.stringContaining('Cannot take the lock') }, + }) + }, + ) + it('syncs the mirror with the remote', async () => { const sandbox = await createSandbox() const { commitInRemote } = await withMirror(sandbox) @@ -3508,6 +3806,68 @@ describe('scripts run when a module is deployed or undeployed', () => { }) }) +describe('waiting for another configfile', () => { + async function withZsh(sandbox: Sandbox) { + await sandbox.configure() + await sandbox.write('home/dotfiles/files/zsh/zshrc', 'zshrc') + await sandbox.write( + 'home/dotfiles/files/zsh/settings.json', + JSON.stringify({ + files: [{ source_path: 'zshrc', target_path: '~/.zshrc', deploy: 'global' }], + }), + ) + } + + it('makes modules deploy and undeploy say once that they wait', async () => { + const sandbox = await createSandbox() + await withZsh(sandbox) + + for (const command of ['deploy', 'undeploy']) { + const other = startOther() + await sandbox.write('home/.configfile/lock', String(other.pid)) + + const result = await runWhile(sandbox, ['modules', command, 'zsh'], [], waiting, () => + other.kill(), + ) + + expect(result.code, result.stderr).toBe(0) + expect( + result.stdout.match(/Waiting for another configfile \(process \d+\) to finish…/g), + ).toHaveLength(1) + } + expect(existsSync(path.join(sandbox.home, '.zshrc'))).toBe(false) + }) + + // root removes files from a folder whatever its permissions. + it.skipIf(process.getuid?.() === 0 || !gitHasReferenceHook)( + 'warns when the lock cannot be removed, and keeps the result of the command', + async () => { + const sandbox = await createSandbox() + const remote = await createRemote(sandbox) + git(sandbox.root, 'clone', '--quiet', remote, sandbox.repo) + await sandbox.configure() + const folder = path.join(sandbox.home, '.configfile') + // Run by git during the sync, while update holds the lock. + await sandbox.write( + 'hooks/reference-transaction', + `#!/bin/sh\nchmod 555 "${folder}"\nexit 0\n`, + 0o755, + ) + git(sandbox.repo, 'config', 'core.hooksPath', path.join(sandbox.root, 'hooks')) + + try { + const result = await runCli(sandbox, ['update']) + + expect(result.code, result.stderr).toBe(0) + expect(result.stderr).toContain(`${path.join(folder, 'lock')} could not be removed (`) + expect(result.stderr).toContain('Delete it if no configfile is running.') + } finally { + await chmod(folder, 0o755) + } + }, + ) +}) + describe('program', () => { it('prints the version', async () => { const sandbox = await createSandbox() diff --git a/tests/lock-fallback.test.ts b/tests/lock-fallback.test.ts new file mode 100644 index 00000000..9ec9174a --- /dev/null +++ b/tests/lock-fallback.test.ts @@ -0,0 +1,38 @@ +// Where hard links are not supported (some network or FAT filesystems), the +// lock is created in two steps, as configfile 1.0 did. + +import { readFile } from 'node:fs/promises' +import path from 'node:path' + +import { describe, expect, it, vi } from 'vitest' + +import { withLock } from '../src/lock.ts' +import { createSandbox } from './helpers.ts' + +vi.mock('node:fs/promises', async importOriginal => ({ + ...(await importOriginal()), + link: async () => { + throw Object.assign(new Error('operation not permitted, link'), { code: 'EPERM' }) + }, +})) + +describe('withLock without hard links', () => { + it('still takes the lock, holding the pid of its owner, then releases it', async () => { + const { home } = await createSandbox() + const lock = path.join(home, '.configfile/lock') + + const seen = await withLock(home, () => readFile(lock, 'utf8')) + + expect(seen).toBe(String(process.pid)) + await expect(readFile(lock, 'utf8')).rejects.toThrow() + }) + + it('still waits for another process holding it', async () => { + const { home, write } = await createSandbox() + await write('home/.configfile/lock', String(process.ppid)) + + await expect(withLock(home, async () => 'never', { maxWaitMs: 300 })).rejects.toThrow( + `Another configfile (process ${process.ppid}) is changing files`, + ) + }) +}) diff --git a/tests/lock.test.ts b/tests/lock.test.ts index f67a125c..553b5c39 100644 --- a/tests/lock.test.ts +++ b/tests/lock.test.ts @@ -1,13 +1,31 @@ import { spawn } from 'node:child_process' -import { chmod, mkdir, readFile } from 'node:fs/promises' +import { chmod, mkdir, readdir, readFile, rm, utimes, writeFile } from 'node:fs/promises' import path from 'node:path' -import { describe, expect, it } from 'vitest' +import { afterEach, describe, expect, it } from 'vitest' import { CliError } from '../src/errors.ts' import { withLock } from '../src/lock.ts' import { createSandbox } from './helpers.ts' +/** The pid of a process that has ended. */ +async function deadPid(): Promise { + const dead = spawn(process.execPath, ['-e', '']) + await new Promise(resolve => dead.on('exit', resolve)) + return dead.pid as number +} + +/** A process that keeps running until it is killed (at the end of the test at the latest). */ +const living: ReturnType[] = [] +function livingPid(): number { + const other = spawn(process.execPath, ['-e', 'setTimeout(() => {}, 30000)']) + living.push(other) + return other.pid as number +} +afterEach(() => { + for (const other of living.splice(0)) other.kill() +}) + describe('withLock', () => { it('runs the task while holding ~/.configfile/lock, then releases it', async () => { const { home } = await createSandbox() @@ -52,6 +70,83 @@ describe('withLock', () => { } }) + it('never takes over a lock without pid, which an older configfile may be writing', async () => { + const { home, write } = await createSandbox() + const lock = await write('home/.configfile/lock', '') + const old = new Date(Date.now() - 60_000) + await utimes(lock, old, old) + + await expect(withLock(home, async () => 'never', { maxWaitMs: 300 })).rejects.toThrow( + 'Another configfile is changing files', + ) + expect(await readFile(lock, 'utf8')).toBe('') + }) + + it('leaves only the lock in its folder, holding the pid of its owner', async () => { + const { home } = await createSandbox() + const folder = path.join(home, '.configfile') + + const seen = await withLock(home, async () => ({ + files: await readdir(folder), + lock: await readFile(path.join(folder, 'lock'), 'utf8'), + })) + + expect(seen).toEqual({ files: ['lock'], lock: String(process.pid) }) + expect(await readdir(folder)).toEqual([]) + }) + + // root reads any file whatever its permissions. + it.skipIf(process.getuid?.() === 0)( + 'never takes over a lock it cannot read: its owner cannot be checked', + async () => { + const { home, write } = await createSandbox() + const other = spawn(process.execPath, ['-e', 'setTimeout(() => {}, 30000)']) + const lock = await write('home/.configfile/lock', String(other.pid), 0o000) + try { + await expect(withLock(home, async () => 'never', { maxWaitMs: 300 })).rejects.toThrow( + /^Cannot take the lock .*: EACCES/, + ) + await chmod(lock, 0o600) + expect(await readFile(lock, 'utf8')).toBe(String(other.pid)) + } finally { + other.kill() + } + }, + ) + + // root removes files from a folder whatever its permissions. + it.skipIf(process.getuid?.() === 0)( + 'keeps the result of the task when the lock cannot be removed', + async () => { + const { home } = await createSandbox() + const folder = path.join(home, '.configfile') + + const left: string[] = [] + try { + const result = await withLock( + home, + async () => { + await chmod(folder, 0o555) + return 'done' + }, + { onLeftBehind: message => left.push(message) }, + ) + + expect(result).toBe('done') + expect(left).toEqual([ + expect.stringMatching( + /^.*\.configfile\/lock could not be removed \(.*EACCES.*\)\. Delete it if no configfile is running\.$/, + ), + ]) + } finally { + await chmod(folder, 0o755) + } + // The lock left behind names this process, which no longer holds it: taken over at once. + expect(await readFile(path.join(folder, 'lock'), 'utf8')).toBe(String(process.pid)) + await expect(withLock(home, async () => 'again', { maxWaitMs: 300 })).resolves.toBe('again') + }, + ) + it('takes over the lock of a process that no longer exists', async () => { const { home, write } = await createSandbox() const dead = spawn(process.execPath, ['-e', '']) @@ -76,6 +171,179 @@ describe('withLock', () => { } }) + it('says once that it waits, naming the process', async () => { + const { home, write } = await createSandbox() + const other = spawn(process.execPath, ['-e', 'setTimeout(() => {}, 30000)']) + const waits: string[] = [] + try { + await write('home/.configfile/lock', String(other.pid)) + setTimeout(() => other.kill(), 400) + + await withLock(home, async () => 'done', { onWait: who => waits.push(who) }) + } finally { + other.kill() + } + + expect(waits).toEqual([`another configfile (process ${other.pid})`]) + }) + + /** + * Runs `count` processes that each take the lock for a moment, and returns + * what they logged: `+` when one starts its task, `-` when it ends. + */ + async function race(home: string, count: number): Promise { + const log = path.join(home, 'log') + const go = path.join(home, 'go') + const ready = path.join(home, 'ready') + await mkdir(ready) + // Every process says it is ready, then waits for the same signal, so they + // all find the lock at once. + const script = + `import { appendFileSync, existsSync, writeFileSync } from 'node:fs'\n` + + `import { withLock } from ${JSON.stringify(new URL('../src/lock.ts', import.meta.url).href)}\n` + + `writeFileSync(${JSON.stringify(ready)} + '/' + process.pid, '')\n` + + `const until = Date.now() + 20000\n` + + `while (!existsSync(${JSON.stringify(go)}) && Date.now() < until) await new Promise(resolve => setTimeout(resolve, 1))\n` + + `await withLock(${JSON.stringify(home)}, async () => {\n` + + ` appendFileSync(${JSON.stringify(log)}, '+')\n` + + ` await new Promise(resolve => setTimeout(resolve, 50))\n` + + ` appendFileSync(${JSON.stringify(log)}, '-')\n` + + `}, { maxWaitMs: 20000 })\n` + const runs = Array.from({ length: count }, () => { + const child = spawn(process.execPath, ['--input-type=module', '-e', script]) + let stderr = '' + child.stderr.on('data', chunk => { + stderr += chunk + }) + return new Promise((resolve, reject) => { + child.on('error', reject) + child.on('close', code => + code === 0 ? resolve(code) : reject(new Error(`exit ${code}: ${stderr}`)), + ) + }) + }) + // Once they have all started. + const until = Date.now() + 20_000 + while ((await readdir(ready)).length < count && Date.now() < until) { + await new Promise(resolve => setTimeout(resolve, 10)) + } + await writeFile(go, '') + await Promise.all(runs) + await rm(ready, { recursive: true }) + return readFile(log, 'utf8') + } + + it('never lets two processes hold the lock, also when they take over the same one', { + timeout: 30_000, + }, async () => { + const { home, write } = await createSandbox() + const dead = spawn(process.execPath, ['-e', '']) + await new Promise(resolve => dead.on('exit', resolve)) + // Every process finds the lock of a process that no longer exists. + await write('home/.configfile/lock', String(dead.pid)) + + const log = await race(home, 8) + + expect(log).toBe('+-'.repeat(8)) + // No lock and no draft left behind. + expect(await readdir(path.join(home, '.configfile'))).toEqual([]) + }) + + it('never lets two processes hold the lock when the takeover guard was left behind', { + timeout: 30_000, + }, async () => { + const { home, write } = await createSandbox() + const dead = await deadPid() + await write('home/.configfile/lock', String(dead)) + await write('home/.configfile/lock.takeover', String(dead)) + + const log = await race(home, 8) + + expect(log).toBe('+-'.repeat(8)) + expect(await readdir(path.join(home, '.configfile'))).toEqual([]) + }) + + it('waits for another process taking over the lock, and gives up in time', async () => { + const { home, write } = await createSandbox() + const other = livingPid() + await write('home/.configfile/lock', String(await deadPid())) + const guard = await write('home/.configfile/lock.takeover', String(other)) + + const started = Date.now() + await expect(withLock(home, async () => 'never', { maxWaitMs: 300 })).rejects.toThrow( + `Another configfile (process ${other}) is changing files. Try again when it is done, or delete ${guard} if no configfile is running.`, + ) + expect(Date.now() - started).toBeLessThan(2000) + expect(await readFile(guard, 'utf8')).toBe(String(other)) + }) + + it('takes over a takeover guard left behind, by another process or by this one', async () => { + for (const owner of [await deadPid(), process.pid]) { + const { home, write } = await createSandbox() + await write('home/.configfile/lock', String(await deadPid())) + await write('home/.configfile/lock.takeover', String(owner)) + + await expect(withLock(home, async () => 'done', { maxWaitMs: 300 })).resolves.toBe('done') + expect(await readdir(path.join(home, '.configfile'))).toEqual([]) + } + }) + + it('never removes a lock it does not hold any more, and says so', async () => { + const { home } = await createSandbox() + const lock = path.join(home, '.configfile/lock') + const other = livingPid() + const said: string[] = [] + + await withLock(home, async () => writeFile(lock, String(other)), { + onLeftBehind: message => said.push(message), + }) + // Left as it is: it names another process, still running. + expect(await readFile(lock, 'utf8')).toBe(String(other)) + await rm(lock) + await withLock(home, async () => rm(lock), { onLeftBehind: message => said.push(message) }) + + expect(said).toEqual([ + `${lock} was replaced while this configfile held it: another configfile may have changed files at the same time. Delete ${lock} if no configfile is running.`, + `${lock} was removed while this configfile held it: another configfile may have changed files at the same time.`, + ]) + }) + + // 600 calls: allow for slow, busy CI machines. + it('never runs two tasks of the same process at once', { timeout: 30_000 }, async () => { + const { home } = await createSandbox() + let running = 0 + let overlaps = 0 + + // Thirty callers, each taking the lock twenty times in a row. + await Promise.all( + Array.from({ length: 30 }, async () => { + for (let call = 0; call < 20; call++) { + await withLock(home, async () => { + running++ + if (running > 1) overlaps++ + await new Promise(resolve => setTimeout(resolve, 1)) + running-- + }) + } + }), + ) + + expect(overlaps).toBe(0) + }) + + it('removes the drafts left by processes that no longer exist', async () => { + const { home, write } = await createSandbox() + const uuid = '0f0e0d0c-0b0a-4908-8706-050403020100' + await write(`home/.configfile/lock.${await deadPid()}.${uuid}`, '1') + await write(`home/.configfile/lock.takeover.${await deadPid()}.${uuid}`, '1') + const living = `lock.${livingPid()}.${uuid}` + await write(`home/.configfile/${living}`, '1') + + await withLock(home, async () => 'done') + + expect(await readdir(path.join(home, '.configfile'))).toEqual([living]) + }) + it('serializes tasks', async () => { const { home } = await createSandbox() const events: string[] = [] From 0d043743feb554870551a1fc2ebb8856843e5745 Mon Sep 17 00:00:00 2001 From: Nathanael CHERRIER Date: Wed, 14 Oct 2026 22:11:27 +0200 Subject: [PATCH 340/341] feat: release standalone binaries for macOS and Linux, with an install script (#320) --- .github/workflows/ci.yml | 54 +++ .github/workflows/publish.yml | 98 ++++- .gitignore | 1 + CHANGELOG.md | 4 + README.md | 6 + docs/public/install.sh | 130 +++++++ .../docs/getting-started/installation.md | 53 ++- docs/src/content/docs/guides/new-machine.md | 11 +- .../content/docs/guides/upgrading-from-0-3.md | 2 +- docs/src/content/docs/reference/scripts.md | 2 +- package.json | 3 + pnpm-lock.yaml | 21 + src/cli.ts | 17 +- src/process.ts | 33 +- src/program.ts | 18 +- tests/e2e.test.ts | 59 ++- tests/install.test.ts | 365 ++++++++++++++++++ tests/process-sea.test.ts | 67 ++++ tools/build-binary.ts | 150 +++++++ 19 files changed, 1037 insertions(+), 57 deletions(-) create mode 100644 docs/public/install.sh create mode 100644 tests/install.test.ts create mode 100644 tests/process-sea.test.ts create mode 100644 tools/build-binary.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index efe1c959..02f026f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,9 @@ jobs: run: | actionlint zizmor --persona regular .github/workflows + - name: Check the install script + # Served at https://docs.configfile.sh/install.sh, run by any POSIX shell. + run: shellcheck --shell=sh docs/public/install.sh test: strategy: @@ -82,6 +85,57 @@ jobs: configfile --help HOME="$RUNNER_TEMP/home" configfile history + binary: + # Builds the standalone binary on each system it is made for, as + # publish.yml does for a release, and runs the end-to-end tests with it. + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, ubuntu-24.04-arm, macos-15, macos-15-intel] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + # The CLI only: the documentation site (docs/) is built by the docs job. + - run: pnpm install --frozen-lockfile --filter configfile + - run: pnpm build:binary + - name: Install the binary with the install script + # As users get it: from a release laid out as on GitHub, with SHA256SUMS. + run: | + archive=$(ls release/configfile-*.tar.gz) + name=$(basename "$archive") + tar -tzf "$archive" | sort > "$RUNNER_TEMP/members" + printf '%s\n' ./ ./LICENSE ./THIRD-PARTY-LICENSES ./configfile | sort | + diff - "$RUNNER_TEMP/members" + release="$RUNNER_TEMP/releases/download/ci" + mkdir -p "$release" + cp "$archive" "$release/" + (cd "$release" && shasum -a 256 "$name" > SHA256SUMS) + CONFIGFILE_DOWNLOAD_URL="file://$RUNNER_TEMP/releases" CONFIGFILE_VERSION=ci \ + CONFIGFILE_INSTALL_DIR="$RUNNER_TEMP/bin" sh docs/public/install.sh + - name: Run the end-to-end tests with the installed binary + run: CONFIGFILE_BINARY="$RUNNER_TEMP/bin/configfile" pnpm vitest run tests/e2e.test.ts + - name: Answer a question on a terminal, whatever NODE_OPTIONS says + run: | + bin="$RUNNER_TEMP/bin/configfile" + export HOME="$RUNNER_TEMP/home" NODE_OPTIONS="--require /nonexistent.js" + mkdir -p "$HOME" + remote="$RUNNER_TEMP/remote" + git init --quiet "$remote" + git -C "$remote" -c user.name=ci -c user.email=ci@example.com commit --quiet --allow-empty -m first + # The URL is typed once the question is shown; the input stays open meanwhile. + answer() { sleep 3; printf '%s\r' "$remote"; sleep 10; } + if [ "$RUNNER_OS" = macOS ]; then + answer | script -q /dev/null "$bin" init + else + answer | script -qec "$bin init" /dev/null + fi + grep -F "$remote" "$HOME/.configfilerc" + docs: # Builds the documentation site (docs/), as docs-deploy.yml publishes it. runs-on: ubuntu-latest diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 502d7b46..f7cf7a75 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,16 +4,23 @@ name: Publish # master, the release branch of git-flow: # # - build: checks the tag, runs the checks and packs the package once; -# - github-release: publishes that tarball, its SHA256SUMS and the CHANGELOG -# section as a GitHub release, with a build provenance attestation -# (`gh attestation verify configfile-.tgz --repo mindsers/configfile`); +# - binaries: builds the standalone binary on each system it is made for +# (tools/build-binary.ts), and runs the end-to-end tests with it; +# - github-release: publishes that tarball, the binaries, their SHA256SUMS +# and the CHANGELOG section as a GitHub release, with a build provenance +# attestation for each archive (`gh attestation verify --repo +# mindsers/configfile`). +# The binaries keep the same names from one release to the next, so that +# docs/public/install.sh finds the latest one at releases/latest/download/; # - npm: publishes the same tarball to npm, with npm trusted publishing (no # token stored, provenance statement). It only runs when the repository # variable NPM_PUBLISH is "true", once trusted publishing is set up on # npmjs.com (package settings > Trusted publishing): repository # mindsers/configfile, workflow publish.yml, environment npm. To publish a # version released while it was off, set the variable and re-run this -# workflow for its tag: an existing GitHub release keeps its notes. +# workflow for its tag: an existing GitHub release keeps its notes and the +# files it already has (a rebuilt archive is not byte for byte the same, and +# would break the checksums users have); only missing files are added. on: push: @@ -53,11 +60,8 @@ jobs: run: | mkdir release npm pack --pack-destination release - cd release - [ -f "configfile-$TAG.tgz" ] || { + [ -f "release/configfile-$TAG.tgz" ] || { echo "::error::npm pack did not produce configfile-$TAG.tgz."; exit 1; } - sha256sum "configfile-$TAG.tgz" > SHA256SUMS - cat SHA256SUMS - name: Extract the release notes from the CHANGELOG env: TAG: ${{ github.ref_name }} @@ -75,8 +79,36 @@ jobs: path: release/ if-no-files-found: error - github-release: + binaries: needs: build + strategy: + matrix: + os: [ubuntu-24.04, ubuntu-24.04-arm, macos-15, macos-15-intel] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + # No cache: nothing restored from another run can end up in a release. + - uses: jdx/mise-action@7a4e45a543138629540c9a1616d08632b893e492 # v5.0.1 + with: + version: 2026.9.18 # mise version, updated by Renovate + cache: false + - run: pnpm install --frozen-lockfile --filter configfile + - run: pnpm build:binary + - name: Run the end-to-end tests with the binary + run: | + mkdir "$RUNNER_TEMP/binary" + tar -xzf release/configfile-*.tar.gz -C "$RUNNER_TEMP/binary" + CONFIGFILE_BINARY="$RUNNER_TEMP/binary/configfile" pnpm vitest run tests/e2e.test.ts + - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: binary-${{ matrix.os }} + path: release/configfile-*.tar.gz + if-no-files-found: error + + github-release: + needs: [build, binaries] runs-on: ubuntu-latest permissions: contents: write # create the release @@ -86,23 +118,57 @@ jobs: - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: name: release + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + pattern: binary-* + merge-multiple: true + - name: Keep the files of an existing release + id: keep + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ github.ref_name }} + run: | + gh release view "$TAG" --repo "$GITHUB_REPOSITORY" --json assets \ + --jq '.assets[].name' > published.txt 2> /dev/null || : > published.txt + # Kept aside until attested: only what this run built is attested. + mkdir published + grep '^configfile-' published.txt | while read -r name; do + rm -f "$name" + gh release download "$TAG" --repo "$GITHUB_REPOSITORY" --pattern "$name" --dir published + echo "::notice::$name is kept as published." + done + if ls configfile-* > /dev/null 2>&1; then + echo "built=true" >> "$GITHUB_OUTPUT" + fi + # Attests the files built by this run only: a published file, which may + # have been uploaded by hand, keeps the attestation it has (if any). - uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2 + if: steps.keep.outputs.built == 'true' with: - subject-path: configfile-${{ github.ref_name }}.tgz + subject-path: configfile-* + - name: Compute the checksums + run: | + find published -type f -exec mv {} . \; + sha256sum configfile-* > SHA256SUMS + cat SHA256SUMS - name: Create the GitHub release env: GH_TOKEN: ${{ github.token }} TAG: ${{ github.ref_name }} run: | - # A release created by hand, or by an earlier run: its notes are kept, - # and the files attested above replace any older ones. + # A release created by hand, or by an earlier run: its notes and files + # are kept, the missing files added, and SHA256SUMS (which covers the + # files as published) replaced. if gh release view "$TAG" --repo "$GITHUB_REPOSITORY" > /dev/null 2>&1; then - gh release upload "$TAG" "configfile-$TAG.tgz" SHA256SUMS \ - --repo "$GITHUB_REPOSITORY" --clobber - echo "::notice::The $TAG release already existed: its notes are kept, its files replaced." + for file in configfile-*; do + grep -qxF "$file" published.txt || + gh release upload "$TAG" "$file" --repo "$GITHUB_REPOSITORY" + done + gh release upload "$TAG" SHA256SUMS --repo "$GITHUB_REPOSITORY" --clobber + echo "::notice::The $TAG release already existed: its notes and files are kept, missing files added." exit 0 fi - gh release create "$TAG" "configfile-$TAG.tgz" SHA256SUMS \ + gh release create "$TAG" configfile-* SHA256SUMS \ --repo "$GITHUB_REPOSITORY" --verify-tag \ --title "$TAG" --notes-file notes.md diff --git a/.gitignore b/.gitignore index 7efa14fb..0b9efe72 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,4 @@ dist/ # Astro (docs/) .astro/ +release/ diff --git a/CHANGELOG.md b/CHANGELOG.md index d07820d8..afcbe64b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Standalone binaries for macOS (13.5 or later) and Linux (GNU C library 2.28 or later), on x64 + and arm64, with each release, and an install script: + `curl -fsSL https://docs.configfile.sh/install.sh | sh` installs configfile on a new machine + without Node.js or a package manager ([#301](https://github.com/mindsers/configfile/issues/301)). - Scripts get the repository folder, their name and the system in the `CONFIGFILE_REPO`, `CONFIGFILE_SCRIPT` and `CONFIGFILE_OS` environment variables ([#295](https://github.com/mindsers/configfile/issues/295)). diff --git a/README.md b/README.md index 63f16f2d..9a20f583 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,12 @@ configfile update # later: brings the chan ## Installation +With one command, on macOS or Linux (no package manager or Node.js needed): + +```bash +curl -fsSL https://docs.configfile.sh/install.sh | sh +``` + With [Homebrew](https://brew.sh), on macOS or Linux (Node.js and git come with it): ```bash diff --git a/docs/public/install.sh b/docs/public/install.sh new file mode 100644 index 00000000..dee1ec87 --- /dev/null +++ b/docs/public/install.sh @@ -0,0 +1,130 @@ +#!/bin/sh +# Installs configfile on macOS or Linux, without Node.js or a package manager: +# +# curl -fsSL https://docs.configfile.sh/install.sh | sh +# +# It downloads the standalone binary for this system from the GitHub release, +# checks it against the release's SHA256SUMS, and installs it as +# ~/.local/bin/configfile. Run it again to update configfile. +# +# Settings, as environment variables (put them before `sh`): +# CONFIGFILE_VERSION the version to install (default: the latest release; +# releases have binaries from the one that +# introduced them, 1.0.0 has none) +# CONFIGFILE_INSTALL_DIR where to install it (default: ~/.local/bin) +# CONFIGFILE_DOWNLOAD_URL where releases are downloaded from (default: the +# GitHub releases of mindsers/configfile; for tests +# and mirrors) +# +# Source: https://github.com/mindsers/configfile/blob/master/docs/public/install.sh + +set -eu + +releases="${CONFIGFILE_DOWNLOAD_URL:-https://github.com/mindsers/configfile/releases}" + +say() { printf '%s\n' "$*"; } +fail() { + printf 'configfile installer: %s\n' "$*" >&2 + exit 1 +} + +# The name of the archive for this system, such as configfile-macos-arm64.tar.gz. +archive_name() { + case "$(uname -s)" in + Darwin) system=macos ;; + Linux) system=linux ;; + *) fail "no configfile binary for $(uname -s): it runs on macOS and Linux." ;; + esac + case "$(uname -m)" in + x86_64 | amd64) arch=x64 ;; + arm64 | aarch64) arch=arm64 ;; + *) fail "no configfile binary for $(uname -m) processors: install it with npm instead (https://docs.configfile.sh/getting-started/installation/)." ;; + esac + # A shell running under Rosetta reports x86_64 on Apple silicon. + if [ "$system" = macos ] && [ "$arch" = x64 ] && + [ "$(sysctl -n sysctl.proc_translated 2>/dev/null || true)" = 1 ]; then + arch=arm64 + fi + # The binaries are built for the GNU C library, which Alpine doesn't use. + if [ "$system" = linux ] && ldd --version 2>&1 | grep -qi musl; then + fail "the configfile binary needs the GNU C library, not musl (Alpine): install it with npm instead (https://docs.configfile.sh/getting-started/installation/)." + fi + say "configfile-$system-$arch.tar.gz" +} + +download() { # url file + if command -v curl >/dev/null 2>&1; then + curl -fsSL --retry 2 -o "$2" "$1" || fail "cannot download $1." + elif command -v wget >/dev/null 2>&1; then + wget -q -O "$2" "$1" || fail "cannot download $1." + else + fail "curl or wget is needed to download configfile." + fi +} + +sha256() { # file + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "$1" | cut -d ' ' -f 1 + elif command -v shasum >/dev/null 2>&1; then + shasum -a 256 "$1" | cut -d ' ' -f 1 + else + fail "sha256sum or shasum is needed to check the download." + fi +} + +main() { + name="$(archive_name)" + version="${CONFIGFILE_VERSION:-latest}" + if [ "$version" = latest ]; then + base="$releases/latest/download" + else + base="$releases/download/$version" + fi + dir="${CONFIGFILE_INSTALL_DIR:-$HOME/.local/bin}" + + work="$(mktemp -d)" + draft="$dir/.configfile.$$" + trap 'rm -rf "$work"; rm -f "$draft"' EXIT + # Stopped (Ctrl+C, kill): ends here, the exit trap cleaning up. + trap 'exit 130' INT + trap 'exit 143' TERM + + say "Downloading $base/$name..." + download "$base/$name" "$work/$name" + download "$base/SHA256SUMS" "$work/SHA256SUMS" + expected="$(awk -v name="$name" '$2 == name || $2 == "*" name { print $1 }' "$work/SHA256SUMS")" + [ -n "$expected" ] || fail "SHA256SUMS of the release has no line for $name." + actual="$(sha256 "$work/$name")" + [ "$actual" = "$expected" ] || + fail "$name does not match the checksum of the release: it was not installed." + + tar -xzf "$work/$name" -C "$work" ./configfile || fail "cannot extract $name." + mkdir -p "$dir" || fail "cannot create $dir." + { cp "$work/configfile" "$draft" && chmod 755 "$draft"; } || fail "cannot install configfile in $dir." + # Checked before it replaces anything: an installed configfile is kept when + # the new one cannot run on this system. + installed="$("$draft" --version)" || + fail "the downloaded configfile does not start on this system: nothing was changed in $dir." + # Moved into place in one step, so a configfile running meanwhile is not cut short. + mv -f "$draft" "$dir/configfile" || fail "cannot install configfile in $dir." + say "configfile $installed is installed in $dir/configfile." + + case ":$PATH:" in + *":$dir:"*) + found="$(command -v configfile || true)" + if [ -n "$found" ] && [ "$found" != "$dir/configfile" ]; then + say "Another configfile comes first in your PATH: $found. Remove it, or put $dir first." + fi + ;; + *) say "$dir is not in your PATH: add it to your shell's profile, for example: export PATH=\"$dir:\$PATH\"" ;; + esac + if ! command -v git >/dev/null 2>&1; then + case "$(uname -s)" in + Darwin) say "configfile needs git: install it with xcode-select --install" ;; + *) say "configfile needs git: install it with your system's package manager." ;; + esac + fi + say 'Next: run "configfile init" to connect it to your dotfiles repository.' +} + +main diff --git a/docs/src/content/docs/getting-started/installation.md b/docs/src/content/docs/getting-started/installation.md index 2190254e..de79e805 100644 --- a/docs/src/content/docs/getting-started/installation.md +++ b/docs/src/content/docs/getting-started/installation.md @@ -1,25 +1,56 @@ --- title: Installation -description: Install configfile on macOS or Linux, with Homebrew or npm. +description: Install configfile on macOS or Linux, with one command, Homebrew or npm. sidebar: order: 1 --- ## Requirements -- macOS or Linux -- Node.js 24.11 or later (Homebrew installs it for you) -- git (Homebrew installs it for you; otherwise, when it is missing, *configfile* says how to install it on your system) +- macOS or Linux, on an Intel/AMD (x64) or ARM (arm64) processor +- git (when it is missing, *configfile* says how to install it on your system) + +Installed with Homebrew or npm, *configfile* also needs Node.js 24.11 or later (Homebrew installs it for you). The standalone binary doesn't: it comes with its own, and needs macOS 13.5 or later, or Linux with the GNU C library 2.28 or later. Its install script needs `curl` or `wget`, which most systems have. ## Install -With [Homebrew](https://brew.sh), on macOS or Linux (Node.js and git come with it): +### With one command + +On a new machine, this is the quickest way: no package manager and no Node.js needed. + +```bash +curl -fsSL https://docs.configfile.sh/install.sh | sh +``` + +The [script](https://github.com/mindsers/configfile/blob/master/docs/public/install.sh) downloads the standalone binary for your system from the [latest GitHub release](https://github.com/mindsers/configfile/releases/latest), checks it against the release's `SHA256SUMS`, and installs it as `~/.local/bin/configfile`, once it has checked that the binary starts on your system (a configfile already installed is otherwise left as it is). It says when that folder is not in your `PATH`, and how to add it. Two environment variables change what it does: + +| Variable | Effect | +| --- | --- | +| `CONFIGFILE_VERSION` | the version to install, instead of the latest (releases have binaries from the one that introduced them; 1.0.0 has none) | +| `CONFIGFILE_INSTALL_DIR` | where to install it, instead of `~/.local/bin` | + +```bash +# For every user of the machine (/usr/local/bin needs administrator rights). +curl -fsSL https://docs.configfile.sh/install.sh | sudo CONFIGFILE_INSTALL_DIR=/usr/local/bin sh +``` + +Run the command again to update *configfile*, with the same `CONFIGFILE_INSTALL_DIR` if you set one (`configfile update` syncs your dotfiles, not *configfile* itself). To uninstall it, delete `~/.local/bin/configfile`; your configuration (`~/.configfilerc`, `~/.configfile/`) stays. + +On Linux, the binaries need the GNU C library: on Alpine (musl), or a system older than the requirements above, install with npm. On macOS, a binary downloaded with a web browser is quarantined by Gatekeeper, as it is not notarized: use the install script, or run `xattr -d com.apple.quarantine configfile` on it. + +The binary's own Node.js runs *configfile* only: a `.js` (`.mjs`, `.cjs`) [script](/reference/scripts/) without a shebang line runs with the `node` in your `PATH`, and fails with a message saying so when Node.js is not installed. + +### With Homebrew + +On macOS or Linux (Node.js and git come with it): ```bash brew install mindsers/tap/configfile ``` -With npm, when Node.js 24.11 or later is installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): +### With npm + +When Node.js 24.11 or later is installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): ```bash npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz @@ -27,4 +58,12 @@ npm install --global https://github.com/mindsers/configfile/releases/download/1. Install it one way only: two copies would compete in your `PATH`. -> Version 1.0 is not on the npm registry yet: `npm install --global configfile` still installs 0.3.1. Each release's tarball comes with a `SHA256SUMS` file and a build provenance attestation, which `gh attestation verify configfile-1.0.0.tgz --repo mindsers/configfile` checks. +> Version 1.0 is not on the npm registry yet: `npm install --global configfile` still installs 0.3.1. + +## Check a download + +Each release comes with a `SHA256SUMS` file, which the install script uses, and a build provenance attestation for each archive (the `.tgz` package and every `.tar.gz` binary), which shows it was built by the project's release workflow from the tagged source. Download the archive, then: + +```bash +gh attestation verify configfile-macos-arm64.tar.gz --repo mindsers/configfile +``` diff --git a/docs/src/content/docs/guides/new-machine.md b/docs/src/content/docs/guides/new-machine.md index f51d3932..7c48538f 100644 --- a/docs/src/content/docs/guides/new-machine.md +++ b/docs/src/content/docs/guides/new-machine.md @@ -9,13 +9,13 @@ This guide takes a machine from nothing to your configuration, using a dotfiles ## 1. Install configfile -On macOS, install [Homebrew](https://brew.sh) first if it isn't there yet, then: +On a new machine, install the standalone binary, which needs neither a package manager nor Node.js: ```sh -brew install mindsers/tap/configfile +curl -fsSL https://docs.configfile.sh/install.sh | sh ``` -Homebrew also installs Node.js and git. [Installation](/getting-started/installation/) lists the other ways. +It installs `~/.local/bin/configfile`, and says how to add that folder to your `PATH` when it is not there. *configfile* also needs git: on macOS, `xcode-select --install` installs it. [Installation](/getting-started/installation/) lists the other ways, such as Homebrew. ## 2. Give the machine access to your repository @@ -77,7 +77,10 @@ To set up machines regularly, put the steps in a script. Without a terminal to a #!/bin/sh set -e -brew install mindsers/tap/configfile +# Downloaded first: in "curl ... | sh", set -e would not see a failed download. +curl -fsSL https://docs.configfile.sh/install.sh -o /tmp/install-configfile.sh +sh /tmp/install-configfile.sh +export PATH="$HOME/.local/bin:$PATH" configfile init --repo git@github.com:me/dotfiles.git configfile modules deploy --all configfile scripts run setup diff --git a/docs/src/content/docs/guides/upgrading-from-0-3.md b/docs/src/content/docs/guides/upgrading-from-0-3.md index 3a5eee4c..7dd0e1f6 100644 --- a/docs/src/content/docs/guides/upgrading-from-0-3.md +++ b/docs/src/content/docs/guides/upgrading-from-0-3.md @@ -5,7 +5,7 @@ sidebar: order: 4 --- -- Node.js 24.11 or later is required, on macOS or Linux. Install again as described in [Installation](/getting-started/installation/). To switch to Homebrew, remove the npm version first (`npm uninstall --global configfile`). +- With Homebrew or npm, Node.js 24.11 or later is required, on macOS or Linux; the standalone binary needs none. Install again as described in [Installation](/getting-started/installation/). To switch to Homebrew or the install script, remove the npm version first (`npm uninstall --global configfile`). - `~/.configfilerc`, the repository layout and `settings.json` work as before, including `settings.json` files that are a plain list (the 0.3.1 format, deprecated: put the list in a `"files"` key). Links deployed by 0.3 are recognised as deployed. - If you installed 0.3 with Yarn, remove it first: `yarn global remove configfile`. - `"global": true | false` still works but is deprecated: replace it with `"deploy": "global" | "local"`. diff --git a/docs/src/content/docs/reference/scripts.md b/docs/src/content/docs/reference/scripts.md index fce0434b..38752c9a 100644 --- a/docs/src/content/docs/reference/scripts.md +++ b/docs/src/content/docs/reference/scripts.md @@ -12,7 +12,7 @@ A script can have a version for each system: `macos` or `linux` after the first Scripts can be written in any language: - a script with a shebang line (such as `#!/usr/bin/env python3`) is run directly when it is executable, and with that interpreter otherwise; -- a `.js` (or `.mjs`, `.cjs`) or `.sh` script without shebang line is run with `node` or `sh`; +- a `.js` (or `.mjs`, `.cjs`) or `.sh` script without shebang line is run with Node.js or `sh`: *configfile*'s own Node.js when installed with Homebrew or npm, the `node` in your `PATH` with the [standalone binary](/getting-started/installation/) (the script then fails, saying so, when there is none); - any other executable file (such as a compiled program) is run directly. *configfile* never changes the permissions of your files. Scripts run in the current folder and their output is not modified. `scripts run` doesn't wait for other *configfile* commands: don't run a script while `update` syncs the repository, as it could read files being replaced. With `configfile scripts run`, the messages of *configfile* go to stderr and the script's exit code is forwarded. diff --git a/package.json b/package.json index 93383fba..f43ef937 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "docs:dev": "pnpm --filter configfile-docs dev", "docs:build": "pnpm --filter configfile-docs build", "docs:commands": "node tools/docs-commands.ts", + "build:binary": "node tools/build-binary.ts", "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"", "prepack": "node --run clean && tsc -p tsconfig.build.json" }, @@ -57,6 +58,8 @@ "@types/node": "24.19.0", "@vitest/coverage-v8": "5.0.3", "ajv": "8.20.0", + "esbuild": "0.28.2", + "postject": "1.0.0-alpha.6", "typescript": "7.0.2", "vitest": "5.0.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca1b2279..465e94e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -185,6 +185,12 @@ importers: ajv: specifier: 8.20.0 version: 8.20.0 + esbuild: + specifier: 0.28.2 + version: 0.28.2 + postject: + specifier: 1.0.0-alpha.6 + version: 1.0.0-alpha.6 typescript: specifier: 7.0.2 version: 7.0.2 @@ -1438,6 +1444,10 @@ packages: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + common-ancestor-path@2.0.0: resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} engines: {node: '>= 18'} @@ -2014,6 +2024,11 @@ packages: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -3435,6 +3450,8 @@ snapshots: commander@15.0.0: {} + commander@9.5.0: {} + common-ancestor-path@2.0.0: {} cookie-es@1.2.3: {} @@ -4153,6 +4170,10 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.2 + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + prismjs@1.30.0: {} process-ancestry@0.1.0: {} diff --git a/src/cli.ts b/src/cli.ts index 60641350..1a8c9faa 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -8,11 +8,26 @@ import { interactivePrompts, nonInteractivePrompts } from './prompts.ts' const home = os.homedir() -process.exitCode = await main(process.argv.slice(2), { +// No top-level await: the standalone binaries run this file as CommonJS. +let settled = false +void main(process.argv.slice(2), { home, cwd: process.cwd(), platform: process.platform, output: new Output(process.stdout, process.stderr), prompts: process.stdin.isTTY ? interactivePrompts : nonInteractivePrompts, history: new History(home), +}).then( + code => { + settled = true + process.exitCode = code + }, + error => { + settled = true + throw error + }, +) +// As a top-level await that never settles: a run that stops halfway is not a success. +process.on('exit', () => { + if (!settled) process.exitCode = 13 }) diff --git a/src/process.ts b/src/process.ts index 57428d4e..58af0689 100644 --- a/src/process.ts +++ b/src/process.ts @@ -3,6 +3,7 @@ import { constants, type Stats } from 'node:fs' import { access, open, readFile, stat } from 'node:fs/promises' import { constants as osConstants } from 'node:os' import path from 'node:path' +import { isSea } from 'node:sea' import { CliError } from './errors.ts' import { errnoCode, messageOf } from './fsutil.ts' @@ -84,11 +85,17 @@ interface RunOptions { onSignal?: ((signal: NodeJS.Signals) => void) | undefined } +/** + * The Node.js that runs JavaScript scripts: configfile's own, or in a + * standalone binary (which runs nothing but configfile) the `node` in PATH. + */ +const NODE = isSea() ? 'node' : process.execPath + /** Used for scripts that have no shebang line. */ const INTERPRETERS: Record = { - '.js': process.execPath, - '.mjs': process.execPath, - '.cjs': process.execPath, + '.js': NODE, + '.mjs': NODE, + '.cjs': NODE, '.sh': 'sh', } @@ -98,7 +105,8 @@ const INTERPRETERS: Record = { * - a script with a shebang line (`#!/usr/bin/env python3`) is run directly * when executable, otherwise with that interpreter (arguments of the * shebang line are split on spaces); - * - a `.js` or `.sh` script without shebang line is run with node or sh; + * - a `.js` (`.mjs`, `.cjs`) or `.sh` script without shebang line is run with + * Node.js (see `NODE`) or sh; * - any other executable file (such as a compiled program) is run directly. */ export async function runScript( @@ -125,6 +133,23 @@ export async function runScript( } const interpreter = INTERPRETERS[path.extname(script.path)] + if (interpreter === 'node') { + try { + return await run(interpreter, [script.path, ...args], { cwd, env, onSignal }) + } catch (error) { + if (errnoCode(error) === 'EACCES') { + throw new CliError( + `Cannot run script "${script.name}": the node found in PATH cannot be executed ` + + '(permission denied).', + ) + } + if (errnoCode(error) !== 'ENOENT') throw launchError(script, undefined, error) + throw new CliError( + `Script "${script.name}" needs Node.js, which is not installed. Install it, or add a ` + + 'shebang line (such as "#!/bin/sh") to run it with another program.', + ) + } + } if (interpreter != null) return launch(interpreter, [script.path, ...args]) if (executable) return launch(script.path, args) diff --git a/src/program.ts b/src/program.ts index 950de6df..b1752ce7 100644 --- a/src/program.ts +++ b/src/program.ts @@ -13,16 +13,24 @@ import { CliError, isPromptExit } from './errors.ts' import { messageOf } from './fsutil.ts' import { describeInvocation, type Invocation, shouldRecord } from './history.ts' -const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { - version: string -} +/** Set by tools/build-binary.ts: a standalone binary has no package.json to read. */ +declare const CONFIGFILE_VERSION: string | undefined + +const version = + typeof CONFIGFILE_VERSION === 'string' + ? CONFIGFILE_VERSION + : ( + JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { + version: string + } + ).version export function buildProgram(ctx: Context): Command { // showHelpAfterError, exitOverride and configureOutput are copied to // subcommands when they are created, so they are set before registering them. const program = new Command('configfile') .description('Manage your configuration files from a dotfiles git repository.') - .version(pkg.version) + .version(version) .showHelpAfterError('(add --help for additional information)') .exitOverride() .configureOutput({ @@ -56,7 +64,7 @@ export async function main(args: string[], ctx: Context): Promise { if (shouldRecord(invocation, error)) { const failed = await ctx.history.save({ time, - version: pkg.version, + version, invocation, cwd: ctx.cwd, exitCode: code, diff --git a/tests/e2e.test.ts b/tests/e2e.test.ts index 0636e475..351a06dd 100644 --- a/tests/e2e.test.ts +++ b/tests/e2e.test.ts @@ -11,17 +11,27 @@ import { createSandbox, type Sandbox } from './helpers.ts' // Built by tests/global-setup.ts before the test run. const cli = fileURLToPath(new URL('../dist/cli.js', import.meta.url)) +/** + * The command that runs configfile as users do: the built package, or the + * standalone binary named by CONFIGFILE_BINARY (tools/build-binary.ts). + */ +function command(args: string[]): [string, string[]] { + const binary = process.env.CONFIGFILE_BINARY + return binary ? [binary, args] : [process.execPath, [cli, ...args]] +} + async function exec(args: string[]) { const sandbox = await createSandbox() await sandbox.configure() await sandbox.write('home/dotfiles/files/zsh/settings.json', '{"files": []}') await sandbox.write('home/dotfiles/scripts/fail.sh', 'exit 4\n') + await sandbox.write('home/dotfiles/scripts/hello.js', 'console.log("hello from Node.js")\n') const env: NodeJS.ProcessEnv = { ...process.env, HOME: sandbox.home, NO_COLOR: '1' } // FORCE_COLOR (set by many CI and shells) would override NO_COLOR. delete env.FORCE_COLOR - const result = spawnSync(process.execPath, [cli, ...args], { + const result = spawnSync(...command([...args]), { cwd: sandbox.cwd, env, encoding: 'utf8', @@ -31,6 +41,23 @@ async function exec(args: string[]) { } describe('built CLI', () => { + it('says its version', async () => { + const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')) + + await expect(exec(['--version'])).resolves.toMatchObject({ + code: 0, + stdout: `${pkg.version}\n`, + }) + }) + + it('runs a JavaScript script without shebang line, with Node.js', async () => { + // In a standalone binary, with the node found in PATH. + await expect(exec(['scripts', 'run', 'hello'])).resolves.toMatchObject({ + code: 0, + stdout: 'hello from Node.js\n', + }) + }) + it('runs a command', async () => { await expect(exec(['modules', 'list'])).resolves.toMatchObject({ code: 0, @@ -85,7 +112,7 @@ describe('built CLI', () => { await sandbox.configure() await sandbox.write('home/dotfiles/scripts/long.sh', script) - const child = spawn(process.execPath, [cli, ...args], { + const child = spawn(...command([...args]), { cwd: sandbox.cwd, env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, detached: true, @@ -183,7 +210,7 @@ describe('built CLI', () => { const sandbox = await createSandbox() await withModules(sandbox, { pre_undeploy: 'long' }) await sandbox.configure() - spawnSync(process.execPath, [cli, 'modules', 'deploy', '--all'], { + spawnSync(...command(['modules', 'deploy', '--all']), { cwd: sandbox.cwd, env: { ...process.env, HOME: sandbox.home }, }) @@ -220,15 +247,11 @@ describe('built CLI', () => { it('says how to install git when it is missing, before changing anything', async () => { const sandbox = await createSandbox() - const result = spawnSync( - process.execPath, - [cli, 'init', '--repo', 'https://example.com/dotfiles.git'], - { - cwd: sandbox.cwd, - env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1', PATH: '/nonexistent' }, - encoding: 'utf8', - }, - ) + const result = spawnSync(...command(['init', '--repo', 'https://example.com/dotfiles.git']), { + cwd: sandbox.cwd, + env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1', PATH: '/nonexistent' }, + encoding: 'utf8', + }) expect(result.status).toBe(1) expect(result.stderr).toMatch(/git is not installed\. Install it with/) @@ -241,7 +264,7 @@ describe('built CLI', () => { await sandbox.configure() await mkdir(path.join(sandbox.repo, '.git'), { recursive: true }) - const result = spawnSync(process.execPath, [cli, 'update'], { + const result = spawnSync(...command(['update']), { cwd: sandbox.cwd, env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1', PATH: '/nonexistent' }, encoding: 'utf8', @@ -259,7 +282,7 @@ describe('built CLI', () => { const pidFile = path.join(sandbox.root, 'git.pid') await sandbox.write('bin/git', `#!/bin/sh\necho $$ > "${pidFile}"\nexec sleep 60\n`, 0o755) - const child = spawn(process.execPath, [cli, 'update'], { + const child = spawn(...command(['update']), { cwd: sandbox.cwd, env: { ...process.env, @@ -308,7 +331,7 @@ describe('built CLI', () => { const runs = modules.map( name => new Promise(resolve => { - const child = spawn(process.execPath, [cli, 'modules', 'deploy', name], { + const child = spawn(...command(['modules', 'deploy', name]), { cwd: sandbox.cwd, env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, stdio: 'ignore', @@ -326,7 +349,7 @@ describe('built CLI', () => { // Undeploying every module unwinds the backups down to the original file. for (const _ of modules) { - spawnSync(process.execPath, [cli, 'modules', 'undeploy', '--all'], { + spawnSync(...command(['modules', 'undeploy', '--all']), { cwd: sandbox.cwd, env: { ...process.env, HOME: sandbox.home, NO_COLOR: '1' }, }) @@ -346,7 +369,7 @@ describe('built CLI', () => { { length: 16 }, () => new Promise(resolve => { - const child = spawn(process.execPath, [cli, 'scripts', 'run', 'ok'], { + const child = spawn(...command(['scripts', 'run', 'ok']), { cwd: sandbox.cwd, env, stdio: 'ignore', @@ -395,7 +418,7 @@ describe('built CLI', () => { { length: 16 }, () => new Promise(resolve => { - spawn(process.execPath, [cli, 'scripts', 'run', 'ok'], { + spawn(...command(['scripts', 'run', 'ok']), { cwd: sandbox.cwd, env, stdio: 'ignore', diff --git a/tests/install.test.ts b/tests/install.test.ts new file mode 100644 index 00000000..9a8745b7 --- /dev/null +++ b/tests/install.test.ts @@ -0,0 +1,365 @@ +// The install script (docs/public/install.sh, served at +// https://docs.configfile.sh/install.sh), run against a fake release on disk. +// Fake `uname`, `sysctl` and `ldd` commands, first in PATH, play the system. + +import { execFileSync, spawnSync } from 'node:child_process' +import { createHash } from 'node:crypto' +import { existsSync } from 'node:fs' +import { mkdir, mkdtemp, readdir, readFile, symlink, writeFile } from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' + +import { describe, expect, it } from 'vitest' + +import { archiveName } from '../tools/build-binary.ts' +import { createSandbox, type Sandbox } from './helpers.ts' + +const script = fileURLToPath(new URL('../docs/public/install.sh', import.meta.url)) + +/** Every archive a release has, by the system (`uname -s`, `uname -m`) it is for. */ +const ARCHIVES: [string, string, string][] = [ + ['Darwin', 'arm64', archiveName('darwin', 'arm64')], + ['Darwin', 'x86_64', archiveName('darwin', 'x64')], + ['Linux', 'x86_64', archiveName('linux', 'x64')], + ['Linux', 'amd64', archiveName('linux', 'x64')], + ['Linux', 'aarch64', archiveName('linux', 'arm64')], + ['Linux', 'arm64', archiveName('linux', 'arm64')], +] +/** The system the tests play by default: Linux on x64. */ +const NAME = archiveName('linux', 'x64') + +/** + * A release in /releases/, laid out as on GitHub: an archive + * per system holding a stand-in for the binary (`binary`, which says its + * version by default), and SHA256SUMS. `sums` rewrites the lines of SHA256SUMS. + */ +async function withRelease( + sandbox: Sandbox, + version: string, + { + folder = `download/${version}`, + binary = `#!/bin/sh\necho ${version}\n`, + sums = (line: string) => line, + }: { folder?: string; binary?: string; sums?: (line: string) => string } = {}, +) { + const dir = path.join(sandbox.root, 'releases', folder) + // As tools/build-binary.ts lays it out. + await sandbox.write('build/configfile', binary, 0o755) + await sandbox.write('build/LICENSE', 'license') + await sandbox.write('build/THIRD-PARTY-LICENSES', 'licenses') + await mkdir(dir, { recursive: true }) + const lines = [`${'0'.repeat(64)} configfile-${version}.tgz`] + for (const name of new Set(ARCHIVES.map(([, , name]) => name))) { + execFileSync('tar', ['-czf', path.join(dir, name), '-C', path.join(sandbox.root, 'build'), '.']) + const sum = createHash('sha256') + .update(await readFile(path.join(dir, name))) + .digest('hex') + lines.push(sums(`${sum} ${name}`)) + } + await writeFile(path.join(dir, 'SHA256SUMS'), `${lines.join('\n')}\n`) + return dir +} + +interface System { + /** `uname -s` and `uname -m`. */ + uname?: [string, string] + /** What `sysctl -n sysctl.proc_translated` says (1: under Rosetta). */ + translated?: string + /** What `ldd --version` prints. */ + libc?: string + /** Replaces the PATH of the user, after the fake commands. */ + path?: string +} + +/** Runs install.sh as on `system`, with the version 9.9.9 by default. */ +async function install(sandbox: Sandbox, env: Record = {}, system: System = {}) { + const { uname = ['Linux', 'x86_64'], translated = '0', libc = 'ldd (GNU libc) 2.39' } = system + const fake = path.join(sandbox.root, 'fake') + await sandbox.write( + 'fake/uname', + `#!/bin/sh\ncase "$1" in -s) echo ${uname[0]} ;; -m) echo ${uname[1]} ;; esac\n`, + 0o755, + ) + await sandbox.write('fake/sysctl', `#!/bin/sh\necho ${translated}\n`, 0o755) + await sandbox.write('fake/ldd', `#!/bin/sh\necho '${libc}' >&2\n`, 0o755) + + const result = spawnSync('/bin/sh', [script], { + cwd: sandbox.cwd, + encoding: 'utf8', + env: { + PATH: `${fake}:${system.path ?? process.env.PATH ?? ''}`, + HOME: sandbox.home, + // As in most terminals: a UTF-8 locale changes how some shells read the script. + LANG: 'en_US.UTF-8', + CONFIGFILE_DOWNLOAD_URL: pathToFileURL(path.join(sandbox.root, 'releases')).href, + CONFIGFILE_VERSION: '9.9.9', + ...env, + }, + }) + return { code: result.status, stdout: result.stdout, stderr: result.stderr } +} + +/** + * A folder with links to these commands only, for a PATH without the others. + * Commands this system doesn't have are left out. + */ +async function only(sandbox: Sandbox, ...commands: string[]): Promise { + const dir = await mkdtemp(path.join(sandbox.root, 'only-')) + for (const command of commands) { + const found = spawnSync('/bin/sh', ['-c', `command -v ${command}`], { encoding: 'utf8' }) + if (found.status === 0) await symlink(found.stdout.trim(), path.join(dir, command)) + } + return dir +} + +/** What install.sh needs from the system, besides a downloader and a checksum tool. */ +const BASICS = [ + 'sh', + 'mktemp', + 'rm', + 'awk', + 'cut', + 'grep', + 'tar', + 'gzip', + 'mkdir', + 'cp', + 'chmod', + 'mv', +] + +const installed = (sandbox: Sandbox) => path.join(sandbox.home, '.local/bin/configfile') + +describe('install.sh', () => { + it('installs the binary of the release in ~/.local/bin, checked against SHA256SUMS', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + + const result = await install(sandbox) + + const binary = installed(sandbox) + expect(result.code, result.stderr).toBe(0) + expect(execFileSync(binary, { encoding: 'utf8' })).toBe('9.9.9\n') + expect(result.stdout).toContain(`configfile 9.9.9 is installed in ${binary}.`) + expect(result.stdout).toContain(`${path.dirname(binary)} is not in your PATH`) + expect(result.stdout).toContain('Next: run "configfile init"') + // Only the binary: the licenses stay in the archive, and no draft is left. + expect(await readdir(path.dirname(binary))).toEqual(['configfile']) + }) + + it.each(ARCHIVES)('downloads the archive for %s %s: %s', async (system, machine, name) => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + + const result = await install(sandbox, {}, { uname: [system, machine] }) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain(`/releases/download/9.9.9/${name}...`) + }) + + it('downloads the archive for Apple silicon from a shell running under Rosetta', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + + const result = await install(sandbox, {}, { uname: ['Darwin', 'x86_64'], translated: '1' }) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain(`/${archiveName('darwin', 'arm64')}...`) + }) + + it.each([ + [['FreeBSD', 'amd64'], 'no configfile binary for FreeBSD: it runs on macOS and Linux.'], + [['Linux', 'riscv64'], 'no configfile binary for riscv64 processors: install it with npm'], + ] as const)('refuses a system it has no binary for: %s', async (uname, message) => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + + const result = await install(sandbox, {}, { uname: [...uname] }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain(message) + expect(existsSync(installed(sandbox))).toBe(false) + }) + + it('refuses a Linux without the GNU C library (Alpine)', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + + const result = await install(sandbox, {}, { libc: 'musl libc (x86_64)' }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + 'needs the GNU C library, not musl (Alpine): install it with npm', + ) + expect(existsSync(installed(sandbox))).toBe(false) + }) + + it('installs where CONFIGFILE_INSTALL_DIR says, replacing an older version', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + const dir = path.join(sandbox.root, 'bin') + await sandbox.write('bin/configfile', '#!/bin/sh\necho 1.0.0\n', 0o755) + + const result = await install( + sandbox, + { CONFIGFILE_INSTALL_DIR: dir }, + { path: `${dir}:${process.env.PATH ?? ''}` }, + ) + + expect(result.code, result.stderr).toBe(0) + expect(execFileSync(path.join(dir, 'configfile'), { encoding: 'utf8' })).toBe('9.9.9\n') + expect(result.stdout).not.toContain('not in your PATH') + expect(result.stdout).not.toContain('Another configfile') + }) + + it('says when another configfile comes first in PATH', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + const other = path.join(sandbox.root, 'other') + await sandbox.write('other/configfile', '#!/bin/sh\necho 0.3.1\n', 0o755) + + const result = await install( + sandbox, + {}, + { path: `${other}:${path.dirname(installed(sandbox))}:${process.env.PATH ?? ''}` }, + ) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain( + `Another configfile comes first in your PATH: ${path.join(other, 'configfile')}.`, + ) + }) + + it('keeps the installed configfile when the new one does not start on this system', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9', { binary: '#!/bin/sh\nexit 1\n' }) + await sandbox.write('home/.local/bin/configfile', '#!/bin/sh\necho 1.0.0\n', 0o755) + + const result = await install(sandbox) + + expect(result.code).toBe(1) + expect(result.stderr).toContain( + `the downloaded configfile does not start on this system: nothing was changed in ${path.dirname(installed(sandbox))}.`, + ) + expect(execFileSync(installed(sandbox), { encoding: 'utf8' })).toBe('1.0.0\n') + expect(await readdir(path.dirname(installed(sandbox)))).toEqual(['configfile']) + }) + + it('installs nothing when the download does not match its checksum', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9', { sums: line => `${'f'.repeat(64)}${line.slice(64)}` }) + + const result = await install(sandbox) + + expect(result.code).toBe(1) + expect(result.stderr).toContain(`${NAME} does not match the checksum of the release`) + expect(existsSync(installed(sandbox))).toBe(false) + }) + + it('installs nothing when SHA256SUMS has no line for the archive', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9', { sums: () => '' }) + + const result = await install(sandbox) + + expect(result.code).toBe(1) + expect(result.stderr).toContain(`SHA256SUMS of the release has no line for ${NAME}.`) + expect(existsSync(installed(sandbox))).toBe(false) + }) + + it('reads SHA256SUMS lines written for binary files (*name)', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9', { sums: line => line.replace(' ', ' *') }) + + const result = await install(sandbox) + + expect(result.code, result.stderr).toBe(0) + }) + + it('says which download failed', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + + const result = await install(sandbox, { CONFIGFILE_VERSION: '8.8.8' }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain(`cannot download ${pathToFileURL(sandbox.root).href}`) + expect(result.stderr).toContain(`/releases/download/8.8.8/${NAME}`) + }) + + it('installs the latest release by default', async () => { + const sandbox = await createSandbox() + // GitHub serves the latest release at releases/latest/download/. + await withRelease(sandbox, '9.9.9', { folder: 'latest/download' }) + + const result = await install(sandbox, { CONFIGFILE_VERSION: '' }) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain(`/releases/latest/download/${NAME}...`) + }) + + it('says when the folder to install into cannot be created', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + const file = await sandbox.write('file') + + const result = await install(sandbox, { CONFIGFILE_INSTALL_DIR: path.join(file, 'bin') }) + + expect(result.code).toBe(1) + expect(result.stderr).toContain(`cannot create ${path.join(file, 'bin')}.`) + }) + + it('downloads with wget when curl is missing', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + // wget cannot read file:// URLs: a stand-in copies the file. + await sandbox.write( + 'wget/wget', + // biome-ignore lint/suspicious/noTemplateCurlyInString: shell parameter expansion. + '#!/bin/sh\n# wget -q -O \ncp "${4#file://}" "$3"\n', + 0o755, + ) + const tools = await only(sandbox, ...BASICS, 'sha256sum', 'shasum', 'git') + + const result = await install( + sandbox, + {}, + { path: `${path.join(sandbox.root, 'wget')}:${tools}` }, + ) + + expect(result.code, result.stderr).toBe(0) + expect(execFileSync(installed(sandbox), { encoding: 'utf8' })).toBe('9.9.9\n') + }) + + it('says what is missing to download or check the binary, once', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + + const noDownloader = await install( + sandbox, + {}, + { path: await only(sandbox, ...BASICS, 'sha256sum', 'shasum') }, + ) + const noChecksum = await install(sandbox, {}, { path: await only(sandbox, ...BASICS, 'curl') }) + + expect(noDownloader.code).toBe(1) + expect(noDownloader.stderr).toContain('curl or wget is needed to download configfile.') + expect(noChecksum.code).toBe(1) + expect(noChecksum.stderr.trim()).toBe( + 'configfile installer: sha256sum or shasum is needed to check the download.', + ) + }) + + it('says when git is missing', async () => { + const sandbox = await createSandbox() + await withRelease(sandbox, '9.9.9') + const tools = await only(sandbox, ...BASICS, 'curl', 'sha256sum', 'shasum') + + const result = await install(sandbox, {}, { path: tools }) + + expect(result.code, result.stderr).toBe(0) + expect(result.stdout).toContain( + "configfile needs git: install it with your system's package manager.", + ) + }) +}) diff --git a/tests/process-sea.test.ts b/tests/process-sea.test.ts new file mode 100644 index 00000000..b470ddb3 --- /dev/null +++ b/tests/process-sea.test.ts @@ -0,0 +1,67 @@ +// In a standalone binary (tools/build-binary.ts), configfile's Node.js runs +// only configfile: JavaScript scripts without shebang line run with the node +// found in PATH. isSea() is read when src/process.ts loads, hence this file. + +import { chmod, readFile } from 'node:fs/promises' +import path from 'node:path' + +import { describe, expect, it, vi } from 'vitest' + +import { runScript } from '../src/process.ts' +import { createSandbox, type Sandbox } from './helpers.ts' + +vi.mock('node:sea', () => ({ isSea: () => true })) + +async function withScript(sandbox: Sandbox) { + const file = await sandbox.write('scripts/hello.js', 'console.log("hello")\n') + return { name: 'hello', file: 'hello.js', path: file } +} + +describe('runScript in a standalone binary', () => { + it('runs a .js script without shebang line with the node found in PATH', async () => { + const sandbox = await createSandbox() + const script = await withScript(sandbox) + const log = path.join(sandbox.root, 'log') + // A stand-in for node: says what it was given. + await sandbox.write('bin/node', `#!/bin/sh\necho "$@" > "${log}"\nexit 3\n`, 0o755) + + const code = await runScript(script, ['--flag'], { + cwd: sandbox.cwd, + env: { PATH: `${path.join(sandbox.root, 'bin')}:/usr/bin:/bin` }, + }) + + expect(code).toBe(3) + expect(await readFile(log, 'utf8')).toBe(`${script.path} --flag\n`) + }) + + it('says to install Node.js when there is none', async () => { + const sandbox = await createSandbox() + const script = await withScript(sandbox) + + await expect( + runScript(script, [], { cwd: sandbox.cwd, env: { PATH: path.join(sandbox.root, 'none') } }), + ).rejects.toThrow( + 'Script "hello" needs Node.js, which is not installed. Install it, or add a shebang line', + ) + }) + + // root runs any file whatever its permissions. + it.skipIf(process.getuid?.() === 0)( + 'names the node of PATH when it cannot be executed', + async () => { + const sandbox = await createSandbox() + const script = await withScript(sandbox) + const node = await sandbox.write('bin/node', '#!/bin/sh\n') + await chmod(node, 0o644) + + await expect( + runScript(script, [], { + cwd: sandbox.cwd, + env: { PATH: path.join(sandbox.root, 'bin') }, + }), + ).rejects.toThrow( + 'Cannot run script "hello": the node found in PATH cannot be executed (permission denied).', + ) + }, + ) +}) diff --git a/tools/build-binary.ts b/tools/build-binary.ts new file mode 100644 index 00000000..107c206e --- /dev/null +++ b/tools/build-binary.ts @@ -0,0 +1,150 @@ +// Builds the standalone binary of configfile for the system it runs on: a +// copy of this Node.js with configfile bundled into it (Node.js single +// executable applications), so that a new machine needs neither Node.js nor +// a package manager. Run it with the Node.js the binary should embed: +// +// node tools/build-binary.ts +// +// It writes release/configfile--.tar.gz, holding the binary +// `configfile`, its LICENSE, and THIRD-PARTY-LICENSES (Node.js and the +// bundled packages). The binary is run once, to check it starts. + +import { execFileSync } from 'node:child_process' +import { copyFile, mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +import { build } from 'esbuild' + +const root = fileURLToPath(new URL('..', import.meta.url)) +/** The sentinel Node.js looks for to know it carries an application. */ +const FUSE = 'NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2' +/** The systems and architectures binaries are made for, by their name in releases. */ +const SYSTEMS: Partial> = { darwin: 'macos', linux: 'linux' } +const ARCHS: Partial> = { arm64: 'arm64', x64: 'x64' } + +/** The name of the archive for this system, such as `configfile-macos-arm64.tar.gz`. */ +export function archiveName(platform: NodeJS.Platform, arch: NodeJS.Architecture): string { + const system = SYSTEMS[platform] + const machine = ARCHS[arch] + if (system == null || machine == null) { + throw new Error(`No binary is made for ${platform} ${arch}.`) + } + return `configfile-${system}-${machine}.tar.gz` +} + +async function main(): Promise { + const { version } = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')) as { + version: string + } + const archive = path.join(root, 'release', archiveName(process.platform, process.arch)) + const work = await mkdtemp(path.join(tmpdir(), 'configfile-binary-')) + + try { + // 1. One CommonJS file: the form Node.js runs in a single executable. + const bundle = path.join(work, 'configfile.cjs') + const { metafile } = await build({ + entryPoints: [path.join(root, 'src/cli.ts')], + bundle: true, + platform: 'node', + format: 'cjs', + target: `node${process.versions.node}`, + outfile: bundle, + define: { CONFIGFILE_VERSION: JSON.stringify(version) }, + legalComments: 'none', + metafile: true, + logLevel: 'warning', + // import.meta is only read when CONFIGFILE_VERSION is not set, which it is here. + logOverride: { 'empty-import-meta': 'silent' }, + }) + + // 2. The blob Node.js loads at start, then a copy of Node.js carrying it. + const config = path.join(work, 'sea-config.json') + const blob = path.join(work, 'sea.blob') + await writeFile( + config, + JSON.stringify({ + main: bundle, + output: blob, + disableExperimentalSEAWarning: true, + // NODE_OPTIONS is for the user's Node.js: it must not change how configfile starts. + execArgvExtension: 'none', + }), + ) + execFileSync(process.execPath, ['--experimental-sea-config', config], { stdio: 'inherit' }) + + const folder = path.join(work, 'configfile') + await mkdir(folder) + const binary = path.join(folder, 'configfile') + await copyFile(process.execPath, binary) + // macOS checks the signature of every binary: the one Node.js came with + // no longer matches once the blob is added, so it is replaced. + if (process.platform === 'darwin') { + execFileSync('codesign', ['--remove-signature', binary], { stdio: 'inherit' }) + } + execFileSync( + path.join(root, 'node_modules/.bin/postject'), + [ + binary, + 'NODE_SEA_BLOB', + blob, + '--sentinel-fuse', + FUSE, + ...(process.platform === 'darwin' ? ['--macho-segment-name', 'NODE_SEA'] : []), + ], + { stdio: 'inherit' }, + ) + if (process.platform === 'darwin') { + execFileSync('codesign', ['--sign', '-', binary], { stdio: 'inherit' }) + } + + // 3. It starts, and says the version it was built for. + const reported = execFileSync(binary, ['--version'], { encoding: 'utf8' }).trim() + if (reported !== version) { + throw new Error(`The binary says it is ${reported}, not ${version}.`) + } + + // 4. The archive, with the licenses of what the binary contains. + await copyFile(path.join(root, 'LICENSE'), path.join(folder, 'LICENSE')) + await writeFile( + path.join(folder, 'THIRD-PARTY-LICENSES'), + await thirdPartyLicenses(Object.keys(metafile.inputs)), + ) + await mkdir(path.dirname(archive), { recursive: true }) + await rm(archive, { force: true }) + execFileSync('tar', ['-czf', archive, '-C', folder, '.'], { stdio: 'inherit' }) + console.log( + `${path.relative(root, archive)}: configfile ${version}, Node.js ${process.version}`, + ) + } finally { + await rm(work, { recursive: true, force: true }) + } +} + +/** + * The licenses of Node.js (the binary is a copy of it) and of every package + * bundled into it, found from the files the bundle was made of. + */ +async function thirdPartyLicenses(inputs: string[]): Promise { + const sections: string[] = [] + const node = path.resolve(path.dirname(process.execPath), '..', 'LICENSE') + sections.push(`Node.js ${process.version}\n\n${await readFile(node, 'utf8')}`) + + const packages = new Set() + for (const input of inputs) { + const match = /^(.*node_modules\/(?:@[^/]+\/)?[^/]+)\//.exec(input) + if (match?.[1] != null) packages.add(path.resolve(root, match[1])) + } + for (const folder of [...packages].sort()) { + const { name, version } = JSON.parse( + await readFile(path.join(folder, 'package.json'), 'utf8'), + ) as { name: string; version: string } + const file = (await readdir(folder)).find(entry => /^licen[sc]e/i.test(entry)) + if (file == null) throw new Error(`${name} ${version} has no license file to ship.`) + sections.push(`${name} ${version}\n\n${await readFile(path.join(folder, file), 'utf8')}`) + } + return `${sections.map(section => section.trimEnd()).join(`\n\n${'-'.repeat(72)}\n\n`)}\n` +} + +if (import.meta.main) await main() From a40426c6ff4fe71cac7b94332e01230586712b07 Mon Sep 17 00:00:00 2001 From: mindsers Date: Wed, 14 Oct 2026 22:18:01 +0200 Subject: [PATCH 341/341] chore(release): 1.1.0 Sets the version to 1.1.0, dates its changelog section, and points the npm install commands at its release. --- CHANGELOG.md | 5 ++++- README.md | 2 +- docs/src/content/docs/getting-started/installation.md | 4 ++-- docs/src/content/docs/guides/scripts-and-ci.md | 2 +- package.json | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afcbe64b..16bf26b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] + +## [1.1.0] - 2026-10-14 ### Added - Standalone binaries for macOS (13.5 or later) and Linux (GNU C library 2.28 or later), on x64 and arm64, with each release, and an install script: @@ -165,7 +167,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The `run` command to run custom and saved scripts. Scripts can be write in all languages. - The README file to give first information on the project (installation, usage, etc.). -[Unreleased]: https://github.com/mindsers/configfile/compare/1.0.0...HEAD +[Unreleased]: https://github.com/mindsers/configfile/compare/1.1.0...HEAD +[1.1.0]: https://github.com/mindsers/configfile/tree/1.1.0 [1.0.0]: https://github.com/mindsers/configfile/tree/1.0.0 [0.3.1]: https://github.com/mindsers/configfile/tree/0.3.1 [0.3.0]: https://github.com/mindsers/configfile/tree/0.3.0 diff --git a/README.md b/README.md index 9a20f583..a0fe8dac 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ brew install mindsers/tap/configfile With npm, when Node.js 24.11 or later is installed: ```bash -npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz +npm install --global https://github.com/mindsers/configfile/releases/download/1.1.0/configfile-1.1.0.tgz ``` [Installation](https://docs.configfile.sh/getting-started/installation/) has the details, including how to verify a download. diff --git a/docs/src/content/docs/getting-started/installation.md b/docs/src/content/docs/getting-started/installation.md index de79e805..0a87b925 100644 --- a/docs/src/content/docs/getting-started/installation.md +++ b/docs/src/content/docs/getting-started/installation.md @@ -53,12 +53,12 @@ brew install mindsers/tap/configfile When Node.js 24.11 or later is installed, from the [GitHub release](https://github.com/mindsers/configfile/releases/latest): ```bash -npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz +npm install --global https://github.com/mindsers/configfile/releases/download/1.1.0/configfile-1.1.0.tgz ``` Install it one way only: two copies would compete in your `PATH`. -> Version 1.0 is not on the npm registry yet: `npm install --global configfile` still installs 0.3.1. +> Versions 1.x are not on the npm registry yet: `npm install --global configfile` still installs 0.3.1. ## Check a download diff --git a/docs/src/content/docs/guides/scripts-and-ci.md b/docs/src/content/docs/guides/scripts-and-ci.md index f5417c5d..85c6020b 100644 --- a/docs/src/content/docs/guides/scripts-and-ci.md +++ b/docs/src/content/docs/guides/scripts-and-ci.md @@ -71,7 +71,7 @@ jobs: - uses: actions/setup-node@v7 with: node-version: 24 - - run: npm install --global https://github.com/mindsers/configfile/releases/download/1.0.0/configfile-1.0.0.tgz + - run: npm install --global https://github.com/mindsers/configfile/releases/download/1.1.0/configfile-1.1.0.tgz # The following steps use a throwaway home folder, not the runner's. - run: | mkdir -p "$RUNNER_TEMP/home" diff --git a/package.json b/package.json index f43ef937..292eb19d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "configfile", - "version": "1.0.0", + "version": "1.1.0", "description": "Manage your dotfiles and setup scripts from a git repository.", "keywords": [ "dotfiles",