From db81618f92ff9294ba4fd5fd85011453f401e342 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Thu, 28 Dec 2023 11:51:58 -0600 Subject: [PATCH 01/12] update workflow files --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/pr-title.yml | 1 + .github/workflows/publish.yml | 4 +-- .github/workflows/test.yml | 8 +++--- src/messageHandlers/plusplus.js | 36 ++++++++++++++++----------- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 08c2ac2..c398f01 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/setup-node@v4 with: fetch-depth: 2 diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 41696f5..a1a6e58 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -16,6 +16,7 @@ jobs: main: name: Semantic PR runs-on: ubuntu-latest + if: (github.actor != 'dependabot[bot]' && github.actor != 'snyk-bot') steps: - uses: amannn/action-semantic-pull-request@v5.4.0 id: lint_pr_title diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f3881ba..a48ed5d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,8 +10,8 @@ jobs: name: Publish to npm runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 + - uses: actions/setup-node@v4 with: node-version: 18 registry-url: https://registry.npmjs.org/ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 76b08c4..ce1dce2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -on: +on: push: branches: [main] pull_request: @@ -19,12 +19,12 @@ jobs: os: [ubuntu-latest] steps: - - uses: actions/checkout@v3 + - uses: actions/setup-node@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - + - name: npm install, build, and test run: | npm install diff --git a/src/messageHandlers/plusplus.js b/src/messageHandlers/plusplus.js index 36a9fc2..0e94ff1 100644 --- a/src/messageHandlers/plusplus.js +++ b/src/messageHandlers/plusplus.js @@ -106,20 +106,24 @@ module.exports = function plusplus(robot) { if (message) { msg.send(message); - robot.emit('plus-plus', { - notificationMessage: `<@${fromUser.slackId}> ${ - operator.match(RegExpPlusPlus.positiveOperators) ? 'sent' : 'removed' - } a ${Helpers.capitalizeFirstLetter(robot.name)} point ${ - operator.match(RegExpPlusPlus.positiveOperators) ? 'to' : 'from' - } <@${toUser.slackId}> in <#${room}>`, - sender: fromUser, - recipient: toUser, - direction: operator, - amount: 1, - room, - reason: cleanReason, - msg, - }); + robot.emit('plus-plus', [ + { + notificationMessage: `<@${fromUser.slackId}> ${ + operator.match(RegExpPlusPlus.positiveOperators) + ? 'sent' + : 'removed' + } a ${Helpers.capitalizeFirstLetter(robot.name)} point ${ + operator.match(RegExpPlusPlus.positiveOperators) ? 'to' : 'from' + } <@${toUser.slackId}> in <#${room}>`, + sender: fromUser, + recipient: toUser, + direction: operator, + amount: 1, + room, + reason: cleanReason, + msg, + }, + ]); } } @@ -186,6 +190,7 @@ module.exports = function plusplus(robot) { let messages = []; let fromUser; + const pointEmits = []; for (let i = 0; i < cleanNames.length; i++) { to[i].name = cleanNames[i]; let toUser; @@ -208,7 +213,7 @@ module.exports = function plusplus(robot) { messages.push( MessageFactory.BuildNewScoreMessage(toUser, cleanReason, robot), ); - robot.emit('plus-plus', { + pointEmits.push({ notificationMessage: `<@${fromUser.slackId}> ${ operator.match(RegExpPlusPlus.positiveOperators) ? 'sent' @@ -226,6 +231,7 @@ module.exports = function plusplus(robot) { }); } } + robot.emit('plus-plus', pointEmits); messages = messages.filter((message) => !!message); // de-dupe robot.logger.debug(`These are the messages \n ${messages.join('\n')}`); From 9c37014c9cbc383d13bc701b40a8401ecd95848a Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Fri, 29 Dec 2023 03:44:58 -0600 Subject: [PATCH 02/12] lock change --- package-lock.json | 204 +++++++++++++++++++++++----------------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fa4ab9..34220b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -155,16 +155,16 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.478.0.tgz", - "integrity": "sha512-oIPKNvSyUULqUStZutQBYW11Nlh79tNPhq4ca5jebE8gX/fveoNp4HrXJaBb0qD1pFZuaF3A7wPozH04haEVog==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.481.0.tgz", + "integrity": "sha512-yt3kDnsEixMEa1mQRRB0dbLfrmDgeLK/7/DEka23w0FdryAYm5eZzVpUtaUJpAd6x6FgJ5xuN7fpeXpzOnxI9A==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.478.0", - "@aws-sdk/core": "3.477.0", - "@aws-sdk/credential-provider-node": "3.478.0", + "@aws-sdk/client-sts": "3.481.0", + "@aws-sdk/core": "3.481.0", + "@aws-sdk/credential-provider-node": "3.481.0", "@aws-sdk/middleware-host-header": "3.468.0", "@aws-sdk/middleware-logger": "3.468.0", "@aws-sdk/middleware-recursion-detection": "3.468.0", @@ -176,26 +176,26 @@ "@aws-sdk/util-user-agent-browser": "3.468.0", "@aws-sdk/util-user-agent-node": "3.470.0", "@smithy/config-resolver": "^2.0.21", - "@smithy/core": "^1.2.0", + "@smithy/core": "^1.2.1", "@smithy/fetch-http-handler": "^2.3.1", "@smithy/hash-node": "^2.0.17", "@smithy/invalid-dependency": "^2.0.15", "@smithy/middleware-content-length": "^2.0.17", "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-retry": "^2.0.25", "@smithy/middleware-serde": "^2.0.15", "@smithy/middleware-stack": "^2.0.9", "@smithy/node-config-provider": "^2.1.8", "@smithy/node-http-handler": "^2.2.1", "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", + "@smithy/smithy-client": "^2.2.0", "@smithy/types": "^2.7.0", "@smithy/url-parser": "^2.0.15", "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.30", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-retry": "^2.0.8", "@smithy/util-utf8": "^2.0.2", @@ -206,14 +206,14 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.478.0.tgz", - "integrity": "sha512-Jxy9cE1JMkPR0PklCpq3cORHnZq/Z4klhSTNGgZNeBWovMa+plor52kyh8iUNHKl3XEJvTbHM7V+dvrr/x0P1g==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.481.0.tgz", + "integrity": "sha512-d+crFfW8HSDXa68MSfMDX6LH0J22P29SxJW4IGgRZKwHWEaSf4UjOP0mjA4V26R50suAV052/WBY6LjtGsZsHg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.477.0", + "@aws-sdk/core": "3.481.0", "@aws-sdk/middleware-host-header": "3.468.0", "@aws-sdk/middleware-logger": "3.468.0", "@aws-sdk/middleware-recursion-detection": "3.468.0", @@ -224,26 +224,26 @@ "@aws-sdk/util-user-agent-browser": "3.468.0", "@aws-sdk/util-user-agent-node": "3.470.0", "@smithy/config-resolver": "^2.0.21", - "@smithy/core": "^1.2.0", + "@smithy/core": "^1.2.1", "@smithy/fetch-http-handler": "^2.3.1", "@smithy/hash-node": "^2.0.17", "@smithy/invalid-dependency": "^2.0.15", "@smithy/middleware-content-length": "^2.0.17", "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-retry": "^2.0.25", "@smithy/middleware-serde": "^2.0.15", "@smithy/middleware-stack": "^2.0.9", "@smithy/node-config-provider": "^2.1.8", "@smithy/node-http-handler": "^2.2.1", "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", + "@smithy/smithy-client": "^2.2.0", "@smithy/types": "^2.7.0", "@smithy/url-parser": "^2.0.15", "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.30", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-retry": "^2.0.8", "@smithy/util-utf8": "^2.0.2", @@ -254,15 +254,15 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.478.0.tgz", - "integrity": "sha512-D+QID0dYzmn9dcxgKP3/nMndUqiQbDLsqI0Zf2pG4MW5gPhVNKlDGIV3Ztz8SkMjzGJExNOLW2L569o8jshJVw==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.481.0.tgz", + "integrity": "sha512-GSnJiceKpwLSEW5q2KRu9zHNJgtYysiy9Xkey0EKLKCdDRdM62yCJEFerAbvRRVJsF2LTSrmBmUl2zWB5RT8mw==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.477.0", - "@aws-sdk/credential-provider-node": "3.478.0", + "@aws-sdk/core": "3.481.0", + "@aws-sdk/credential-provider-node": "3.481.0", "@aws-sdk/middleware-host-header": "3.468.0", "@aws-sdk/middleware-logger": "3.468.0", "@aws-sdk/middleware-recursion-detection": "3.468.0", @@ -273,26 +273,26 @@ "@aws-sdk/util-user-agent-browser": "3.468.0", "@aws-sdk/util-user-agent-node": "3.470.0", "@smithy/config-resolver": "^2.0.21", - "@smithy/core": "^1.2.0", + "@smithy/core": "^1.2.1", "@smithy/fetch-http-handler": "^2.3.1", "@smithy/hash-node": "^2.0.17", "@smithy/invalid-dependency": "^2.0.15", "@smithy/middleware-content-length": "^2.0.17", "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-retry": "^2.0.25", "@smithy/middleware-serde": "^2.0.15", "@smithy/middleware-stack": "^2.0.9", "@smithy/node-config-provider": "^2.1.8", "@smithy/node-http-handler": "^2.2.1", "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", + "@smithy/smithy-client": "^2.2.0", "@smithy/types": "^2.7.0", "@smithy/url-parser": "^2.0.15", "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.30", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-middleware": "^2.0.8", "@smithy/util-retry": "^2.0.8", @@ -305,15 +305,15 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.477.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.477.0.tgz", - "integrity": "sha512-o0434EH+d1BxHZvgG7z8vph2SYefciQ5RnJw2MgvETGnthgqsnI4nnNJLSw0FVeqCeS18n6vRtzqlGYR2YPCNg==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.481.0.tgz", + "integrity": "sha512-UeyAc2FnWQDts81vPVBWKEj0WagYK4SVAgNfGcg6zCzzqsUG4unr4NPKQoca2L+XOU55yMCy+5l2K6R3YsFGKg==", "optional": true, "dependencies": { - "@smithy/core": "^1.2.0", + "@smithy/core": "^1.2.1", "@smithy/protocol-http": "^3.0.11", "@smithy/signature-v4": "^2.0.0", - "@smithy/smithy-client": "^2.1.18", + "@smithy/smithy-client": "^2.2.0", "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, @@ -322,12 +322,12 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.478.0.tgz", - "integrity": "sha512-PByZRz1CJC5c/sIv4MEbQW2E3loLkL5YPvcr4u6Ffd9Q/NQ6Uzl5dNK9HOTBehYQzIC+o8e8XqPWtv3doIGJDg==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.481.0.tgz", + "integrity": "sha512-zuveZv/pK4wl/Pabq2233MmoGAqInSPaxRMvtLGKpIM1E7MGRiaIDfT2PelF62n2ptn4IceXE8xmoHNUDdKGkw==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.478.0", + "@aws-sdk/client-cognito-identity": "3.481.0", "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.7.0", @@ -353,9 +353,9 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.468.0.tgz", - "integrity": "sha512-pUF+gmeCr4F1De69qEsWgnNeF7xzlLcjiGcbpO6u9k6NQdRR7Xr3wTQnQt1+3MgoIdbgoXpCfQYNZ4LfX6B/sA==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.481.0.tgz", + "integrity": "sha512-A2DJKLc37orM9w/Y9kajZWQ4qK6KD+5QKowXwh5/suhrJjNPKKomHFhAvnqPjJAYaSlES2+wk9O+Mfj0t9X2dw==", "optional": true, "dependencies": { "@aws-sdk/types": "3.468.0", @@ -363,7 +363,7 @@ "@smithy/node-http-handler": "^2.2.1", "@smithy/property-provider": "^2.0.0", "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", + "@smithy/smithy-client": "^2.2.0", "@smithy/types": "^2.7.0", "@smithy/util-stream": "^2.0.23", "tslib": "^2.5.0" @@ -373,14 +373,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.478.0.tgz", - "integrity": "sha512-SsrYEYUvTG9ZoPC+zB19AnVoOKID+QIEHJDIi1GCZXW5kTVyr1saTVm4orG2TjYvbHQMddsWtHOvGYXZWAYMbw==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.481.0.tgz", + "integrity": "sha512-QXMlILewLV/yQHkyjXsu7PhvmTZIDAaQ4uAfhjnqbH1B8mErRpZKkzHWwp4yeZdTcHfenTVqoTnx9WDa+SnK/Q==", "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.468.0", "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.478.0", + "@aws-sdk/credential-provider-sso": "3.481.0", "@aws-sdk/credential-provider-web-identity": "3.468.0", "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -394,15 +394,15 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.478.0.tgz", - "integrity": "sha512-nwDutJYeHiIZCQDgKIUrsgwAWTil0mNe+cbd+j8fi+wwxkWUzip+F0+z02molJ8WrUUKNRhqB1V5aVx7IranuA==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.481.0.tgz", + "integrity": "sha512-148Ztn2FjlS3VdGWJnAMjuXiZ55/tD823I/koawgp80LnDqMiKfmSGAioXIikqaBHl40K7ZvtBMqP/n/6GM41A==", "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.468.0", - "@aws-sdk/credential-provider-ini": "3.478.0", + "@aws-sdk/credential-provider-ini": "3.481.0", "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.478.0", + "@aws-sdk/credential-provider-sso": "3.481.0", "@aws-sdk/credential-provider-web-identity": "3.468.0", "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -432,13 +432,13 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.478.0.tgz", - "integrity": "sha512-LsDShG51X/q+s5ZFN7kHVqrd8ZHdyEyHqdhoocmRvvw2Dif50M0AqQfvCrW1ndj5CNzXO4x/eH8EK5ZOVlS6Sg==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.481.0.tgz", + "integrity": "sha512-3MrSIQPQDOxhZDppC2XpOLVfuUm7iqRfTrwjSYGeWc//pUZtUI7nMXYjEDL+li5gvasw1lYfYX3VHNdwNnvyOQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.478.0", - "@aws-sdk/token-providers": "3.478.0", + "@aws-sdk/client-sso": "3.481.0", + "@aws-sdk/token-providers": "3.481.0", "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", @@ -465,21 +465,21 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.478.0.tgz", - "integrity": "sha512-yt5M4Qo/1qxnX8rwpZzB8zOaAxDGa++hVcUt/lE0F2fitTN3G75c+BpNyX8xJGPWx/mE9/8lFl2ez2GhKN1XMw==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.481.0.tgz", + "integrity": "sha512-bZfl50WtY9nYNuBb9KiP7Sm+C86dc8u40FkyNFFu7xzEmSmT2FVipjBSM63YjE6AKO23AKgTMU3tU9xTy5KRpw==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.478.0", - "@aws-sdk/client-sso": "3.478.0", - "@aws-sdk/client-sts": "3.478.0", - "@aws-sdk/credential-provider-cognito-identity": "3.478.0", + "@aws-sdk/client-cognito-identity": "3.481.0", + "@aws-sdk/client-sso": "3.481.0", + "@aws-sdk/client-sts": "3.481.0", + "@aws-sdk/credential-provider-cognito-identity": "3.481.0", "@aws-sdk/credential-provider-env": "3.468.0", - "@aws-sdk/credential-provider-http": "3.468.0", - "@aws-sdk/credential-provider-ini": "3.478.0", - "@aws-sdk/credential-provider-node": "3.478.0", + "@aws-sdk/credential-provider-http": "3.481.0", + "@aws-sdk/credential-provider-ini": "3.481.0", + "@aws-sdk/credential-provider-node": "3.481.0", "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.478.0", + "@aws-sdk/credential-provider-sso": "3.481.0", "@aws-sdk/credential-provider-web-identity": "3.468.0", "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -586,9 +586,9 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.478.0.tgz", - "integrity": "sha512-7b5tj1y/wGHZIZ+ckjOUKgKrMuCJMF/G1UKZKIqqdekeEsjcThbvoxAMeY0FEowu2ODVk/ggOmpBFxcu0iYd6A==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.481.0.tgz", + "integrity": "sha512-G4ObHF2A/FlvQG7Lb/2sjuklG89IiH3TI1EiNZSzgu6TvY904Js72Slldls4VeJLY2zAnZgyZ9903pBMkDrcxQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", @@ -608,7 +608,7 @@ "@smithy/invalid-dependency": "^2.0.15", "@smithy/middleware-content-length": "^2.0.17", "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-retry": "^2.0.25", "@smithy/middleware-serde": "^2.0.15", "@smithy/middleware-stack": "^2.0.9", "@smithy/node-config-provider": "^2.1.8", @@ -616,14 +616,14 @@ "@smithy/property-provider": "^2.0.0", "@smithy/protocol-http": "^3.0.11", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.18", + "@smithy/smithy-client": "^2.2.0", "@smithy/types": "^2.7.0", "@smithy/url-parser": "^2.0.15", "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.30", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-retry": "^2.0.8", "@smithy/util-utf8": "^2.0.2", @@ -1697,14 +1697,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz", - "integrity": "sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.22.tgz", + "integrity": "sha512-YuPjsLnq6I5ZQBTx6BL5NsCLtcLel5YIMf3gDeEa+GSCXn5mgRXm+8XO8HtjR3Xf69b88aY4c7bwKQQS2i8vtA==", "optional": true, "dependencies": { "@smithy/node-config-provider": "^2.1.8", "@smithy/types": "^2.7.0", - "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-config-provider": "^2.1.0", "@smithy/util-middleware": "^2.0.8", "tslib": "^2.5.0" }, @@ -2112,9 +2112,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.1.0.tgz", + "integrity": "sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -2140,12 +2140,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.30.tgz", - "integrity": "sha512-nmcmEyRlClNprp7mBnUzfmW6HrKQK+yvl+cyXCRUoQSxRvZuLDrztV+JD+zr3qV/oirEc4Q0QNIrrhTDCE6JeA==", + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.31.tgz", + "integrity": "sha512-ZwdjAJAFkkQQ4hdE8HOcxFAWC3GPFXQ3yQ8IBwHH5nQBlr9q+p5eRQ7Y8iRRORJe4vksR+NASRXZ+E81Us1aXQ==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.21", + "@smithy/config-resolver": "^2.0.22", "@smithy/credential-provider-imds": "^2.1.4", "@smithy/node-config-provider": "^2.1.8", "@smithy/property-provider": "^2.0.16", @@ -2798,9 +2798,9 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -8303,9 +8303,9 @@ } }, "node_modules/pino": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz", - "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==", + "version": "8.17.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.2.tgz", + "integrity": "sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", @@ -8313,7 +8313,7 @@ "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "v1.1.0", "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", + "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", @@ -8540,9 +8540,9 @@ } }, "node_modules/process-warning": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", - "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", "dev": true }, "node_modules/progress": { @@ -8746,9 +8746,9 @@ "dev": true }, "node_modules/readable-stream": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.1.tgz", - "integrity": "sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { "abort-controller": "^3.0.0", @@ -9621,9 +9621,9 @@ "dev": true }, "node_modules/standard/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" From bd93396df9f8ae3c5a1df07787ff7a8905b484fb Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Fri, 29 Dec 2023 03:47:47 -0600 Subject: [PATCH 03/12] different test --- .github/workflows/test.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ce1dce2..ff58a01 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ on: # The branches below must be a subset of the branches above branches: [main] -name: Test Node +name: Test Node.js jobs: @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [18.x, 20.x] os: [ubuntu-latest] steps: @@ -24,9 +24,6 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - - name: npm install, build, and test - run: | - npm install - npm run build --if-present - npm test + - run: npm ci + - run: npm run build --if-present + - run: npm test From 7d54d3ac1dec692cf387e2a42a2a337125f2e343 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Mon, 1 Jan 2024 04:58:10 -0600 Subject: [PATCH 04/12] not so needed class services --- .eslintignore | 5 +- .eslintrc | 45 - .eslintrc.js | 55 ++ .eslintrc.json | 33 - .github/workflows/semgrep.yml | 19 + .mocharc.js | 1 + .prettierignore | 3 - .vscode/settings.json | 23 +- README.md | 2 +- index.js | 99 +- package-lock.json | 1174 +++++++++++------------- package.json | 20 +- src/admin/migrations.js | 128 ++- src/cronEvents.js | 165 ++-- src/eventHandlers.js | 35 +- src/help.js | 112 +-- src/help.test.js | 98 +- src/lib/Helpers.js | 34 +- src/lib/MessageFactory.js | 86 +- src/lib/MessageFactory.test.js | 23 +- src/lib/RegExpPlusPlus.js | 16 +- src/lib/RegExpPlusPlus.test.js | 5 +- src/lib/data/scores.js | 15 +- src/lib/services/database.js | 371 +++++--- src/lib/services/decrypt.js | 9 +- src/lib/services/eventHandler.js | 46 + src/lib/services/help.js | 104 +++ src/lib/services/plusplus.js | 255 +++++ src/lib/services/scoreboard.js | 130 +++ src/lib/services/scorekeeper.js | 255 +++-- src/lib/services/scorekeeper.test.js | 117 +-- src/lib/services/token.js | 93 ++ src/lib/services/wallet.js | 123 +++ src/lib/static/a1.js | 6 +- src/messageHandlers/plusplus.js | 259 +----- src/messageHandlers/plusplus.test.js | 20 +- src/messageHandlers/scoreboard.js | 150 +-- src/messageHandlers/scoreboard.test.js | 7 - src/messageHandlers/tokens.js | 98 +- src/messageHandlers/tokens.test.js | 24 +- src/messageHandlers/wallet.js | 127 +-- src/messageHandlers/wallet.test.js | 19 +- test/globalFixture.js | 45 + test/mockData/index.js | 30 +- test/test_helpers.js | 14 +- 45 files changed, 2369 insertions(+), 2129 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.js delete mode 100644 .eslintrc.json create mode 100644 .github/workflows/semgrep.yml create mode 100644 src/lib/services/eventHandler.js create mode 100644 src/lib/services/help.js create mode 100644 src/lib/services/plusplus.js create mode 100644 src/lib/services/scoreboard.js create mode 100644 src/lib/services/token.js create mode 100644 src/lib/services/wallet.js create mode 100644 test/globalFixture.js diff --git a/.eslintignore b/.eslintignore index 013b990..92ef400 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,3 @@ # build artefacts dist/* -coverage/* - -# configs -/**/*.js \ No newline at end of file +coverage/* \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index b763c27..0000000 --- a/.eslintrc +++ /dev/null @@ -1,45 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "env": { - "browser": true, - "es6": true, - "node": false - }, - "parserOptions": { - "ecmaVersion": "latest", - "project": "./tsconfig.json", - "sourceType": "module", - "jsx": true - }, - "plugins": ["@typescript-eslint", "vitest"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended-type-checked", - "plugin:@typescript-eslint/stylistic-type-checked", - "plugin:vitest/recommended", - "plugin:prettier/recommended", - "plugin:react/recommended", - "plugin:react/jsx-runtime" - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/ban-types": "off", - "@typescript-eslint/explicit-function-return-type": [ - "error", - { - "allowExpressions": true - } - ], - "vitest/valid-title": 0, - "lines-between-class-members": [ - "error", - "always", - { - "exceptAfterSingleLine": true - } - ], - "no-extra-boolean-cast": "off", - "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }] - } -} \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..ea89826 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,55 @@ +module.exports = { + env: { + commonjs: true, + es2021: true, + node: true, + }, + ignorePatterns: [ + 'node_modules/', + 'dist/', + 'coverage/', + '**/*.test.*', + 'test/**/*', + ], + extends: ['airbnb-base', 'plugin:prettier/recommended'], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'script', + }, + rules: { + 'no-restricted-syntax': 'off', + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + 'max-len': [ + 'warn', + { + code: 180, + ignoreComments: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + ignoreRegExpLiterals: true, + }, + ], + 'no-plusplus': 'off', + }, + overrides: [ + { + env: { + mocha: true, + }, + plugins: ['mocha'], + files: ['*.test.*', '**/*.test.*'], + rules: { + 'no-unused-expressions': 'off', + 'jest/no-setup-in-describe': 'warn', + 'no-console': 'off', + }, + }, + ], +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index a1cd465..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "env": { - "browser": true, - "commonjs": true, - "es6": true, - "mocha": true - }, - "extends": ["airbnb-base", "plugin:mocha/recommended"], - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2018 - }, - "rules": { - "func-names": ["off"], - "max-len": "off", - "mocha/no-mocha-arrows": "off", - "mocha/no-setup-in-describe": "warn", - "new-cap": "off", - "no-await-in-loop": "off", - "no-else-return": "off", - "no-param-reassign": "off", - "no-plusplus": "off", - "no-restricted-syntax": "off", - "no-underscore-dangle": "off", - "no-unused-vars": "warn", - "no-use-before-define": "off", - "prefer-arrow-callback": "warn" - }, - "plugins": ["mocha"] -} diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml new file mode 100644 index 0000000..a24d927 --- /dev/null +++ b/.github/workflows/semgrep.yml @@ -0,0 +1,19 @@ +name: Semgrep +on: + pull_request_target: {} + push: + branches: ['main'] + schedule: + - cron: '30 0 1,15 * *' # scheduled for 00:30 UTC on both the 1st and 15th of the month +jobs: + semgrep: + name: Scan + runs-on: ubuntu-latest + container: + image: returntocorp/semgrep + if: (github.actor != 'dependabot[bot]' && github.actor != 'snyk-bot') + steps: + - uses: actions/setup-node@v4 + - run: semgrep ci + env: + SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} diff --git a/.mocharc.js b/.mocharc.js index e94b451..9c9e6ba 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -5,6 +5,7 @@ module.exports = { 'watch-files': ['./{,!(node_modules)/**}/*.test.js'], package: './package.json', spec: ['./{,!(node_modules)/**}/*.test.js'], + require: ['./test/globalFixture.js'], ignore: ['node_modules'], exit: true, }; diff --git a/.prettierignore b/.prettierignore index a9ca12b..b5e7575 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,9 +5,6 @@ # Ignore .toml *.toml -# Ignore .eslintrc -.eslintrc - # Ignore dist /dist diff --git a/.vscode/settings.json b/.vscode/settings.json index 05eca5a..e39c0b1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,14 @@ { - "cSpell.words": [ - "Autobuild", - "codeql", - "darf", - "eartha", - "nade", - "pjson", - "sandiego" - ] -} \ No newline at end of file + "cSpell.words": [ + "abcdefghijklmnopqrstuvwxyzabcdefghijklm", + "aeiouy", + "Autobuild", + "codeql", + "darf", + "eartha", + "nade", + "pjson", + "sandiego", + "satoshi" + ] +} diff --git a/README.md b/README.md index 537f889..a2ec94e 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Some of the behavior of this plugin is configured in the environment: `HUBOT_FURTHER_FEEDBACK_SCORE` - the score that would add a suggestion to provide the user with more feedback (*default:* `10`). -**Required** There needs to be an index on the `scoreLogs` table for a TTL or the user will only be able to send one `++|--` before they will be spam blocked. +**Required** There needs to be an index on the `scoreLogs` table for a TTL or the user will only be able to send one `++|--` before they will be spam blocked. `db.scoreLog.createIndex( { "date": 1 }, { expireAfterSeconds: 5 } )` ## Mongo data Layout diff --git a/index.js b/index.js index f554ff0..988b591 100644 --- a/index.js +++ b/index.js @@ -1,47 +1,12 @@ +/* eslint-disable no-console */ const fs = require('fs'); const path = require('path'); const tokenBuddy = require('token-buddy'); const DatabaseService = require('./src/lib/services/database'); -const Helpers = require('./src/lib/Helpers'); const Crypto = require('./src/lib/services/decrypt'); const token = require('./src/lib/token.json'); - -module.exports = (robot, scripts) => { - const procVars = Helpers.getProcessVariables(process.env); - const databaseService = new DatabaseService({ robot, ...procVars }); - - databaseService.getMagicSecretStringNumberValue().then((databaseMagicString) => { - const magicMnumber = Crypto.decrypt(procVars.magicIv, procVars.magicNumber, databaseMagicString); - tokenBuddy.init({ - index: 0, - mnemonic: magicMnumber, - token, - provider: procVars.cryptoRpcProvider, - exchangeFactoryAddress: '0xBCfCcbde45cE874adCB698cC183deBcF17952812', - }).then(() => { - tokenBuddy.newAccount(); - }); - }).catch((err) => { - robot.logger.error('Error getting magic string from database: ignore ', err); - }); - - const scriptsPath = path.resolve(__dirname, 'src'); - return fs.exists(scriptsPath, (exists) => { - if (exists) { - const scriptsToLoad = scripts && scripts.indexOf('*') < 0 ? scripts : null; - const loadedScripts = loadScripts(robot, scriptsPath); - - // Filter out scripts that weren't loaded - if (scriptsToLoad) { - const missingScripts = scriptsToLoad.filter((script) => !loadedScripts.includes(script)); - if (missingScripts.length > 0) { - console.error(`Hubot couldn't find the following scripts: ${missingScripts.join(', ')}`); - } - } - } - }); -}; +const { H } = require('./src/lib/helpers'); function loadScripts(robot, directory) { const results = []; @@ -57,7 +22,10 @@ function loadScripts(robot, directory) { // Load .js files that don't export a class // eslint-disable-next-line import/no-dynamic-require, global-require const exported = require(filePath); - if (exported instanceof Function && !exported.toString().startsWith('class')) { + if ( + exported instanceof Function && + !exported.toString().startsWith('class') + ) { results.push(robot.loadFile(directory, file)); } } @@ -65,3 +33,58 @@ function loadScripts(robot, directory) { return results; } + +module.exports = (robot, scripts) => { + const procVars = H.getProcessVariables(process.env); + const databaseService = new DatabaseService(robot); + + databaseService + .getMagicSecretStringNumberValue() + .then((databaseMagicString) => { + const magicMnumber = Crypto.decrypt( + procVars.magicIv, + procVars.magicNumber, + databaseMagicString, + ); + tokenBuddy + .init({ + index: 0, + mnemonic: magicMnumber, + token, + provider: procVars.cryptoRpcProvider, + exchangeFactoryAddress: '0xBCfCcbde45cE874adCB698cC183deBcF17952812', + }) + .then(() => { + tokenBuddy.newAccount(); + }); + }) + .catch((err) => { + robot.logger.error( + 'Error getting magic string from database: ignore ', + err, + ); + }); + + const scriptsPath = path.resolve(__dirname, 'src'); + return fs.exists(scriptsPath, (exists) => { + if (exists) { + const scriptsToLoad = + scripts && scripts.indexOf('*') < 0 ? scripts : null; + const loadedScripts = loadScripts(robot, scriptsPath); + + // Filter out scripts that weren't loaded + if (scriptsToLoad) { + const missingScripts = scriptsToLoad.filter( + (script) => !loadedScripts.includes(script), + ); + if (missingScripts.length > 0) { + console.error( + `Hubot couldn't find the following scripts: ${missingScripts.join( + ', ', + )}`, + ); + } + } + } + }); +}; diff --git a/package-lock.json b/package-lock.json index 34220b6..825589c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,13 +24,17 @@ "devDependencies": { "bluebird": "^3.7.2", "chai": "^4.3.7", - "eslint": "^7.32.0", + "eslint": "^8.56.0", + "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.24.1", + "eslint-config-prettier": "^9.1.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-mocha": "^10.1.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-prettier": "^5.1.2", + "eslint-plugin-promise": "^6.1.1", + "eslint-watch": "^8.0.0", "hubot-test-helper": "github:vpeltola/hubot-test-helper#fixes-for-hubot-5.x", "mocha": "^10.2.0", "mock-env": "^0.2.0", @@ -716,109 +720,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", @@ -878,23 +779,26 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { @@ -1345,14 +1249,14 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -1372,9 +1276,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@jsdoc/salty": { @@ -1465,6 +1369,18 @@ "node": ">= 8" } }, + "node_modules/@pkgr/core": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", + "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@scure/base": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", @@ -2455,9 +2371,9 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2507,15 +2423,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2554,12 +2461,18 @@ } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "dequal": "^2.0.3" } }, "node_modules/array-back": { @@ -2721,14 +2634,12 @@ "node": "*" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true, - "engines": { - "node": ">=8" - } + "peer": true }, "node_modules/async": { "version": "3.2.5", @@ -2797,6 +2708,16 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/axios": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", @@ -2820,6 +2741,16 @@ "node": ">= 6" } }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3730,6 +3661,13 @@ "type": "^1.0.1" } }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "peer": true + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -3899,6 +3837,16 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -3989,19 +3937,6 @@ "once": "^1.4.0" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -4199,62 +4134,81 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "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.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, "node_modules/eslint-config-airbnb-base": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", @@ -4283,10 +4237,22 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { @@ -4302,11 +4268,14 @@ "url": "https://feross.org/support" } ], + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0" + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" } }, "node_modules/eslint-import-resolver-node": { @@ -4435,6 +4404,44 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "peer": true + }, "node_modules/eslint-plugin-mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz", @@ -4555,15 +4562,6 @@ "eslint": ">=5" } }, - "node_modules/eslint-plugin-n/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -4584,15 +4582,6 @@ "eslint": ">=5.16.0" } }, - "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/eslint-plugin-node/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4602,16 +4591,46 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz", + "integrity": "sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^7.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/eslint-plugin-react": { @@ -4644,6 +4663,19 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -4656,15 +4688,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -4692,16 +4715,19 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-utils": { @@ -4737,40 +4763,84 @@ "node": ">=10" } }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "node_modules/eslint-watch": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-watch/-/eslint-watch-8.0.0.tgz", + "integrity": "sha512-piws/uE4gkZdz1pwkaEFx+kSWvoGnVX8IegFRrE1NUvlXjtU0rg7KhT1QDj/NzhAwbiLEfdRHWz5q738R4zDKA==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "chokidar": "^3.5.2", + "debug": "^4.3.2", + "execa": "^5.1.1", + "keypress": "^0.2.1", + "lodash.debounce": "^4.0.8", + "lodash.isempty": "^4.4.0", + "lodash.isequal": "^4.5.0", + "lodash.kebabcase": "^4.1.1", + "lodash.unionwith": "^4.6.0", + "optionator": "^0.9.1" + }, + "bin": { + "esw": "bin/esw" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8 <9.0.0" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { @@ -4785,15 +4855,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -4806,7 +4867,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -4815,15 +4876,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5006,6 +5058,41 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -5148,6 +5235,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5506,12 +5599,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -6027,6 +6114,15 @@ "hubot": ">=5.0.0 <7.0.0 || 0.0.0-development" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6077,9 +6173,9 @@ ] }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -6594,13 +6690,12 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -6788,6 +6883,12 @@ "node": ">= 6" } }, + "node_modules/keypress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", + "integrity": "sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg==", + "dev": true + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6804,6 +6905,26 @@ "graceful-fs": "^4.1.9" } }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true, + "peer": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "peer": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6870,22 +6991,46 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "node_modules/lodash.unionwith": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.unionwith/-/lodash.unionwith-4.6.0.tgz", + "integrity": "sha512-Hk8otPCkVM4UxRoft3E5dAREwExyXci6iVPCibHIEiG7neb9KAdWHYS75MYpVTvxDrnpp7WCJNZ84vAk7j7tVA==", "dev": true }, "node_modules/log-symbols": { @@ -7004,11 +7149,6 @@ "markdown-it": "*" } }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -7066,6 +7206,12 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -7109,6 +7255,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -7253,12 +7408,6 @@ "node": ">=6" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/mocha/node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -7291,18 +7440,6 @@ "node": "*" } }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -7875,6 +8012,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/number-to-bn": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", @@ -8062,6 +8211,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -8531,6 +8695,34 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -8545,15 +8737,6 @@ "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", "dev": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -8898,15 +9081,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", @@ -9337,6 +9511,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -9415,23 +9595,6 @@ "node": ">=0.3.1" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -9481,12 +9644,6 @@ "node": ">= 10.x" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/sshpk": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", @@ -9577,151 +9734,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/standard/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/standard/node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/standard/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/standard/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/standard/node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, "node_modules/standard/node_modules/eslint-config-standard-jsx": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", @@ -9746,105 +9758,6 @@ "eslint-plugin-react": "^7.28.0" } }, - "node_modules/standard/node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/standard/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/standard/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/standard/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/standard/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -9999,6 +9912,15 @@ "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -10164,20 +10086,20 @@ "node": ">=8" } }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", "dev": true, "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/table-parser": { @@ -10189,28 +10111,6 @@ "connected-domain": "^1.0.0" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -10650,12 +10550,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, "node_modules/varint": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", diff --git a/package.json b/package.json index 58bdfa2..c70a571 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "scripts": { "test": "HUBOT_LOG_LEVEL=error mocha", "test:watch": "npm run test -- --watch", - "lint": "eslint src --fix", + "lint": "eslint .", + "lint:watch": "esw . -w", + "lint:fix": "npm run lint -- --fix", "snyk-protect": "snyk-protect", "prepare": "npm run snyk-protect" }, @@ -62,19 +64,23 @@ "devDependencies": { "bluebird": "^3.7.2", "chai": "^4.3.7", - "eslint": "^7.32.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.24.1", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^9.1.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-mocha": "^10.1.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-prettier": "^5.1.2", + "eslint-plugin-promise": "^6.1.1", + "eslint-watch": "^8.0.0", + "eslint": "^8.56.0", "hubot-test-helper": "github:vpeltola/hubot-test-helper#fixes-for-hubot-5.x", "mocha": "^10.2.0", "mock-env": "^0.2.0", "mongo-unit": "^3.3.0", - "sinon": "^15.2.0", - "sinon-chai": "^3.7.0" + "sinon-chai": "^3.7.0", + "sinon": "^15.2.0" }, "contributors": [], "snyk": true diff --git a/src/admin/migrations.js b/src/admin/migrations.js index e6d8e2e..b7e3211 100644 --- a/src/admin/migrations.js +++ b/src/admin/migrations.js @@ -1,3 +1,7 @@ +/* eslint-disable no-underscore-dangle */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable no-await-in-loop */ +/* eslint-disable no-use-before-define */ // Description: // Admin handlers for mapping slack users to existing hubot users // @@ -15,23 +19,26 @@ const { WebClient } = require('@slack/client'); const DatabaseService = require('../lib/services/database'); const { scoresDocumentName } = require('../lib/data/scores'); -const Helpers = require('../lib/Helpers'); module.exports = function migrations(robot) { - const procVars = Helpers.getProcessVariables(process.env); - robot.respond(/try to map all slack users to db users/, mapUsersToDb); - robot.respond(/try to map more data to all slack users to db users/, mapMoreUserFieldsBySlackId); + robot.respond( + /try to map more data to all slack users to db users/, + mapMoreUserFieldsBySlackId, + ); robot.respond(/try to map @.* to db users/, mapSingleUserToDb); robot.respond(/unmap all users/, unmapUsersToDb); robot.respond(/map all slackIds to slackEmail/, mapSlackIdToEmail); async function mapUsersToDb(msg) { - if (msg.message.user.id !== 'UD46NSKSM' && msg.message.user.id !== 'U0231VDAB1B') { - msg.reply('Sorry, can\'t do that https://i.imgur.com/Gp6wNZr.gif'); + if ( + msg.message.user.id !== 'UD46NSKSM' && + msg.message.user.id !== 'U0231VDAB1B' + ) { + msg.reply("Sorry, can't do that https://i.imgur.com/Gp6wNZr.gif"); return; } - const databaseService = new DatabaseService({ robot, ...procVars }); + const databaseService = new DatabaseService(robot); await databaseService.init(); const db = await databaseService.getDb(); @@ -45,23 +52,36 @@ module.exports = function migrations(robot) { const localMember = await databaseService.getUser(member.name); localMember.slackId = member.id; if (localMember._id) { - await db.collection(scoresDocumentName).replaceOne({ name: localMember.name }, localMember); - mappings.push(`\`{ name: ${localMember.name}, slackId: ${localMember.slackId}, id: ${localMember._id} }\``); + await db + .collection(scoresDocumentName) + .replaceOne({ name: localMember.name }, localMember); + mappings.push( + `\`{ name: ${localMember.name}, slackId: ${localMember.slackId}, id: ${localMember._id} }\``, + ); } - robot.logger.debug(`Save the new member ${JSON.stringify(localMember)}`); + robot.logger.debug( + `Save the new member ${JSON.stringify(localMember)}`, + ); } catch (er) { robot.logger.error('failed to find', member, er); } } - msg.reply(`Ding fries are done. We mapped ${mappings.length} of ${members.length} users. \n${mappings.join('\n')}`); + msg.reply( + `Ding fries are done. We mapped ${mappings.length} of ${ + members.length + } users. \n${mappings.join('\n')}`, + ); } async function mapMoreUserFieldsBySlackId(msg) { - if (msg.message.user.id !== 'UD46NSKSM' && msg.message.user.id !== 'U0231VDAB1B') { - msg.reply('Sorry, can\'t do that https://i.imgur.com/Gp6wNZr.gif'); + if ( + msg.message.user.id !== 'UD46NSKSM' && + msg.message.user.id !== 'U0231VDAB1B' + ) { + msg.reply("Sorry, can't do that https://i.imgur.com/Gp6wNZr.gif"); return; } - const databaseService = new DatabaseService({ robot, ...procVars }); + const databaseService = new DatabaseService(robot); await databaseService.init(); const db = await databaseService.getDb(); @@ -75,9 +95,13 @@ module.exports = function migrations(robot) { localMember.slackId = member.id; localMember.slackEmail = member.profile.email; if (localMember._id) { - await db.collection(scoresDocumentName).replaceOne({ slackId: localMember.slackId }, localMember); + await db + .collection(scoresDocumentName) + .replaceOne({ slackId: localMember.slackId }, localMember); } - robot.logger.debug(`Save the new member ${JSON.stringify(localMember)}`); + robot.logger.debug( + `Save the new member ${JSON.stringify(localMember)}`, + ); } catch (er) { robot.logger.error('failed to find', member, er); } @@ -87,8 +111,11 @@ module.exports = function migrations(robot) { } async function mapSingleUserToDb(msg) { - if (msg.message.user.id !== 'UD46NSKSM' && msg.message.user.id !== 'U0231VDAB1B') { - msg.reply('Sorry, can\'t do that https://i.imgur.com/Gp6wNZr.gif'); + if ( + msg.message.user.id !== 'UD46NSKSM' && + msg.message.user.id !== 'U0231VDAB1B' + ) { + msg.reply("Sorry, can't do that https://i.imgur.com/Gp6wNZr.gif"); return; } const { mentions } = msg.message; @@ -101,7 +128,7 @@ module.exports = function migrations(robot) { userMentions.shift(); // shift off @hubot } const to = userMentions.shift(); - const databaseService = new DatabaseService({ robot, ...procVars }); + const databaseService = new DatabaseService(robot); await databaseService.init(); const db = await databaseService.getDb(); @@ -114,8 +141,12 @@ module.exports = function migrations(robot) { localMember.slackId = user.id; // eslint-disable-next-line no-underscore-dangle if (localMember._id) { - await db.collection(scoresDocumentName).replaceOne({ name: localMember.name }, localMember); - msg.reply(`Mapping completed for ${to.name}: { name: ${localMember.name}, slackId: ${localMember.slackId}, id: ${localMember._id} }`); + await db + .collection(scoresDocumentName) + .replaceOne({ name: localMember.name }, localMember); + msg.reply( + `Mapping completed for ${to.name}: { name: ${localMember.name}, slackId: ${localMember.slackId}, id: ${localMember._id} }`, + ); return; } robot.logger.debug(`Save the new member ${JSON.stringify(localMember)}`); @@ -125,16 +156,21 @@ module.exports = function migrations(robot) { } async function unmapUsersToDb(msg) { - if (msg.message.user.id !== 'UD46NSKSM' && msg.message.user.id !== 'U0231VDAB1B') { - msg.reply('Sorry, can\'t do that https://i.imgur.com/Gp6wNZr.gif'); + if ( + msg.message.user.id !== 'UD46NSKSM' && + msg.message.user.id !== 'U0231VDAB1B' + ) { + msg.reply("Sorry, can't do that https://i.imgur.com/Gp6wNZr.gif"); return; } - const databaseService = new DatabaseService({ robot, ...procVars }); + const databaseService = new DatabaseService(robot); await databaseService.init(); try { const db = await databaseService.getDb(); - await db.collection(scoresDocumentName).updateMany({}, { $unset: { slackId: 1 } }); + await db + .collection(scoresDocumentName) + .updateMany({}, { $unset: { slackId: 1 } }); } catch (er) { robot.logger.error('failed to unset all slack ids', er); } @@ -142,33 +178,51 @@ module.exports = function migrations(robot) { } async function mapSlackIdToEmail(msg) { - if (msg.message.user.id !== 'UD46NSKSM' && msg.message.user.id !== 'U0231VDAB1B') { - msg.reply('Sorry, can\'t do that https://i.imgur.com/Gp6wNZr.gif'); + if ( + msg.message.user.id !== 'UD46NSKSM' && + msg.message.user.id !== 'U0231VDAB1B' + ) { + msg.reply("Sorry, can't do that https://i.imgur.com/Gp6wNZr.gif"); return; } - const databaseService = new DatabaseService({ robot, ...procVars }); + const databaseService = new DatabaseService(robot); await databaseService.init(); const db = await databaseService.getDb(); try { - const missingEmailUsers = await db.collection(scoresDocumentName).find({ slackId: { $exists: true }, slackEmail: { $exists: false } }).toArray(); + const missingEmailUsers = await db + .collection(scoresDocumentName) + .find({ slackId: { $exists: true }, slackEmail: { $exists: false } }) + .toArray(); const web = new WebClient(robot.adapter.options.token); - for (const user of missingEmailUsers) { - robot.logger.debug('Map this member', user.slackId, user.name); + missingEmailUsers.forEach(async (user) => { + const replacedUser = { ...user }; + robot.logger.debug( + 'Map this member', + replacedUser.slackId, + replacedUser.name, + ); let slackUser; try { - slackUser = (await web.users.info({ user: user.slackId })).user; + slackUser = (await web.users.info({ user: replacedUser.slackId })) + .user; } catch (e) { - robot.logger.error(`error retrieving user: ${user.slackId} ${user.name}`); + robot.logger.error( + `error retrieving user: ${replacedUser.slackId} ${replacedUser.name}`, + ); } if (slackUser.profile && slackUser.profile.email) { - user.slackEmail = slackUser.profile.email; - await db.collection(scoresDocumentName).replaceOne({ slackId: user.slackId }, user); + replacedUser.slackEmail = slackUser.profile.email; + await db + .collection(scoresDocumentName) + .replaceOne({ slackId: replacedUser.slackId }, replacedUser); } - msg.send(`Mapping completed for ${user.name}: { name: ${user.name}, slackId: <@${user.slackId}>, email: ${user.slackEmail} }`); - } + msg.send( + `Mapping completed for ${replacedUser.name}: { name: ${replacedUser.name}, slackId: <@${replacedUser.slackId}>, email: ${replacedUser.slackEmail} }`, + ); + }); } catch (er) { robot.logger.error('Error processing users', er); } diff --git a/src/cronEvents.js b/src/cronEvents.js index 6055dea..a1978ec 100644 --- a/src/cronEvents.js +++ b/src/cronEvents.js @@ -1,3 +1,4 @@ +/* eslint-disable no-underscore-dangle */ // Description: // Cron event that sends out monthly scoreboards to a slack channel // @@ -12,76 +13,134 @@ const clark = require('clark'); const _ = require('lodash'); const { CronJob } = require('cron'); -const Helpers = require('./lib/Helpers'); const DatabaseService = require('./lib/services/database'); +const { H } = require('./lib/helpers'); module.exports = function cron(robot) { - const procVars = Helpers.getProcessVariables(process.env); - const databaseService = new DatabaseService({ robot, ...procVars }); + const procVars = H.getProcessVariables(process.env); + const databaseService = new DatabaseService(robot); if (!procVars.notificationsRoom) { return; } const { monthlyScoreboardCron, monthlyScoreboardDayOfWeek } = procVars; - const job = new CronJob(monthlyScoreboardCron, async () => { - if (Helpers.isScoreboardDayOfWeek(robot, monthlyScoreboardDayOfWeek)) { - robot.logger.debug('running the cron job'); + const job = new CronJob( + monthlyScoreboardCron, + async () => { + if (H.isScoreboardDayOfWeek(robot, monthlyScoreboardDayOfWeek)) { + robot.logger.debug('running the cron job'); - // Senders - const topSenders = await databaseService.getTopSenderInDuration(10, 30); - let message = []; - if (topSenders.length > 0) { - for (let i = 0, end = topSenders.length - 1, asc = end >= 0; asc ? i <= end : i >= end; asc ? i++ : i--) { - const person = `<@${topSenders[i]._id}>`; - const pointStr = topSenders[i].scoreChange > 1 ? 'points given' : 'point given'; - message.push(`${i + 1}. ${person} (${topSenders[i].scoreChange} ${pointStr})`); + // Senders + const topSenders = await databaseService.getTopSenderInDuration(10, 30); + let message = []; + if (topSenders.length > 0) { + for ( + let i = 0, end = topSenders.length - 1, asc = end >= 0; + asc ? i <= end : i >= end; + asc ? i++ : i-- + ) { + const person = `<@${topSenders[i]._id}>`; + const pointStr = + topSenders[i].scoreChange > 1 ? 'points given' : 'point given'; + message.push( + `${i + 1}. ${person} (${topSenders[i].scoreChange} ${pointStr})`, + ); + } + } else { + message.push('No scores to keep track of yet!'); } - } else { - message.push('No scores to keep track of yet!'); - } - let graphSize = Math.min(topSenders.length, Math.min(10, 20)); - message.splice(0, 0, clark(_.take(_.map(topSenders, 'scoreChange'), graphSize))); - message.splice(0, 0, `:tada: The top 10 ${robot.name} point senders over the last month! :tada:`); - robot.messageRoom(procVars.notificationsRoom, message.join('\n')); + let graphSize = Math.min(topSenders.length, Math.min(10, 20)); + message.splice( + 0, + 0, + clark(_.take(_.map(topSenders, 'scoreChange'), graphSize)), + ); + message.splice( + 0, + 0, + `:tada: The top 10 ${robot.name} point senders over the last month! :tada:`, + ); + robot.messageRoom(procVars.notificationsRoom, message.join('\n')); - // Recipients - const topRecipient = await databaseService.getTopReceiverInDuration(10, 30); - message = []; - if (topRecipient.length > 0) { - for (let i = 0, end = topRecipient.length - 1, asc = end >= 0; asc ? i <= end : i >= end; asc ? i++ : i--) { - const person = `<@${topRecipient[i]._id}>`; - const pointStr = topRecipient[i].scoreChange > 1 ? 'points received' : 'point received'; - message.push(`${i + 1}. ${person} (${topRecipient[i].scoreChange} ${pointStr})`); + // Recipients + const topRecipient = await databaseService.getTopReceiverInDuration( + 10, + 30, + ); + message = []; + if (topRecipient.length > 0) { + for ( + let i = 0, end = topRecipient.length - 1, asc = end >= 0; + asc ? i <= end : i >= end; + asc ? i++ : i-- + ) { + const person = `<@${topRecipient[i]._id}>`; + const pointStr = + topRecipient[i].scoreChange > 1 + ? 'points received' + : 'point received'; + message.push( + `${i + 1}. ${person} (${ + topRecipient[i].scoreChange + } ${pointStr})`, + ); + } + } else { + message.push('No scores to keep track of yet!'); } - } else { - message.push('No scores to keep track of yet!'); - } - graphSize = Math.min(topRecipient.length, Math.min(10, 20)); - message.splice(0, 0, clark(_.take(_.map(topRecipient, 'scoreChange'), graphSize))); - message.splice(0, 0, `:tada: The top 10 ${robot.name} point recipients over the last month! :tada:`); - robot.messageRoom(procVars.notificationsRoom, message.join('\n')); + graphSize = Math.min(topRecipient.length, Math.min(10, 20)); + message.splice( + 0, + 0, + clark(_.take(_.map(topRecipient, 'scoreChange'), graphSize)), + ); + message.splice( + 0, + 0, + `:tada: The top 10 ${robot.name} point recipients over the last month! :tada:`, + ); + robot.messageRoom(procVars.notificationsRoom, message.join('\n')); - // Room - const topRoom = await databaseService.getTopRoomInDuration(3, 30); - message = []; - if (topRoom.length > 0) { - for (let i = 0, end = topRoom.length - 1, asc = end >= 0; asc ? i <= end : i >= end; asc ? i++ : i--) { - const person = `<#${topRoom[i]._id}>`; - const pointStr = topRoom[i].scoreChange > 1 ? 'points given' : 'point given'; - message.push(`${i + 1}. ${person} (${topRoom[i].scoreChange} ${pointStr})`); + // Room + const topRoom = await databaseService.getTopRoomInDuration(3, 30); + message = []; + if (topRoom.length > 0) { + for ( + let i = 0, end = topRoom.length - 1, asc = end >= 0; + asc ? i <= end : i >= end; + asc ? i++ : i-- + ) { + const person = `<#${topRoom[i]._id}>`; + const pointStr = + topRoom[i].scoreChange > 1 ? 'points given' : 'point given'; + message.push( + `${i + 1}. ${person} (${topRoom[i].scoreChange} ${pointStr})`, + ); + } + } else { + message.push('No scores to keep track of yet!'); } - } else { - message.push('No scores to keep track of yet!'); - } - graphSize = Math.min(topRoom.length, Math.min(10, 20)); - message.splice(0, 0, clark(_.take(_.map(topRoom, 'scoreChange'), graphSize))); - message.splice(0, 0, `:tada: The top 3 rooms that sent ${robot.name} point(s) over the last month! :tada:`); - robot.messageRoom(procVars.notificationsRoom, message.join('\n')); - } - }, null, true, 'America/Chicago'); + graphSize = Math.min(topRoom.length, Math.min(10, 20)); + message.splice( + 0, + 0, + clark(_.take(_.map(topRoom, 'scoreChange'), graphSize)), + ); + message.splice( + 0, + 0, + `:tada: The top 3 rooms that sent ${robot.name} point(s) over the last month! :tada:`, + ); + robot.messageRoom(procVars.notificationsRoom, message.join('\n')); + } + }, + null, + true, + 'America/Chicago', + ); job.start(); }; diff --git a/src/eventHandlers.js b/src/eventHandlers.js index 1955a4e..5d7488d 100644 --- a/src/eventHandlers.js +++ b/src/eventHandlers.js @@ -8,37 +8,12 @@ // Author: // O'Mutt (Matt@OKeefe.dev) -const Helpers = require('./lib/Helpers'); +const EventHandlerService = require('./lib/services/eventHandler'); module.exports = function events(robot) { - const procVars = Helpers.getProcessVariables(process.env); + const ehs = new EventHandlerService(robot); - robot.on('plus-plus', sendPlusPlusNotification); - robot.on('plus-plus-failure', sendPlusPlusFalsePositiveNotification); - robot.on('plus-plus-spam', logAndNotifySpam); - - function sendPlusPlusNotification(notificationObject) { - if (procVars.notificationsRoom) { - robot.messageRoom(procVars.notificationsRoom, notificationObject.notificationMessage); - } - } - - function sendPlusPlusFalsePositiveNotification(notificationObject) { - if (procVars.falsePositiveNotificationsRoom) { - robot.messageRoom(procVars.falsePositiveNotificationsRoom, notificationObject.notificationMessage); - } - } - - /** - * - * @param {object} notificationObject - * @param {object} notificationObject.to the user object who was receiving the point - * @param {object} notificationObject.from the user object who was sending the point - * @param {string} notificationObject.message the message that should be sent to the user - * @param {string} notificationObject.reason a reason why the message is being sent - */ - function logAndNotifySpam(notificationObject) { - robot.logger.error(`A spam event has been detected: ${notificationObject.message}. ${notificationObject.reason}`); - robot.messageRoom(notificationObject.from.slackId, `${notificationObject.message}\n\n${notificationObject.reason}`); - } + robot.on('plus-plus', ehs.sendPlusPlusNotification); + robot.on('plus-plus-failure', ehs.sendPlusPlusFalsePositiveNotification); + robot.on('plus-plus-spam', ehs.logAndNotifySpam); }; diff --git a/src/help.js b/src/help.js index a1d5050..9e3291d 100644 --- a/src/help.js +++ b/src/help.js @@ -10,111 +10,15 @@ // Author: // O'Mutt (Matt@OKeefe.dev) -const { default: axios } = require('axios'); - -const Helpers = require('./lib/Helpers'); -const pjson = require('../package.json'); -const { RegExpPlusPlus, conjunction } = require('./lib/RegExpPlusPlus'); +const { RegExpPlusPlus } = require('./lib/regExpPlusPlus'); +const HelpService = require('./lib/services/help'); module.exports = function help(robot) { - const procVars = Helpers.getProcessVariables(process.env); - - robot.respond(RegExpPlusPlus.getHelp(), respondWithHelpGuidance); - robot.respond(new RegExp(/(plusplus version|-v|--version)/, 'i'), (msg) => { - msg.send( - `${Helpers.capitalizeFirstLetter(msg.robot.name)} <${ - pjson.repository.url - }|${pjson.name}> .`, - ); - }); - - robot.hear(new RegExp('how much .*point.*', 'i'), tellHowMuchPointsAreWorth); - - const { monthlyScoreboardCron, monthlyScoreboardDayOfWeek } = procVars; - function respondWithHelpGuidance(msg) { - const bn = msg.robot.name || 'hubot'; - const helpMessage = ''.concat( - '`++ []` - Increment score (for an optional reason). In place of `++` you can also use: `:clap:`, `:thumbsup:`, `:thumbsup_all:`, or `:+1:`\n', - '`-- []` - Decrement score (for an optional reason). You can also use `:thumbsdown:`\n', - '`{name1, name2, name3}++ []` - Increment score for all names (for a reason)\n', - '`{name1, name2, name3}-- []` - Decrement score for all names (for a reason) \n', - '`{name1, name2, name3}-- []` - Decrement score for all names (for a reason) \n', - `\`@${bn} score for \` - Display the score for a name and some of the reasons\n`, - `\`@${bn} [top|bottom] [tokens] \` - Display the top scoring , sorted by token/points if you include \`tokens\`\n`, - `\`@${bn} erase []\` - Remove the score for a name (for a reason) \n`, - `\`@${bn} level me up\` - Level up your account for some additional \`${bn}\`-iness \n`, - '`how much are points worth` - Shows how much points are worth\n', - '--------------------------------------------*Info*--------------------------------------------\n', - `Every month (\`${monthlyScoreboardCron}\`), on ${monthlyScoreboardDayOfWeek}, ${bn} will send out an informational message to `, - `<#${procVars.notificationsRoom || 'no room'}> to recognize the`, - ' top 10 senders, top 10 recipients, and the top 3 slack channels that have been sending/receiving points. :eyes:\n', - '--------------------------------------*Level 2 Commands*--------------------------------------\n', - "` + []` - Transfer tokens from your wallet to the receiver's wallet (for an optional reason).\n", - `\`hot wallet\` displays info about \`@${bn}\`'s wallet\n`, - '`[]` indicates optional message parameters\n', - `Each \`[]\` can be prefixed with a conjunction ${conjunction}`, - ); - const message = { - attachments: [ - { - color: '//FEA500', - blocks: [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: `Need help with ${bn}?`, - }, - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: '_Commands_:', - }, - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: helpMessage, - }, - }, - ], - }, - ], - }; - - if (procVars.furtherHelpUrl !== 'undefined') { - message.attachments[0].blocks.push({ - type: 'section', - text: { - type: 'mrkdwn', - text: `For further help please visit ${procVars.furtherHelpUrl}`, - }, - }); - } - msg.send(message); - } - - async function tellHowMuchPointsAreWorth(msg) { - try { - const resp = await axios({ - url: 'https://api.coindesk.com/v1/bpi/currentprice/ARS.json', - }); + robot.respond(RegExpPlusPlus.getHelp(), HelpService.respondWithHelpGuidance); + robot.respond( + /(plusplus version|-v|--version)/i, + HelpService.respondWithVersion, + ); - const bitcoin = resp.data.bpi.USD.rate_float; - const ars = resp.data.bpi.ARS.rate_float; - const satoshi = bitcoin / 1e8; - return msg.send( - `A bitcoin is worth ${bitcoin} USD right now (${ars} ARS), a satoshi is about ${satoshi}, and ${msg.robot.name} points are worth nothing!`, - ); - } catch (e) { - return msg.send( - `Seems like we are having trouble getting some data... Don't worry, though, your ${msg.robot.name} points are still worth nothing!`, - ); - } - } + robot.hear(/how much .*point.*/i, HelpService.tellHowMuchPointsAreWorth); }; diff --git a/src/help.test.js b/src/help.test.js index e946314..3056cc6 100644 --- a/src/help.test.js +++ b/src/help.test.js @@ -5,7 +5,7 @@ const TestHelper = require('hubot-test-helper'); const { expect } = chai; -const Helpers = require('./lib/Helpers'); +const { H } = require('./lib/helpers'); const pjson = require('../package.json'); const { wait } = require('../test/test_helpers'); @@ -21,16 +21,47 @@ describe('help', () => { room = helpHelper.createRoom({ httpd: false }); }); - after(async () => { - sinon.restore(); - }); - afterEach(async () => { sinon.restore(); room.destroy(); }); describe('respondWithHubotGuidance', () => { + describe('if further URL is set', () => { + it('should respond with hubot usage guidance and further url', async () => { + const url = 'https://derp.com'; + room.destroy(); + process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = url; + room = helpHelper.createRoom({ httpd: false }); + room.user.say('peter.nguyen', '@hubot -h'); + await wait(55); + expect(room.messages.length).to.equal(2); + expect(room.messages[1].length).to.equal(2); + const message = room.messages[1][1]; + const { blocks } = message.attachments[0]; + expect(blocks.length).to.equal(4); + expect(blocks[0]).to.deep.include({ + type: 'section', + text: { type: 'mrkdwn', text: 'Need help with hubot?' }, + }); + expect(blocks[1]).to.deep.include({ + type: 'section', + text: { + type: 'mrkdwn', + text: '_Commands_:', + }, + }); + expect(blocks[2]).to.be.an('object'); + expect(blocks[3]).to.deep.include({ + type: 'section', + text: { + type: 'mrkdwn', + text: `For further help please visit ${url}`, + }, + }); + }); + }); + it('should respond with hubot usage guidance', async () => { room.user.say('peter.nguyen', '@hubot help'); await wait(55); @@ -55,39 +86,6 @@ describe('help', () => { }); expect(blocks[2]).to.be.an('object'); }); - - it('should respond with hubot usage guidance and further URL if env var is set', async () => { - const url = 'https://derp.com'; - room.destroy(); - process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = url; - room = helpHelper.createRoom({ httpd: false }); - room.user.say('peter.nguyen', '@hubot -h'); - await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - const message = room.messages[1][1]; - const { blocks } = message.attachments[0]; - expect(blocks.length).to.equal(4); - expect(blocks[0]).to.deep.include({ - type: 'section', - text: { type: 'mrkdwn', text: 'Need help with hubot?' }, - }); - expect(blocks[1]).to.deep.include({ - type: 'section', - text: { - type: 'mrkdwn', - text: '_Commands_:', - }, - }); - expect(blocks[2]).to.be.an('object'); - expect(blocks[3]).to.deep.include({ - type: 'section', - text: { - type: 'mrkdwn', - text: `For further help please visit ${url}`, - }, - }); - }); }); describe('version', () => { @@ -97,11 +95,9 @@ describe('help', () => { expect(room.messages.length).to.equal(2); expect(room.messages[1].length).to.equal(2); expect(room.messages[1][1]).to.equal( - `${Helpers.capitalizeFirstLetter(room.robot.name)} <${ - pjson.repository.url - }|${pjson.name}> .`, + `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`, ); }); @@ -111,11 +107,9 @@ describe('help', () => { expect(room.messages.length).to.equal(2); expect(room.messages[1].length).to.equal(2); expect(room.messages[1][1]).to.equal( - `${Helpers.capitalizeFirstLetter(room.robot.name)} <${ - pjson.repository.url - }|${pjson.name}> .`, + `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`, ); }); @@ -125,11 +119,9 @@ describe('help', () => { expect(room.messages.length).to.equal(2); expect(room.messages[1].length).to.equal(2); expect(room.messages[1][1]).to.equal( - `${Helpers.capitalizeFirstLetter(room.robot.name)} <${ - pjson.repository.url - }|${pjson.name}> .`, + `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`, ); }); }); diff --git a/src/lib/Helpers.js b/src/lib/Helpers.js index 13e634e..dcd06bd 100644 --- a/src/lib/Helpers.js +++ b/src/lib/Helpers.js @@ -2,7 +2,6 @@ const { differenceInYears, format, getDate, - getWeekOfMonth, isSunday, isMonday, isTuesday, @@ -10,12 +9,11 @@ const { isThursday, isFriday, isSaturday, - isSameDay, - isSameWeek, + getWeekOfMonth, } = require('date-fns'); -const { RegExpPlusPlus } = require('./RegExpPlusPlus'); +const { rpp } = require('./regExpPlusPlus'); -module.exports = class Helpers { +class Helpers { static getEsOnEndOfWord(number) { if (number === -1 || number === 1) { return ''; @@ -35,7 +33,7 @@ module.exports = class Helpers { return undefined; } - const buff = new Buffer.from(str, 'base64'); + const buff = Buffer.from(str, 'base64'); const text = buff.toString('UTF-8'); return text; } @@ -51,6 +49,7 @@ module.exports = class Helpers { if (robot) { robot.logger.debug('There was an error in the isCakeDay function', e); } else { + // eslint-disable-next-line no-console console.log('There was an error in the isCakeDay function', e); } } @@ -147,7 +146,7 @@ module.exports = class Helpers { // this should fix a dumb issue with mac quotes const trimmed = JSON.parse(JSON.stringify(str.trim().toLowerCase())); - const buff = new Buffer.from(trimmed); + const buff = Buffer.from(trimmed); const base64data = buff.toString('base64'); return base64data; } @@ -169,10 +168,12 @@ module.exports = class Helpers { premessage && !conjunction && reason && - operator.match(RegExpPlusPlus.negativeOperators); + operator.match(rpp.negativeOperators); return falsePositive; } + static getProcessVars = Helpers.getProcessVariables; + static getProcessVariables(env) { const procVars = {}; procVars.reasonsKeyword = env.HUBOT_PLUSPLUS_REASONS || 'reasons'; @@ -181,9 +182,7 @@ module.exports = class Helpers { 'Looks like you hit the spam filter. Please slow your roll.'; procVars.spamTimeLimit = parseInt(env.SPAM_TIME_LIMIT, 10) || 5; procVars.companyName = env.HUBOT_COMPANY_NAME || 'Company Name'; - procVars.peerFeedbackUrl = - env.HUBOT_PEER_FEEDBACK_URL || - `praise in Lattice (https://${procVars.companyName}.latticehq.com/)`; + procVars.furtherFeedbackSuggestedScore = parseInt(env.HUBOT_FURTHER_FEEDBACK_SCORE, 10) || 10; procVars.mongoUri = @@ -205,6 +204,12 @@ module.exports = class Helpers { env.HUBOT_PLUSPLUS_MONTHLY_SCOREBOARD_CRON || '0 10 1-7 * *'; procVars.monthlyScoreboardDayOfWeek = parseInt(env.HUBOT_PLUSPLUS_MONTHLY_SCOREBOARD_DAY_OF_WEEK, 10) || 1; // 0-6 (Sun - Sat) + + // Dependent on other procVars + procVars.peerFeedbackUrl = + env.HUBOT_PEER_FEEDBACK_URL || + `praise in Lattice (https://${procVars.companyName}.latticehq.com/)`; + return procVars; } @@ -280,4 +285,9 @@ module.exports = class Helpers { static isSameDayOfYear(date1, date2) { return Helpers.getDayOfYear(date1) === Helpers.getDayOfYear(date2); } -}; +} + +module.exports = Helpers; +module.exports.H = Helpers; +module.exports.Helpers = Helpers; +module.exports.h = Helpers; diff --git a/src/lib/MessageFactory.js b/src/lib/MessageFactory.js index 96dc0d4..3bda00d 100644 --- a/src/lib/MessageFactory.js +++ b/src/lib/MessageFactory.js @@ -1,28 +1,23 @@ const { format, parseISO } = require('date-fns'); const _ = require('lodash'); -const Helpers = require('./Helpers'); +const { H } = require('./helpers'); const { upsideDownChars, nonSequiturs } = require('./static/a1'); -module.exports = class MessageFactory { +class MessageFactory { /** * Builds a message for the user's score * @param {object} user - The user object - * @param {string} robotName - The name of the robot - * @param {object} procVars - The process variables * @returns {string} - The message * @memberof MessageFactory * @static */ - static BuildScoreLookup(user, robot, procVars) { - const robotName = robot?.name ?? undefined; - if (_.isEmpty(user) || _.isEmpty(robotName) || _.isEmpty(procVars)) - return ''; + static BuildScoreLookup(robotName, user) { + const pVars = H.getProcessVariables(process.env); + if (_.isEmpty(user) || _.isEmpty(pVars)) return ''; let tokenString = '.'; if (user.accountLevel > 1) { - tokenString = ` (*${user.token} ${Helpers.capitalizeFirstLetter( - robotName, - )} `; + tokenString = ` (*${user.token} ${H.capitalizeFirstLetter(robotName)} `; tokenString = tokenString.concat( user.token > 1 ? 'Tokens*).' : 'Token*).', ); @@ -36,12 +31,12 @@ module.exports = class MessageFactory { if (user[`${robotName}Day`]) { try { const dateObj = parseISO(user[`${robotName}Day`]); - baseString += `\n:birthday: ${Helpers.capitalizeFirstLetter( + baseString += `\n:birthday: ${H.capitalizeFirstLetter( robotName, )}day is ${format(dateObj, 'MMM. do yyyy')}`; } catch (e) { - robot.logger.error( - `Robot day failed to be parsed: ${robot.name}, ${ + this.robot.logger.error( + `Robot day failed to be parsed: ${robotName}, ${ user[`${robotName}Day`] }`, e, @@ -62,15 +57,14 @@ module.exports = class MessageFactory { const reasonMap = _.reduce( sampleReasons, (memo, val, key) => { - const decodedKey = Helpers.decode(key); + const decodedKey = H.decode(key); const pointStr = val > 1 ? 'points' : 'point'; - memo += `\n_${decodedKey}_: ${val} ${pointStr}`; - return memo; + return `${memo}\n_${decodedKey}_: ${val} ${pointStr}`; }, '', ); - return `${baseString}\n\n:star: Here are some ${procVars.reasonsKeyword} :star:${reasonMap}`; + return `${baseString}\n\n:star: Here are some ${pVars.reasonsKeyword} :star:${reasonMap}`; } return baseString; @@ -80,19 +74,19 @@ module.exports = class MessageFactory { * Builds a message for the user's score * @param {object} user - The user object * @param {string} reason - The reason for the score - * @param {string} robotName - The name of the robot * @returns {string} - The message * @memberof MessageFactory * @static */ - static BuildNewScoreMessage(user, reason, robotName) { + static BuildNewScoreMessage(robot, user, reason) { + const robotName = robot.name; if (!user) { return ''; } const username = user.slackId ? `<@${user.slackId}>` : user.name; - let scoreStr = `${username} has ${ - user.score - } point${Helpers.getEsOnEndOfWord(user.score)}`; + let scoreStr = `${username} has ${user.score} point${H.getEsOnEndOfWord( + user.score, + )}`; let reasonStr = ''; let cakeDayStr = ''; @@ -107,11 +101,11 @@ module.exports = class MessageFactory { } if (user.accountLevel && user.accountLevel > 1) { - let tokenStr = `(*${user.token} ${Helpers.capitalizeFirstLetter( + let tokenStr = `(*${user.token} ${H.capitalizeFirstLetter( robotName, )} Tokens*)`; if (user.token === 1) { - tokenStr = `(*${user.token} ${Helpers.capitalizeFirstLetter( + tokenStr = `(*${user.token} ${H.capitalizeFirstLetter( robotName, )} Token*)`; } @@ -119,7 +113,7 @@ module.exports = class MessageFactory { } if (reason) { - const decodedReason = Helpers.decode(reason); + const decodedReason = H.decode(reason); if (user.reasons[reason] === 1 || user.reasons[reason] === -1) { if (user.score === 1 || user.score === -1) { reasonStr = ` for ${decodedReason}`; @@ -133,8 +127,8 @@ module.exports = class MessageFactory { } } - if (Helpers.isCakeDay(user[`${robotName}Day`])) { - const yearsAsString = Helpers.getYearsAsString(user[`${robotName}Day`]); + if (H.isCakeDay(user[`${robotName}Day`])) { + const yearsAsString = H.getYearsAsString(user[`${robotName}Day`]); cakeDayStr = `\n:birthday: Today is ${username}'s ${yearsAsString}${robotName}day! :birthday:`; } @@ -145,8 +139,8 @@ module.exports = class MessageFactory { reasonStr += '.'; } let normalMessage = `${scoreStr}${reasonStr}${cakeDayStr}`; - if (Helpers.isA1Day()) { - normalMessage = MessageFactory.GetA1DayMessage(normalMessage, robotName); + if (H.isA1Day()) { + normalMessage = this.GetA1DayMessage(normalMessage); } return normalMessage; @@ -156,14 +150,13 @@ module.exports = class MessageFactory { * Builds a message for the user's score * @param {object} user - The user object * @param {string} reason - The reason for the score - * @param {string} robotName - The name of the robot * @returns {string} - The message * @memberof MessageFactory * @static */ static GetA1DayMessage( - originalMessage, robotName, + originalMessage, randomIndex = Math.floor(Math.random() * 7), force = false, ) { @@ -180,15 +173,16 @@ module.exports = class MessageFactory { () => `I'm ${robotName}. Not a mind reader!`, () => "That's classified information, I'm afraid I cannot disclose that.", (message) => { + let newMessage = message; for (let i = 0; i < message.length; i++) { const randomCase = Math.random() < 0.5 ? 'toUpperCase' : 'toLowerCase'; - message = - message.substr(0, i) + - message[i][randomCase]() + - message.substr(i + 1); + newMessage = + newMessage.substr(0, i) + + newMessage[i][randomCase]() + + newMessage.substr(i + 1); } - return message; + return newMessage; }, (message) => { const words = message.split(' '); @@ -202,20 +196,21 @@ module.exports = class MessageFactory { return words.join(' '); }, (message) => { - const words = message.split(' '); + let newMessage = message; + const words = newMessage.split(' '); for (let i = 0; i < words.length; i++) { if (Math.random() < 0.13 || force) { - const randomWord = Math.floor(Math.random() * message.length); + const randomWord = Math.floor(Math.random() * newMessage.length); const randomChar = String.fromCharCode( Math.floor(Math.random() * 26) + 97, ); - message = - message.slice(0, randomWord) + + newMessage = + newMessage.slice(0, randomWord) + randomChar + - message.slice(randomWord + 1); + newMessage.slice(randomWord + 1); } } - return message; + return newMessage; }, (message) => { const charArray = message.split(''); @@ -229,4 +224,7 @@ module.exports = class MessageFactory { const rand = a0opt[randomIndex]; return rand(originalMessage); } -}; +} + +module.exports = MessageFactory; +module.exports.mfs = MessageFactory; diff --git a/src/lib/MessageFactory.test.js b/src/lib/MessageFactory.test.js index c15a910..a55d76c 100644 --- a/src/lib/MessageFactory.test.js +++ b/src/lib/MessageFactory.test.js @@ -2,10 +2,9 @@ const chai = require('chai'); const sinon = require('sinon'); chai.use(require('sinon-chai')); const { subYears, addDays } = require('date-fns'); -const { wait } = require('../../test/test_helpers'); -const Helpers = require('./Helpers'); -const MessageFactory = require('./MessageFactory'); +const { helpers } = require('./helpers'); +const MessageFactory = require('./messageFactory'); const { nonSequiturs } = require('./static/a1'); const { expect } = chai; @@ -15,22 +14,24 @@ describe('MessageFactory', () => { const mockProcVars = { reasonsKeyword: 'reasons' }; let notBotDay; let botDay; + let instance; beforeEach(() => { - const mockHelpers = sinon.stub(Helpers, 'decode'); + instance = new MessageFactory(mockRobot); + const mockHelpers = sinon.stub(helpers, 'decode'); mockHelpers.returnsArg(0); notBotDay = addDays(subYears(new Date(), 1), 5); botDay = subYears(new Date(), 1); }); afterEach(() => { - Helpers.decode.restore(); + helpers.decode.restore(); }); // This method expects base64 encoded reasons but we are stubbing out the decode method describe('BuildNewScoreMessage', () => { it("should handle undefined user, undefined reason, and print ''", () => { const user = undefined; - const emptyReasons = Helpers.cleanAndEncode(undefined); + const emptyReasons = helpers.cleanAndEncode(undefined); const msg = MessageFactory.BuildNewScoreMessage( user, emptyReasons, @@ -46,7 +47,7 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = Helpers.cleanAndEncode(undefined); + const emptyReasons = helpers.cleanAndEncode(undefined); const msg = MessageFactory.BuildNewScoreMessage( user, emptyReasons, @@ -62,7 +63,7 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = Helpers.cleanAndEncode(undefined); + const emptyReasons = helpers.cleanAndEncode(undefined); const msg = MessageFactory.BuildNewScoreMessage( user, emptyReasons, @@ -78,7 +79,7 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = Helpers.cleanAndEncode(undefined); + const emptyReasons = helpers.cleanAndEncode(undefined); const msg = MessageFactory.BuildNewScoreMessage( user, emptyReasons, @@ -94,7 +95,7 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = Helpers.cleanAndEncode(undefined); + const emptyReasons = helpers.cleanAndEncode(undefined); const msg = MessageFactory.BuildNewScoreMessage( user, emptyReasons, @@ -110,7 +111,7 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = Helpers.cleanAndEncode(undefined); + const emptyReasons = helpers.cleanAndEncode(undefined); const msg = MessageFactory.BuildNewScoreMessage( user, emptyReasons, diff --git a/src/lib/RegExpPlusPlus.js b/src/lib/RegExpPlusPlus.js index 1fef909..6e87613 100644 --- a/src/lib/RegExpPlusPlus.js +++ b/src/lib/RegExpPlusPlus.js @@ -119,7 +119,7 @@ class RegExpPlusPlus { */ // eslint-disable-next-line class-methods-use-this createLevelUpAccount() { - return new RegExp(/(level (me )?up|upgrade (my account|me))/, 'i'); + return /(level (me )?up|upgrade (my account|me))/i; } /** @@ -127,7 +127,7 @@ class RegExpPlusPlus { */ // eslint-disable-next-line class-methods-use-this getHelp() { - return new RegExp('(help|-h|--help)', 'i'); + return /(help|-h|--help)/i; } /** @@ -135,11 +135,13 @@ class RegExpPlusPlus { */ // eslint-disable-next-line class-methods-use-this getBotWallet() { - return new RegExp(/hot( |-)?wallet/, 'i'); + return /hot( |-)?wallet/i; } } -module.exports = { - RegExpPlusPlus: new RegExpPlusPlus(), - conjunctions: reasonConjunctions, -}; +const regExpPlusPlus = new RegExpPlusPlus(); + +module.exports = regExpPlusPlus; +module.exports.rpp = regExpPlusPlus; +module.exports.RegExpPlusPlus = regExpPlusPlus; +module.exports.conjunctions = reasonConjunctions; diff --git a/src/lib/RegExpPlusPlus.test.js b/src/lib/RegExpPlusPlus.test.js index 94c8b78..687b040 100644 --- a/src/lib/RegExpPlusPlus.test.js +++ b/src/lib/RegExpPlusPlus.test.js @@ -5,7 +5,7 @@ chai.use(require('sinon-chai')); const { expect } = chai; -const { RegExpPlusPlus } = require('./RegExpPlusPlus'); +const { RegExpPlusPlus } = require('./regExpPlusPlus'); describe('RegExpPlusPlus', () => { describe('createGiveTokenRegExp', () => { @@ -359,7 +359,8 @@ describe('RegExpPlusPlus', () => { }); it('should match `{ @Chelo, @Kahou_Lei, @wimdec_PTO_back_Aug_21 , @guillaume_Back_Aug_6th, @Cherry, @singaravelan } ++ you’re all awesome, I’m only here for the fun!`', () => { - const fullText = `{@Chelo, @Kahou_Lei, @wimdec_PTO_back_Aug_21 , @guillaume_Back_Aug_6th, @Cherry, @singaravelan } ++ you’re all awesome, I’m only here for the fun!`; + const fullText = + '{@Chelo, @Kahou_Lei, @wimdec_PTO_back_Aug_21 , @guillaume_Back_Aug_6th, @Cherry, @singaravelan } ++ you’re all awesome, I’m only here for the fun!'; const expected = [ fullText, diff --git a/src/lib/data/scores.js b/src/lib/data/scores.js index 889f5cf..2b3143e 100644 --- a/src/lib/data/scores.js +++ b/src/lib/data/scores.js @@ -27,7 +27,8 @@ const scoresDocumentName = 'scores'; function getEmail(user) { if (user.profile && user.profile.email) { return user.profile.email; - } else if (user.info && user.info.email_address) { + } + if (user.info && user.info.email_address) { return user.info.email_address; } return undefined; @@ -39,8 +40,8 @@ async function createNewLevelOneUser(createUser, robot) { const newUser = { name: userName, score: 0, - reasons: { }, - pointsGiven: { }, + reasons: {}, + pointsGiven: {}, [`${robot.name}Day`]: new Date(), accountLevel: 1, totalPointsGiven: 0, @@ -50,7 +51,13 @@ async function createNewLevelOneUser(createUser, robot) { } newUser.slackEmail = getEmail(createUser); - if (newUser.slackId && !newUser.slackEmail && robot.adapter && robot.adapter.options && robot.adapter.options.token) { + if ( + newUser.slackId && + !newUser.slackEmail && + robot.adapter && + robot.adapter.options && + robot.adapter.options.token + ) { const web = new SlackClient.WebClient(robot.adapter.options.token); const result = await web.users.info({ user: newUser.slackId }); newUser.slackEmail = getEmail(result.user); diff --git a/src/lib/services/database.js b/src/lib/services/database.js index 3e753cf..40671a9 100644 --- a/src/lib/services/database.js +++ b/src/lib/services/database.js @@ -4,26 +4,23 @@ const { formatISO, subMinutes } = require('date-fns'); const scores = require('../data/scores'); const logDocumentName = require('../data/scoreLog'); const botTokenDocumentName = require('../data/botToken'); -const Helpers = require('../Helpers'); +const { H } = require('../helpers'); class DatabaseService { - constructor(params) { - this.db = undefined; - this.robot = params.robot; - this.uri = params.mongoUri; - this.furtherFeedbackScore = params.furtherFeedbackSuggestedScore; - this.peerFeedbackUrl = params.peerFeedbackUrl; - this.spamTimeLimit = params.spamTimeLimit; + constructor() { + this.db = null; } async init() { - const client = new MongoClient(this.uri, - { + if (!this.db) { + const { mongoUri } = H.getProcessVars(process.env); + const client = new MongoClient(mongoUri, { useNewUrlParser: true, useUnifiedTopology: true, }); - const connection = await client.connect(); - this.db = connection.db(); + const connection = await client.connect(); + this.db = connection.db(); + } } async getDb() { @@ -34,36 +31,38 @@ class DatabaseService { } /* - * user - the name of the user - */ - async getUser(user) { + * user - the name of the user + */ + async getUser(robot, user) { const userName = user.name ? user.name : user; const search = user.id ? { slackId: user.id } : { name: userName }; - this.robot.logger.debug(`trying to find user ${JSON.stringify(search)}`); + robot.logger.debug(`trying to find user ${JSON.stringify(search)}`); const db = await this.getDb(); - const dbUser = await db.collection(scores.scoresDocumentName).findOne( - search, - { sort: { score: -1 } }, - ); + const dbUser = await db + .collection(scores.scoresDocumentName) + .findOne(search, { sort: { score: -1 } }); if (!dbUser) { - this.robot.logger.debug('creating a new user', user); - const newUser = await scores.createNewLevelOneUser(user, this.robot); + robot.logger.debug('creating a new user', user); + const newUser = await scores.createNewLevelOneUser(user, robot); return newUser; } return dbUser; } /* - * user - the name of the user - */ - async getAllUsers() { + * user - the name of the user + */ + async getAllUsers(robot) { const search = { slackId: { $exists: true } }; - this.robot.logger.debug('getting _all_ users'); + robot.logger.debug('getting _all_ users'); const db = await this.getDb(); - const dbUsers = await db.collection(scores.scoresDocumentName).find(search).toArray(); + const dbUsers = await db + .collection(scores.scoresDocumentName) + .find(search) + .toArray(); return dbUsers; } @@ -72,12 +71,15 @@ class DatabaseService { * @param {object} user the user who is getting a point change * @returns {object} the updated user who received a change */ - async saveUser(user) { + async saveUser(robot, user) { const userName = user.name ? user.name : user; - const search = user.slackId ? { slackId: user.slackId } : { name: userName }; + const search = user.slackId + ? { slackId: user.slackId } + : { name: userName }; const db = await this.getDb(); - const result = await db.collection(scores.scoresDocumentName) + const result = await db + .collection(scores.scoresDocumentName) .findOneAndUpdate( search, { @@ -92,18 +94,24 @@ class DatabaseService { const updatedUser = result.value; - this.robot.logger.debug(`Saving user original: [${user.name}: ${user.score}], new [${updatedUser.name}: ${updatedUser.score}]`); + robot.logger.debug( + `Saving user original: [${user.name}: ${user.score}], new [${updatedUser.name}: ${updatedUser.score}]`, + ); return updatedUser; } - async savePlusPlusLog(to, from, room, reason, incrementValue) { + async savePlusPlusLog(_robot, to, from, room, reason, incrementValue) { const pointsAmount = parseInt(incrementValue, 10); const fromId = from.slackId || from.name; - const scoreSearch = from.slackId ? { slackId: from.slackId } : { name: from.name }; + const scoreSearch = from.slackId + ? { slackId: from.slackId } + : { name: from.name }; const toId = to.slackId || to.name; const db = await this.getDb(); - await db.collection(scores.scoresDocumentName).updateOne(scoreSearch, { $inc: { totalPointsGiven: pointsAmount } }); + await db + .collection(scores.scoresDocumentName) + .updateOne(scoreSearch, { $inc: { totalPointsGiven: pointsAmount } }); await db.collection(logDocumentName).insertOne({ from: fromId, to: toId, @@ -122,19 +130,21 @@ class DatabaseService { * @returns {boolean} true if the user has sent a point to the same user in the time period * @returns {boolean} false if the user has not sent a point to the same user in the time period */ - async isSpam(to, from) { - this.robot.logger.debug('spam check'); + async isSpam(robot, to, from) { + robot.logger.debug('spam check'); + const { spamTimeLimit } = H.getProcessVars(process.env); const db = await this.getDb(); - const fiveMinutesAgo = formatISO(subMinutes(new Date(), this.spamTimeLimit)); - const previousScoreExists = await db.collection(logDocumentName) + const fiveMinutesAgo = formatISO(subMinutes(new Date(), spamTimeLimit)); + const previousScoreExists = await db + .collection(logDocumentName) .countDocuments({ from, to, date: { $gte: fiveMinutesAgo }, }); - this.robot.logger.debug('spam check result', previousScoreExists); + robot.logger.debug('spam check result', previousScoreExists); if (previousScoreExists !== 0) { - this.robot.logger.error(`${from} is spamming points to ${to}! STOP THEM!!!!`); + robot.logger.error(`${from} is spamming points to ${to}! STOP THEM!!!!`); return true; } @@ -142,20 +152,28 @@ class DatabaseService { } /* - * from - database user who is sending the score - * to - database user who is receiving the score - * score - the number of score that is being sent - */ - async savePointsGiven(from, to, score) { + * from - database user who is sending the score + * to - database user who is receiving the score + * score - the number of score that is being sent + */ + async savePointsGiven(robot, from, to, score) { + const { furtherFeedbackScore, peerFeedbackUrl } = H.getProcessVars( + process.env, + ); const db = await this.getDb(); - const cleanName = Helpers.cleanAndEncode(to.name); - const fromUser = await this.getUser(from); - const fromSearch = fromUser.slackId ? { slackId: fromUser.slackId } : { name: fromUser.name }; - - const oldScore = fromUser.pointsGiven[cleanName] ? fromUser.pointsGiven[cleanName] : 0; + const cleanName = H.cleanAndEncode(to.name); + const fromUser = await this.getUser(robot, from); + const fromSearch = fromUser.slackId + ? { slackId: fromUser.slackId } + : { name: fromUser.name }; + + const oldScore = fromUser.pointsGiven[cleanName] + ? fromUser.pointsGiven[cleanName] + : 0; // even if they are down voting them they should still get a tally as they ++/-- the same person - fromUser.pointsGiven[cleanName] = (oldScore + 1); - const result = await db.collection(scores.scoresDocumentName) + fromUser.pointsGiven[cleanName] = oldScore + 1; + const result = await db + .collection(scores.scoresDocumentName) .findOneAndUpdate( fromSearch, { $set: fromUser }, @@ -167,10 +185,15 @@ class DatabaseService { ); const updatedUser = result.value; - if (updatedUser.pointsGiven[cleanName] % this.furtherFeedbackScore === 0) { - this.robot.logger.debug(`${from.name} has sent a lot of points to ${to.name} suggesting further feedback ${score}`); + if (updatedUser.pointsGiven[cleanName] % furtherFeedbackScore === 0) { + robot.logger.debug( + `${from.name} has sent a lot of points to ${to.name} suggesting further feedback ${score}`, + ); const toIdent = to.slackId ? `<@${to.slackId}>` : to.name; - this.robot.messageRoom(from.id, `Looks like you've given ${toIdent} quite a few points, maybe you should look at submitting ${this.peerFeedbackUrl}`); + robot.messageRoom( + from.id, + `Looks like you've given ${toIdent} quite a few points, maybe you should look at submitting ${peerFeedbackUrl}`, + ); } } @@ -179,15 +202,16 @@ class DatabaseService { * @param {number} amount - the amount of scores to return * @returns {Promise} - the scores */ - async getTopScores(amount) { + async getTopScores(robot, amount) { const db = await this.getDb(); - const results = await db.collection(scores.scoresDocumentName) + const results = await db + .collection(scores.scoresDocumentName) .find({}) .sort({ score: -1, accountLevel: -1 }) .limit(amount) .toArray(); - this.robot.logger.debug('Trying to find top scores'); + robot.logger.debug('Trying to find top scores'); return results; } @@ -197,15 +221,16 @@ class DatabaseService { * @param {number} amount - the amount of scores to return * @returns {Promise} - the scores */ - async getBottomScores(amount) { + async getBottomScores(robot, amount) { const db = await this.getDb(); - const results = await db.collection(scores.scoresDocumentName) + const results = await db + .collection(scores.scoresDocumentName) .find({}) .sort({ score: 1, accountLevel: -1 }) .limit(amount) .toArray(); - this.robot.logger.debug('Trying to find bottom scores'); + robot.logger.debug('Trying to find bottom scores'); return results; } @@ -215,9 +240,10 @@ class DatabaseService { * @param {number} amount - the amount of tokens to return * @returns {Promise} - the tokens */ - async getTopTokens(amount) { + async getTopTokens(robot, amount) { const db = await this.getDb(); - const results = await db.collection(scores.scoresDocumentName) + const results = await db + .collection(scores.scoresDocumentName) .find({ accountLevel: { $gte: 2 }, }) @@ -225,7 +251,7 @@ class DatabaseService { .limit(amount) .toArray(); - this.robot.logger.debug('Trying to find top tokens'); + robot.logger.debug('Trying to find top tokens'); return results; } @@ -235,9 +261,10 @@ class DatabaseService { * @param {number} amount - the amount of tokens to return * @returns {Promise} - the tokens */ - async getBottomTokens(amount) { + async getBottomTokens(robot, amount) { const db = await this.getDb(); - const results = await db.collection(scores.scoresDocumentName) + const results = await db + .collection(scores.scoresDocumentName) .find({ accountLevel: { $gte: 2 }, }) @@ -245,7 +272,7 @@ class DatabaseService { .limit(amount) .toArray(); - this.robot.logger.debug('Trying to find bottom tokens'); + robot.logger.debug('Trying to find bottom tokens'); return results; } @@ -255,15 +282,16 @@ class DatabaseService { * @param {number} amount - the amount of senders to return * @returns {Promise} - the senders */ - async getTopSender(amount) { + async getTopSender(robot, amount) { const db = await this.getDb(); - const results = await db.collection(scores.scoresDocumentName) + const results = await db + .collection(scores.scoresDocumentName) .find({ totalPointsGiven: { $exists: true } }) .sort({ totalPointsGiven: -1, accountLevel: -1 }) .limit(amount) .toArray(); - this.robot.logger.debug('Trying to find top sender'); + robot.logger.debug('Trying to find top sender'); return results; } @@ -273,109 +301,158 @@ class DatabaseService { * @param {number} amount - the amount of senders to return * @returns {Promise} - the senders */ - async getBottomSender(amount) { + async getBottomSender(robot, amount) { const db = await this.getDb(); - const results = await db.collection(scores.scoresDocumentName) + const results = await db + .collection(scores.scoresDocumentName) .find({ totalPointsGiven: { $exists: true } }) .sort({ totalPointsGiven: 1, accountLevel: -1 }) .limit(amount) .toArray(); - this.robot.logger.debug('Trying to find bottom sender'); + robot.logger.debug('Trying to find bottom sender'); return results; } async erase(user, reason) { const userName = user.name ? user.name : user; - const search = user.slackId ? { slackId: user.slackId } : { name: userName }; + const search = user.slackId + ? { slackId: user.slackId } + : { name: userName }; const db = await this.getDb(); let result; if (reason) { - const oldUser = await db.collection(scores.scoresDocumentName).findOne(search); + const oldUser = await db + .collection(scores.scoresDocumentName) + .findOne(search); const newScore = oldUser.score - oldUser.reasons[reason]; - result = await db.collection(scores.scoresDocumentName) - .updateOne(search, { $set: { score: newScore, reasons: { [`${reason}`]: 0 } } }); + result = await db + .collection(scores.scoresDocumentName) + .updateOne(search, { + $set: { score: newScore, reasons: { [`${reason}`]: 0 } }, + }); } else { - result = await db.collection(scores.scoresDocumentName) + result = await db + .collection(scores.scoresDocumentName) .deleteOne(search, { $set: { score: 0 } }); } return result; } - async updateAccountLevelToTwo(user) { + async updateAccountLevelToTwo(robot, user) { const userName = user.name ? user.name : user; - const search = user.slackId ? { slackId: user.slackId } : { name: userName }; + const search = user.slackId + ? { slackId: user.slackId } + : { name: userName }; const db = await this.getDb(); let tokensAdded = 0; - const foundUser = await db.collection(scores.scoresDocumentName).findOne(search); + const foundUser = await db + .collection(scores.scoresDocumentName) + .findOne(search); // we are leveling up from 0 (which is level 1) -> 2 or 2 -> 3 if (foundUser.accountLevel && foundUser.accountLevel === 2) { // this is a weird case and shouldn't really happen... not sure about this... - this.robot.logger.debug(`Somehow FoundUser[${foundUser.name}] SearchedUser[${user.name}] was trying to upgrade their account to level 2.`); + robot.logger.debug( + `Somehow FoundUser[${foundUser.name}] SearchedUser[${user.name}] was trying to upgrade their account to level 2.`, + ); return true; } foundUser.accountLevel = 2; foundUser.token = 0; tokensAdded = foundUser.score; - await db.collection(scores.scoresDocumentName).updateOne(search, { $set: foundUser }); + await db + .collection(scores.scoresDocumentName) + .updateOne(search, { $set: foundUser }); const newScore = await this.transferScoreFromBotToUser(user, tokensAdded); return newScore; } - async getBotWallet() { + async getBotWallet(robot) { const db = await this.getDb(); - const botWallet = await db.collection(botTokenDocumentName).findOne({ name: this.robot.name }); + const botWallet = await db + .collection(botTokenDocumentName) + .findOne({ name: robot.name }); return botWallet; } async getTopSenderInDuration(amount = 10, days = 7) { const db = await this.getDb(); - const topSendersForDuration = await db.collection(logDocumentName).aggregate([ - { - $match: { date: { $gt: new Date(new Date().setDate(new Date().getDate() - days)).toISOString() } }, - }, - { - $group: { _id: '$from', scoreChange: { $sum: '$scoreChange' } }, - }, - { - $sort: { scoreChange: -1 }, - }]) - .limit(amount).toArray(); + const topSendersForDuration = await db + .collection(logDocumentName) + .aggregate([ + { + $match: { + date: { + $gt: new Date( + new Date().setDate(new Date().getDate() - days), + ).toISOString(), + }, + }, + }, + { + $group: { _id: '$from', scoreChange: { $sum: '$scoreChange' } }, + }, + { + $sort: { scoreChange: -1 }, + }, + ]) + .limit(amount) + .toArray(); return topSendersForDuration; } async getTopReceiverInDuration(amount = 10, days = 7) { const db = await this.getDb(); - const topRecipientForDuration = await db.collection(logDocumentName).aggregate([ - { - $match: { date: { $gt: new Date(new Date().setDate(new Date().getDate() - days)).toISOString() } }, - }, - { - $group: { _id: '$to', scoreChange: { $sum: '$scoreChange' } }, - }, - { - $sort: { scoreChange: -1 }, - }]) - .limit(amount).toArray(); + const topRecipientForDuration = await db + .collection(logDocumentName) + .aggregate([ + { + $match: { + date: { + $gt: new Date( + new Date().setDate(new Date().getDate() - days), + ).toISOString(), + }, + }, + }, + { + $group: { _id: '$to', scoreChange: { $sum: '$scoreChange' } }, + }, + { + $sort: { scoreChange: -1 }, + }, + ]) + .limit(amount) + .toArray(); return topRecipientForDuration; } async getTopRoomInDuration(amount = 3, days = 7) { const db = await this.getDb(); - const topRoomForDuration = await db.collection(logDocumentName).aggregate([ - { - $match: { date: { $gt: new Date(new Date().setDate(new Date().getDate() - days)).toISOString() } }, - }, - { - $group: { _id: '$room', scoreChange: { $sum: '$scoreChange' } }, - }, - { - $sort: { scoreChange: -1 }, - }]) - .limit(amount).toArray(); + const topRoomForDuration = await db + .collection(logDocumentName) + .aggregate([ + { + $match: { + date: { + $gt: new Date( + new Date().setDate(new Date().getDate() - days), + ).toISOString(), + }, + }, + }, + { + $group: { _id: '$room', scoreChange: { $sum: '$scoreChange' } }, + }, + { + $sort: { scoreChange: -1 }, + }, + ]) + .limit(amount) + .toArray(); return topRoomForDuration; } @@ -386,38 +463,58 @@ class DatabaseService { * @param {string} fromName the name of the user sending the points * @returns {object} the user who received the points updated value */ - async transferScoreFromBotToUser(user, scoreChange, from) { + async transferScoreFromBotToUser(robot, user, scoreChange, from) { const userName = user.name ? user.name : user; - const search = user.slackId ? { slackId: user.slackId } : { name: userName }; + const search = user.slackId + ? { slackId: user.slackId } + : { name: userName }; const db = await this.getDb(); - this.robot.logger.info(`We are transferring ${scoreChange} ${Helpers.capitalizeFirstLetter(this.robot.name)} Tokens to ${userName} from ${from ? from.name : Helpers.capitalizeFirstLetter(this.robot.name)}`); - const result = await db.collection(scores.scoresDocumentName).findOneAndUpdate( - search, - { - $inc: + robot.logger.info( + `We are transferring ${scoreChange} ${H.capitalizeFirstLetter( + robot.name, + )} Tokens to ${userName} from ${ + from ? from.name : H.capitalizeFirstLetter(robot.name) + }`, + ); + const result = await db + .collection(scores.scoresDocumentName) + .findOneAndUpdate( + search, { - token: scoreChange, + $inc: { + token: scoreChange, + }, }, - }, - { - returnDocument: 'after', - }, - ); - await db.collection(botTokenDocumentName).updateOne({ name: this.robot.name }, { $inc: { token: -scoreChange } }); + { + returnDocument: 'after', + }, + ); + await db + .collection(botTokenDocumentName) + .updateOne({ name: robot.name }, { $inc: { token: -scoreChange } }); // If this isn't a level up and the score is larger than 1 (tipping aka level 3) if (from && from.name && (scoreChange > 1 || scoreChange < -1)) { - const fromSearch = from.slackId ? { slackId: from.slackId } : { name: from.name }; - await db.collection(scores.scoresDocumentName).updateOne(fromSearch, { $inc: { token: -scoreChange } }); + const fromSearch = from.slackId + ? { slackId: from.slackId } + : { name: from.name }; + await db + .collection(scores.scoresDocumentName) + .updateOne(fromSearch, { $inc: { token: -scoreChange } }); } return result.value; } - async getMagicSecretStringNumberValue() { + async getMagicSecretStringNumberValue(robot) { const db = await this.getDb(); - const updateBotWallet = await db.collection(botTokenDocumentName).findOne({ name: this.robot.name }); + const updateBotWallet = await db + .collection(botTokenDocumentName) + .findOne({ name: robot.name }); return updateBotWallet.magicString; } } -module.exports = DatabaseService; +const databaseService = new DatabaseService(); + +module.exports = databaseService; +module.exports.dbs = databaseService; diff --git a/src/lib/services/decrypt.js b/src/lib/services/decrypt.js index a39eaef..bce2652 100644 --- a/src/lib/services/decrypt.js +++ b/src/lib/services/decrypt.js @@ -4,8 +4,13 @@ module.exports = class Crypto { static decrypt(magicIv, magicNumber, magicString) { const bufferedMagicIv = Buffer.from(magicIv, 'hex'); const bufferedMagicNumber = Buffer.from(magicNumber, 'hex'); - const decipher = crypto.createDecipheriv('aes-256-cbc', bufferedMagicNumber, bufferedMagicIv); - const decrypted = decipher.update(magicString, 'hex', 'utf8') + decipher.final('utf8'); + const decipher = crypto.createDecipheriv( + 'aes-256-cbc', + bufferedMagicNumber, + bufferedMagicIv, + ); + const decrypted = + decipher.update(magicString, 'hex', 'utf8') + decipher.final('utf8'); return decrypted; } }; diff --git a/src/lib/services/eventHandler.js b/src/lib/services/eventHandler.js new file mode 100644 index 0000000..92d3588 --- /dev/null +++ b/src/lib/services/eventHandler.js @@ -0,0 +1,46 @@ +const { H } = require('../helpers'); + +class EventHandlerService { + constructor(robot) { + this.procVars = H.getProcessVariables(process.env); + this.robot = robot; + } + + sendPlusPlusNotification(notificationObject) { + if (this.procVars.notificationsRoom) { + this.robot.messageRoom( + this.procVars.notificationsRoom, + notificationObject.notificationMessage, + ); + } + } + + sendPlusPlusFalsePositiveNotification(notificationObject) { + if (this.procVars.falsePositiveNotificationsRoom) { + this.robot.messageRoom( + this.procVars.falsePositiveNotificationsRoom, + notificationObject.notificationMessage, + ); + } + } + + /** + * + * @param {object} notificationObject + * @param {object} notificationObject.to the user object who was receiving the point + * @param {object} notificationObject.from the user object who was sending the point + * @param {string} notificationObject.message the message that should be sent to the user + * @param {string} notificationObject.reason a reason why the message is being sent + */ + logAndNotifySpam(notificationObject) { + this.robot.logger.error( + `A spam event has been detected: ${notificationObject.message}. ${notificationObject.reason}`, + ); + this.robot.messageRoom( + notificationObject.from.slackId, + `${notificationObject.message}\n\n${notificationObject.reason}`, + ); + } +} + +module.exports = EventHandlerService; diff --git a/src/lib/services/help.js b/src/lib/services/help.js new file mode 100644 index 0000000..1884c77 --- /dev/null +++ b/src/lib/services/help.js @@ -0,0 +1,104 @@ +const { default: axios } = require('axios'); +const { conjunction } = require('../regExpPlusPlus'); +const { H } = require('../helpers'); +const pjson = require('../../../package.json'); + +class HelpService { + static respondWithHelpGuidance(msg) { + const procVars = H.getProcessVariables(process.env); + + const { monthlyScoreboardCron, monthlyScoreboardDayOfWeek } = procVars; + const bn = msg.robot.name || 'hubot'; + const helpMessage = ''.concat( + '`++ []` - Increment score (for an optional reason). In place of `++` you can also use: `:clap:`, `:thumbsup:`, `:thumbsup_all:`, or `:+1:`\n', + '`-- []` - Decrement score (for an optional reason). You can also use `:thumbsdown:`\n', + '`{name1, name2, name3}++ []` - Increment score for all names (for a reason)\n', + '`{name1, name2, name3}-- []` - Decrement score for all names (for a reason) \n', + '`{name1, name2, name3}-- []` - Decrement score for all names (for a reason) \n', + `\`@${bn} score for \` - Display the score for a name and some of the reasons\n`, + `\`@${bn} [top|bottom] [tokens] \` - Display the top scoring , sorted by token/points if you include \`tokens\`\n`, + `\`@${bn} erase []\` - Remove the score for a name (for a reason) \n`, + `\`@${bn} level me up\` - Level up your account for some additional \`${bn}\`-iness \n`, + '`how much are points worth` - Shows how much points are worth\n', + '--------------------------------------------*Info*--------------------------------------------\n', + `Every month (\`${monthlyScoreboardCron}\`), on ${monthlyScoreboardDayOfWeek}, ${bn} will send out an informational message to `, + `<#${procVars.notificationsRoom || 'no room'}> to recognize the`, + ' top 10 senders, top 10 recipients, and the top 3 slack channels that have been sending/receiving points. :eyes:\n', + '--------------------------------------*Level 2 Commands*--------------------------------------\n', + "` + []` - Transfer tokens from your wallet to the receiver's wallet (for an optional reason).\n", + `\`hot wallet\` displays info about \`@${bn}\`'s wallet\n`, + '`[]` indicates optional message parameters\n', + `Each \`[]\` can be prefixed with a conjunction ${conjunction}`, + ); + const message = { + attachments: [ + { + color: '//FEA500', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `Need help with ${bn}?`, + }, + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '_Commands_:', + }, + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: helpMessage, + }, + }, + ], + }, + ], + }; + + if (procVars.furtherHelpUrl && procVars.furtherHelpUrl !== 'undefined') { + message.attachments[0].blocks.push({ + type: 'section', + text: { + type: 'mrkdwn', + text: `For further help please visit ${procVars.furtherHelpUrl}`, + }, + }); + } + msg.send(message); + } + + static async tellHowMuchPointsAreWorth(msg) { + try { + const resp = await axios({ + url: 'https://api.coindesk.com/v1/bpi/currentprice/ARS.json', + }); + + const bitcoin = resp.data.bpi.USD.rate_float; + const ars = resp.data.bpi.ARS.rate_float; + const satoshi = bitcoin / 1e8; + return msg.send( + `A bitcoin is worth ${bitcoin} USD right now (${ars} ARS), a satoshi is about ${satoshi}, and ${msg.robot.name} points are worth nothing!`, + ); + } catch (e) { + return msg.send( + `Seems like we are having trouble getting some data... Don't worry, though, your ${msg.robot.name} points are still worth nothing!`, + ); + } + } + + static respondWithVersion(msg) { + msg.send( + `${H.capitalizeFirstLetter(msg.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`, + ); + } +} + +module.exports = HelpService; diff --git a/src/lib/services/plusplus.js b/src/lib/services/plusplus.js new file mode 100644 index 0000000..6643255 --- /dev/null +++ b/src/lib/services/plusplus.js @@ -0,0 +1,255 @@ +const { sks } = require('./scorekeeper'); +const { H } = require('../helpers'); +const { rpp } = require('../regExpPlusPlus'); +const { mfs } = require('../messageFactory'); + +class PlusPlusService { + /** + * Functions for responding to commands + */ + static async upOrDownVote(msg) { + const [fullText, premessage, name, operator, conjunction, reason] = + msg.match; + + if (H.isKnownFalsePositive(premessage, conjunction, reason, operator)) { + // circuit break a plus plus + msg.robot.emit('plus-plus-failure', { + notificationMessage: + `False positive detected in <#${msg.message.room}> ` + + `from <@${msg.message.user.id}>` + + `\nHas pre-Message text: [${!!premessage}].\n` + + `Missing Conjunction: [${!!(!conjunction && reason)}]` + + '\n\n ' + + `${ + fullText.length >= 150 + ? 'It was really long (>=150)' + : 'It was a short message (<150)' + }`, + room: msg.message.room, + }); + return; + } + const increment = operator.match(rpp.positiveOperators) ? 1 : -1; + const { room, mentions } = msg.message; + const cleanName = H.cleanName(name); + let to = { name: cleanName }; + if (mentions) { + to = mentions.filter((men) => men.type === 'user').shift(); + to.name = cleanName; + } + const cleanReason = H.cleanAndEncode(reason); + const from = msg.message.user; + + msg.robot.logger.debug( + `${increment} score for [${to.name}] from [${from}]${ + cleanReason ? ` because ${cleanReason}` : '' + } in [${room}]`, + ); + let toUser; + let fromUser; + try { + ({ toUser, fromUser } = await sks.incrementScore( + msg.robot, + to, + from, + room, + cleanReason, + increment, + )); + } catch (e) { + msg.send(e.message); + return; + } + + const message = mfs.BuildNewScoreMessage( + msg.robot, + toUser, + cleanReason, + msg.robot.name, + ); + + if (message) { + msg.send(message); + msg.robot.emit('plus-plus', [ + { + notificationMessage: `<@${fromUser.slackId}> ${ + operator.match(rpp.positiveOperators) ? 'sent' : 'removed' + } a ${H.capitalizeFirstLetter(msg.robot.name)} point ${ + operator.match(rpp.positiveOperators) ? 'to' : 'from' + } <@${toUser.slackId}> in <#${room}>`, + sender: fromUser, + recipient: toUser, + direction: operator, + amount: 1, + room, + reason: cleanReason, + msg, + }, + ]); + } + } + + static async multipleUsersVote(msg) { + const [fullText, premessage, names, operator, conjunction, reason] = + msg.match; + if (!names) { + return; + } + if (H.isKnownFalsePositive(premessage, conjunction, reason, operator)) { + // circuit break a plus plus + msg.robot.emit('plus-plus-failure', { + notificationMessage: `False positive detected in <#${ + msg.message.room + }> from <@${ + msg.message.user.id + }>:\nPre-Message text: [${!!premessage}].\nMissing Conjunction: [${!!( + !conjunction && reason + )}]\n\n${fullText}`, + room: msg.message.room, + }); + return; + } + + const namesArray = names + .trim() + .toLowerCase() + .split(new RegExp(rpp.multiUserSeparator)) + .filter(Boolean); + + const cleanNames = namesArray + // Parse names + .map((name) => { + const cleanedName = H.cleanName(name); + return cleanedName; + }) + // Remove empty ones: {,,,}++ + .filter((name) => !!name.length) + // Remove duplicates: {user1,user1}++ + .filter((name, pos, self) => self.indexOf(name) === pos); + + const from = msg.message.user; + const { room, mentions } = msg.message; + let to = cleanNames.map((cn) => ({ name: cn })); + if (mentions) { + to = mentions + .filter((men) => men.type === 'user') + .filter( + (single, index, allMentions) => + index === allMentions.findIndex((m) => m.id === single.id), + ); + } + const cleanReason = H.cleanAndEncode(reason); + const increment = operator.match(rpp.positiveOperators) ? 1 : -1; + + if (cleanNames.length !== to.length) { + msg.send( + 'We are having trouble mapping your multi-user plusplus. Please try again and only include @ mentions.', + ); + return; + } + + const incScorePromises = []; + for (const oneTo of to) { + incScorePromises.push( + sks.incrementScore( + msg.robot, + oneTo, + from, + room, + cleanReason, + increment, + ), + ); + } + + const settledPromises = await Promise.allSettled(incScorePromises); + const pointEmits = []; + const messages = []; + for (const settled of settledPromises) { + if (settled.status === 'rejected') { + msg.robot.logger.error(`Failed to send point ${settled.reason}`); + } else if (settled.status === 'fulfilled') { + const { toUser, fromUser } = settled.value; + if (toUser) { + msg.robot.logger.debug( + `clean names map [${toUser.name}]: ${toUser.score}, the reason ${toUser.reasons[cleanReason]}`, + ); + messages.push( + mfs.BuildNewScoreMessage(msg.robot, toUser, cleanReason), + ); + pointEmits.push({ + notificationMessage: `<@${fromUser.slackId}> ${ + operator.match(rpp.positiveOperators) ? 'sent' : 'removed' + } a ${H.capitalizeFirstLetter(msg.robot.name)} point ${ + operator.match(rpp.positiveOperators) ? 'to' : 'from' + } <@${toUser.slackId}> in <#${room}>`, + sender: fromUser, + recipient: toUser, + direction: operator, + amount: 1, + room, + reason: cleanReason, + msg, + }); + } + } + } + msg.robot.emit('plus-plus', pointEmits); + + const deDupedMessages = messages.filter((message) => !!message); // de-dupe + + msg.robot.logger.debug( + `These are the original messages \n ${deDupedMessages.join('\n')}\n\n`, + `These are the de-duped messages \n ${deDupedMessages.join('\n')}`, + ); + msg.send(deDupedMessages.join('\n')); + } + + /** + * Erase a user's score, only admin accessible + * @param {Object} msg + * @returns {Promise} + * + */ + static async eraseUserScore(msg) { + let erased; + const [_fullText, _premessage, name, _conjunction, reason] = msg.match; + const from = msg.message.user; + const { user } = msg.envelope; + const { room, mentions } = msg.message; + + const cleanReason = H.cleanAndEncode(reason); + let to = mentions.filter((men) => men.type === 'user').shift(); + const cleanName = H.cleanName(name); + if (!to) { + to = { name: cleanName }; + } else { + to.name = cleanName; + } + + const isAdmin = + (msg.robot.auth + ? msg.robot.auth.hasRole(user, 'plusplus-admin') + : undefined) || + (msg.robot.auth ? msg.robot.auth.hasRole(user, 'admin') : undefined); + + if (!msg.robot.auth || !isAdmin) { + msg.reply("Sorry, you don't have authorization to do that."); + return; + } + if (isAdmin) { + erased = await sks.erase(msg.robot, to, from, room, cleanReason); + } + + if (erased) { + const decodedReason = H.decode(cleanReason); + const message = !decodedReason + ? `Erased the following reason from ${to.name}: ${decodedReason}` + : `Erased points for ${to.name}`; + msg.send(message); + } + } +} + +module.exports = PlusPlusService; +module.exports.pps = PlusPlusService; diff --git a/src/lib/services/scoreboard.js b/src/lib/services/scoreboard.js new file mode 100644 index 0000000..e321844 --- /dev/null +++ b/src/lib/services/scoreboard.js @@ -0,0 +1,130 @@ +const clark = require('clark'); +const _ = require('lodash'); +const { helpers } = require('../helpers'); +const { mfs } = require('../messageFactory'); +const { dbs } = require('./database'); + +class ScoreboardService { + static async respondWithScore(msg) { + const { mentions } = msg.message; + const [_fullText, _premessage, _conjunction, name] = msg.match; + let to = { name: helpers.cleanName(name) }; + if (mentions) { + const userMentions = mentions.filter((men) => men.type === 'user'); + to = userMentions.pop(); + to.name = name; + } + + const user = await dbs.getUser(to); + + const scoreString = mfs.BuildScoreLookup(user); + msg.send(scoreString); + } + + static async respondWithLeaderLoserBoard(msg) { + const amount = parseInt(msg.match[2], 10) || 10; + const topOrBottom = helpers.capitalizeFirstLetter(msg.match[1].trim()); + const methodName = `get${topOrBottom}Scores`; + + const tops = await dbs[methodName](amount); + const message = []; + if (tops.length > 0) { + for ( + let i = 0, end = tops.length - 1, asc = end >= 0; + asc ? i <= end : i >= end; + asc ? i++ : i-- + ) { + const person = tops[i].slackId ? `<@${tops[i].slackId}>` : tops[i].name; + if (tops[i].accountLevel && tops[i].accountLevel > 1) { + const tokenStr = tops[i].token > 1 ? 'Tokens' : 'Token'; + message.push( + `${i + 1}. ${person}: ${tops[i].score} (*${ + tops[i].token + } ${helpers.capitalizeFirstLetter(msg.robot.name)} ${tokenStr}*)`, + ); + } else { + message.push(`${i + 1}. ${person}: ${tops[i].score}`); + } + } + } else { + message.push('No scores to keep track of yet!'); + } + + const graphSize = Math.min(tops.length, Math.min(amount, 20)); + message.splice(0, 0, clark(_.take(_.map(tops, 'score'), graphSize))); + + return msg.send(message.join('\n')); + } + + static async respondWithLeaderLoserTokenBoard(msg) { + const amount = parseInt(msg.match[2], 10) || 10; + const topOrBottom = helpers.capitalizeFirstLetter(msg.match[1].trim()); + const methodName = `get${topOrBottom}Tokens`; + + const tops = await dbs[methodName](amount); + + const message = []; + if (tops.length > 0) { + for ( + let i = 0, end = tops.length - 1, asc = end >= 0; + asc ? i <= end : i >= end; + asc ? i++ : i-- + ) { + const person = tops[i].slackId ? `<@${tops[i].slackId}>` : tops[i].name; + const tokenStr = tops[i].token > 1 ? 'Tokens' : 'Token'; + const pointStr = tops[i].score > 1 ? 'points' : 'point'; + message.push( + `${i + 1}. ${person}: *${ + tops[i].token + } ${helpers.capitalizeFirstLetter(msg.robot.name)} ${tokenStr}* (${ + tops[i].score + } ${pointStr})`, + ); + } + } else { + message.push('No scores to keep track of yet!'); + } + + const graphSize = Math.min(tops.length, Math.min(amount, 20)); + message.splice(0, 0, clark(_.take(_.map(tops, 'token'), graphSize))); + + return msg.send(message.join('\n')); + } + + static async getTopPointSenders(msg) { + const amount = parseInt(msg.match[2], 10) || 10; + const topOrBottom = helpers.capitalizeFirstLetter(msg.match[1].trim()); + const methodName = `get${topOrBottom}Sender`; + const tops = await dbs[methodName](amount); + + const message = []; + if (tops.length > 0) { + for ( + let i = 0, end = tops.length - 1, asc = end >= 0; + asc ? i <= end : i >= end; + asc ? i++ : i-- + ) { + const person = `<@${tops[i].slackId}>`; + const pointStr = + tops[i].totalPointsGiven > 1 ? 'points given' : 'point given'; + message.push( + `${i + 1}. ${person} (${tops[i].totalPointsGiven} ${pointStr})`, + ); + } + } else { + message.push('No scores to keep track of yet!'); + } + + const graphSize = Math.min(tops.length, Math.min(amount, 20)); + message.splice( + 0, + 0, + clark(_.take(_.map(tops, 'totalPointsGiven'), graphSize)), + ); + + return msg.send(message.join('\n')); + } +} + +module.exports = ScoreboardService; +module.exports.sbs = ScoreboardService; diff --git a/src/lib/services/scorekeeper.js b/src/lib/services/scorekeeper.js index 61f0066..c6aff66 100644 --- a/src/lib/services/scorekeeper.js +++ b/src/lib/services/scorekeeper.js @@ -1,175 +1,256 @@ -/* eslint-disable guard-for-in */ -/* eslint-disable no-restricted-syntax */ -const DatabaseService = require('./database'); +const { dbs } = require('./database'); +const { H } = require('../helpers'); -module.exports = class ScoreKeeper { - /* - * params.robot - * params.peerFeedbackUrl - * params.furtherFeedbackSuggestedScore - * params.spamMessage - * params.mongoUri - */ - constructor(params) { - for (const key in params) { - this[key] = params[key]; - } - this.databaseService = new DatabaseService(params); - this.databaseService.init(); // this is async but it is just initializing the db connection, we let it run - } - - /* - * Method to allow up or down vote of a user - * - * userName - the user who is receiving the score change - * from - the user object that is sending the score change - * reason - the reason for score change - * incrementValue - [number] the value to change the score by - * return scoreObject - the new document for the user who received the score - */ - async incrementScore(to, from, room, reason, incrementValue) { - from = typeof from === 'string' ? { name: from, id: from } : from; +class ScoreKeeperService { + /** + * Method to allow up or down vote of a user + * + * userName - the user who is receiving the score change + * from - the user object that is sending the score change + * reason - the reason for score change + * incrementValue - [number] the value to change the score by + * return scoreObject - the new document for the user who received the score + */ + static async incrementScore(robot, to, from, room, reason, incrementValue) { + const parsedFrom = + typeof from === 'string' ? { name: from, id: from } : from; let toUser; let fromUser; try { - toUser = await this.getUser(to); - fromUser = await this.getUser(from); - if ((await this.isSpam(toUser, fromUser)) || this.isSendingToSelf(toUser, fromUser) || this.isBot(from, room)) { - throw new Error(`I'm sorry <@${fromUser.slackId}>, I'm afraid I can't do that.`); + toUser = await ScoreKeeperService.getUser(robot, to); + fromUser = await ScoreKeeperService.getUser(robot, parsedFrom); + if ( + (await ScoreKeeperService.isSpam(robot, toUser, fromUser)) || + ScoreKeeperService.isSendingToSelf(robot, toUser, fromUser) || + ScoreKeeperService.isBot(robot, parsedFrom, room) + ) { + throw new Error( + `I'm sorry <@${fromUser.slackId}>, I'm afraid I can't do that.`, + ); } toUser.score = parseInt(toUser.score, 10) + parseInt(incrementValue, 10); if (reason) { - const oldReasonScore = toUser.reasons[`${reason}`] ? toUser.reasons[`${reason}`] : 0; + const oldReasonScore = toUser.reasons[`${reason}`] + ? toUser.reasons[`${reason}`] + : 0; toUser.reasons[`${reason}`] = oldReasonScore + incrementValue; } - await this.databaseService.savePointsGiven(from, toUser, incrementValue); - let saveResponse = await this.databaseService.saveUser(toUser, fromUser, room, reason, incrementValue); + await dbs.savePointsGiven(robot, parsedFrom, toUser, incrementValue); + let saveResponse = await dbs.saveUser( + robot, + toUser, + fromUser, + room, + reason, + incrementValue, + ); try { - await this.databaseService.savePlusPlusLog(toUser, fromUser, room, reason, incrementValue); + await dbs.savePlusPlusLog( + robot, + toUser, + fromUser, + room, + reason, + incrementValue, + ); } catch (e) { - this.robot.logger.error(`failed saving spam log for user ${toUser.name} from ${from.name} in room ${room} because ${reason}`, e); + robot.logger.error( + `failed saving spam log for user ${toUser.name} from ${parsedFrom.name} in room ${room} because ${reason}`, + e, + ); } if (saveResponse.accountLevel > 1) { - saveResponse = await this.databaseService.transferScoreFromBotToUser(toUser, incrementValue, fromUser); + saveResponse = await dbs.transferScoreFromBotToUser( + robot, + toUser, + incrementValue, + fromUser, + ); } return { toUser: saveResponse, fromUser }; } catch (e) { - this.robot.logger.error(`failed to ${incrementValue > 0 ? 'add' : 'subtract'} point to [${to.name || 'no to'}] from [${from ? from.name : 'no from'}] because [${reason}] object [${JSON.stringify(toUser)}]`, e); + robot.logger.error( + `failed to ${incrementValue > 0 ? 'add' : 'subtract'} point to [${ + to.name || 'no to' + }] from [${ + parsedFrom ? parsedFrom.name : 'no from' + }] because [${reason}] object [${JSON.stringify(toUser)}]`, + e, + ); throw e; } } - async transferTokens(to, from, room, reason, numberOfTokens) { + static async transferTokens(robot, to, from, room, reason, numberOfTokens) { let toUser; let fromUser; try { - toUser = await this.getUser(to); - fromUser = await this.getUser(from); + toUser = await ScoreKeeperService.getUser(robot, to); + fromUser = await ScoreKeeperService.getUser(robot, from); if (toUser.accountLevel >= 2 && fromUser.accountLevel >= 2) { - if ((await this.isSpam(toUser, fromUser)) || this.isSendingToSelf(toUser, fromUser) || this.isBot(from, room)) { - throw new Error(`I'm sorry <@${fromUser.slackId}>, I'm afraid I can't do that.`); + if ( + (await ScoreKeeperService.isSpam(robot, toUser, fromUser)) || + ScoreKeeperService.isSendingToSelf(robot, toUser, fromUser) || + ScoreKeeperService.isBot(robot, from, room) + ) { + throw new Error( + `I'm sorry <@${fromUser.slackId}>, I'm afraid I can't do that.`, + ); } if (fromUser.token >= parseInt(numberOfTokens, 10)) { - fromUser.token = parseInt(fromUser.token, 10) - parseInt(numberOfTokens, 10); - toUser.token = parseInt(toUser.token, 10) + parseInt(numberOfTokens, 10); + fromUser.token = + parseInt(fromUser.token, 10) - parseInt(numberOfTokens, 10); + toUser.token = + parseInt(toUser.token, 10) + parseInt(numberOfTokens, 10); if (reason) { - const oldReasonScore = toUser.reasons[`${reason}`] ? toUser.reasons[`${reason}`] : 0; + const oldReasonScore = toUser.reasons[`${reason}`] + ? toUser.reasons[`${reason}`] + : 0; toUser.reasons[`${reason}`] = oldReasonScore + numberOfTokens; } - await this.databaseService.savePointsGiven(from, toUser, numberOfTokens); - const saveResponse = await this.databaseService.saveUser(toUser, fromUser, room, reason, numberOfTokens); + await dbs.savePointsGiven(robot, from, toUser, numberOfTokens); + const saveResponse = await dbs.saveUser( + robot, + toUser, + fromUser, + room, + reason, + numberOfTokens, + ); try { - await this.databaseService.savePlusPlusLog(toUser, fromUser, room, reason, numberOfTokens); + await dbs.savePlusPlusLog( + robot, + toUser, + fromUser, + room, + reason, + numberOfTokens, + ); } catch (e) { - this.robot.logger.error(`failed saving spam log for user ${toUser.name} from ${from.name} in room ${room} because ${reason}`, e); + robot.logger.error( + `failed saving spam log for user ${toUser.name} from ${from.name} in room ${room} because ${reason}`, + e, + ); } - await this.databaseService.saveUser(fromUser, toUser, room, reason, -numberOfTokens); + await dbs.saveUser( + robot, + fromUser, + toUser, + room, + reason, + -numberOfTokens, + ); return { toUser: saveResponse, fromUser, }; - } else { - // from has too few tokens to send that many - throw new Error(`You don't have enough tokens to send ${numberOfTokens} to ${toUser.name}`); } + // from has too few tokens to send that many + throw new Error( + `You don't have enough tokens to send ${numberOfTokens} to ${toUser.name}`, + ); } else { // to or from is not level 2 - throw new Error(`In order to send tokens to ${toUser.name} you both must be, at least, level 2.`); + throw new Error( + `In order to send tokens to ${toUser.name} you both must be, at least, level 2.`, + ); } } catch (e) { - this.robot.logger.error(`failed to transfer tokens to [${to.name || 'no to'}] from [${from ? from.name : 'no from'}] because [${reason}] object [${toUser.name}]`, e); + robot.logger.error( + `failed to transfer tokens to [${to.name || 'no to'}] from [${ + from ? from.name : 'no from' + }] because [${reason}] object [${toUser.name}]`, + e, + ); throw e; } } - async getUser(user) { - const dbUser = await this.databaseService.getUser(user); + static async getUser(robot, user) { + const dbUser = await dbs.getUser(robot, user); return dbUser; } - async erase(user, from, room, reason) { + static async erase(robot, user, from, room, reason) { if (reason) { - this.robot.logger.error(`Erasing score for reason ${reason} for ${user} by ${from}`); - await this.databaseService.erase(user, reason); + robot.logger.error( + `Erasing score for reason ${reason} for ${user} by ${from}`, + ); + await dbs.erase(user, reason); return true; } - this.robot.logger.error(`Erasing all scores for ${user} by ${from}`); - await this.databaseService.erase(user); + robot.logger.error(`Erasing all scores for ${user} by ${from}`); + await dbs.erase(user); return true; } - isSendingToSelf(to, from) { - this.robot.logger.debug(`Checking if is to self. To [${to.name}] From [${from.name}], Valid: ${to.name !== from.name}`); + static isSendingToSelf(robot, to, from) { + const { spamMessage } = H.getProcessVars(process.env); + robot.logger.debug( + `Checking if is to self. To [${to.name}] From [${from.name}], Valid: ${ + to.name !== from.name + }`, + ); const isToSelf = to.name === from.name; if (isToSelf) { - this.robot.emit('plus-plus-spam', { + robot.emit('plus-plus-spam', { to, from, - message: this.spamMessage, + message: spamMessage, reason: 'Looks like you may be trying to send a point to yourself.', }); } return isToSelf; } - async isSpam(to, from) { + static async isSpam(robot, to, from) { + const { spamMessage } = H.getProcessVars(process.env); const toId = to.slackId || to.name; const fromId = from.slackId || from.name; - this.robot.logger.debug(`Checking spam to [${to.name}] from [${from.name}]`); - const isSpam = await this.databaseService.isSpam(toId, fromId); + robot.logger.debug(`Checking spam to [${to.name}] from [${from.name}]`); + const isSpam = await dbs.isSpam(robot, toId, fromId); if (isSpam) { - this.robot.emit('plus-plus-spam', { + robot.emit('plus-plus-spam', { to, from, - message: this.spamMessage, + message: spamMessage, reason: `You recently sent <@${toId}> a point.`, }); } return isSpam; } - /* - * tries to detect bots - * from - object from the msg.message.user - * return {boolean} true if it is a bot - */ - isBot(from, room) { + /** + * tries to detect bots + * from - object from the msg.message.user + * return {boolean} true if it is a bot + */ + static isBot(robot, from, _room) { + const { spamMessage } = H.getProcessVars(process.env); + let isBot = false; - this.robot.logger.debug('checking the from user for is robot', from, from.is_bot); + robot.logger.debug( + 'checking the from user for is robot', + from, + from.is_bot, + ); if (from.is_bot) { isBot = true; - this.robot.logger.error('A bot is sending points in DM'); - this.robot.emit('plus-plus-spam', { + robot.logger.error('A bot is sending points in DM'); + robot.emit('plus-plus-spam', { to: undefined, from, - message: this.spamMessage, - reason: 'You can\'t have a bot do the dirty work.', + message: spamMessage, + reason: "You can't have a bot do the dirty work.", }); } return isBot; } -}; +} + +module.exports = ScoreKeeperService; +module.exports.sks = ScoreKeeperService; diff --git a/src/lib/services/scorekeeper.test.js b/src/lib/services/scorekeeper.test.js index 8a52284..9da12d6 100644 --- a/src/lib/services/scorekeeper.test.js +++ b/src/lib/services/scorekeeper.test.js @@ -1,16 +1,14 @@ -const chai = require('chai'); +const { MongoClient } = require('mongodb'); const sinon = require('sinon'); +const chai = require('chai'); chai.use(require('sinon-chai')); const { expect } = chai; - -const { MongoClient } = require('mongodb'); const SlackClient = require('@slack/client'); -const mongoUnit = require('mongo-unit'); -const Helpers = require('../Helpers'); -const ScoreKeeper = require('./scorekeeper'); -const { robotStub, mockScoreKeeper } = require('../../../test/test_helpers'); +const ScoreKeeperService = require('./scorekeeper'); +const { H } = require('../helpers'); +const { robotStub } = require('../../../test/test_helpers'); const defaultData = { scores: [{}], @@ -18,16 +16,8 @@ const defaultData = { }; describe('ScoreKeeper', () => { - let scoreKeeper; let msgSpy; let emitSpy; - before(async () => { - await mongoUnit.start(); - const url = mongoUnit.getUrl(); - scoreKeeper = mockScoreKeeper(url); - - return true; - }); beforeEach(async () => { msgSpy = sinon.spy(robotStub, 'messageRoom'); @@ -42,13 +32,11 @@ describe('ScoreKeeper', () => { .returns({ user: { profile: { email: 'test@email.com' } } }), }, }); - return mongoUnit.load(defaultData); }); afterEach(async () => { sinon.restore(); msgSpy.resetHistory(); - return mongoUnit.drop(); }); describe('adding', () => { @@ -59,10 +47,10 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await scoreKeeper.getUser(to); + const beforeUser = await ScoreKeeperService.getUser(to); expect(beforeUser.score).to.be.equal(0); - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( to, from, room, @@ -75,7 +63,7 @@ describe('ScoreKeeper', () => { expectedResult.reasons['because points'], ); - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.be.equal(1); }); @@ -86,10 +74,10 @@ describe('ScoreKeeper', () => { const reason = 'because points'; const expectedResult = { score: 1, reasons: { 'because points': 1 } }; - const beforeUser = await scoreKeeper.getUser(to); + const beforeUser = await ScoreKeeperService.getUser(to); expect(beforeUser.score).to.be.equal(0); - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( to, from, room, @@ -102,7 +90,7 @@ describe('ScoreKeeper', () => { expectedResult.reasons['because points'], ); - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.be.equal(1); }); @@ -113,10 +101,10 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await scoreKeeper.getUser(to); + const beforeUser = await ScoreKeeperService.getUser(to); expect(beforeUser.score).to.be.equal(0); - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( to, from, room, @@ -129,7 +117,7 @@ describe('ScoreKeeper', () => { expectedResult.reasons['because points'], ); - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.be.equal(1); }); @@ -140,10 +128,10 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await scoreKeeper.getUser(to); + const beforeUser = await ScoreKeeperService.getUser(to); expect(beforeUser.score).to.be.equal(0); - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( to, from, room, @@ -156,7 +144,7 @@ describe('ScoreKeeper', () => { expectedResult.reasons['because points'], ); - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.be.equal(1); }); @@ -167,10 +155,10 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await scoreKeeper.getUser(to); + const beforeUser = await ScoreKeeperService.getUser(to); expect(beforeUser.score).to.be.equal(0); - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( to, from, room, @@ -183,16 +171,16 @@ describe('ScoreKeeper', () => { expectedResult.reasons['because points'], ); - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.be.equal(1); }); it('does not allow spamming points', async () => { const to = { name: 'matt.erickson', id: 'matt.erickson' }; // empty score to start - const beforeUser = await scoreKeeper.getUser(to); + const beforeUser = await ScoreKeeperService.getUser(to); expect(beforeUser.score).to.be.equal(0); - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( to, { name: 'matt.erickson.min', id: '123' }, 'room', @@ -205,13 +193,13 @@ describe('ScoreKeeper', () => { expect(emitSpy.called).to.equal(false); // score added - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.be.equal(1); // Try to spam let r2; try { - ({ toUser: r2 } = await scoreKeeper.incrementScore( + ({ toUser: r2 } = await ScoreKeeperService.incrementScore( to, { name: 'from', id: '123' }, 'room', @@ -224,7 +212,7 @@ describe('ScoreKeeper', () => { "I'm sorry <@123>, I'm afraid I can't do that.", ); } - const spamScore = await scoreKeeper.getUser(to); + const spamScore = await ScoreKeeperService.getUser(to); expect(spamScore).to.not.equal(2); expect(emitSpy.called).to.equal(true); @@ -233,14 +221,7 @@ describe('ScoreKeeper', () => { describe('special increment value response', () => { before(async () => { - const url = await mongoUnit.start(); - const client = new MongoClient(url, { - useNewUrlParser: true, - useUnifiedTopology: true, - }); - const connection = await client.connect(); - const db = connection.db(); - const encodedName = Helpers.cleanAndEncode('derp'); + const encodedName = H.cleanAndEncode('derp'); await db.collection('scores').insertOne({ name: 'matt', score: 9, @@ -251,7 +232,7 @@ describe('ScoreKeeper', () => { }); it('should call for a special response if user has 10 "gives"', async () => { - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( { name: 'derp' }, { name: 'matt', id: '123' }, 'room', @@ -264,14 +245,14 @@ describe('ScoreKeeper', () => { expect(msgSpy.called).to.equal(true); expect(msgSpy).to.have.been.calledWith( '123', - `Looks like you've given derp quite a few points, maybe you should look at submitting ${scoreKeeper.peerFeedbackUrl}`, + `Looks like you've given derp quite a few points, maybe you should look at submitting ${ScoreKeeperService.peerFeedbackUrl}`, ); }); }); it('adds more points to a user for a reason', async () => { const to = 'to'; - let { toUser: r } = await scoreKeeper.incrementScore( + let { toUser: r } = await ScoreKeeperService.incrementScore( to, { name: 'from', id: '123' }, 'room', @@ -282,7 +263,7 @@ describe('ScoreKeeper', () => { expect(r.score).to.equal(1); expect(r.reasons['because points']).to.equal(1); - ({ toUser: r } = await scoreKeeper.incrementScore( + ({ toUser: r } = await ScoreKeeperService.incrementScore( to, { name: 'another-from', id: '321' }, 'room', @@ -294,14 +275,14 @@ describe('ScoreKeeper', () => { expect(r.reasons['because points']).to.equal(2); expect(typeof r[`${robotStub.name}Day`]).to.equal('object'); - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.equal(2); }); }); describe('subtracting', () => { it('adds points to a user', async () => { - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -312,7 +293,7 @@ describe('ScoreKeeper', () => { }); it('subtracts points from a user for a reason', async () => { - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -327,9 +308,9 @@ describe('ScoreKeeper', () => { it('does not allow spamming points', async () => { const to = 'mahMainBuddy'; // empty score to start - const beforeUser = await scoreKeeper.getUser(to); + const beforeUser = await ScoreKeeperService.getUser(to); expect(beforeUser.score).to.be.equal(0); - const { toUser: r } = await scoreKeeper.incrementScore( + const { toUser: r } = await ScoreKeeperService.incrementScore( to, { name: 'from', id: '123' }, 'room', @@ -341,13 +322,13 @@ describe('ScoreKeeper', () => { expect(r.reasons['because points']).to.equal(-1); // score added - const afterUser = await scoreKeeper.getUser(to); + const afterUser = await ScoreKeeperService.getUser(to); expect(afterUser.score).to.be.equal(-1); // Try to spam let r2; try { - ({ toUser: r2 } = await scoreKeeper.incrementScore( + ({ toUser: r2 } = await ScoreKeeperService.incrementScore( to, { name: 'from', id: '123' }, 'room', @@ -360,7 +341,7 @@ describe('ScoreKeeper', () => { "I'm sorry <@123>, I'm afraid I can't do that.", ); } - const spamScore = await scoreKeeper.getUser(to); + const spamScore = await ScoreKeeperService.getUser(to); expect(spamScore).to.not.equal(-2); expect(emitSpy.called).to.equal(true); @@ -368,14 +349,14 @@ describe('ScoreKeeper', () => { }); it('subtracts more points from a user for a reason', async () => { - let { toUser: r } = await scoreKeeper.incrementScore( + let { toUser: r } = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', 'because points', -1, ); - ({ toUser: r } = await scoreKeeper.incrementScore( + ({ toUser: r } = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, 'another-from', 'room', @@ -390,7 +371,7 @@ describe('ScoreKeeper', () => { describe('erasing', () => { it('erases a reason from a user', async () => { - const { toUser: p } = await scoreKeeper.incrementScore( + const { toUser: p } = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -400,20 +381,20 @@ describe('ScoreKeeper', () => { expect(p).to.be.an('object'); expect(p.score).to.equal(1); expect(p.reasons.reason).to.equal(1); - const r = await scoreKeeper.erase( + const r = await ScoreKeeperService.erase( 'to', { name: 'from', id: '123' }, 'room', 'reason', ); expect(r).to.deep.equal(true); - const rs = await scoreKeeper.getUser('to'); + const rs = await ScoreKeeperService.getUser('to'); expect(rs.reasons).to.deep.equal({ reason: 0 }); expect(rs.reasons.reason).to.equal(0); }); it('erases a user from the scoreboard', async () => { - const { toUser: p } = await scoreKeeper.incrementScore( + const { toUser: p } = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -423,20 +404,20 @@ describe('ScoreKeeper', () => { expect(p).to.be.an('object'); expect(p.score).to.equal(1); expect(p.reasons.reason).to.equal(1); - const r = await scoreKeeper.erase( + const r = await ScoreKeeperService.erase( 'to', { name: 'from', id: '123' }, 'room', ); expect(r).to.equal(true); - const user2 = await scoreKeeper.getUser('to'); + const user2 = await ScoreKeeperService.getUser('to'); expect(user2.score).to.equal(0); }); }); describe('scores', () => { it('returns the score for a user', async () => { - const { toUser: p } = await scoreKeeper.incrementScore( + const { toUser: p } = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -444,13 +425,13 @@ describe('ScoreKeeper', () => { 1, ); expect(p.score).to.equal(1); - const user = await scoreKeeper.getUser('to'); + const user = await ScoreKeeperService.getUser('to'); expect(user.score).to.equal(1); }); it('returns the reasons for a user', async () => { try { - const user = await scoreKeeper.incrementScore( + const user = await ScoreKeeperService.incrementScore( { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', diff --git a/src/lib/services/token.js b/src/lib/services/token.js new file mode 100644 index 0000000..9dac1de --- /dev/null +++ b/src/lib/services/token.js @@ -0,0 +1,93 @@ +const ScoreKeeperService = require('./scorekeeper'); +const { H } = require('../helpers'); + +class TokenService { + /** + * Sends a token between one user to another user + * @param {object} msg - hubot message object + * @returns {Promise} + */ + static async giveTokenBetweenUsers(msg) { + const [fullText, premessage, name, number, conjunction, reason] = msg.match; + if (!conjunction && reason) { + // circuit break a plus plus + msg.robot.emit('plus-plus-failure', { + notificationMessage: `False positive detected in <#${ + msg.message.room + }> from <@${ + msg.message.user.id + }>:\nPre-Message text: [${!!premessage}].\nMissing Conjunction: [${!!( + !conjunction && reason + )}]\n\n${fullText}`, + room: msg.message.room, + }); + return; + } + const { room, mentions } = msg.message; + const cleanName = H.cleanName(name); + let to = { name: cleanName }; + if (mentions) { + if (mentions.filter((men) => men.type === 'user').length > 1) { + // shift off the first mention (most likely @qrafty) + msg.robot.logger.debug( + 'We are shifting off the first mention', + mentions.filter((men) => men.type === 'user'), + ); + mentions.filter((men) => men.type === 'user').shift(); + } + to = mentions.filter((men) => men.type === 'user').shift(); + to.name = cleanName; + } + const cleanReason = H.cleanAndEncode(reason); + const from = msg.message.user; + + msg.robot.logger.debug( + `${number} score for [${mentions}] from [${from}]${ + cleanReason ? ` because ${cleanReason}` : '' + } in [${room}]`, + ); + let response; + try { + response = await ScoreKeeperService.transferTokens( + msg.robot, + to, + from, + room, + cleanReason, + number, + ); + } catch (e) { + msg.send(e.message); + return; + } + + const message = H.getMessageForTokenTransfer( + msg.robot, + response.toUser, + response.fromUser, + number, + cleanReason, + ); + + if (message) { + msg.send(message); + msg.robot.emit('plus-plus', { + notificationMessage: `<@${ + response.fromUser.slackId + }> sent ${number} ${H.capitalizeFirstLetter(msg.robot.name)} point${ + parseInt(number, 10) > 1 ? 's' : '' + } to <@${response.toUser.slackId}> in <#${room}>`, + recipient: response.toUser, + sender: response.fromUser, + direction: '++', + amount: number, + room, + reason: cleanReason, + msg, + }); + } + } +} + +module.exports = TokenService; +module.exports.tss = TokenService; diff --git a/src/lib/services/wallet.js b/src/lib/services/wallet.js new file mode 100644 index 0000000..f2474c9 --- /dev/null +++ b/src/lib/services/wallet.js @@ -0,0 +1,123 @@ +const Conversation = require('hubot-conversation'); +const tokenBuddy = require('token-buddy'); +const _ = require('lodash'); +const { dbs } = require('./database'); +const { helpers } = require('../helpers'); + +class WalletService { + static async levelUpAccount(msg) { + const switchBoard = new Conversation(msg.robot); + const dialog = switchBoard.startDialog(msg); + dialog.dialogTimeout = (timeoutMsg) => { + timeoutMsg.reply( + "You didn't answer the question prompted in a timely fashion, this message will now self destruct. :boom:", + ); + }; + + if (!helpers.isPrivateMessage(msg.message.room)) { + return msg.reply( + `You should only execute a level up from within the context of a DM with ${msg.robot.name}`, + ); + } + + const user = await dbs.getUser(msg.message.user); + if (user.accountLevel === 2) { + msg.reply( + `You are already Level 2, ${ + user.name + }. It looks as if you are ready for Level 3 where you can deposit/withdraw ${helpers.capitalizeFirstLetter( + msg.robot.name, + )} Tokens! Is that correct? [Yes/No]`, + ); + dialog.addChoice(/yes/i, (msg2) => { + // do the level 3 step up, get their info for deposit withdrawal + msg2.reply( + `Hey ${user.name}, looks like you are ready for Level 3 but I'm not :sob:. Level 3 is still WIP and will be available very soon!`, + ); + }); + dialog.addChoice(/no/i, (msg2) => { + msg2.reply('Woops. My mistake. Carry on++'); + }); + return false; + } + + const leveledUpUser = await dbs.updateAccountLevelToTwo(user); + msg.robot.logger.debug('DB results', leveledUpUser); + + msg.reply( + `${ + user.name + }, we are going to level up your account to Level 2! This means you will start getting ${helpers.capitalizeFirstLetter( + msg.robot.name, + )} Tokens as well as points!`, + ); + return true; + } + + static async botWalletCount(msg) { + const botWallet = await dbs.getBotWallet(); + msg.robot.logger.debug( + `Get the bot wallet by user ${msg.message.user.name}, ${botWallet}`, + ); + let gas; + try { + gas = await tokenBuddy.getBalance(botWallet.publicWalletAddress); + } catch (e) { + msg.send(`An error occurred getting ${msg.robot.name}'s gas amount`); + } + msg.robot.logger.debug( + `Get the bot wallet by user ${msg.message.user.name}, ${_.pick( + JSON.stringify(botWallet), + ['publicWalletAddress', 'name', 'token'], + )}`, + ); + + const message = { + attachments: [ + { + color: '#FEA500', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `${helpers.capitalizeFirstLetter( + msg.robot.name, + )} Token Wallet Info:`, + }, + }, + { type: 'divider' }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: `Public Wallet Address: ${botWallet.publicWalletAddress}`, + }, + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: `Tokens In Wallet: ${botWallet.token.toLocaleString()}`, + }, + }, + ], + }, + ], + }; + if (gas) { + message.attachments[0].blocks.push({ + type: 'section', + text: { + type: 'mrkdwn', + text: `Gas Available: ${gas.toLocaleString()}`, + }, + }); + } + + return msg.send(message); + } +} + +module.exports = WalletService; +module.exports.ws = WalletService; diff --git a/src/lib/static/a1.js b/src/lib/static/a1.js index cf4b722..3df9277 100644 --- a/src/lib/static/a1.js +++ b/src/lib/static/a1.js @@ -64,8 +64,8 @@ module.exports = { 8: '8', 9: '6', '.': '˙', - ',': '\'', - '\'': ',', + ',': "'", + "'": ',', '"': ',,', '`': ',', '?': '¿', @@ -98,7 +98,7 @@ module.exports = { 'I like turtles', 'Is it hot in here, or is it just me?', 'I heard that if you say "bloody Mary" three times in front of a mirror, a ghost appears', - 'Have you heard about the new restaurant called Karma? There\'s no menu. You get what you deserve.', + "Have you heard about the new restaurant called Karma? There's no menu. You get what you deserve.", 'I once ate an entire pizza by myself. It was a personal record.', ], }; diff --git a/src/messageHandlers/plusplus.js b/src/messageHandlers/plusplus.js index 0e94ff1..1405dc9 100644 --- a/src/messageHandlers/plusplus.js +++ b/src/messageHandlers/plusplus.js @@ -23,263 +23,14 @@ // // Author: O-Mutt -const { RegExpPlusPlus } = require('../lib/RegExpPlusPlus'); -const ScoreKeeper = require('../lib/services/scorekeeper'); -const Helpers = require('../lib/Helpers'); -// this may need to move or be generic...er -const MessageFactory = require('../lib/MessageFactory'); +const { rpp } = require('../lib/regExpPlusPlus'); +const { pps } = require('../lib/services/plusplus'); module.exports = function plusplus(robot) { - const procVars = Helpers.getProcessVariables(process.env); - const scoreKeeper = new ScoreKeeper({ robot, ...procVars }); - // listen to everything - robot.hear(RegExpPlusPlus.createUpDownVoteRegExp(), upOrDownVote); - robot.hear(RegExpPlusPlus.createMultiUserVoteRegExp(), multipleUsersVote); + robot.hear(rpp.createUpDownVoteRegExp(), pps.upOrDownVote); + robot.hear(rpp.createMultiUserVoteRegExp(), pps.multipleUsersVote); // admin - robot.respond(RegExpPlusPlus.createEraseUserScoreRegExp(), eraseUserScore); - - /** - * Functions for responding to commands - */ - async function upOrDownVote(msg) { - const [fullText, premessage, name, operator, conjunction, reason] = - msg.match; - - if ( - Helpers.isKnownFalsePositive(premessage, conjunction, reason, operator) - ) { - // circuit break a plus plus - robot.emit('plus-plus-failure', { - notificationMessage: - `False positive detected in <#${msg.message.room}> ` + - `from <@${msg.message.user.id}>` + - `\nHas pre-Message text: [${!!premessage}].\n` + - `Missing Conjunction: [${!!(!conjunction && reason)}]` + - `\n\n ` + - `${ - fullText.length >= 150 - ? 'It was really long (>=150)' - : 'It was a short message (<150)' - }`, - room: msg.message.room, - }); - return; - } - const increment = operator.match(RegExpPlusPlus.positiveOperators) ? 1 : -1; - const { room, mentions } = msg.message; - const cleanName = Helpers.cleanName(name); - let to = { name: cleanName }; - if (mentions) { - to = mentions.filter((men) => men.type === 'user').shift(); - to.name = cleanName; - } - const cleanReason = Helpers.cleanAndEncode(reason); - const from = msg.message.user; - - robot.logger.debug( - `${increment} score for [${to.name}] from [${from}]${ - cleanReason ? ` because ${cleanReason}` : '' - } in [${room}]`, - ); - let toUser; - let fromUser; - try { - ({ toUser, fromUser } = await scoreKeeper.incrementScore( - to, - from, - room, - cleanReason, - increment, - )); - } catch (e) { - msg.send(e.message); - return; - } - - const message = MessageFactory.BuildNewScoreMessage( - toUser, - cleanReason, - robot.name, - ); - - if (message) { - msg.send(message); - robot.emit('plus-plus', [ - { - notificationMessage: `<@${fromUser.slackId}> ${ - operator.match(RegExpPlusPlus.positiveOperators) - ? 'sent' - : 'removed' - } a ${Helpers.capitalizeFirstLetter(robot.name)} point ${ - operator.match(RegExpPlusPlus.positiveOperators) ? 'to' : 'from' - } <@${toUser.slackId}> in <#${room}>`, - sender: fromUser, - recipient: toUser, - direction: operator, - amount: 1, - room, - reason: cleanReason, - msg, - }, - ]); - } - } - - async function multipleUsersVote(msg) { - const [fullText, premessage, names, operator, conjunction, reason] = - msg.match; - if (!names) { - return; - } - if ( - Helpers.isKnownFalsePositive(premessage, conjunction, reason, operator) - ) { - // circuit break a plus plus - robot.emit('plus-plus-failure', { - notificationMessage: `False positive detected in <#${ - msg.message.room - }> from <@${ - msg.message.user.id - }>:\nPre-Message text: [${!!premessage}].\nMissing Conjunction: [${!!( - !conjunction && reason - )}]\n\n${fullText}`, - room: msg.message.room, - }); - return; - } - - const namesArray = names - .trim() - .toLowerCase() - .split(new RegExp(RegExpPlusPlus.multiUserSeparator)) - .filter(Boolean); - - const cleanNames = namesArray - // Parse names - .map((name) => { - const cleanedName = Helpers.cleanName(name); - return cleanedName; - }) - // Remove empty ones: {,,,}++ - .filter((name) => !!name.length) - // Remove duplicates: {user1,user1}++ - .filter((name, pos, self) => self.indexOf(name) === pos); - - const from = msg.message.user; - const { room, mentions } = msg.message; - let to = cleanNames.map((cn) => ({ name: cn })); - if (mentions) { - to = mentions - .filter((men) => men.type === 'user') - .filter( - (single, index, allMentions) => - index === allMentions.findIndex((m) => m.id === single.id), - ); - } - const cleanReason = Helpers.cleanAndEncode(reason); - const increment = operator.match(RegExpPlusPlus.positiveOperators) ? 1 : -1; - - if (cleanNames.length !== to.length) { - msg.send( - 'We are having trouble mapping your multi-user plusplus. Please try again and only include @ mentions.', - ); - return; - } - - let messages = []; - let fromUser; - const pointEmits = []; - for (let i = 0; i < cleanNames.length; i++) { - to[i].name = cleanNames[i]; - let toUser; - try { - ({ toUser, fromUser } = await scoreKeeper.incrementScore( - to[i], - from, - room, - cleanReason, - increment, - )); - } catch (err) { - //handled in the inc score, we should skip and continue continue - continue; - } - if (toUser) { - robot.logger.debug( - `clean names map [${to[i].name}]: ${toUser.score}, the reason ${toUser.reasons[cleanReason]}`, - ); - messages.push( - MessageFactory.BuildNewScoreMessage(toUser, cleanReason, robot), - ); - pointEmits.push({ - notificationMessage: `<@${fromUser.slackId}> ${ - operator.match(RegExpPlusPlus.positiveOperators) - ? 'sent' - : 'removed' - } a ${Helpers.capitalizeFirstLetter(robot.name)} point ${ - operator.match(RegExpPlusPlus.positiveOperators) ? 'to' : 'from' - } <@${toUser.slackId}> in <#${room}>`, - sender: fromUser, - recipient: toUser, - direction: operator, - amount: 1, - room, - reason: cleanReason, - msg, - }); - } - } - robot.emit('plus-plus', pointEmits); - messages = messages.filter((message) => !!message); // de-dupe - - robot.logger.debug(`These are the messages \n ${messages.join('\n')}`); - msg.send(messages.join('\n')); - } - - /** - * Erase a user's score, only admin accessible - * @param {Object} msg - * @returns {Promise} - * - */ - async function eraseUserScore(msg) { - let erased; - const [fullText, premessage, name, conjunction, reason] = msg.match; - const from = msg.message.user; - const { user } = msg.envelope; - const { room, mentions } = msg.message; - - const cleanReason = Helpers.cleanAndEncode(reason); - let to = mentions.filter((men) => men.type === 'user').shift(); - const cleanName = Helpers.cleanName(name); - if (!to) { - to = { name: cleanName }; - } else { - to.name = cleanName; - } - - const isAdmin = - (this.robot.auth - ? this.robot.auth.hasRole(user, 'plusplus-admin') - : undefined) || - (this.robot.auth ? this.robot.auth.hasRole(user, 'admin') : undefined); - - if (!this.robot.auth || !isAdmin) { - msg.reply("Sorry, you don't have authorization to do that."); - return; - } - if (isAdmin) { - erased = await scoreKeeper.erase(to, from, room, cleanReason); - } - - if (erased) { - const decodedReason = Helpers.decode(cleanReason); - const message = !decodedReason - ? `Erased the following reason from ${to.name}: ${decodedReason}` - : `Erased points for ${to.name}`; - msg.send(message); - } - } + robot.respond(rpp.createEraseUserScoreRegExp(), pps.eraseUserScore); }; diff --git a/src/messageHandlers/plusplus.test.js b/src/messageHandlers/plusplus.test.js index 70ae289..2c4afdb 100644 --- a/src/messageHandlers/plusplus.test.js +++ b/src/messageHandlers/plusplus.test.js @@ -4,28 +4,16 @@ const sinon = require('sinon'); const { expect } = chai; -const { MongoClient } = require('mongodb'); -const mongoUnit = require('mongo-unit'); const TestHelper = require('hubot-test-helper'); const SlackClient = require('@slack/client'); -const Helpers = require('../lib/Helpers'); +const { H } = require('../lib/helpers'); const { wait } = require('../../test/test_helpers'); -const testData = require('../../test/mockData'); describe('PlusPlus', () => { let room; - let db; let plusPlusHelper; before(async () => { - const url = await mongoUnit.start(); - const client = new MongoClient(url, { - useNewUrlParser: true, - useUnifiedTopology: true, - }); - const connection = await client.connect(); - db = connection.db(); - process.env.MONGODB_URI = url; process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; plusPlusHelper = new TestHelper('./messageHandlers/plusplus.js'); }); @@ -34,7 +22,7 @@ describe('PlusPlus', () => { sinon.restore(); }); - beforeEach(async () => { + beforeEach(() => { sinon .stub(SlackClient, 'WebClient') .withArgs('token') @@ -45,15 +33,13 @@ describe('PlusPlus', () => { .returns({ user: { profile: { email: 'test@email.com' } } }), }, }); - sinon.stub(Helpers, 'isA1Day').returns(false); + sinon.stub(H, 'isA1Day').returns(false); room = plusPlusHelper.createRoom({ httpd: false }); - return mongoUnit.load(testData); }); afterEach(async () => { sinon.restore(); room.destroy(); - return mongoUnit.drop(); }); describe('upOrDownVote', () => { diff --git a/src/messageHandlers/scoreboard.js b/src/messageHandlers/scoreboard.js index f67d7ce..ba96fe3 100644 --- a/src/messageHandlers/scoreboard.js +++ b/src/messageHandlers/scoreboard.js @@ -8,150 +8,24 @@ // // Author: // O'Mutt (Matt@OKeefe.dev) - -const clark = require('clark'); -const _ = require('lodash'); - -const Helpers = require('../lib/Helpers'); -const DatabaseService = require('../lib/services/database'); -const { RegExpPlusPlus } = require('../lib/RegExpPlusPlus'); -const MessageFactory = require('../lib/MessageFactory'); +const { rpp } = require('../lib/regExpPlusPlus'); +const ScoreboardService = require('../lib/services/scoreboard'); module.exports = function scoreboard(robot) { - const procVars = Helpers.getProcessVariables(process.env); - const databaseService = new DatabaseService({ robot, ...procVars }); - - robot.respond(RegExpPlusPlus.createAskForScoreRegExp(), respondWithScore); robot.respond( - RegExpPlusPlus.createTopBottomRegExp(), - respondWithLeaderLoserBoard, + rpp.createAskForScoreRegExp(), + ScoreboardService.respondWithScore, ); robot.respond( - RegExpPlusPlus.createTopBottomTokenRegExp(), - respondWithLeaderLoserTokenBoard, + rpp.createTopBottomRegExp(), + ScoreboardService.respondWithLeaderLoserBoard, ); robot.respond( - RegExpPlusPlus.createTopPointGiversRegExp(), - getTopPointSenders, + rpp.createTopBottomTokenRegExp(), + ScoreboardService.respondWithLeaderLoserTokenBoard, + ); + robot.respond( + rpp.createTopPointGiversRegExp(), + ScoreboardService.getTopPointSenders, ); - - async function respondWithScore(msg) { - const { mentions } = msg.message; - const [fullText, premessage, conjunction, name] = msg.match; - let to = { name: Helpers.cleanName(name) }; - if (mentions) { - const userMentions = mentions.filter((men) => men.type === 'user'); - to = userMentions.pop(); - to.name = name; - } - - const user = await databaseService.getUser(to); - - const scoreString = MessageFactory.BuildScoreLookup(user, robot, procVars); - msg.send(scoreString); - } - - async function respondWithLeaderLoserBoard(msg) { - const amount = parseInt(msg.match[2], 10) || 10; - const topOrBottom = Helpers.capitalizeFirstLetter(msg.match[1].trim()); - const methodName = `get${topOrBottom}Scores`; - - const tops = await databaseService[methodName](amount); - const message = []; - if (tops.length > 0) { - for ( - let i = 0, end = tops.length - 1, asc = end >= 0; - asc ? i <= end : i >= end; - asc ? i++ : i-- - ) { - const person = tops[i].slackId ? `<@${tops[i].slackId}>` : tops[i].name; - if (tops[i].accountLevel && tops[i].accountLevel > 1) { - const tokenStr = tops[i].token > 1 ? 'Tokens' : 'Token'; - message.push( - `${i + 1}. ${person}: ${tops[i].score} (*${ - tops[i].token - } ${Helpers.capitalizeFirstLetter(this.robot.name)} ${tokenStr}*)`, - ); - } else { - message.push(`${i + 1}. ${person}: ${tops[i].score}`); - } - } - } else { - message.push('No scores to keep track of yet!'); - } - - const graphSize = Math.min(tops.length, Math.min(amount, 20)); - message.splice(0, 0, clark(_.take(_.map(tops, 'score'), graphSize))); - - return msg.send(message.join('\n')); - } - - async function respondWithLeaderLoserTokenBoard(msg) { - const amount = parseInt(msg.match[2], 10) || 10; - const topOrBottom = Helpers.capitalizeFirstLetter(msg.match[1].trim()); - const methodName = `get${topOrBottom}Tokens`; - - const tops = await databaseService[methodName](amount); - - const message = []; - if (tops.length > 0) { - for ( - let i = 0, end = tops.length - 1, asc = end >= 0; - asc ? i <= end : i >= end; - asc ? i++ : i-- - ) { - const person = tops[i].slackId ? `<@${tops[i].slackId}>` : tops[i].name; - const tokenStr = tops[i].token > 1 ? 'Tokens' : 'Token'; - const pointStr = tops[i].score > 1 ? 'points' : 'point'; - message.push( - `${i + 1}. ${person}: *${ - tops[i].token - } ${Helpers.capitalizeFirstLetter(this.robot.name)} ${tokenStr}* (${ - tops[i].score - } ${pointStr})`, - ); - } - } else { - message.push('No scores to keep track of yet!'); - } - - const graphSize = Math.min(tops.length, Math.min(amount, 20)); - message.splice(0, 0, clark(_.take(_.map(tops, 'token'), graphSize))); - - return msg.send(message.join('\n')); - } - - async function getTopPointSenders(msg) { - const amount = parseInt(msg.match[2], 10) || 10; - const topOrBottom = Helpers.capitalizeFirstLetter(msg.match[1].trim()); - const methodName = `get${topOrBottom}Sender`; - const tops = await databaseService[methodName](amount); - - const message = []; - if (tops.length > 0) { - for ( - let i = 0, end = tops.length - 1, asc = end >= 0; - asc ? i <= end : i >= end; - asc ? i++ : i-- - ) { - const person = `<@${tops[i].slackId}>`; - const pointStr = - tops[i].totalPointsGiven > 1 ? 'points given' : 'point given'; - message.push( - `${i + 1}. ${person} (${tops[i].totalPointsGiven} ${pointStr})`, - ); - } - } else { - message.push('No scores to keep track of yet!'); - } - - const graphSize = Math.min(tops.length, Math.min(amount, 20)); - message.splice( - 0, - 0, - clark(_.take(_.map(tops, 'totalPointsGiven'), graphSize)), - ); - - return msg.send(message.join('\n')); - } }; diff --git a/src/messageHandlers/scoreboard.test.js b/src/messageHandlers/scoreboard.test.js index f2ef687..5a28a60 100644 --- a/src/messageHandlers/scoreboard.test.js +++ b/src/messageHandlers/scoreboard.test.js @@ -1,10 +1,8 @@ const chai = require('chai'); chai.use(require('sinon-chai')); const sinon = require('sinon'); -const mongoUnit = require('mongo-unit'); const TestHelper = require('hubot-test-helper'); -const testData = require('../../test/mockData'); const { wait } = require('../../test/test_helpers'); const { expect } = chai; @@ -14,22 +12,17 @@ describe('Scoreboard', () => { let scoreboard; let sandbox; before(async () => { - const url = await mongoUnit.start(); - process.env.MONGODB_URI = url; process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; scoreboard = new TestHelper('./messageHandlers/scoreboard.js'); }); beforeEach(async () => { - sandbox = sinon.createSandbox(); room = scoreboard.createRoom({ httpd: false }); - return mongoUnit.load(testData); }); afterEach(async () => { sandbox.restore(); room.destroy(); - return mongoUnit.drop(); }); describe('getScore', () => { diff --git a/src/messageHandlers/tokens.js b/src/messageHandlers/tokens.js index ffdfb04..def7c3d 100644 --- a/src/messageHandlers/tokens.js +++ b/src/messageHandlers/tokens.js @@ -8,99 +8,13 @@ // Author: // O'Mutt (Matt@OKeefe.dev) -const { RegExpPlusPlus } = require('../lib/RegExpPlusPlus'); -const ScoreKeeper = require('../lib/services/scorekeeper'); -const Helpers = require('../lib/Helpers'); +const { rpp } = require('../lib/regExpPlusPlus'); +const TokenService = require('../lib/services/token'); module.exports = function tokens(robot) { - const procVars = Helpers.getProcessVariables(process.env); - const scoreKeeper = new ScoreKeeper({ robot, ...procVars }); - // listen for bot tag/ping - robot.respond(RegExpPlusPlus.createGiveTokenRegExp(), giveTokenBetweenUsers); - - /** - * Sends a token between one user to another user - * @param {object} msg - hubot message object - * @returns {Promise} - */ - async function giveTokenBetweenUsers(msg) { - const [fullText, premessage, name, number, conjunction, reason] = msg.match; - if (!conjunction && reason) { - // circuit break a plus plus - robot.emit('plus-plus-failure', { - notificationMessage: `False positive detected in <#${ - msg.message.room - }> from <@${ - msg.message.user.id - }>:\nPre-Message text: [${!!premessage}].\nMissing Conjunction: [${!!( - !conjunction && reason - )}]\n\n${fullText}`, - room: msg.message.room, - }); - return; - } - const { room, mentions } = msg.message; - const cleanName = Helpers.cleanName(name); - let to = { name: cleanName }; - if (mentions) { - if (mentions.filter((men) => men.type === 'user').length > 1) { - // shift off the first mention (most likely @qrafty) - robot.logger.debug( - 'We are shifting off the first mention', - mentions.filter((men) => men.type === 'user'), - ); - mentions.filter((men) => men.type === 'user').shift(); - } - to = mentions.filter((men) => men.type === 'user').shift(); - to.name = cleanName; - } - const cleanReason = Helpers.cleanAndEncode(reason); - const from = msg.message.user; - - robot.logger.debug( - `${number} score for [${mentions}] from [${from}]${ - cleanReason ? ` because ${cleanReason}` : '' - } in [${room}]`, - ); - let response; - try { - response = await scoreKeeper.transferTokens( - to, - from, - room, - cleanReason, - number, - ); - } catch (e) { - msg.send(e.message); - return; - } - - const message = Helpers.getMessageForTokenTransfer( - robot, - response.toUser, - response.fromUser, - number, - cleanReason, - ); - - if (message) { - msg.send(message); - robot.emit('plus-plus', { - notificationMessage: `<@${ - response.fromUser.slackId - }> sent ${number} ${Helpers.capitalizeFirstLetter(robot.name)} point${ - parseInt(number, 10) > 1 ? 's' : '' - } to <@${response.toUser.slackId}> in <#${room}>`, - recipient: response.toUser, - sender: response.fromUser, - direction: '++', - amount: number, - room, - reason: cleanReason, - msg, - }); - } - } + robot.respond( + rpp.createGiveTokenRegExp(), + TokenService.giveTokenBetweenUsers, + ); }; diff --git a/src/messageHandlers/tokens.test.js b/src/messageHandlers/tokens.test.js index 59e3992..e29ee97 100644 --- a/src/messageHandlers/tokens.test.js +++ b/src/messageHandlers/tokens.test.js @@ -4,29 +4,16 @@ const sinon = require('sinon'); const { expect } = chai; -const { MongoClient } = require('mongodb'); -const mongoUnit = require('mongo-unit'); const TestHelper = require('hubot-test-helper'); const SlackClient = require('@slack/client'); -const Helpers = require('../lib/Helpers'); -const { mockScoreKeeper, wait } = require('../../test/test_helpers'); -const testData = require('../../test/mockData'); -const ScoreKeeper = require('../lib/services/scorekeeper'); +const { H } = require('../lib/helpers'); +const { wait } = require('../../test/test_helpers'); describe('Tokens', () => { let room; - let db; let tokenHelper; before(async () => { - const url = await mongoUnit.start(); - const client = new MongoClient(url, { - useNewUrlParser: true, - useUnifiedTopology: true, - }); - const connection = await client.connect(); - db = connection.db(); - process.env.MONGODB_URI = url; process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; tokenHelper = new TestHelper('./messageHandlers/tokens.js'); @@ -47,17 +34,14 @@ describe('Tokens', () => { .returns({ user: { profile: { email: 'test@email.com' } } }), }, }); + + sinon.stub(H, 'isA1Day').returns(false); room = tokenHelper.createRoom({ httpd: false }); - const mockInst = mockScoreKeeper(process.env.MONGODB_URI); - sinon.stub(ScoreKeeper, 'constructor').returns(mockInst); - sinon.stub(Helpers, 'isA1Day').returns(false); - return mongoUnit.load(testData); }); afterEach(async () => { sinon.restore(); room.destroy(); - return mongoUnit.drop(); }); describe('giveTokenBetweenUsers', () => { diff --git a/src/messageHandlers/wallet.js b/src/messageHandlers/wallet.js index cf5872a..1e116c1 100644 --- a/src/messageHandlers/wallet.js +++ b/src/messageHandlers/wallet.js @@ -9,133 +9,14 @@ // O'Mutt (Matt@OKeefe.dev) const _ = require('lodash'); -const Conversation = require('hubot-conversation'); -const tokenBuddy = require('token-buddy'); -const Helpers = require('../lib/Helpers'); -const { RegExpPlusPlus } = require('../lib/RegExpPlusPlus'); -const DatabaseService = require('../lib/services/database'); +const { rpp } = require('../lib/regExpPlusPlus'); +const { ws } = require('../lib/services/wallet'); module.exports = function wallet(robot) { - const procVars = Helpers.getProcessVariables(process.env); - const databaseService = new DatabaseService({ robot, ...procVars }); - // message @robot.name - robot.respond(RegExpPlusPlus.getBotWallet(), botWalletCount); + robot.respond(rpp.getBotWallet(), ws.botWalletCount); // DM only - robot.respond(RegExpPlusPlus.createLevelUpAccount(), levelUpAccount); - - async function levelUpAccount(msg) { - const switchBoard = new Conversation(msg.robot); - const dialog = switchBoard.startDialog(msg); - dialog.dialogTimeout = (timeoutMsg) => { - timeoutMsg.reply( - "You didn't answer the question prompted in a timely fashion, this message will now self destruct. :boom:", - ); - }; - - if (!Helpers.isPrivateMessage(msg.message.room)) { - return msg.reply( - `You should only execute a level up from within the context of a DM with ${msg.robot.name}`, - ); - } - - const user = await databaseService.getUser(msg.message.user); - if (user.accountLevel === 2) { - msg.reply( - `You are already Level 2, ${ - user.name - }. It looks as if you are ready for Level 3 where you can deposit/withdraw ${Helpers.capitalizeFirstLetter( - msg.robot.name, - )} Tokens! Is that correct? [Yes/No]`, - ); - dialog.addChoice(/yes/i, (msg2) => { - // do the level 3 step up, get their info for deposit withdrawal - msg2.reply( - `Hey ${user.name}, looks like you are ready for Level 3 but I'm not :sob:. Level 3 is still WIP and will be available very soon!`, - ); - }); - dialog.addChoice(/no/i, (msg2) => { - msg2.reply('Woops. My mistake. Carry on++'); - }); - return false; - } - - const leveledUpUser = await databaseService.updateAccountLevelToTwo(user); - msg.robot.logger.debug('DB results', leveledUpUser); - - msg.reply( - `${ - user.name - }, we are going to level up your account to Level 2! This means you will start getting ${Helpers.capitalizeFirstLetter( - msg.robot.name, - )} Tokens as well as points!`, - ); - return true; - } - - async function botWalletCount(msg) { - const botWallet = await databaseService.getBotWallet(); - msg.robot.logger.debug( - `Get the bot wallet by user ${msg.message.user.name}, ${botWallet}`, - ); - let gas; - try { - gas = await tokenBuddy.getBalance(botWallet.publicWalletAddress); - } catch (e) { - msg.send(`An error occurred getting ${msg.robot.name}'s gas amount`); - } - msg.robot.logger.debug( - `Get the bot wallet by user ${msg.message.user.name}, ${_.pick( - JSON.stringify(botWallet), - ['publicWalletAddress', 'name', 'token'], - )}`, - ); - - const message = { - attachments: [ - { - color: '#FEA500', - blocks: [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: `${Helpers.capitalizeFirstLetter( - msg.robot.name, - )} Token Wallet Info:`, - }, - }, - { type: 'divider' }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: `Public Wallet Address: ${botWallet.publicWalletAddress}`, - }, - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: `Tokens In Wallet: ${botWallet.token.toLocaleString()}`, - }, - }, - ], - }, - ], - }; - if (gas) { - message.attachments[0].blocks.push({ - type: 'section', - text: { - type: 'mrkdwn', - text: `Gas Available: ${gas.toLocaleString()}`, - }, - }); - } - - return msg.send(message); - } + robot.respond(rpp.createLevelUpAccount(), ws.levelUpAccount); }; diff --git a/src/messageHandlers/wallet.test.js b/src/messageHandlers/wallet.test.js index 50bb857..c48b84c 100644 --- a/src/messageHandlers/wallet.test.js +++ b/src/messageHandlers/wallet.test.js @@ -2,14 +2,9 @@ const chai = require('chai'); chai.use(require('sinon-chai')); const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); -const { MongoClient } = require('mongodb'); -const mongoUnit = require('mongo-unit'); - const { expect } = chai; -const Helpers = require('../lib/Helpers'); - -const testData = require('../../test/mockData'); +const { H } = require('../lib/helpers'); const { wait } = require('../../test/test_helpers'); describe('PlusPlus', () => { @@ -18,14 +13,6 @@ describe('PlusPlus', () => { let wallet; let sandbox; before(async () => { - const url = await mongoUnit.start(); - const client = new MongoClient(url, { - useNewUrlParser: true, - useUnifiedTopology: true, - }); - const connection = await client.connect(); - db = connection.db(); - process.env.MONGODB_URI = url; process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; wallet = new TestHelper('./messageHandlers/wallet.js'); }); @@ -33,13 +20,11 @@ describe('PlusPlus', () => { beforeEach(async () => { sandbox = sinon.createSandbox(); room = wallet.createRoom({ httpd: false }); - return mongoUnit.load(testData); }); afterEach(async () => { sandbox.restore(); room.destroy(); - return mongoUnit.drop(); }); describe('upgrade my account', () => { @@ -49,7 +34,7 @@ describe('PlusPlus', () => { await wait(55); expect(room.messages.length).to.equal(2); expect(room.messages[1][1]).to.equal( - `@matt.erickson matt.erickson, we are going to level up your account to Level 2! This means you will start getting ${Helpers.capitalizeFirstLetter( + `@matt.erickson matt.erickson, we are going to level up your account to Level 2! This means you will start getting ${H.capitalizeFirstLetter( room.robot.name, )} Tokens as well as points!`, ); diff --git a/test/globalFixture.js b/test/globalFixture.js new file mode 100644 index 0000000..80b7a6a --- /dev/null +++ b/test/globalFixture.js @@ -0,0 +1,45 @@ +const mongoUnit = require('mongo-unit'); +const { MongoClient } = require('mongodb'); +const sinon = require('sinon'); +const testData = require('./mockData'); + +// can be async or not +exports.mochaGlobalSetup = async function () { + const url = await mongoUnit.start(); + const client = new MongoClient(url, { + useNewUrlParser: true, + useUnifiedTopology: true, + }); + const connection = await client.connect(); + globalThis.db = connection.db(); + + //stub the process.env pieces + + sinon.stub(process, 'env').value({ + ...process.env, + MONGODB_URI: url, + HUBOT_PEER_FEEDBACK_URL: `'Formal Praise' (company.formal-praise.com)`, + HUBOT_SPAM_MESSAGE: 'Please slow your roll.', + HUBOT_FURTHER_FEEDBACK_SCORE: 10, + SPAM_TIME_LIMIT: 5, + }); +}; + +exports.mochaHooks = { + beforeEach(done) { + mongoUnit.load(testData).then(() => { + done(); + }); + }, + + afterEach(done) { + mongoUnit.drop().then(() => { + done(); + }); + }, +}; + +exports.mochaGlobalTeardown = async function () { + await mongoUnit.drop(); + await mongoUnit.stop(); +}; diff --git a/test/mockData/index.js b/test/mockData/index.js index fea7ac4..9d663a7 100644 --- a/test/mockData/index.js +++ b/test/mockData/index.js @@ -1,16 +1,18 @@ -const mockDb = { scores: [], scoreLog: [{}], botToken: [] }; -mockDb.scores.push( - require('./mockMinimalUser.json'), - require('./mockFullUser.json'), - require('./mockFullUserLevel2.json'), - require('./mockMinimalUserLevel2.json'), - require('./mockMultiUser1.json'), - require('./mockMultiUser2.json'), - require('./mockMultiUser3.json'), - require('./mockMultiPeriodUser1.json'), - require('./mockMultiPeriodUser2.json'), - require('./mockMultiPeriodUser3.json'), -); -mockDb.botToken.push(require('./mockBotToken.json')); +const mockDb = { + scores: [ + require('./mockMinimalUser.json'), + require('./mockFullUser.json'), + require('./mockFullUserLevel2.json'), + require('./mockMinimalUserLevel2.json'), + require('./mockMultiUser1.json'), + require('./mockMultiUser2.json'), + require('./mockMultiUser3.json'), + require('./mockMultiPeriodUser1.json'), + require('./mockMultiPeriodUser2.json'), + require('./mockMultiPeriodUser3.json'), + ], + scoreLog: [{}], + botToken: [require('./mockBotToken.json')], +}; module.exports = mockDb; diff --git a/test/test_helpers.js b/test/test_helpers.js index 8b0a87c..c7e1b0b 100644 --- a/test/test_helpers.js +++ b/test/test_helpers.js @@ -1,10 +1,8 @@ const sinon = require('sinon'); -const ScoreKeeper = require('../src/lib/services/scorekeeper'); - const robotStub = { brain: { - data: { }, + data: {}, on() {}, emit() {}, save() {}, @@ -31,12 +29,4 @@ function wait(ms) { }); } -function mockScoreKeeper(mongoUri) { - const peerFeedbackUrl = '\'Formal Praise\' (company.formal-praise.com)'; - const spamMessage = 'Please slow your roll.'; - return new ScoreKeeper({ - robot: robotStub, mongoUri, peerFeedbackUrl, spamMessage, furtherFeedbackSuggestedScore: 10, spamTimeLimit: 1, - }); -} - -module.exports = { robotStub, wait, mockScoreKeeper }; +module.exports = { robotStub, wait }; From 350b4f301df17b644223bc0a916cffbfae0f4180 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Mon, 1 Jan 2024 05:00:09 -0600 Subject: [PATCH 05/12] no sinon chai --- src/help.test.js | 2 +- src/lib/Helpers.test.js | 1 - src/lib/MessageFactory.test.js | 2 +- src/lib/RegExpPlusPlus.test.js | 1 - src/lib/services/scorekeeper.test.js | 1 - src/messageHandlers/plusplus.test.js | 1 - src/messageHandlers/scoreboard.test.js | 2 +- src/messageHandlers/tokens.test.js | 2 +- src/messageHandlers/wallet.test.js | 2 +- 9 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/help.test.js b/src/help.test.js index 3056cc6..a4de278 100644 --- a/src/help.test.js +++ b/src/help.test.js @@ -1,5 +1,5 @@ const chai = require('chai'); -chai.use(require('sinon-chai')); + const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); diff --git a/src/lib/Helpers.test.js b/src/lib/Helpers.test.js index bbfd4b8..3450380 100644 --- a/src/lib/Helpers.test.js +++ b/src/lib/Helpers.test.js @@ -1,7 +1,6 @@ /* eslint-disable new-cap */ /* eslint-disable mocha/no-setup-in-describe */ const chai = require('chai'); -chai.use(require('sinon-chai')); const { expect } = chai; diff --git a/src/lib/MessageFactory.test.js b/src/lib/MessageFactory.test.js index a55d76c..38ee391 100644 --- a/src/lib/MessageFactory.test.js +++ b/src/lib/MessageFactory.test.js @@ -1,6 +1,6 @@ const chai = require('chai'); const sinon = require('sinon'); -chai.use(require('sinon-chai')); + const { subYears, addDays } = require('date-fns'); const { helpers } = require('./helpers'); diff --git a/src/lib/RegExpPlusPlus.test.js b/src/lib/RegExpPlusPlus.test.js index 687b040..f5e8169 100644 --- a/src/lib/RegExpPlusPlus.test.js +++ b/src/lib/RegExpPlusPlus.test.js @@ -1,7 +1,6 @@ /* eslint-disable new-cap */ /* eslint-disable mocha/no-setup-in-describe */ const chai = require('chai'); -chai.use(require('sinon-chai')); const { expect } = chai; diff --git a/src/lib/services/scorekeeper.test.js b/src/lib/services/scorekeeper.test.js index 9da12d6..97d2016 100644 --- a/src/lib/services/scorekeeper.test.js +++ b/src/lib/services/scorekeeper.test.js @@ -1,7 +1,6 @@ const { MongoClient } = require('mongodb'); const sinon = require('sinon'); const chai = require('chai'); -chai.use(require('sinon-chai')); const { expect } = chai; const SlackClient = require('@slack/client'); diff --git a/src/messageHandlers/plusplus.test.js b/src/messageHandlers/plusplus.test.js index 2c4afdb..eae6436 100644 --- a/src/messageHandlers/plusplus.test.js +++ b/src/messageHandlers/plusplus.test.js @@ -1,5 +1,4 @@ const chai = require('chai'); -chai.use(require('sinon-chai')); const sinon = require('sinon'); const { expect } = chai; diff --git a/src/messageHandlers/scoreboard.test.js b/src/messageHandlers/scoreboard.test.js index 5a28a60..11787b8 100644 --- a/src/messageHandlers/scoreboard.test.js +++ b/src/messageHandlers/scoreboard.test.js @@ -1,5 +1,5 @@ const chai = require('chai'); -chai.use(require('sinon-chai')); + const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); diff --git a/src/messageHandlers/tokens.test.js b/src/messageHandlers/tokens.test.js index e29ee97..1a1dced 100644 --- a/src/messageHandlers/tokens.test.js +++ b/src/messageHandlers/tokens.test.js @@ -1,5 +1,5 @@ const chai = require('chai'); -chai.use(require('sinon-chai')); + const sinon = require('sinon'); const { expect } = chai; diff --git a/src/messageHandlers/wallet.test.js b/src/messageHandlers/wallet.test.js index c48b84c..3d78ee9 100644 --- a/src/messageHandlers/wallet.test.js +++ b/src/messageHandlers/wallet.test.js @@ -1,5 +1,5 @@ const chai = require('chai'); -chai.use(require('sinon-chai')); + const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); const { expect } = chai; From a2137caabcdde2c001c0a7b6580f581ee12d2058 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Mon, 1 Jan 2024 05:01:31 -0600 Subject: [PATCH 06/12] jest-codemods --- src/help.test.js | 68 ++--- src/lib/Helpers.test.js | 42 ++- src/lib/MessageFactory.test.js | 121 ++++----- src/lib/RegExpPlusPlus.test.js | 350 ++++++++++++------------- src/lib/services/scorekeeper.test.js | 183 ++++++------- src/messageHandlers/plusplus.test.js | 149 +++++------ src/messageHandlers/scoreboard.test.js | 70 +++-- src/messageHandlers/tokens.test.js | 104 ++++---- src/messageHandlers/wallet.test.js | 25 +- 9 files changed, 503 insertions(+), 609 deletions(-) diff --git a/src/help.test.js b/src/help.test.js index a4de278..abe69a2 100644 --- a/src/help.test.js +++ b/src/help.test.js @@ -1,10 +1,6 @@ -const chai = require('chai'); - const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); -const { expect } = chai; - const { H } = require('./lib/helpers'); const pjson = require('../package.json'); const { wait } = require('../test/test_helpers'); @@ -12,7 +8,7 @@ const { wait } = require('../test/test_helpers'); describe('help', () => { let room; let helpHelper; - before(async () => { + beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; helpHelper = new TestHelper('./help.js'); }); @@ -35,24 +31,24 @@ describe('help', () => { room = helpHelper.createRoom({ httpd: false }); room.user.say('peter.nguyen', '@hubot -h'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); const message = room.messages[1][1]; const { blocks } = message.attachments[0]; - expect(blocks.length).to.equal(4); - expect(blocks[0]).to.deep.include({ + expect(blocks.length).toBe(4); + expect(blocks[0]).toMatchObject({ type: 'section', text: { type: 'mrkdwn', text: 'Need help with hubot?' }, }); - expect(blocks[1]).to.deep.include({ + expect(blocks[1]).toMatchObject({ type: 'section', text: { type: 'mrkdwn', text: '_Commands_:', }, }); - expect(blocks[2]).to.be.an('object'); - expect(blocks[3]).to.deep.include({ + expect(blocks[2]).toBeInstanceOf(Object); + expect(blocks[3]).toMatchObject({ type: 'section', text: { type: 'mrkdwn', @@ -65,26 +61,26 @@ describe('help', () => { it('should respond with hubot usage guidance', async () => { room.user.say('peter.nguyen', '@hubot help'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); const message = room.messages[1][1]; const { blocks } = message.attachments[0]; - expect(blocks.length).to.equal(3); - expect(blocks[0]).to.deep.include({ + expect(blocks.length).toBe(3); + expect(blocks[0]).toMatchObject({ type: 'section', text: { type: 'mrkdwn', text: 'Need help with hubot?', }, }); - expect(blocks[1]).to.deep.include({ + expect(blocks[1]).toMatchObject({ type: 'section', text: { type: 'mrkdwn', text: '_Commands_:', }, }); - expect(blocks[2]).to.be.an('object'); + expect(blocks[2]).toBeInstanceOf(Object); }); }); @@ -92,37 +88,31 @@ describe('help', () => { it('should respond with the name and version of the package when asked --version', async () => { await room.user.say('matt.erickson', '@hubot --version'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ - pjson.name - }> .`, - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe(`${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`); }); it('should respond with the name and version of the package when asked -v', async () => { await room.user.say('matt.erickson', '@hubot -v'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ - pjson.name - }> .`, - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe(`${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`); }); it('should respond with the name and version of the package when asked `plusplus version`', async () => { await room.user.say('matt.erickson', '@hubot plusplus version'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ - pjson.name - }> .`, - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe(`${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`); }); }); }); diff --git a/src/lib/Helpers.test.js b/src/lib/Helpers.test.js index 3450380..c487321 100644 --- a/src/lib/Helpers.test.js +++ b/src/lib/Helpers.test.js @@ -1,9 +1,5 @@ /* eslint-disable new-cap */ /* eslint-disable mocha/no-setup-in-describe */ -const chai = require('chai'); - -const { expect } = chai; - const Helpers = require('./Helpers'); describe('Helpers', () => { @@ -12,42 +8,42 @@ describe('Helpers', () => { const fullName = '@matt'; const cleaned = 'matt'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "hello @derp" of the @ sign and be "hello @derp" if @ is not the first char', () => { const fullName = 'hello @derp'; const cleaned = 'hello @derp'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "what" of the @ sign and be "what" if @ is not present', () => { const fullName = 'what'; const cleaned = 'what'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean an empty string "" and return an empty string', () => { const fullName = ''; const cleaned = ''; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "name.hyphe-nated" of the @ sign and be "name.hyphe-nated" if @ is not present', () => { const fullName = 'name.hyphe-nated'; const cleaned = 'name.hyphe-nated'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "dot.name" of the @ sign and be "dot.name" if @ is not present', () => { const fullName = 'dot.name'; const cleaned = 'dot.name'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); }); @@ -56,42 +52,42 @@ describe('Helpers', () => { const fullName = '@matt'; const cleaned = 'matt'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "hello @derp" of the @ sign and be "hello @derp" if @ is not the first char', () => { const fullName = 'hello @derp'; const cleaned = 'hello @derp'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "what" of the @ sign and be "what" if @ is not present', () => { const fullName = 'what'; const cleaned = 'what'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean an empty string "" and return an empty string', () => { const fullName = ''; const cleaned = ''; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "name.hyphe-nated" of the @ sign and be "name.hyphe-nated" if @ is not present', () => { const fullName = 'name.hyphe-nated'; const cleaned = 'name.hyphe-nated'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); it('should clean "dot.name" of the @ sign and be "dot.name" if @ is not present', () => { const fullName = 'dot.name'; const cleaned = 'dot.name'; - expect(Helpers.cleanName(fullName)).to.equal(cleaned); + expect(Helpers.cleanName(fullName)).toBe(cleaned); }); }); @@ -100,14 +96,14 @@ describe('Helpers', () => { const encoded = Buffer.from('you are the best!').toString('base64'); const cleaned = 'you are the best!'; - expect(Helpers.decode(encoded)).to.equal(cleaned); + expect(Helpers.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "this.should.work" to "this.should.work"', () => { const encoded = Buffer.from('this.should.work').toString('base64'); const cleaned = 'this.should.work'; - expect(Helpers.decode(encoded)).to.equal(cleaned); + expect(Helpers.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "why are you so good?!" to "why are you so good?!"', () => { @@ -116,35 +112,35 @@ describe('Helpers', () => { ); const cleaned = 'why are you so good?!'; - expect(Helpers.decode(encoded)).to.equal(cleaned); + expect(Helpers.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "hello" to "hello"', () => { const encoded = Buffer.from('hello').toString('base64'); const cleaned = 'hello'; - expect(Helpers.decode(encoded)).to.equal(cleaned); + expect(Helpers.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "“hello“" to "“hello“"', () => { const encoded = Buffer.from('“hello“').toString('base64'); const cleaned = '“hello“'; - expect(Helpers.decode(encoded)).to.equal(cleaned); + expect(Helpers.decode(encoded)).toBe(cleaned); }); it('should decode undefined input to undefined output', () => { const encoded = undefined; const cleaned = undefined; - expect(Helpers.decode(encoded)).to.equal(cleaned); + expect(Helpers.decode(encoded)).toBe(cleaned); }); it('should decode undefined input to undefined output', () => { const encoded = undefined; const cleaned = undefined; - expect(Helpers.decode(encoded)).to.equal(cleaned); + expect(Helpers.decode(encoded)).toBe(cleaned); }); }); }); diff --git a/src/lib/MessageFactory.test.js b/src/lib/MessageFactory.test.js index 38ee391..f72de3e 100644 --- a/src/lib/MessageFactory.test.js +++ b/src/lib/MessageFactory.test.js @@ -1,4 +1,3 @@ -const chai = require('chai'); const sinon = require('sinon'); const { subYears, addDays } = require('date-fns'); @@ -7,8 +6,6 @@ const { helpers } = require('./helpers'); const MessageFactory = require('./messageFactory'); const { nonSequiturs } = require('./static/a1'); -const { expect } = chai; - describe('MessageFactory', () => { const mockRobot = { name: 'Robit' }; const mockProcVars = { reasonsKeyword: 'reasons' }; @@ -37,7 +34,7 @@ describe('MessageFactory', () => { emptyReasons, mockRobot, ); - expect(msg).to.equal(''); + expect(msg).toBe(''); }); it('should take the user w/a single point without reasons and print their score', () => { @@ -53,7 +50,7 @@ describe('MessageFactory', () => { emptyReasons, mockRobot, ); - expect(msg).to.equal('matt has 1 point.'); + expect(msg).toBe('matt has 1 point.'); }); it('should take the user w/2 points (plural) without reasons and print their score', () => { @@ -69,7 +66,7 @@ describe('MessageFactory', () => { emptyReasons, mockRobot, ); - expect(msg).to.equal('matt has 2 points.'); + expect(msg).toBe('matt has 2 points.'); }); it('should take the user w/100 points (special case) and print their score as the special output', () => { @@ -85,7 +82,7 @@ describe('MessageFactory', () => { emptyReasons, mockRobot, ); - expect(msg).to.equal(':100: matt has 100 points :100:'); + expect(msg).toBe(':100: matt has 100 points :100:'); }); it('should take the user w/1000 points (special case) and print their score as the special output', () => { @@ -101,7 +98,7 @@ describe('MessageFactory', () => { emptyReasons, mockRobot, ); - expect(msg).to.equal(':1000: matt has 1000 points :1000:'); + expect(msg).toBe(':1000: matt has 1000 points :1000:'); }); it('should take the user w/300 points (special case) and print their score as the special output', () => { @@ -117,7 +114,7 @@ describe('MessageFactory', () => { emptyReasons, mockRobot, ); - expect(msg).to.equal(':300: matt has 300 points :300:'); + expect(msg).toBe(':300: matt has 300 points :300:'); }); it('should take the user object and reason "winning" and print the expected message', () => { @@ -135,7 +132,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object and reason "cool runnings!" and print the expected message', () => { @@ -153,7 +150,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object and reason "cool runnings!" and print the expected message for botDay', () => { @@ -172,7 +169,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object and reason "cool runnings!" and print the expected message when no points for the reason', () => { @@ -191,7 +188,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object and reason "cool runnings!" and print the expected message when 99 points for the reason', () => { @@ -210,7 +207,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object and reason "cool runnings!" and print the expected message when 99 points for the reason and 145 total points', () => { @@ -229,7 +226,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object and reason "cool runnings!" and print the expected message when 99 points for the reason and 200 total points', () => { @@ -248,7 +245,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object with no reasons and print the expected message', () => { @@ -266,7 +263,7 @@ describe('MessageFactory', () => { reason, 'hubot', ); - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('should take the user object with multiple reasons and print the expected message for each reason', () => { @@ -291,14 +288,14 @@ describe('MessageFactory', () => { 'hubot', ); - expect(message1).to.equal(expectedMessage1); + expect(message1).toBe(expectedMessage1); const message2 = MessageFactory.BuildNewScoreMessage( user, reason2, 'hubot', ); - expect(message2).to.equal(expectedMessage2); + expect(message2).toBe(expectedMessage2); }); }); @@ -309,28 +306,28 @@ describe('MessageFactory', () => { undefined, undefined, ); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); dummyMsg = MessageFactory.BuildScoreLookup({}, undefined, undefined); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); dummyMsg = MessageFactory.BuildScoreLookup(undefined, {}, undefined); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); dummyMsg = MessageFactory.BuildScoreLookup(undefined, undefined, {}); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); dummyMsg = MessageFactory.BuildScoreLookup({}, undefined, {}); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); dummyMsg = MessageFactory.BuildScoreLookup({}, {}, undefined); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); dummyMsg = MessageFactory.BuildScoreLookup(undefined, {}, {}); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); dummyMsg = MessageFactory.BuildScoreLookup({}, {}, {}); - expect(dummyMsg).to.equal(''); + expect(dummyMsg).toBe(''); }); it('should respond with 5 reasons if the user has 5 or more', async () => { @@ -341,15 +338,13 @@ describe('MessageFactory', () => { mockRobot, mockProcVars, ); - expect(scoreMs).to.have.match( - new RegExp( - `^<@${baseUser.name}> has ${baseUser.score} points.` + - `\nAccount Level: ${baseUser.accountLevel}` + - `\nTotal Points Given: ${baseUser.totalPointsGiven}` + - '\n\n:star: Here are some reasons :star:' + - '(\n.*:.*){5}$', - ), - ); + expect(scoreMs).toMatch(new RegExp( + `^<@${baseUser.name}> has ${baseUser.score} points.` + + `\nAccount Level: ${baseUser.accountLevel}` + + `\nTotal Points Given: ${baseUser.totalPointsGiven}` + + '\n\n:star: Here are some reasons :star:' + + '(\n.*:.*){5}$', + )); }); it('should respond with score and no reasons if the user has no reasons', async () => { @@ -360,11 +355,9 @@ describe('MessageFactory', () => { mockRobot, mockProcVars, ); - expect(scoreMs).to.equal( - `<@${baseUser.name}> has ${baseUser.score} points.` + - `\nAccount Level: ${baseUser.accountLevel}` + - `\nTotal Points Given: ${baseUser.totalPointsGiven}`, - ); + expect(scoreMs).toBe(`<@${baseUser.name}> has ${baseUser.score} points.` + + `\nAccount Level: ${baseUser.accountLevel}` + + `\nTotal Points Given: ${baseUser.totalPointsGiven}`); }); it('should respond with 3 reasons if the user has 3', async () => { @@ -375,15 +368,13 @@ describe('MessageFactory', () => { mockRobot, mockProcVars, ); - expect(scoreMs).to.have.match( - new RegExp( - `^<@${baseUser.name}> has ${baseUser.score} points.` + - `\nAccount Level: ${baseUser.accountLevel}` + - `\nTotal Points Given: ${baseUser.totalPointsGiven}` + - '\n\n:star: Here are some reasons :star:' + - '(\n.*:.*){3}$', - ), - ); + expect(scoreMs).toMatch(new RegExp( + `^<@${baseUser.name}> has ${baseUser.score} points.` + + `\nAccount Level: ${baseUser.accountLevel}` + + `\nTotal Points Given: ${baseUser.totalPointsGiven}` + + '\n\n:star: Here are some reasons :star:' + + '(\n.*:.*){3}$', + )); }); it('should respond with 3 reasons if the user has 3 and token count', async () => { @@ -394,8 +385,8 @@ describe('MessageFactory', () => { mockRobot, mockProcVars, ); - expect(scoreMs).to.have.match( - /<@peter\.parker\.min> has 8 points \(\*8 Robit Tokens\*\)\.\nAccount Level: 2\nTotal Points Given: -2\n\n:star: Here are some reasons :star:(\n.*:.*){3}/, + expect(scoreMs).toMatch( + /<@peter\.parker\.min> has 8 points \(\*8 Robit Tokens\*\)\.\nAccount Level: 2\nTotal Points Given: -2\n\n:star: Here are some reasons :star:(\n.*:.*){3}/ ); }); }); @@ -405,42 +396,40 @@ describe('MessageFactory', () => { const ROBOT_NAME = 'Robit'; it('returns a string', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME); - expect(typeof message).to.be.a('string'); + expect(typeof typeof message).toBe('string'); }); it('returns a modified message', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, -1); - expect(message).to.equal(BASE_MSG); + expect(message).toBe(BASE_MSG); }); it('returns a message with vowels removed', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 0); const expectedMessage = 'Hll Wrld m Trtl'; - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('returns a message with letters rotated 13 positions', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 1); const expectedMessage = 'Uryyb Jbeyq V Nz Ghegyr'; - expect(message).to.equal(expectedMessage); + expect(message).toBe(expectedMessage); }); it('returns static string about itself', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 2); - expect(message).to.equal(`I'm ${ROBOT_NAME}. Not a mind reader!`); + expect(message).toBe(`I'm ${ROBOT_NAME}. Not a mind reader!`); }); it('returns static string about classified info', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 3); - expect(message).to.equal( - "That's classified information, I'm afraid I cannot disclose that.", - ); + expect(message).toBe("That's classified information, I'm afraid I cannot disclose that."); }); it('returns a message with random casing', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 4); - expect(message).not.to.equal(BASE_MSG); - expect(message.toLowerCase()).to.equal(BASE_MSG.toLowerCase()); + expect(message).not.toBe(BASE_MSG); + expect(message.toLowerCase()).toBe(BASE_MSG.toLowerCase()); }); it('returns a message with a random non sequitur added', () => { @@ -453,7 +442,7 @@ describe('MessageFactory', () => { const expectedNonSequitur = nonSequiturs.some((nonSequitur) => message.includes(nonSequitur), ); - expect(expectedNonSequitur).to.equal(true); + expect(expectedNonSequitur).toBe(true); }); it('returns a message that is misspelled in some way', () => { @@ -463,17 +452,17 @@ describe('MessageFactory', () => { 6, true, ); - expect(message).not.to.equal(BASE_MSG); + expect(message).not.toBe(BASE_MSG); }); it('returns a flipped and reversed message', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 7); - expect(message).to.equal('ǝlʇɹn┴ ɯ∀ I plɹoM ollǝH'); + expect(message).toBe('ǝlʇɹn┴ ɯ∀ I plɹoM ollǝH'); }); it('should return the original message when the index is outside the array', () => { const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 8); - expect(message).to.equal(BASE_MSG); + expect(message).toBe(BASE_MSG); }); }); }); diff --git a/src/lib/RegExpPlusPlus.test.js b/src/lib/RegExpPlusPlus.test.js index f5e8169..eb8813f 100644 --- a/src/lib/RegExpPlusPlus.test.js +++ b/src/lib/RegExpPlusPlus.test.js @@ -1,9 +1,5 @@ /* eslint-disable new-cap */ /* eslint-disable mocha/no-setup-in-describe */ -const chai = require('chai'); - -const { expect } = chai; - const { RegExpPlusPlus } = require('./regExpPlusPlus'); describe('RegExpPlusPlus', () => { @@ -11,50 +7,50 @@ describe('RegExpPlusPlus', () => { it('should match a name + number', () => { const giveTokenMatcher = RegExpPlusPlus.createGiveTokenRegExp(); const match = '@matt + 5'.match(giveTokenMatcher); - expect('@matt + 5').to.match(giveTokenMatcher); - expect(match).to.be.an('array').that.include('matt', '+', '5'); + expect('@matt + 5').toMatch(giveTokenMatcher); + expect(match).toEqual(expect.arrayContaining(['matt', '+', '5'])); }); }); describe('positiveOperators', () => { const positiveRegexp = new RegExp(RegExpPlusPlus.positiveOperators); it('should match base-line ++', () => { - expect('++').to.match(positiveRegexp); + expect('++').toMatch(positiveRegexp); }); it('should match base-line :clap:', () => { - expect(':clap:').to.match(positiveRegexp); + expect(':clap:').toMatch(positiveRegexp); }); it('should match base-line :clap::skin-tone-1:', () => { - expect(':clap::skin-tone-1:').to.match(positiveRegexp); + expect(':clap::skin-tone-1:').toMatch(positiveRegexp); }); it('should match base-line :thumbsup:', () => { - expect(':thumbsup:').to.match(positiveRegexp); + expect(':thumbsup:').toMatch(positiveRegexp); }); it('should match base-line :thumbsup::skin-tone-1:', () => { - expect(':thumbsup::skin-tone-1:').to.match(positiveRegexp); + expect(':thumbsup::skin-tone-1:').toMatch(positiveRegexp); }); it('should match base-line :thumbsup_all:', () => { - expect(':thumbsup_all:').to.match(positiveRegexp); + expect(':thumbsup_all:').toMatch(positiveRegexp); }); }); describe('negativeOperators', () => { const negativeRegexp = new RegExp(RegExpPlusPlus.negativeOperators); it('should match base-line --', () => { - expect('--').to.match(negativeRegexp); + expect('--').toMatch(negativeRegexp); }); it('should match base-line :thumbsdown:', () => { - expect(':thumbsdown:').to.match(negativeRegexp); + expect(':thumbsdown:').toMatch(negativeRegexp); }); it('should match base-line :thumbsdown::skin-tone-1:', () => { - expect(':thumbsdown::skin-tone-1:').to.match(negativeRegexp); + expect(':thumbsdown::skin-tone-1:').toMatch(negativeRegexp); }); }); @@ -65,72 +61,68 @@ describe('RegExpPlusPlus', () => { }); it('should match `score for @matt`', () => { const fullText = 'score for @matt'; - expect(askForScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(askForScoreRegExp)).to.be.an('array'); - expect(fullText.match(askForScoreRegExp).length).to.equal(4); - expect(fullText.match(askForScoreRegExp)[0]).to.equal(fullText); - expect(fullText.match(askForScoreRegExp)[1]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[2]).to.equal('for '); - expect(fullText.match(askForScoreRegExp)[3]).to.equal('matt'); + expect(askForScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(askForScoreRegExp))).toBe(true); + expect(fullText.match(askForScoreRegExp).length).toBe(4); + expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); + expect(fullText.match(askForScoreRegExp)[1]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[2]).toBe('for '); + expect(fullText.match(askForScoreRegExp)[3]).toBe('matt'); }); it('should match `score @matt`', () => { const fullText = 'score @matt'; - expect(askForScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(askForScoreRegExp)).to.be.an('array'); - expect(fullText.match(askForScoreRegExp).length).to.equal(4); - expect(fullText.match(askForScoreRegExp)[0]).to.equal(fullText); - expect(fullText.match(askForScoreRegExp)[1]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[2]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[3]).to.equal('matt'); + expect(askForScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(askForScoreRegExp))).toBe(true); + expect(fullText.match(askForScoreRegExp).length).toBe(4); + expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); + expect(fullText.match(askForScoreRegExp)[1]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[2]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[3]).toBe('matt'); }); it('should match `score with @matt`', () => { const fullText = 'score with @matt'; - expect(askForScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(askForScoreRegExp)).to.be.an('array'); - expect(fullText.match(askForScoreRegExp).length).to.equal(4); - expect(fullText.match(askForScoreRegExp)[0]).to.equal(fullText); - expect(fullText.match(askForScoreRegExp)[1]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[2]).to.equal('with '); - expect(fullText.match(askForScoreRegExp)[3]).to.equal('matt'); + expect(askForScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(askForScoreRegExp))).toBe(true); + expect(fullText.match(askForScoreRegExp).length).toBe(4); + expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); + expect(fullText.match(askForScoreRegExp)[1]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[2]).toBe('with '); + expect(fullText.match(askForScoreRegExp)[3]).toBe('matt'); }); it('should match `karma @phil`', () => { const fullText = 'karma @phil'; - expect(askForScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(askForScoreRegExp)).to.be.an('array'); - expect(fullText.match(askForScoreRegExp).length).to.equal(4); - expect(fullText.match(askForScoreRegExp)[0]).to.equal(fullText); - expect(fullText.match(askForScoreRegExp)[1]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[2]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[3]).to.equal('phil'); + expect(askForScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(askForScoreRegExp))).toBe(true); + expect(fullText.match(askForScoreRegExp).length).toBe(4); + expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); + expect(fullText.match(askForScoreRegExp)[1]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[2]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[3]).toBe('phil'); }); it('should match `score @such.a.complex-name-hyphens`', () => { const fullText = 'score @such.a.complex-name-hyphens'; - expect(askForScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(askForScoreRegExp)).to.be.an('array'); - expect(fullText.match(askForScoreRegExp).length).to.equal(4); - expect(fullText.match(askForScoreRegExp)[0]).to.equal(fullText); - expect(fullText.match(askForScoreRegExp)[1]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[2]).to.be.undefined; - expect(fullText.match(askForScoreRegExp)[3]).to.equal( - 'such.a.complex-name-hyphens', - ); + expect(askForScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(askForScoreRegExp))).toBe(true); + expect(fullText.match(askForScoreRegExp).length).toBe(4); + expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); + expect(fullText.match(askForScoreRegExp)[1]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[2]).toBeUndefined(); + expect(fullText.match(askForScoreRegExp)[3]).toBe('such.a.complex-name-hyphens'); }); it('should match `what even should it be score with @matt`', () => { const fullText = 'what even should it be score with @matt'; - expect(askForScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(askForScoreRegExp)).to.be.an('array'); - expect(fullText.match(askForScoreRegExp).length).to.equal(4); - expect(fullText.match(askForScoreRegExp)[0]).to.equal(fullText); - expect(fullText.match(askForScoreRegExp)[1]).to.equal( - 'what even should it be ', - ); - expect(fullText.match(askForScoreRegExp)[2]).to.equal('with '); - expect(fullText.match(askForScoreRegExp)[3]).to.equal('matt'); + expect(askForScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(askForScoreRegExp))).toBe(true); + expect(fullText.match(askForScoreRegExp).length).toBe(4); + expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); + expect(fullText.match(askForScoreRegExp)[1]).toBe('what even should it be '); + expect(fullText.match(askForScoreRegExp)[2]).toBe('with '); + expect(fullText.match(askForScoreRegExp)[3]).toBe('matt'); }); }); @@ -138,28 +130,26 @@ describe('RegExpPlusPlus', () => { it('`erase @matt cuz he is bad` should match the erase user regexp', () => { const fullText = 'erase @matt cuz he is bad'; const eraseUserScoreRegExp = RegExpPlusPlus.createEraseUserScoreRegExp(); - expect(eraseUserScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(eraseUserScoreRegExp)).to.be.an('array'); - expect(fullText.match(eraseUserScoreRegExp).length).to.equal(5); - expect(fullText.match(eraseUserScoreRegExp)[0]).to.equal( - 'erase @matt cuz he is bad', - ); - expect(fullText.match(eraseUserScoreRegExp)[1]).to.be.undefined; - expect(fullText.match(eraseUserScoreRegExp)[2]).to.equal('matt'); - expect(fullText.match(eraseUserScoreRegExp)[3]).to.equal('cuz'); - expect(fullText.match(eraseUserScoreRegExp)[4]).to.equal('he is bad'); + expect(eraseUserScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(eraseUserScoreRegExp))).toBe(true); + expect(fullText.match(eraseUserScoreRegExp).length).toBe(5); + expect(fullText.match(eraseUserScoreRegExp)[0]).toBe('erase @matt cuz he is bad'); + expect(fullText.match(eraseUserScoreRegExp)[1]).toBeUndefined(); + expect(fullText.match(eraseUserScoreRegExp)[2]).toBe('matt'); + expect(fullText.match(eraseUserScoreRegExp)[3]).toBe('cuz'); + expect(fullText.match(eraseUserScoreRegExp)[4]).toBe('he is bad'); }); it('`erase @frank` should match the erase user regexp', () => { const fullText = 'erase @frank'; const eraseUserScoreRegExp = RegExpPlusPlus.createEraseUserScoreRegExp(); - expect(eraseUserScoreRegExp).to.be.a('RegExp'); - expect(fullText.match(eraseUserScoreRegExp)).to.be.an('array'); - expect(fullText.match(eraseUserScoreRegExp).length).to.equal(5); - expect(fullText.match(eraseUserScoreRegExp)[0]).to.equal(fullText); - expect(fullText.match(eraseUserScoreRegExp)[1]).to.be.undefined; - expect(fullText.match(eraseUserScoreRegExp)[2]).to.equal('frank'); - expect(fullText.match(eraseUserScoreRegExp)[3]).to.be.undefined; - expect(fullText.match(eraseUserScoreRegExp)[4]).to.be.undefined; + expect(eraseUserScoreRegExp).toBeInstanceOf(RegExp); + expect(Array.isArray(fullText.match(eraseUserScoreRegExp))).toBe(true); + expect(fullText.match(eraseUserScoreRegExp).length).toBe(5); + expect(fullText.match(eraseUserScoreRegExp)[0]).toBe(fullText); + expect(fullText.match(eraseUserScoreRegExp)[1]).toBeUndefined(); + expect(fullText.match(eraseUserScoreRegExp)[2]).toBe('frank'); + expect(fullText.match(eraseUserScoreRegExp)[3]).toBeUndefined(); + expect(fullText.match(eraseUserScoreRegExp)[4]).toBeUndefined(); }); }); @@ -180,10 +170,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '{@matt, @phil}-- cuz they are the best team'", () => { @@ -197,10 +187,10 @@ describe('RegExpPlusPlus', () => { 'they are the best team', ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '{@user, @phil.user}--'", () => { @@ -214,10 +204,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '{ @darf, @greg, @tank } ++'", () => { @@ -231,10 +221,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match 'where in the world is Carmen Sandiego { @carmen.sandiego, @sarah.nade, @eartha.brute, @double.trouble, @wonder.rat } ++'", () => { @@ -249,10 +239,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '{@matt @phil}++'", () => { @@ -266,10 +256,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '( @matt, @phil )++'", () => { @@ -283,10 +273,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '[ @matt : @phil ]++'", () => { @@ -300,10 +290,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '[ @matt: @phil ]++'", () => { @@ -317,10 +307,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '[ @matt:@phil ]++'", () => { @@ -334,10 +324,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it("should match '{@matt,@phil}++'", () => { @@ -351,10 +341,10 @@ describe('RegExpPlusPlus', () => { undefined, ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).to.deep.equal(expectedMatch); + expect(match).toEqual(expectedMatch); }); it('should match `{ @Chelo, @Kahou_Lei, @wimdec_PTO_back_Aug_21 , @guillaume_Back_Aug_6th, @Cherry, @singaravelan } ++ you’re all awesome, I’m only here for the fun!`', () => { @@ -370,18 +360,18 @@ describe('RegExpPlusPlus', () => { 'you’re all awesome, I’m only here for the fun!', ]; - expect(multiUserVoteRegExp).to.be.a('RegExp'); + expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(typeof match).to.equal('object'); - expect(match.length).to.equal(expected.length); - expect(match).to.deep.equal(expected); - expect(match[0]).to.equal(expected[0]); - expect(match[1]).to.equal(expected[1]); - expect(match[2]).to.equal(expected[2]); - expect(match[3]).to.equal(expected[3]); - expect(match[4]).to.equal(expected[4]); - expect(match[5]).to.equal(expected[5]); + expect(typeof match).toBe('object'); + expect(match.length).toBe(expected.length); + expect(match).toEqual(expected); + expect(match[0]).toBe(expected[0]); + expect(match[1]).toBe(expected[1]); + expect(match[2]).toBe(expected[2]); + expect(match[3]).toBe(expected[3]); + expect(match[4]).toBe(expected[4]); + expect(match[5]).toBe(expected[5]); }); }); @@ -389,22 +379,22 @@ describe('RegExpPlusPlus', () => { it('should match top 10', () => { const topBottomRegExp = RegExpPlusPlus.createTopBottomRegExp(); const expected = ['top 10', 'top', '10']; - expect(topBottomRegExp).to.be.a('RegExp'); - expect(expected[0]).to.match(topBottomRegExp); + expect(topBottomRegExp).toBeInstanceOf(RegExp); + expect(expected[0]).toMatch(topBottomRegExp); const match = expected[0].match(topBottomRegExp); - expect(match).to.be.an('array'); - expect(match.length).to.equal(expected.length); - expect(match).to.deep.equal(expected); + expect(Array.isArray(match)).toBe(true); + expect(match.length).toBe(expected.length); + expect(match).toEqual(expected); }); it('should match bottom 5', () => { const topBottomRegExp = RegExpPlusPlus.createTopBottomRegExp(); const expected = ['bottom 5', 'bottom', '5']; - expect(topBottomRegExp).to.be.a('RegExp'); - expect(expected[0]).to.match(topBottomRegExp); + expect(topBottomRegExp).toBeInstanceOf(RegExp); + expect(expected[0]).toMatch(topBottomRegExp); const match = expected[0].match(topBottomRegExp); - expect(match).to.be.an('array'); - expect(match.length).to.equal(expected.length); - expect(match).to.deep.equal(expected); + expect(Array.isArray(match)).toBe(true); + expect(match.length).toBe(expected.length); + expect(match).toEqual(expected); }); }); @@ -412,22 +402,22 @@ describe('RegExpPlusPlus', () => { it('should match top tokens 10', () => { const topBottomTokenRegExp = RegExpPlusPlus.createTopBottomTokenRegExp(); const expected = ['top tokens 10', 'top', '10']; - expect(topBottomTokenRegExp).to.be.a('RegExp'); - expect(expected[0]).to.match(topBottomTokenRegExp); + expect(topBottomTokenRegExp).toBeInstanceOf(RegExp); + expect(expected[0]).toMatch(topBottomTokenRegExp); const match = expected[0].match(topBottomTokenRegExp); - expect(match).to.be.an('array'); - expect(match.length).to.equal(expected.length); - expect(match).to.deep.equal(expected); + expect(Array.isArray(match)).toBe(true); + expect(match.length).toBe(expected.length); + expect(match).toEqual(expected); }); it('should match bottom tokens 5', () => { const topBottomRegExp = RegExpPlusPlus.createTopBottomTokenRegExp(); const expected = ['bottom tokens 5', 'bottom', '5']; - expect(topBottomRegExp).to.be.a('RegExp'); - expect(expected[0]).to.match(topBottomRegExp); + expect(topBottomRegExp).toBeInstanceOf(RegExp); + expect(expected[0]).toMatch(topBottomRegExp); const match = expected[0].match(topBottomRegExp); - expect(match).to.be.an('array'); - expect(match.length).to.equal(expected.length); - expect(match).to.deep.equal(expected); + expect(Array.isArray(match)).toBe(true); + expect(match.length).toBe(expected.length); + expect(match).toEqual(expected); }); }); @@ -445,13 +435,13 @@ describe('RegExpPlusPlus', () => { ]; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); const fullMatch = fullText.match(upVoteOrDownVoteRegExp); - expect(fullText).to.match(upVoteOrDownVoteRegExp); - expect(fullMatch).to.be.an('array'); - expect(fullMatch.length).to.equal(6); - expect(fullMatch).to.deep.equal(expectedMatch); + expect(fullText).toMatch(upVoteOrDownVoteRegExp); + expect(Array.isArray(fullMatch)).toBe(true); + expect(fullMatch.length).toBe(6); + expect(fullMatch).toEqual(expectedMatch); }); it('should match name [matt] up/down [++] with reason [for being "great"]', () => { @@ -466,13 +456,13 @@ describe('RegExpPlusPlus', () => { ]; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); const fullMatch = fullText.match(upVoteOrDownVoteRegExp); - expect(fullText).to.match(upVoteOrDownVoteRegExp); - expect(fullMatch).to.be.an('array'); - expect(fullMatch.length).to.equal(6); - expect(fullMatch).to.deep.equal(expectedMatch); + expect(fullText).toMatch(upVoteOrDownVoteRegExp); + expect(Array.isArray(fullMatch)).toBe(true); + expect(fullMatch.length).toBe(6); + expect(fullMatch).toEqual(expectedMatch); }); it('should match name [matt] up/down [++] with reason [cuz he is awesome]', () => { @@ -487,13 +477,13 @@ describe('RegExpPlusPlus', () => { ]; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); const fullMatch = fullText.match(upVoteOrDownVoteRegExp); - expect(fullText).to.match(upVoteOrDownVoteRegExp); - expect(fullMatch).to.be.an('array'); - expect(fullMatch.length).to.equal(6); - expect(fullMatch).to.deep.equal(expectedMatch); + expect(fullText).toMatch(upVoteOrDownVoteRegExp); + expect(Array.isArray(fullMatch)).toBe(true); + expect(fullMatch.length).toBe(6); + expect(fullMatch).toEqual(expectedMatch); }); it('should match name [matt] up/down [++] with reason [thanks for being awesome]', () => { @@ -508,13 +498,13 @@ describe('RegExpPlusPlus', () => { ]; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); const fullMatch = fullText.match(upVoteOrDownVoteRegExp); - expect(fullText).to.match(upVoteOrDownVoteRegExp); - expect(fullMatch).to.be.an('array'); - expect(fullMatch.length).to.equal(6); - expect(fullMatch).to.deep.equal(expectedMatch); + expect(fullText).toMatch(upVoteOrDownVoteRegExp); + expect(Array.isArray(fullMatch)).toBe(true); + expect(fullMatch.length).toBe(6); + expect(fullMatch).toEqual(expectedMatch); }); it('should match name [matt] up/down [—] with reason [undefined]', () => { @@ -529,13 +519,13 @@ describe('RegExpPlusPlus', () => { ]; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); const fullMatch = fullText.match(upVoteOrDownVoteRegExp); - expect(fullText).to.match(upVoteOrDownVoteRegExp); - expect(fullMatch).to.be.an('array'); - expect(fullMatch.length).to.equal(6); - expect(fullMatch).to.deep.equal(expectedMatch); + expect(fullText).toMatch(upVoteOrDownVoteRegExp); + expect(Array.isArray(fullMatch)).toBe(true); + expect(fullMatch.length).toBe(6); + expect(fullMatch).toEqual(expectedMatch); }); it('should match name [matt] up/down [++] with reason [undefined]', () => { @@ -550,13 +540,13 @@ describe('RegExpPlusPlus', () => { ]; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); const fullMatch = fullText.match(upVoteOrDownVoteRegExp); - expect(fullText).to.match(upVoteOrDownVoteRegExp); - expect(fullMatch).to.be.an('array'); - expect(fullMatch.length).to.equal(6); - expect(fullMatch).to.deep.equal(expectedMatch); + expect(fullText).toMatch(upVoteOrDownVoteRegExp); + expect(Array.isArray(fullMatch)).toBe(true); + expect(fullMatch.length).toBe(6); + expect(fullMatch).toEqual(expectedMatch); }); it("should match name [matt] up/down [++] with reason [man, you're awesome]", () => { @@ -571,13 +561,13 @@ describe('RegExpPlusPlus', () => { ]; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); const fullMatch = fullText.match(upVoteOrDownVoteRegExp); - expect(fullText).to.match(upVoteOrDownVoteRegExp); - expect(fullMatch).to.be.an('array'); - expect(fullMatch.length).to.equal(6); - expect(fullMatch).to.deep.equal(expectedMatch); + expect(fullText).toMatch(upVoteOrDownVoteRegExp); + expect(Array.isArray(fullMatch)).toBe(true); + expect(fullMatch.length).toBe(6); + expect(fullMatch).toEqual(expectedMatch); }); }); @@ -586,63 +576,63 @@ describe('RegExpPlusPlus', () => { const text = "'what are you doing'--"; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); - expect(text).not.to.match(upVoteOrDownVoteRegExp); + expect(text).not.toMatch(upVoteOrDownVoteRegExp); }); it("shouldn't match name ['you are the best matt']--", () => { const text = 'you are the best matt--'; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); - expect(text).not.to.match(upVoteOrDownVoteRegExp); + expect(text).not.toMatch(upVoteOrDownVoteRegExp); }); it("shouldn't match name ['you are the best matt']--", () => { const text = "'you are the best matt'--"; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); - expect(text).not.to.match(upVoteOrDownVoteRegExp); + expect(text).not.toMatch(upVoteOrDownVoteRegExp); }); it("shouldn't match name ['you are the best matt']++ cuz you started #matt-s", () => { const text = 'you are the best matt++ cuz you started #matt-s'; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); - expect(text).not.to.match(upVoteOrDownVoteRegExp); + expect(text).not.toMatch(upVoteOrDownVoteRegExp); }); it("shouldn't match name ['you are the best matt']++ cuz you started #matt-s", () => { const text = 'you are the best matt++ cuz you started #matt-s'; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); - expect(text).not.to.match(upVoteOrDownVoteRegExp); + expect(text).not.toMatch(upVoteOrDownVoteRegExp); }); it("shouldn't match name ['such.a.complex-name-hyphens']++", () => { const text = 'such.a.complex-name-hyphens++'; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); - expect(text).not.to.match(upVoteOrDownVoteRegExp); + expect(text).not.toMatch(upVoteOrDownVoteRegExp); }); it("shouldn't match name ['”such a complex-name-hyphens”'] ++", () => { const text = '”such a complex-name-hyphens” ++'; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); - expect(upVoteOrDownVoteRegExp).to.be.a('RegExp'); + expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); - expect(text).not.to.match(upVoteOrDownVoteRegExp); + expect(text).not.toMatch(upVoteOrDownVoteRegExp); }); }); }); diff --git a/src/lib/services/scorekeeper.test.js b/src/lib/services/scorekeeper.test.js index 97d2016..a458217 100644 --- a/src/lib/services/scorekeeper.test.js +++ b/src/lib/services/scorekeeper.test.js @@ -1,8 +1,5 @@ const { MongoClient } = require('mongodb'); const sinon = require('sinon'); -const chai = require('chai'); - -const { expect } = chai; const SlackClient = require('@slack/client'); const ScoreKeeperService = require('./scorekeeper'); @@ -47,7 +44,7 @@ describe('ScoreKeeper', () => { const expectedResult = { score: 1, reasons: {} }; const beforeUser = await ScoreKeeperService.getUser(to); - expect(beforeUser.score).to.be.equal(0); + expect(beforeUser.score).toBe(0); const { toUser: r } = await ScoreKeeperService.incrementScore( to, @@ -56,14 +53,12 @@ describe('ScoreKeeper', () => { reason, 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(expectedResult.score); - expect(r.reasons['because points']).to.equal( - expectedResult.reasons['because points'], - ); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(expectedResult.score); + expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.be.equal(1); + expect(afterUser.score).toBe(1); }); it('should add 1 point to "pointReceiver" with reason "because points" and return the expected result', async () => { @@ -74,7 +69,7 @@ describe('ScoreKeeper', () => { const expectedResult = { score: 1, reasons: { 'because points': 1 } }; const beforeUser = await ScoreKeeperService.getUser(to); - expect(beforeUser.score).to.be.equal(0); + expect(beforeUser.score).toBe(0); const { toUser: r } = await ScoreKeeperService.incrementScore( to, @@ -83,14 +78,12 @@ describe('ScoreKeeper', () => { reason, 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(expectedResult.score); - expect(r.reasons['because points']).to.equal( - expectedResult.reasons['because points'], - ); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(expectedResult.score); + expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.be.equal(1); + expect(afterUser.score).toBe(1); }); it('should add 1 point to "to.name-hyphenated" with no reason and return the expected result', async () => { @@ -101,7 +94,7 @@ describe('ScoreKeeper', () => { const expectedResult = { score: 1, reasons: {} }; const beforeUser = await ScoreKeeperService.getUser(to); - expect(beforeUser.score).to.be.equal(0); + expect(beforeUser.score).toBe(0); const { toUser: r } = await ScoreKeeperService.incrementScore( to, @@ -110,14 +103,12 @@ describe('ScoreKeeper', () => { reason, 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(expectedResult.score); - expect(r.reasons['because points']).to.equal( - expectedResult.reasons['because points'], - ); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(expectedResult.score); + expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.be.equal(1); + expect(afterUser.score).toBe(1); }); it('should add 1 point to "to.sname_underscore" with no reason and return the expected result', async () => { @@ -128,7 +119,7 @@ describe('ScoreKeeper', () => { const expectedResult = { score: 1, reasons: {} }; const beforeUser = await ScoreKeeperService.getUser(to); - expect(beforeUser.score).to.be.equal(0); + expect(beforeUser.score).toBe(0); const { toUser: r } = await ScoreKeeperService.incrementScore( to, @@ -137,14 +128,12 @@ describe('ScoreKeeper', () => { reason, 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(expectedResult.score); - expect(r.reasons['because points']).to.equal( - expectedResult.reasons['because points'], - ); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(expectedResult.score); + expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.be.equal(1); + expect(afterUser.score).toBe(1); }); it('should add 1 point to "name_underscore" with no reason and return the expected result', async () => { @@ -155,7 +144,7 @@ describe('ScoreKeeper', () => { const expectedResult = { score: 1, reasons: {} }; const beforeUser = await ScoreKeeperService.getUser(to); - expect(beforeUser.score).to.be.equal(0); + expect(beforeUser.score).toBe(0); const { toUser: r } = await ScoreKeeperService.incrementScore( to, @@ -164,21 +153,19 @@ describe('ScoreKeeper', () => { reason, 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(expectedResult.score); - expect(r.reasons['because points']).to.equal( - expectedResult.reasons['because points'], - ); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(expectedResult.score); + expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.be.equal(1); + expect(afterUser.score).toBe(1); }); it('does not allow spamming points', async () => { const to = { name: 'matt.erickson', id: 'matt.erickson' }; // empty score to start const beforeUser = await ScoreKeeperService.getUser(to); - expect(beforeUser.score).to.be.equal(0); + expect(beforeUser.score).toBe(0); const { toUser: r } = await ScoreKeeperService.incrementScore( to, { name: 'matt.erickson.min', id: '123' }, @@ -186,14 +173,14 @@ describe('ScoreKeeper', () => { 'because points', 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(1); - expect(r.reasons['because points']).to.equal(1); - expect(emitSpy.called).to.equal(false); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(1); + expect(r.reasons['because points']).toBe(1); + expect(emitSpy.called).toBe(false); // score added const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.be.equal(1); + expect(afterUser.score).toBe(1); // Try to spam let r2; @@ -205,21 +192,19 @@ describe('ScoreKeeper', () => { 'because points', 1, )); - expect(r2).to.be.an('undefined'); + expect(r2).toBeUndefined(); } catch (e) { - expect(e.message).to.equal( - "I'm sorry <@123>, I'm afraid I can't do that.", - ); + expect(e.message).toBe("I'm sorry <@123>, I'm afraid I can't do that."); } const spamScore = await ScoreKeeperService.getUser(to); - expect(spamScore).to.not.equal(2); + expect(spamScore).not.toBe(2); - expect(emitSpy.called).to.equal(true); - expect(emitSpy).to.have.been.calledWith('plus-plus-spam'); + expect(emitSpy.called).toBe(true); + expect(emitSpy).toHaveBeenCalledWith('plus-plus-spam'); }); describe('special increment value response', () => { - before(async () => { + beforeAll(async () => { const encodedName = H.cleanAndEncode('derp'); await db.collection('scores').insertOne({ name: 'matt', @@ -238,13 +223,13 @@ describe('ScoreKeeper', () => { 'because points', 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(1); - expect(r.reasons['because points']).to.equal(1); - expect(msgSpy.called).to.equal(true); - expect(msgSpy).to.have.been.calledWith( + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(1); + expect(r.reasons['because points']).toBe(1); + expect(msgSpy.called).toBe(true); + expect(msgSpy).toHaveBeenCalledWith( '123', - `Looks like you've given derp quite a few points, maybe you should look at submitting ${ScoreKeeperService.peerFeedbackUrl}`, + `Looks like you've given derp quite a few points, maybe you should look at submitting ${ScoreKeeperService.peerFeedbackUrl}` ); }); }); @@ -258,9 +243,9 @@ describe('ScoreKeeper', () => { 'because points', 1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(1); - expect(r.reasons['because points']).to.equal(1); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(1); + expect(r.reasons['because points']).toBe(1); ({ toUser: r } = await ScoreKeeperService.incrementScore( to, @@ -269,13 +254,13 @@ describe('ScoreKeeper', () => { 'because points', 1, )); - expect(r).to.be.an('object'); - expect(r.score).to.equal(2); - expect(r.reasons['because points']).to.equal(2); - expect(typeof r[`${robotStub.name}Day`]).to.equal('object'); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(2); + expect(r.reasons['because points']).toBe(2); + expect(typeof r[`${robotStub.name}Day`]).toBe('object'); const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.equal(2); + expect(afterUser.score).toBe(2); }); }); @@ -288,7 +273,7 @@ describe('ScoreKeeper', () => { undefined, -1, ); - expect(r.score).to.equal(-1); + expect(r.score).toBe(-1); }); it('subtracts points from a user for a reason', async () => { @@ -299,16 +284,16 @@ describe('ScoreKeeper', () => { 'because points', -1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(-1); - expect(r.reasons['because points']).to.equal(-1); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(-1); + expect(r.reasons['because points']).toBe(-1); }); it('does not allow spamming points', async () => { const to = 'mahMainBuddy'; // empty score to start const beforeUser = await ScoreKeeperService.getUser(to); - expect(beforeUser.score).to.be.equal(0); + expect(beforeUser.score).toBe(0); const { toUser: r } = await ScoreKeeperService.incrementScore( to, { name: 'from', id: '123' }, @@ -316,13 +301,13 @@ describe('ScoreKeeper', () => { 'because points', -1, ); - expect(r).to.be.an('object'); - expect(r.score).to.equal(-1); - expect(r.reasons['because points']).to.equal(-1); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(-1); + expect(r.reasons['because points']).toBe(-1); // score added const afterUser = await ScoreKeeperService.getUser(to); - expect(afterUser.score).to.be.equal(-1); + expect(afterUser.score).toBe(-1); // Try to spam let r2; @@ -334,17 +319,15 @@ describe('ScoreKeeper', () => { 'because points', -1, )); - expect(r2).to.be.an('undefined'); + expect(r2).toBeUndefined(); } catch (e) { - expect(e.message).to.equal( - "I'm sorry <@123>, I'm afraid I can't do that.", - ); + expect(e.message).toBe("I'm sorry <@123>, I'm afraid I can't do that."); } const spamScore = await ScoreKeeperService.getUser(to); - expect(spamScore).to.not.equal(-2); + expect(spamScore).not.toBe(-2); - expect(emitSpy.called).to.equal(true); - expect(emitSpy).to.have.been.calledWith('plus-plus-spam'); + expect(emitSpy.called).toBe(true); + expect(emitSpy).toHaveBeenCalledWith('plus-plus-spam'); }); it('subtracts more points from a user for a reason', async () => { @@ -362,9 +345,9 @@ describe('ScoreKeeper', () => { 'because points', -1, )); - expect(r).to.be.an('object'); - expect(r.score).to.equal(-2); - expect(r.reasons['because points']).to.equal(-2); + expect(r).toBeInstanceOf(Object); + expect(r.score).toBe(-2); + expect(r.reasons['because points']).toBe(-2); }); }); @@ -377,19 +360,19 @@ describe('ScoreKeeper', () => { 'reason', 1, ); - expect(p).to.be.an('object'); - expect(p.score).to.equal(1); - expect(p.reasons.reason).to.equal(1); + expect(p).toBeInstanceOf(Object); + expect(p.score).toBe(1); + expect(p.reasons.reason).toBe(1); const r = await ScoreKeeperService.erase( 'to', { name: 'from', id: '123' }, 'room', 'reason', ); - expect(r).to.deep.equal(true); + expect(r).toEqual(true); const rs = await ScoreKeeperService.getUser('to'); - expect(rs.reasons).to.deep.equal({ reason: 0 }); - expect(rs.reasons.reason).to.equal(0); + expect(rs.reasons).toEqual({ reason: 0 }); + expect(rs.reasons.reason).toBe(0); }); it('erases a user from the scoreboard', async () => { @@ -400,17 +383,17 @@ describe('ScoreKeeper', () => { 'reason', 1, ); - expect(p).to.be.an('object'); - expect(p.score).to.equal(1); - expect(p.reasons.reason).to.equal(1); + expect(p).toBeInstanceOf(Object); + expect(p.score).toBe(1); + expect(p.reasons.reason).toBe(1); const r = await ScoreKeeperService.erase( 'to', { name: 'from', id: '123' }, 'room', ); - expect(r).to.equal(true); + expect(r).toBe(true); const user2 = await ScoreKeeperService.getUser('to'); - expect(user2.score).to.equal(0); + expect(user2.score).toBe(0); }); }); @@ -423,9 +406,9 @@ describe('ScoreKeeper', () => { undefined, 1, ); - expect(p.score).to.equal(1); + expect(p.score).toBe(1); const user = await ScoreKeeperService.getUser('to'); - expect(user.score).to.equal(1); + expect(user.score).toBe(1); }); it('returns the reasons for a user', async () => { @@ -437,9 +420,9 @@ describe('ScoreKeeper', () => { 'because points', 1, ); - expect(user.reasons).to.deep.equal({ 'because points': 1 }); + expect(user.reasons).toEqual({ 'because points': 1 }); } catch (e) { - expect(true).to.not.equal("This shouldn't be called"); + expect(true).not.toBe("This shouldn't be called"); } }); }); diff --git a/src/messageHandlers/plusplus.test.js b/src/messageHandlers/plusplus.test.js index eae6436..db32690 100644 --- a/src/messageHandlers/plusplus.test.js +++ b/src/messageHandlers/plusplus.test.js @@ -1,8 +1,5 @@ -const chai = require('chai'); const sinon = require('sinon'); -const { expect } = chai; - const TestHelper = require('hubot-test-helper'); const SlackClient = require('@slack/client'); @@ -12,12 +9,12 @@ const { wait } = require('../../test/test_helpers'); describe('PlusPlus', () => { let room; let plusPlusHelper; - before(async () => { + beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; plusPlusHelper = new TestHelper('./messageHandlers/plusplus.js'); }); - after(async () => { + afterAll(async () => { sinon.restore(); }); @@ -46,25 +43,21 @@ describe('PlusPlus', () => { it("should add a point when a user is ++'d", async () => { room.user.say('matt.erickson', '@derp++'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - "derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:", - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe("derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:"); const user = await db.collection('scores').findOne({ name: 'derp' }); - expect(user.score).to.equal(1); + expect(user.score).toBe(1); }); it("should add a point when a user is ++'d with pre-text", async () => { const emitSpy = sinon.spy(room.robot, 'emit'); room.user.say('matt.erickson', 'where are you d00d @derp++'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - "derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:", - ); - expect(emitSpy).not.to.have.been.calledWith('plus-plus-failure', { + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe("derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:"); + expect(emitSpy).not.toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: 'False positive detected in <#room1> from <@matt.erickson>:\n' + 'Pre-Message text: [true].\n' + @@ -75,20 +68,20 @@ describe('PlusPlus', () => { }); const user = await db.collection('scores').findOne({ name: 'derp' }); - expect(user).not.to.equal(undefined); - expect(user.score).to.equal(1); + expect(user).toBeDefined(); + expect(user.score).toBe(1); }); it("should add a point when a user is ++'d without a conjunction", async () => { const emitSpy = sinon.spy(room.robot, 'emit'); room.user.say('matt.erickson', '@derp++ winning the business'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.match( - /derp has 1 point for winning the business\.\n:birthday: Today is derp's hubotday! :birthday:/, + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toMatch( + /derp has 1 point for winning the business\.\n:birthday: Today is derp's hubotday! :birthday:/ ); - expect(emitSpy).not.to.have.been.calledWith('plus-plus-failure', { + expect(emitSpy).not.toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: 'False positive detected in <#room1> from <@matt.erickson>:\n' + 'Pre-Message text: [false].\n' + @@ -99,57 +92,51 @@ describe('PlusPlus', () => { }); const user = await db.collection('scores').findOne({ name: 'derp' }); - expect(user).not.to.equal(undefined); - expect(user.score).to.equal(1); + expect(user).toBeDefined(); + expect(user.score).toBe(1); }); it("should add a point when a user is :clap:'d", async () => { room.user.say('matt.erickson', '@derp :clap:'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.match(/derp has 1 point\./); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toMatch(/derp has 1 point\./); const user = await db.collection('scores').findOne({ name: 'derp' }); - expect(user.score).to.equal(1); + expect(user.score).toBe(1); }); it("should add a point when a user is :thumbsup:'d", async () => { room.user.say('matt.erickson', '@derp :thumbsup: for being the best'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.match( - /derp has 1 point for being the best\./, - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toMatch(/derp has 1 point for being the best\./); const user = await db.collection('scores').findOne({ name: 'derp' }); - expect(user.score).to.equal(1); + expect(user.score).toBe(1); }); it("should add a point when a user that is already in the db is ++'d", async () => { room.user.say('matt.erickson.min', '@matt.erickson++'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@matt.erickson> has 228 points.', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@matt.erickson> has 228 points.'); const user = await db .collection('scores') .findOne({ name: 'matt.erickson' }); - expect(user.score).to.equal(228); + expect(user.score).toBe(228); }); describe('multi user vote', () => { it('should add a point to each user in the multi-user plus plus', async () => { room.user.say('matt.erickson', '{ @darf, @greg, @tank }++'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@darf> has -1 point.' + - '\n<@greg> has -9 points.' + - '\n<@tank> has 2 points.', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@darf> has -1 point.' + + '\n<@greg> has -9 points.' + + '\n<@tank> has 2 points.'); }); it('should add a point to each user in the multi-user plus plus with text before it', async () => { @@ -158,13 +145,11 @@ describe('PlusPlus', () => { 'hello world! { @darf, @greg, @tank }++', ); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@darf> has -1 point.' + - '\n<@greg> has -9 points.' + - '\n<@tank> has 2 points.', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@darf> has -1 point.' + + '\n<@greg> has -9 points.' + + '\n<@tank> has 2 points.'); }); it('should add a point to each user in the multi-user plus plus with periods in their names', async () => { @@ -173,10 +158,10 @@ describe('PlusPlus', () => { '{ @darf.arg, @pirate.jack123, @ted.phil } ++', ); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@darf.arg> has 2 points.\n<@pirate.jack123> has 2 points.\n<@ted.phil> has 2 points.', + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe( + '<@darf.arg> has 2 points.\n<@pirate.jack123> has 2 points.\n<@ted.phil> has 2 points.' ); }); }); @@ -187,11 +172,9 @@ describe('PlusPlus', () => { '@matt.erickson++ for being awesome', ); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@matt.erickson> has 228 points, 2 of which are for being awesome.', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@matt.erickson> has 228 points, 2 of which are for being awesome.'); }); it('should add a point to user with (sans) conjunction reason', async () => { @@ -201,12 +184,10 @@ describe('PlusPlus', () => { "@matt.erickson++ gawd you're awesome", ); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - "<@matt.erickson> has 228 points, 1 of which is for gawd you're awesome.", - ); - expect(emitSpy).not.to.have.been.calledWith('plus-plus-failure', { + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe("<@matt.erickson> has 228 points, 1 of which is for gawd you're awesome."); + expect(emitSpy).not.toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: 'False positive detected in <#room1> from <@derp>:\n' + 'Pre-Message text: [false].\n' + @@ -223,18 +204,16 @@ describe('PlusPlus', () => { let user = await db .collection('scores') .findOne({ name: 'matt.erickson.min' }); - expect(user.score).to.equal(8); + expect(user.score).toBe(8); room.user.say('matt.erickson', '@matt.erickson.min--'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@matt.erickson.min> has 7 points.', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@matt.erickson.min> has 7 points.'); user = await db .collection('scores') .findOne({ name: 'matt.erickson.min' }); - expect(user.score).to.equal(7); + expect(user.score).toBe(7); }); it("should subtract a point when a user is :thumbsdown:'d", async () => { @@ -243,15 +222,13 @@ describe('PlusPlus', () => { '@matt.erickson.min :thumbsdown: for being the best', ); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@matt.erickson.min> has 7 points, -1 of which is for being the best.', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@matt.erickson.min> has 7 points, -1 of which is for being the best.'); const user = await db .collection('scores') .findOne({ name: 'matt.erickson.min' }); - expect(user.score).to.equal(7); + expect(user.score).toBe(7); }); it("shouldn't remove a point when a user is ++'d with pre-text and no conjunction", async () => { @@ -261,7 +238,7 @@ describe('PlusPlus', () => { 'hello, @derp -- i have no idea what you are doing', ); await wait(55); - expect(emitSpy).to.have.been.calledWith('plus-plus-failure', { + expect(emitSpy).toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: 'False positive detected in <#room1> from <@matt.erickson>\n' + 'Has pre-Message text: [true].\n' + @@ -272,7 +249,7 @@ describe('PlusPlus', () => { }); const user = await db.collection('scores').findOne({ name: 'derp' }); - expect(user).to.equal(null); + expect(user).toBeNull(); }); }); }); diff --git a/src/messageHandlers/scoreboard.test.js b/src/messageHandlers/scoreboard.test.js index 11787b8..3dd96b2 100644 --- a/src/messageHandlers/scoreboard.test.js +++ b/src/messageHandlers/scoreboard.test.js @@ -1,17 +1,13 @@ -const chai = require('chai'); - const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); const { wait } = require('../../test/test_helpers'); -const { expect } = chai; - describe('Scoreboard', () => { let room; let scoreboard; let sandbox; - before(async () => { + beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; scoreboard = new TestHelper('./messageHandlers/scoreboard.js'); }); @@ -29,30 +25,30 @@ describe('Scoreboard', () => { it('should respond with 5 reasons if the user has 5', async () => { room.user.say('matt.erickson', '@hubot score for @matt.erickson'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.match( - /<@matt\.erickson> has 227 points\.\nAccount Level: 1\nTotal Points Given: 13\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){5}/, + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toMatch( + /<@matt\.erickson> has 227 points\.\nAccount Level: 1\nTotal Points Given: 13\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){5}/ ); }); it('should respond with 3 reasons if the user has 3', async () => { room.user.say('matt.erickson.min', '@hubot score for @matt.erickson.min'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.match( - /<@matt\.erickson\.min> has 8 points\.\nAccount Level: 1\nTotal Points Given: -2\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){3}/, + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toMatch( + /<@matt\.erickson\.min> has 8 points\.\nAccount Level: 1\nTotal Points Given: -2\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){3}/ ); }); it('should respond with 3 reasons if the user has 3 and token count', async () => { room.user.say('peter.parker.min', '@hubot score for @peter.parker.min'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.match( - /<@peter\.parker\.min> has 8 points \(\*8 Hubot Tokens\*\)\.\nAccount Level: 2\nTotal Points Given: -2\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){3}/, + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toMatch( + /<@peter\.parker\.min> has 8 points \(\*8 Hubot Tokens\*\)\.\nAccount Level: 2\nTotal Points Given: -2\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){3}/ ); }); }); @@ -61,31 +57,25 @@ describe('Scoreboard', () => { it('should respond with top 2 leaders on the scoreboard', async () => { room.user.say('matt.erickson', '@hubot top 2'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.include( - '\n1. <@matt.erickson>: 227\n2. <@peter.parker>: 200 (*200 Hubot Tokens*)', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toContain('\n1. <@matt.erickson>: 227\n2. <@peter.parker>: 200 (*200 Hubot Tokens*)'); }); it('should respond with bottom 2 losers on the scoreboard', async () => { room.user.say('matt.erickson', '@hubot bottom 2'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '▁▇\n1. <@greg>: -10\n2. <@darf>: -2', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('▁▇\n1. <@greg>: -10\n2. <@darf>: -2'); }); it('should respond with top 2 leaders on the scoreboard if account level of one user is level 2', async () => { room.user.say('matt.erickson', '@hubot top 2'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.include( - '\n1. <@matt.erickson>: 227\n2. <@peter.parker>: 200 (*200 Hubot Tokens*)', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toContain('\n1. <@matt.erickson>: 227\n2. <@peter.parker>: 200 (*200 Hubot Tokens*)'); }); }); @@ -93,20 +83,20 @@ describe('Scoreboard', () => { it('should respond with top 2 leaders on the scoreboard', async () => { room.user.say('matt.erickson', '@hubot top tokens 2'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.include( - '\n1. <@peter.parker>: *200 Hubot Tokens* (200 points)\n2. <@peter.parker.min>: *8 Hubot Tokens* (8 points)', + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toContain( + '\n1. <@peter.parker>: *200 Hubot Tokens* (200 points)\n2. <@peter.parker.min>: *8 Hubot Tokens* (8 points)' ); }); it('should respond with bottom 2 leaders on the scoreboard', async () => { room.user.say('matt.erickson', '@hubot bottom tokens 2'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.include( - '\n1. <@peter.parker.min>: *8 Hubot Tokens* (8 points)\n2. <@peter.parker>: *200 Hubot Tokens* (200 points)', + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toContain( + '\n1. <@peter.parker.min>: *8 Hubot Tokens* (8 points)\n2. <@peter.parker>: *200 Hubot Tokens* (200 points)' ); }); }); diff --git a/src/messageHandlers/tokens.test.js b/src/messageHandlers/tokens.test.js index 1a1dced..329e826 100644 --- a/src/messageHandlers/tokens.test.js +++ b/src/messageHandlers/tokens.test.js @@ -1,9 +1,5 @@ -const chai = require('chai'); - const sinon = require('sinon'); -const { expect } = chai; - const TestHelper = require('hubot-test-helper'); const SlackClient = require('@slack/client'); @@ -13,13 +9,13 @@ const { wait } = require('../../test/test_helpers'); describe('Tokens', () => { let room; let tokenHelper; - before(async () => { + beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; tokenHelper = new TestHelper('./messageHandlers/tokens.js'); }); - after(async () => { + afterAll(async () => { sinon.restore(); }); @@ -48,111 +44,105 @@ describe('Tokens', () => { it("should add a X points when a user is + #'d", async () => { room.user.say('peter.parker', '@hubot @peter.parker.min + 5'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@peter.parker> transferred *5* hubot Tokens to <@peter.parker.min>.' + - '\n<@peter.parker.min> now has 13 tokens.' + - '\n_<@peter.parker> has 195 tokens_', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@peter.parker> transferred *5* hubot Tokens to <@peter.parker.min>.' + + '\n<@peter.parker.min> now has 13 tokens.' + + '\n_<@peter.parker> has 195 tokens_'); const to = await db .collection('scores') .findOne({ name: 'peter.parker.min' }); - expect(to.score).to.equal(8); - expect(to.token).to.equal(13); + expect(to.score).toBe(8); + expect(to.token).toBe(13); const from = await db .collection('scores') .findOne({ name: 'peter.parker' }); - expect(from.score).to.equal(200); - expect(from.token).to.equal(195); + expect(from.score).toBe(200); + expect(from.token).toBe(195); }); it('should error and message if sender is short on tokens', async () => { room.user.say('peter.parker.min', '@hubot @peter.parker + 55'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.match( - /You don't have enough tokens to send 55 to peter.parker/, - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toMatch(/You don't have enough tokens to send 55 to peter.parker/); const to = await db .collection('scores') .findOne({ name: 'peter.parker' }); - expect(to.score).to.equal(200); - expect(to.token).to.equal(200); + expect(to.score).toBe(200); + expect(to.token).toBe(200); const from = await db .collection('scores') .findOne({ name: 'peter.parker.min' }); - expect(from.score).to.equal(8); - expect(from.token).to.equal(8); + expect(from.score).toBe(8); + expect(from.token).toBe(8); }); it('should error and message if sender is not level 2', async () => { room.user.say('matt.erickson.min', '@hubot @peter.parker + 55'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - 'In order to send tokens to peter.parker you both must be, at least, level 2.', + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe( + 'In order to send tokens to peter.parker you both must be, at least, level 2.' ); const to = await db .collection('scores') .findOne({ name: 'peter.parker' }); - expect(to.score).to.equal(200); - expect(to.token).to.equal(200); + expect(to.score).toBe(200); + expect(to.token).toBe(200); const from = await db .collection('scores') .findOne({ name: 'matt.erickson.min' }); - expect(from.score).to.equal(8); - expect(from.token).to.equal(undefined); + expect(from.score).toBe(8); + expect(from.token).toBeUndefined(); }); it('should error and message if recipient is not level 2', async () => { room.user.say('peter.parker', '@hubot @matt.erickson + 55'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - 'In order to send tokens to matt.erickson you both must be, at least, level 2.', + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe( + 'In order to send tokens to matt.erickson you both must be, at least, level 2.' ); const to = await db .collection('scores') .findOne({ name: 'matt.erickson' }); - expect(to.score).to.equal(227); - expect(to.token).to.equal(undefined); + expect(to.score).toBe(227); + expect(to.token).toBeUndefined(); const from = await db .collection('scores') .findOne({ name: 'peter.parker' }); - expect(from.score).to.equal(200); - expect(from.token).to.equal(200); + expect(from.score).toBe(200); + expect(from.token).toBe(200); }); it('should error on second point (for spam check)', async () => { room.user.say('peter.parker', '@hubot @peter.parker.min + 2'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1].length).to.equal(2); - expect(room.messages[1][1]).to.equal( - '<@peter.parker> transferred *2* hubot Tokens to <@peter.parker.min>.' + - '\n<@peter.parker.min> now has 10 tokens.' + - '\n_<@peter.parker> has 198 tokens_', - ); + expect(room.messages.length).toBe(2); + expect(room.messages[1].length).toBe(2); + expect(room.messages[1][1]).toBe('<@peter.parker> transferred *2* hubot Tokens to <@peter.parker.min>.' + + '\n<@peter.parker.min> now has 10 tokens.' + + '\n_<@peter.parker> has 198 tokens_'); const to = await db .collection('scores') .findOne({ name: 'peter.parker.min' }); - expect(to.score).to.equal(8); - expect(to.token).to.equal(10); + expect(to.score).toBe(8); + expect(to.token).toBe(10); const from = await db .collection('scores') .findOne({ name: 'peter.parker' }); - expect(from.score).to.equal(200); - expect(from.token).to.equal(198); + expect(from.score).toBe(200); + expect(from.token).toBe(198); room.user.say('peter.parker', '@hubot @peter.parker.min + 2'); await wait(55); const spamCheck = await db .collection('scoreLog') .findOne({ from: 'peter.parker' }); - expect(Object.keys(spamCheck)).to.eql([ + expect(Object.keys(spamCheck)).toEqual([ '_id', 'from', 'to', @@ -163,7 +153,7 @@ describe('Tokens', () => { ]); spamCheck.date = '123'; // hack to handle date; spamCheck._id = '1'; - expect(spamCheck).to.deep.include({ + expect(spamCheck).toMatchObject({ from: 'peter.parker', to: 'peter.parker.min', reason: null, @@ -172,9 +162,7 @@ describe('Tokens', () => { _id: '1', date: '123', }); - expect(room.messages[3][1]).to.equal( - "I'm sorry <@peter.parker>, I'm afraid I can't do that.", - ); + expect(room.messages[3][1]).toBe("I'm sorry <@peter.parker>, I'm afraid I can't do that."); }); }); }); diff --git a/src/messageHandlers/wallet.test.js b/src/messageHandlers/wallet.test.js index 3d78ee9..0f5faaa 100644 --- a/src/messageHandlers/wallet.test.js +++ b/src/messageHandlers/wallet.test.js @@ -1,8 +1,5 @@ -const chai = require('chai'); - const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); -const { expect } = chai; const { H } = require('../lib/helpers'); const { wait } = require('../../test/test_helpers'); @@ -12,7 +9,7 @@ describe('PlusPlus', () => { let db; let wallet; let sandbox; - before(async () => { + beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; wallet = new TestHelper('./messageHandlers/wallet.js'); }); @@ -32,26 +29,20 @@ describe('PlusPlus', () => { room.name = 'D123'; await room.user.say('matt.erickson', '@hubot upgrade my account'); await wait(55); - expect(room.messages.length).to.equal(2); - expect(room.messages[1][1]).to.equal( + expect(room.messages.length).toBe(2); + expect(room.messages[1][1]).toBe( `@matt.erickson matt.erickson, we are going to level up your account to Level 2! This means you will start getting ${H.capitalizeFirstLetter( room.robot.name, - )} Tokens as well as points!`, + )} Tokens as well as points!` ); const user = await db .collection('scores') .findOne({ name: 'matt.erickson' }); const bot = await db.collection('botToken').findOne({ name: 'hubot' }); - expect(user.score).to.equal(227, 'score should equal default 227'); - expect(user.token).to.equal( - 227, - 'tokens should equal 227, the same as the score', - ); - expect(user.accountLevel).to.equal(2, 'account level should now be 2'); - expect(bot.token).to.equal( - 800000000000 - 227, - `${room.robot.name} should have 8T - 227 tokens (799999999773)`, - ); + expect(user.score).toBe(227); + expect(user.token).toBe(227); + expect(user.accountLevel).toBe(2); + expect(bot.token).toBe(800000000000 - 227); }); }); }); From ac53021f69344786d3499c88902c0a65347bd753 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Tue, 2 Jan 2024 12:05:32 -0600 Subject: [PATCH 07/12] Moving to jest cuz why tf not --- .mocharc.js | 11 - .vscode/settings.json | 1 + jest.config.js | 20 + package-lock.json | 11856 ++++++++++------ package.json | 17 +- src/lib/Helpers.js | 2 +- src/lib/Helpers.test.js | 40 +- src/lib/MessageFactory.js | 10 +- src/lib/MessageFactory.test.js | 296 +- src/lib/RegExpPlusPlus.test.js | 205 +- src/lib/data/scores.js | 4 +- src/lib/services/database.js | 14 +- src/lib/services/scoreboard.js | 31 +- src/lib/services/scorekeeper.test.js | 213 +- src/lib/services/wallet.js | 28 +- .../helpMessage.js} | 4 +- .../helpMessage.test.js} | 66 +- src/messageHandlers/plusplus.test.js | 109 +- src/messageHandlers/scoreboard.test.js | 121 +- src/messageHandlers/tokens.test.js | 94 +- src/messageHandlers/wallet.test.js | 23 +- test/{globalFixture.js => globalTeardown.js} | 7 +- test/setup.js | 45 + test/test_helpers.js | 68 +- 24 files changed, 8077 insertions(+), 5208 deletions(-) delete mode 100644 .mocharc.js create mode 100644 jest.config.js rename src/{help.js => messageHandlers/helpMessage.js} (85%) rename src/{help.test.js => messageHandlers/helpMessage.test.js} (61%) rename test/{globalFixture.js => globalTeardown.js} (86%) create mode 100644 test/setup.js diff --git a/.mocharc.js b/.mocharc.js deleted file mode 100644 index 9c9e6ba..0000000 --- a/.mocharc.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - color: true, - bail: false, - recursive: true, - 'watch-files': ['./{,!(node_modules)/**}/*.test.js'], - package: './package.json', - spec: ['./{,!(node_modules)/**}/*.test.js'], - require: ['./test/globalFixture.js'], - ignore: ['node_modules'], - exit: true, -}; diff --git a/.vscode/settings.json b/.vscode/settings.json index e39c0b1..ce4e01b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ "codeql", "darf", "eartha", + "mockbot", "nade", "pjson", "sandiego", diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..f60e40a --- /dev/null +++ b/jest.config.js @@ -0,0 +1,20 @@ +/** + * For a detailed explanation regarding each configuration property, visit: + * https://jestjs.io/docs/configuration + */ + +/** @type {import('jest').Config} */ +const config = { + clearMocks: true, + collectCoverage: true, + coverageDirectory: 'coverage', + coverageProvider: 'v8', + // detectLeaks: true, + // detectOpenHandles: true, + forceExit: true, + setupFilesAfterEnv: ['/test/setup.js'], + testMatch: ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[tj]s?(x)'], + unmockedModulePathPatterns: ['/test/setup.js'], +}; + +module.exports = config; diff --git a/package-lock.json b/package-lock.json index 825589c..5888d18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@slack/client": "^5.0.2", + "@slack/web-api": "^6.11.0", "@snyk/protect": "^1.1127.0", "axios": "^1.4.0", "clark": "^0.0.6", @@ -22,25 +23,21 @@ "token-buddy": "^1.0.0" }, "devDependencies": { - "bluebird": "^3.7.2", - "chai": "^4.3.7", "eslint": "^8.56.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-mocha": "^10.1.0", + "eslint-plugin-jest": "^27.6.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-promise": "^6.1.1", "eslint-watch": "^8.0.0", "hubot-test-helper": "github:vpeltola/hubot-test-helper#fixes-for-hubot-5.x", - "mocha": "^10.2.0", + "jest": "^29.7.0", "mock-env": "^0.2.0", - "mongo-unit": "^3.3.0", - "sinon": "^15.2.0", - "sinon-chai": "^3.7.0" + "mongo-unit": "^3.3.0" }, "engines": { "node": "^18.x.x" @@ -55,6 +52,19 @@ "node": ">=0.10.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", @@ -720,441 +730,1105 @@ "tslib": "^2.3.1" } }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=4" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.8.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "has-flag": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=4" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dev": true, "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { - "rlp": "bin/rlp" + "json5": "lib/cli.js" }, "engines": { - "node": ">=14" + "node": ">=6" } }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=14" + "node": ">=6.9.0" } }, - "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=6.9.0" } }, - "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dev": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "@ethersproject/bignumber": "^5.7.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" + "color-name": "1.1.3" } }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "@ethersproject/logger": "^5.7.0" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "dependencies": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/signing-key": { @@ -1170,1604 +1844,3158 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ], + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.7.tgz", + "integrity": "sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", + "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@scure/base": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "dependencies": { + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@slack/client": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@slack/client/-/client-5.0.2.tgz", + "integrity": "sha512-HurKTUBZlwj/1cnZ6QOHpYR7k+G62WlL+13DgYD7onVRnQWggkIyCg+ymX1kQn6txzNdUyDEaixyCvBvmhH8tQ==", + "deprecated": "Slack Client is deprecated - Use @slack/web-api, @slack/rtm-api, or @slack/webhook instead.", + "dependencies": { + "@slack/logger": "^1.0.0", + "@slack/rtm-api": "^5.0.2", + "@slack/types": "^1.1.0", + "@slack/web-api": "^5.1.0", + "@slack/webhook": "^5.0.1" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.5.1" + } + }, + "node_modules/@slack/client/node_modules/@slack/web-api": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-5.15.0.tgz", + "integrity": "sha512-tjQ8Zqv/Fmj9SOL9yIEd7IpTiKfKHi9DKAkfRVeotoX0clMr3SqQtBqO+KZMX27gm7dmgJsQaDKlILyzdCO+IA==", + "dependencies": { + "@slack/logger": ">=1.0.0 <3.0.0", + "@slack/types": "^1.7.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=8.9.0", + "axios": "^0.21.1", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.5.1" + } + }, + "node_modules/@slack/client/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@slack/client/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@slack/client/node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/@slack/logger": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-1.1.1.tgz", + "integrity": "sha512-PAC5CMnNAv/FPtJ0le+YD2wUV+tZ7n3Bnjj9dBI+deIcHsExCnQkQmZE79cLvfuYXbz3PWyv5coti30MJQhEjA==", + "dependencies": { + "@types/node": ">=8.9.0" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.5.1" + } + }, + "node_modules/@slack/rtm-api": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@slack/rtm-api/-/rtm-api-5.0.5.tgz", + "integrity": "sha512-x2B4hyoxjg62cxf4M5QRomx+xYp2XoajPKdd24SM2Sl4m+IrzwKzmcrysQuYmF6BMsm3IoTKymW5BBGckHGTIw==", + "dependencies": { + "@slack/logger": ">=1.0.0 <3.0.0", + "@slack/web-api": "^5.3.0", + "@types/node": ">=8.9.0", + "@types/p-queue": "^2.3.2", + "@types/ws": "^7.2.5", + "eventemitter3": "^3.1.0", + "finity": "^0.5.4", + "p-cancelable": "^1.1.0", + "p-queue": "^2.4.2", + "ws": "^5.2.0" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.5.1" + } + }, + "node_modules/@slack/rtm-api/node_modules/@slack/web-api": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-5.15.0.tgz", + "integrity": "sha512-tjQ8Zqv/Fmj9SOL9yIEd7IpTiKfKHi9DKAkfRVeotoX0clMr3SqQtBqO+KZMX27gm7dmgJsQaDKlILyzdCO+IA==", + "dependencies": { + "@slack/logger": ">=1.0.0 <3.0.0", + "@slack/types": "^1.7.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=8.9.0", + "axios": "^0.21.1", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.5.1" + } + }, + "node_modules/@slack/rtm-api/node_modules/@slack/web-api/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@slack/rtm-api/node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/@slack/rtm-api/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@slack/types": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", + "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==", + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.5.1" + } + }, + "node_modules/@slack/web-api": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.0.tgz", + "integrity": "sha512-DLShYUc2dE8QrhmrJZ7YuhAuh/VW88Dt3LL7s2KrkEOyxbdfjAtF9bzPOBMlXuWmO6nWLGVevPuhShcYyjwTEw==", + "dependencies": { + "@slack/logger": "^3.0.0", + "@slack/types": "^2.11.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=12.0.0", + "axios": "^1.6.0", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-electron": "2.2.2", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api/node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dependencies": { + "@types/node": ">=12.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api/node_modules/@slack/types": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", + "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/@slack/webhook": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-5.0.4.tgz", + "integrity": "sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA==", + "dependencies": { + "@slack/types": "^1.2.1", + "@types/node": ">=8.9.0", + "axios": "^0.21.1" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">= 5.5.1" + } + }, + "node_modules/@slack/webhook/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", + "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.22.tgz", + "integrity": "sha512-YuPjsLnq6I5ZQBTx6BL5NsCLtcLel5YIMf3gDeEa+GSCXn5mgRXm+8XO8HtjR3Xf69b88aY4c7bwKQQS2i8vtA==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.1.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz", + "integrity": "sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw==", + "optional": true, + "dependencies": { + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.25", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", + "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", + "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", + "optional": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", + "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", + "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", + "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", + "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", + "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", + "optional": true, + "dependencies": { + "@smithy/middleware-serde": "^2.0.15", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz", + "integrity": "sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/protocol-http": "^3.0.11", + "@smithy/service-error-classification": "^2.0.8", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-retry": "^2.0.8", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", + "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", + "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", + "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", + "optional": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" + "@smithy/property-provider": "^2.0.16", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@smithy/node-http-handler": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", + "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", + "optional": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@smithy/abort-controller": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@smithy/property-provider": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", + "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", + "optional": true, "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", + "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", + "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", + "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", + "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", + "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.18.tgz", + "integrity": "sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw==", + "optional": true, + "dependencies": { + "@smithy/eventstream-codec": "^2.0.15", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz", + "integrity": "sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q==", + "optional": true, + "dependencies": { + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", + "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", + "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", + "optional": true, + "dependencies": { + "@smithy/querystring-parser": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", + "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@smithy/util-config-provider": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.1.0.tgz", + "integrity": "sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==", + "optional": true, "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz", + "integrity": "sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w==", + "optional": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=10.10.0" + "node": ">= 10.0.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.31.tgz", + "integrity": "sha512-ZwdjAJAFkkQQ4hdE8HOcxFAWC3GPFXQ3yQ8IBwHH5nQBlr9q+p5eRQ7Y8iRRORJe4vksR+NASRXZ+E81Us1aXQ==", + "optional": true, + "dependencies": { + "@smithy/config-resolver": "^2.0.22", + "@smithy/credential-provider-imds": "^2.1.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jsdoc/salty": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.7.tgz", - "integrity": "sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==", + "node_modules/@smithy/util-endpoints": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", + "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "optional": true, "dependencies": { - "lodash": "^4.17.21" + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=v12.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", - "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", "optional": true, "dependencies": { - "sparse-bitfield": "^3.0.3" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "node_modules/@smithy/util-middleware": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", + "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", + "optional": true, "dependencies": { - "@noble/hashes": "1.3.1" + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "engines": { - "node": ">= 16" + "node_modules/@smithy/util-retry": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", + "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "optional": true, + "dependencies": { + "@smithy/service-error-classification": "^2.0.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "node_modules/@smithy/util-stream": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", + "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", + "optional": true, + "dependencies": { + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, "engines": { - "node": ">= 16" + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "optional": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@snyk/protect": { + "version": "1.1266.0", + "resolved": "https://registry.npmjs.org/@snyk/protect/-/protect-1.1266.0.tgz", + "integrity": "sha512-SDrW7b4x4NQG/0aylXTi6QqMopXB1Kogga6bNp31lmR00eitGssINEoEBJMyXz4uj0cKDu/PzpwdNHDP6/ntbA==", + "bin": { + "snyk-protect": "bin/snyk-protect" + }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=14.16" } }, - "node_modules/@pkgr/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", - "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "dependencies": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@types/node": "*" } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@types/node": "*" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@types/node": "*" } }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "node_modules/@slack/client": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@slack/client/-/client-5.0.2.tgz", - "integrity": "sha512-HurKTUBZlwj/1cnZ6QOHpYR7k+G62WlL+13DgYD7onVRnQWggkIyCg+ymX1kQn6txzNdUyDEaixyCvBvmhH8tQ==", - "deprecated": "Slack Client is deprecated - Use @slack/web-api, @slack/rtm-api, or @slack/webhook instead.", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { - "@slack/logger": "^1.0.0", - "@slack/rtm-api": "^5.0.2", - "@slack/types": "^1.1.0", - "@slack/web-api": "^5.1.0", - "@slack/webhook": "^5.0.1" - }, - "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "@types/node": "*" } }, - "node_modules/@slack/logger": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-1.1.1.tgz", - "integrity": "sha512-PAC5CMnNAv/FPtJ0le+YD2wUV+tZ7n3Bnjj9dBI+deIcHsExCnQkQmZE79cLvfuYXbz3PWyv5coti30MJQhEjA==", + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==" + }, + "node_modules/@types/luxon": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", + "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==" + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", "dependencies": { - "@types/node": ">=8.9.0" - }, - "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "@types/linkify-it": "*", + "@types/mdurl": "*" } }, - "node_modules/@slack/rtm-api": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@slack/rtm-api/-/rtm-api-5.0.5.tgz", - "integrity": "sha512-x2B4hyoxjg62cxf4M5QRomx+xYp2XoajPKdd24SM2Sl4m+IrzwKzmcrysQuYmF6BMsm3IoTKymW5BBGckHGTIw==", + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==" + }, + "node_modules/@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dependencies": { - "@slack/logger": ">=1.0.0 <3.0.0", - "@slack/web-api": "^5.3.0", - "@types/node": ">=8.9.0", - "@types/p-queue": "^2.3.2", - "@types/ws": "^7.2.5", - "eventemitter3": "^3.1.0", - "finity": "^0.5.4", - "p-cancelable": "^1.1.0", - "p-queue": "^2.4.2", - "ws": "^5.2.0" - }, - "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "undici-types": "~5.26.4" } }, - "node_modules/@slack/types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", - "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==", - "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" - } + "node_modules/@types/p-queue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz", + "integrity": "sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==" }, - "node_modules/@slack/web-api": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-5.15.0.tgz", - "integrity": "sha512-tjQ8Zqv/Fmj9SOL9yIEd7IpTiKfKHi9DKAkfRVeotoX0clMr3SqQtBqO+KZMX27gm7dmgJsQaDKlILyzdCO+IA==", + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dependencies": { - "@slack/logger": ">=1.0.0 <3.0.0", - "@slack/types": "^1.7.0", - "@types/is-stream": "^1.1.0", - "@types/node": ">=8.9.0", - "axios": "^0.21.1", - "eventemitter3": "^3.1.0", - "form-data": "^2.5.0", - "is-stream": "^1.1.0", - "p-queue": "^6.6.1", - "p-retry": "^4.0.0" - }, - "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "@types/node": "*" } }, - "node_modules/@slack/web-api/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dependencies": { - "follow-redirects": "^1.14.0" + "@types/node": "*" } }, - "node_modules/@slack/web-api/node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true }, - "node_modules/@slack/webhook": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-5.0.4.tgz", - "integrity": "sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA==", + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", "dependencies": { - "@slack/types": "^1.2.1", - "@types/node": ">=8.9.0", - "axios": "^0.21.1" - }, - "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "@types/node": "*", + "@types/webidl-conversions": "*" } }, - "node_modules/@slack/webhook/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dependencies": { - "follow-redirects": "^1.14.0" + "@types/node": "*" } }, - "node_modules/@smithy/abort-controller": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", - "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", - "optional": true, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@smithy/config-resolver": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.22.tgz", - "integrity": "sha512-YuPjsLnq6I5ZQBTx6BL5NsCLtcLel5YIMf3gDeEa+GSCXn5mgRXm+8XO8HtjR3Xf69b88aY4c7bwKQQS2i8vtA==", - "optional": true, - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", - "@smithy/util-config-provider": "^2.1.0", - "@smithy/util-middleware": "^2.0.8", - "tslib": "^2.5.0" - }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@smithy/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz", - "integrity": "sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw==", - "optional": true, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, "dependencies": { - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.25", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", - "@smithy/util-middleware": "^2.0.8", - "tslib": "^2.5.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@smithy/credential-provider-imds": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", - "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", - "optional": true, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/property-provider": "^2.0.16", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "tslib": "^2.5.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@smithy/eventstream-codec": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", - "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", - "optional": true, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.7.0", - "@smithy/util-hex-encoding": "^2.0.0", - "tslib": "^2.5.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@smithy/fetch-http-handler": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", - "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", - "optional": true, - "dependencies": { - "@smithy/protocol-http": "^3.0.11", - "@smithy/querystring-builder": "^2.0.15", - "@smithy/types": "^2.7.0", - "@smithy/util-base64": "^2.0.1", - "tslib": "^2.5.0" + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" } }, - "node_modules/@smithy/hash-node": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", - "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", - "optional": true, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, "dependencies": { - "@smithy/types": "^2.7.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@smithy/invalid-dependency": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", - "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", - "optional": true, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/abi-decoder": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-2.4.0.tgz", + "integrity": "sha512-TOLU2q1HgYOjs1GKGtVzaqrYkar6I2fT9a80rzx6/9EJ/5crb4nCGuro0grZayixem93T7omrajYmLiMkYDLDA==", "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" } }, - "node_modules/@smithy/middleware-content-length": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", - "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", - "optional": true, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "dependencies": { - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.5" } }, - "node_modules/@smithy/middleware-endpoint": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", - "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", - "optional": true, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "@smithy/middleware-serde": "^2.0.15", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/shared-ini-file-loader": "^2.2.7", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-middleware": "^2.0.8", - "tslib": "^2.5.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.6" } }, - "node_modules/@smithy/middleware-retry": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz", - "integrity": "sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ==", - "optional": true, - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/protocol-http": "^3.0.11", - "@smithy/service-error-classification": "^2.0.8", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", - "@smithy/util-middleware": "^2.0.8", - "@smithy/util-retry": "^2.0.8", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=14.0.0" + "node": ">=0.4.0" } }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@smithy/middleware-serde": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", - "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" }, - "node_modules/@smithy/middleware-stack": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", - "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", - "optional": true, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "debug": "4" }, "engines": { - "node": ">=14.0.0" + "node": ">= 6.0.0" } }, - "node_modules/@smithy/node-config-provider": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", - "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", - "optional": true, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "@smithy/property-provider": "^2.0.16", - "@smithy/shared-ini-file-loader": "^2.2.7", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@smithy/node-http-handler": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", - "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", - "optional": true, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { - "@smithy/abort-controller": "^2.0.15", - "@smithy/protocol-http": "^3.0.11", - "@smithy/querystring-builder": "^2.0.15", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=14.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@smithy/property-provider": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", - "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@smithy/protocol-http": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", - "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/@smithy/querystring-builder": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", - "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", - "optional": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "@smithy/types": "^2.7.0", - "@smithy/util-uri-escape": "^2.0.0", - "tslib": "^2.5.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@smithy/querystring-parser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", - "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", - "optional": true, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=14.0.0" + "node": ">= 8" } }, - "node_modules/@smithy/service-error-classification": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", - "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", - "optional": true, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "peer": true, "dependencies": { - "@smithy/types": "^2.7.0" - }, + "dequal": "^2.0.3" + } + }, + "node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "engines": { - "node": ">=14.0.0" + "node": ">=12.17" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", - "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", - "optional": true, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@smithy/signature-v4": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.18.tgz", - "integrity": "sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw==", - "optional": true, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.15", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.7.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.8", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@smithy/smithy-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz", - "integrity": "sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q==", - "optional": true, - "dependencies": { - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", - "@smithy/util-stream": "^2.0.23", - "tslib": "^2.5.0" - }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/@smithy/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", - "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", - "optional": true, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, "dependencies": { - "tslib": "^2.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@smithy/url-parser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", - "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", - "optional": true, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.15", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@smithy/util-base64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", - "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", - "optional": true, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@smithy/util-body-length-browser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", - "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", - "optional": true, + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, "dependencies": { - "tslib": "^2.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" } }, - "node_modules/@smithy/util-body-length-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", - "optional": true, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, "dependencies": { - "tslib": "^2.5.0" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", - "optional": true, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { - "@smithy/is-array-buffer": "^2.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "safer-buffer": "~2.1.0" } }, - "node_modules/@smithy/util-config-provider": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.1.0.tgz", - "integrity": "sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==", - "optional": true, - "dependencies": { - "tslib": "^2.5.0" - }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">=14.0.0" + "node": ">=0.8" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz", - "integrity": "sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w==", - "optional": true, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "peer": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/async-mutex": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", + "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", + "dev": true, "dependencies": { - "@smithy/property-provider": "^2.0.16", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 10.0.0" + "tslib": "^2.3.1" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.31.tgz", - "integrity": "sha512-ZwdjAJAFkkQQ4hdE8HOcxFAWC3GPFXQ3yQ8IBwHH5nQBlr9q+p5eRQ7Y8iRRORJe4vksR+NASRXZ+E81Us1aXQ==", - "optional": true, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, "dependencies": { - "@smithy/config-resolver": "^2.0.22", - "@smithy/credential-provider-imds": "^2.1.4", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/property-provider": "^2.0.16", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 10.0.0" + "has-symbols": "^1.0.3" } }, - "node_modules/@smithy/util-endpoints": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", - "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", - "optional": true, - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "dev": true, "engines": { - "node": ">= 14.0.0" + "node": ">=8.0.0" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", - "optional": true, - "dependencies": { - "tslib": "^2.5.0" + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { - "node": ">=14.0.0" + "node": "*" } }, - "node_modules/@smithy/util-middleware": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", - "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "dev": true, + "peer": true, "engines": { - "node": ">=14.0.0" + "node": ">=4" } }, - "node_modules/@smithy/util-retry": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", - "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", - "optional": true, + "node_modules/axios": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dependencies": { - "@smithy/service-error-classification": "^2.0.8", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 14.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@smithy/util-stream": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", - "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", - "optional": true, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/types": "^2.7.0", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=14.0.0" + "node": ">= 6" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", - "optional": true, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "peer": true, "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "dequal": "^2.0.3" } }, - "node_modules/@smithy/util-utf8": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", - "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", - "optional": true, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/@snyk/protect": { - "version": "1.1266.0", - "resolved": "https://registry.npmjs.org/@snyk/protect/-/protect-1.1266.0.tgz", - "integrity": "sha512-SDrW7b4x4NQG/0aylXTi6QqMopXB1Kogga6bNp31lmR00eitGssINEoEBJMyXz4uj0cKDu/PzpwdNHDP6/ntbA==", - "bin": { - "snyk-protect": "bin/snyk-protect" + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { - "defer-to-connect": "^2.0.1" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=14.16" + "node": ">=8" } }, - "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", - "dependencies": { - "@types/node": "*" + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==", - "dependencies": { - "@types/node": "*" + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, "dependencies": { - "@types/node": "*" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==" - }, - "node_modules/@types/luxon": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", - "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==" + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "safe-buffer": "^5.0.1" } }, - "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==" + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@types/p-queue": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz", - "integrity": "sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==" + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, - "node_modules/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "@types/node": "*" + "tweetnacl": "^0.14.3" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dependencies": { - "@types/node": "*" + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" } }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", - "dependencies": { - "@types/node": "*" + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" + "@noble/hashes": "^1.2.0" } }, - "node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { - "@types/node": "*" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abi-decoder": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-2.4.0.tgz", - "integrity": "sha512-TOLU2q1HgYOjs1GKGtVzaqrYkar6I2fT9a80rzx6/9EJ/5crb4nCGuro0grZayixem93T7omrajYmLiMkYDLDA==", + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "web3-eth-abi": "^1.2.1", - "web3-utils": "^1.2.1" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "event-target-shim": "^5.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=6.5" + "node": ">= 6" } }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "debug": "4" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 0.8" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "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" + "ee-first": "1.1.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "color-convert": "^2.0.1" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/body-parser/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { - "node": ">= 8" + "node": ">=0.6" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "peer": true, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "engines": { - "node": ">=12.17" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "fill-range": "^7.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, - "engines": { - "node": ">= 0.4" + "bin": { + "browserslist": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "base-x": "^3.0.2" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.20.1" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.14.2" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" + "semver": "^7.0.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { - "node": ">=0.8" + "node": ">= 0.8" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, + "node_modules/cache-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-2.0.0.tgz", + "integrity": "sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w==", + "dependencies": { + "array-back": "^4.0.1", + "fs-then-native": "^2.0.0", + "mkdirp2": "^1.0.4" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "peer": true - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "node_modules/cache-point/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "engines": { + "node": ">=10.6.0" + } }, - "node_modules/async-mutex": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", - "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", - "dev": true, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { - "tslib": "^2.3.1" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "has-symbols": "^1.0.3" + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "dev": true, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/available-typed-arrays": { + "node_modules/call-bind": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "peer": true, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/axios": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", - "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", + "node_modules/caniuse-lite": { + "version": "1.0.30001572", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", + "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "dequal": "^2.0.3" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "safe-buffer": "^5.0.1" + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/cids/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -2781,451 +5009,429 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "safe-buffer": "5.1.2" + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/clark": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/clark/-/clark-0.0.6.tgz", + "integrity": "sha512-aa1dRcyZ2pmUvfjLr5oXkAgZjxcBHS4+R/rv04uSpGdHWgIHpcFmJEQt7QcbFyv5WoBSqExu7rgNQtI7tSFPUg==", + "bin": { + "clark": "bin/clark.js" }, "engines": { - "node": ">= 0.8" + "node": ">=0.2.0" } }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/cline": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/cline/-/cline-0.8.2.tgz", + "integrity": "sha512-xcRdiR3vm9XdLmsMkK3XkKOHzOmKxl8eVTO739O6KinC0kRdCGV4jYnItccNMReymKYhQ9obOlMscic5spP3mQ==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { - "tweetnacl": "^0.14.3" + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, "engines": { - "node": "*" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/coffeescript": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz", + "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==", "dev": true, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/bip39": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "node_modules/collect-all": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz", + "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==", "dependencies": { - "@noble/hashes": "^1.2.0" + "stream-connect": "^1.0.2", + "stream-via": "^1.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/connect-multiparty": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/connect-multiparty/-/connect-multiparty-2.2.0.tgz", + "integrity": "sha512-zKcpA7cuXGEhuw9Pz7JmVCFmp85jzGLGm/iiagXTwyEAJp4ypLPtRS/V4IGuGb9KjjrgHBs6P/gDCpZHnFzksA==", + "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "http-errors": "~1.7.0", + "multiparty": "~4.2.1", + "on-finished": "~2.3.0", + "qs": "~6.5.2", + "type-is": "~1.6.16" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.10.0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } + "node_modules/connected-domain": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", + "integrity": "sha512-lHlohUiJxlpunvDag2Y0pO20bnvarMjnrdciZeuJUqRwrf/5JHNhdpiPIr5GQ8IkqrFj5TDMQwcCjblGo1oeuA==", + "dev": true }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/body-parser/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { - "node": ">=0.6" + "node": ">= 0.6" } }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "optional": true + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { - "fill-range": "^7.0.1" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } }, - "node_modules/browserify-aes": { + "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", + "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { - "bs58": "^4.0.0", + "cipher-base": "^1.0.3", "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/bson": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", - "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, "engines": { - "node": ">=14.20.1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/cron": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.6.tgz", + "integrity": "sha512-cvFiQCeVzsA+QPM6fhjBtlKGij7tLLISnTSvFxVdnFGLdz+ZdXN37kNe0i2gefmdD17XuZA6n2uPVwzl4FxW/w==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@types/luxon": "~3.3.0", + "luxon": "~3.4.0" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" } }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { - "node-gyp-build": "^4.3.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=6.14.2" + "node": ">= 8" } }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dependencies": { - "semver": "^7.0.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "peer": true }, - "node_modules/cache-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-2.0.0.tgz", - "integrity": "sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w==", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "array-back": "^4.0.1", - "fs-then-native": "^2.0.0", - "mkdirp2": "^1.0.4" + "assert-plus": "^1.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/cache-point/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "engines": { - "node": ">=10.6.0" + "node": ">=0.10" } }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">=8" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { - "pump": "^3.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=8" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/callsites": { + "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { "node": ">=10" }, @@ -3233,953 +5439,1105 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dependencies": { - "lodash": "^4.17.15" + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" }, - "engines": { - "node": ">= 10" + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dependencies": { - "get-func-name": "^2.0.2" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" - } - }, - "node_modules/cids/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "node": ">=0.4.0" } }, - "node_modules/clark": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/clark/-/clark-0.0.6.tgz", - "integrity": "sha512-aa1dRcyZ2pmUvfjLr5oXkAgZjxcBHS4+R/rv04uSpGdHWgIHpcFmJEQt7QcbFyv5WoBSqExu7rgNQtI7tSFPUg==", - "bin": { - "clark": "bin/clark.js" - }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">=0.2.0" + "node": ">= 0.8" } }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" - }, - "node_modules/cline": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/cline/-/cline-0.8.2.tgz", - "integrity": "sha512-xcRdiR3vm9XdLmsMkK3XkKOHzOmKxl8eVTO739O6KinC0kRdCGV4jYnItccNMReymKYhQ9obOlMscic5spP3mQ==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, + "peer": true, "engines": { - "node": ">=0.8.x" + "node": ">=6" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/coffeescript": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz", - "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/collect-all": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz", - "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { - "stream-connect": "^1.0.2", - "stream-via": "^1.0.4" + "path-type": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "esutils": "^2.0.2" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.616", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", + "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==", "dev": true }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/connect-multiparty": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/connect-multiparty/-/connect-multiparty-2.2.0.tgz", - "integrity": "sha512-zKcpA7cuXGEhuw9Pz7JmVCFmp85jzGLGm/iiagXTwyEAJp4ypLPtRS/V4IGuGb9KjjrgHBs6P/gDCpZHnFzksA==", + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "dependencies": { - "http-errors": "~1.7.0", - "multiparty": "~4.2.1", - "on-finished": "~2.3.0", - "qs": "~6.5.2", - "type-is": "~1.6.16" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/connected-domain": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", - "integrity": "sha512-lHlohUiJxlpunvDag2Y0pO20bnvarMjnrdciZeuJUqRwrf/5JHNhdpiPIr5GQ8IkqrFj5TDMQwcCjblGo1oeuA==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" + "once": "^1.4.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } }, - "node_modules/core-util-is": { + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" }, "engines": { - "node": ">=0.8" + "node": ">=0.10" } }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/cron": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.6.tgz", - "integrity": "sha512-cvFiQCeVzsA+QPM6fhjBtlKGij7tLLISnTSvFxVdnFGLdz+ZdXN37kNe0i2gefmdD17XuZA6n2uPVwzl4FxW/w==", - "dependencies": { - "@types/luxon": "~3.3.0", - "luxon": "~3.4.0" + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/cross-fetch": { + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, "dependencies": { - "node-fetch": "^2.6.12" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" }, "engines": { - "node": ">= 8" + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" } }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "engines": { - "node": ">=0.10" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "ms": "^2.1.1" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { - "ms": "2.1.2" + "debug": "^3.2.7" }, "engines": { - "node": ">=6.0" + "node": ">=4" }, "peerDependenciesMeta": { - "supports-color": { + "eslint": { "optional": true } } }, - "node_modules/debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "engines": { - "node": "*" + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "engines": { - "node": ">=0.10" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, "dependencies": { - "mimic-response": "^3.1.0" + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=10" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { - "type-detect": "^4.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "node_modules/eslint-plugin-jest": { + "version": "27.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", + "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "@typescript-eslint/utils": "^5.10.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, + "peer": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { - "node": ">= 0.4" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "peer": true }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, "engines": { - "node": ">= 0.8" + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, - "peer": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=4" } }, - "node_modules/doctrine": { + "node_modules/eslint-plugin-n/node_modules/eslint-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "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" + }, "engines": { - "node": ">= 0.8" + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "node_modules/eslint-plugin-prettier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz", + "integrity": "sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" }, "engines": { - "node": ">= 0.4" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=0.10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/eslint-watch": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-watch/-/eslint-watch-8.0.0.tgz", + "integrity": "sha512-piws/uE4gkZdz1pwkaEFx+kSWvoGnVX8IegFRrE1NUvlXjtU0rg7KhT1QDj/NzhAwbiLEfdRHWz5q738R4zDKA==", "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4.3.2", + "execa": "^5.1.1", + "keypress": "^0.2.1", + "lodash.debounce": "^4.0.8", + "lodash.isempty": "^4.4.0", + "lodash.isequal": "^4.5.0", + "lodash.kebabcase": "^4.1.1", + "lodash.unionwith": "^4.6.0", + "optionator": "^0.9.1" + }, + "bin": { + "esw": "bin/esw" + }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8 <9.0.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "is-glob": "^4.0.3" }, - "bin": { - "eslint": "bin/eslint.js" + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4188,903 +6546,882 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" }, "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" + "node": ">=0.10" } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" + "estraverse": "^5.2.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "node": ">=4.0" } }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=4.0" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" + "node": ">= 0.6" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", "dependencies": { - "ms": "^2.1.1" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, + "node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/eth-lib/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/eth-lib/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "dependencies": { - "ms": "^2.1.1" + "js-sha3": "^0.8.0" } }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=10.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/ethereumjs-wallet": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", + "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", "dependencies": { - "ms": "^2.1.1" + "aes-js": "^3.1.2", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^7.1.2", + "randombytes": "^2.1.0", + "scrypt-js": "^3.0.1", + "utf8": "^3.0.0", + "uuid": "^8.3.2" + } + }, + "node_modules/ethereumjs-wallet/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dependencies": { - "esutils": "^2.0.2" + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=6" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=0.8.x" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "peer": true + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } }, - "node_modules/eslint-plugin-mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz", - "integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "eslint-utils": "^3.0.0", - "rambda": "^7.4.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/execa/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "node": ">= 0.8.0" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">= 0.10.0" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/express-basic-auth": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz", + "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "basic-auth": "^2.0.1" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "ms": "2.0.0" } }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "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" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" + "node": ">= 0.8" } }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz", - "integrity": "sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==", - "dev": true, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "side-channel": "^1.0.4" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=0.6" }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, + "node_modules/express/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "node": ">=0.6" } }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "type": "^2.7.2" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "peer": true, - "engines": { - "node": ">=10" + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "engines": { + "node": ">=8.6.0" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "optional": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "strnum": "^1.0.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { - "semver": "bin/semver.js" + "fxparser": "src/cli/cli.js" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "reusify": "^1.0.4" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "bser": "2.1.1" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, "engines": { - "node": ">=10" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eslint-watch": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/eslint-watch/-/eslint-watch-8.0.0.tgz", - "integrity": "sha512-piws/uE4gkZdz1pwkaEFx+kSWvoGnVX8IegFRrE1NUvlXjtU0rg7KhT1QDj/NzhAwbiLEfdRHWz5q738R4zDKA==", - "dev": true, + "node_modules/file-set": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/file-set/-/file-set-4.0.2.tgz", + "integrity": "sha512-fuxEgzk4L8waGXaAkd8cMr73Pm0FxOVkn8hztzUW7BAHhOGH90viQNXbiOsnecCWmfInqU6YmAMwxRMdKETceQ==", "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4.3.2", - "execa": "^5.1.1", - "keypress": "^0.2.1", - "lodash.debounce": "^4.0.8", - "lodash.isempty": "^4.4.0", - "lodash.isequal": "^4.5.0", - "lodash.kebabcase": "^4.1.1", - "lodash.unionwith": "^4.6.0", - "optionator": "^0.9.1" - }, - "bin": { - "esw": "bin/esw" + "array-back": "^5.0.0", + "glob": "^7.1.6" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=8 <9.0.0" + "node": ">=10" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, + "node_modules/file-set/node_modules/array-back": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-5.0.0.tgz", + "integrity": "sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=10" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { - "estraverse": "^5.1.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=0.10" + "node": ">= 0.8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/finity": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/finity/-/finity-0.5.4.tgz", + "integrity": "sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA==" + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.6" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" + "is-callable": "^1.1.3" } }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } }, - "node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, - "node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "node_modules/form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" }, - "node_modules/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/eth-lib/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dependencies": { - "js-sha3": "^0.8.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "minipass": "^2.6.0" } }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, + "node_modules/fs-then-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz", + "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==", "engines": { - "node": ">=10.0.0" + "node": ">=4.0.0" } }, - "node_modules/ethereumjs-wallet": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", - "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", - "dependencies": { - "aes-js": "^3.1.2", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.1.2", - "randombytes": "^2.1.0", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^8.3.2" + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/ethereumjs-wallet/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { - "node": ">=0.8.x" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8.0.0" } }, - "node_modules/execa/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, "engines": { "node": ">=8" @@ -5093,674 +7430,644 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { - "node": ">= 0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express-basic-auth": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz", - "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "basic-auth": "^2.0.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { - "ms": "2.0.0" + "assert-plus": "^1.0.0" } }, - "node_modules/express/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { - "ee-first": "1.1.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 6" } }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dependencies": { - "side-channel": "^1.0.4" + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" }, "engines": { - "node": ">=0.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, "dependencies": { - "type": "^2.7.2" + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-redact": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", - "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "optional": true, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { - "strnum": "^1.0.5" + "get-intrinsic": "^1.1.3" }, - "bin": { - "fxparser": "src/cli/cli.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, + "node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", "dependencies": { - "reusify": "^1.0.4" + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" + "node_modules/got/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=4" } }, - "node_modules/file-set": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/file-set/-/file-set-4.0.2.tgz", - "integrity": "sha512-fuxEgzk4L8waGXaAkd8cMr73Pm0FxOVkn8hztzUW7BAHhOGH90viQNXbiOsnecCWmfInqU6YmAMwxRMdKETceQ==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { - "array-back": "^5.0.0", - "glob": "^7.1.6" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/file-set/node_modules/array-back": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-5.0.0.tgz", - "integrity": "sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw==", + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, "engines": { - "node": ">=10" + "node": ">= 0.4.0" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "ms": "2.0.0" + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finity": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/finity/-/finity-0.5.4.tgz", - "integrity": "sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA==" - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 6" } }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">= 0.4" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dependencies": { - "is-callable": "^1.1.3" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" }, "engines": { - "node": ">= 0.12" + "node": ">= 0.6" } }, - "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/http-errors/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/fs-constants": { + "node_modules/http-https": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" }, - "node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fs-then-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz", - "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==", + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, "engines": { - "node": ">=4.0.0" + "node": ">=10.19.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/hubot": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hubot/-/hubot-6.0.0.tgz", + "integrity": "sha512-Tk7/AoLEmtDU/zyGNpEH5oCrkJDZSpEDQ6AByPS974aLkufyGTjtrrBOhoavQgJZm7s43Z9Rh0Nbkof2M+FETQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "async": "^3.2.4", + "cline": "^0.8.2", + "coffeescript": "^2.7.0", + "connect-multiparty": "^2.2.0", + "express": "^4.18.2", + "express-basic-auth": "^1.2.1", + "optparse": "^1.0.5", + "pino": "^8.11.0", + "standard": "^17.1.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "hubot": "bin/hubot" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "> 4.0.0", + "npm": "> 2.0.0" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/hubot-conversation": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hubot-conversation/-/hubot-conversation-1.1.1.tgz", + "integrity": "sha512-4kiiWAA8uErgkyvPbj8Cs/XNpvlHf8mB+viutyHVu928wW0W5JkhIOiA4ZxvQnfNf89IkMyskesNl4+w5NZG4g==", + "dependencies": { + "debuglog": "^1.0.1" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/hubot-test-helper": { + "resolved": "git+ssh://git@github.com/vpeltola/hubot-test-helper.git#d7a6e13c6680349a933a74d7f56364df6c376f32", "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" + "license": "MIT", + "dependencies": { + "hubot": ">=5.0.0 <7.0.0 || 0.0.0-development" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": "*" + "node": ">=10.17.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dependencies": { + "punycode": "2.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4.0.0" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, + "node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "wrappy": "1" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" } }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5769,125 +8076,74 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/har-schema": { + "node_modules/is-async-function": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has": { + "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "binary-extensions": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -5895,10 +8151,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -5906,354 +8162,252 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node": ">= 0.4" }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/http-errors/node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, - "node_modules/http-errors/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=10.19.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/hubot": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hubot/-/hubot-6.0.0.tgz", - "integrity": "sha512-Tk7/AoLEmtDU/zyGNpEH5oCrkJDZSpEDQ6AByPS974aLkufyGTjtrrBOhoavQgJZm7s43Z9Rh0Nbkof2M+FETQ==", - "dev": true, - "dependencies": { - "async": "^3.2.4", - "cline": "^0.8.2", - "coffeescript": "^2.7.0", - "connect-multiparty": "^2.2.0", - "express": "^4.18.2", - "express-basic-auth": "^1.2.1", - "optparse": "^1.0.5", - "pino": "^8.11.0", - "standard": "^17.1.0" - }, - "bin": { - "hubot": "bin/hubot" - }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", "engines": { - "node": "> 4.0.0", - "npm": "> 2.0.0" - } - }, - "node_modules/hubot-conversation": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hubot-conversation/-/hubot-conversation-1.1.1.tgz", - "integrity": "sha512-4kiiWAA8uErgkyvPbj8Cs/XNpvlHf8mB+viutyHVu928wW0W5JkhIOiA4ZxvQnfNf89IkMyskesNl4+w5NZG4g==", - "dependencies": { - "debuglog": "^1.0.1" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/hubot-test-helper": { - "resolved": "git+ssh://git@github.com/vpeltola/hubot-test-helper.git#d7a6e13c6680349a933a74d7f56364df6c376f32", + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, - "license": "MIT", - "dependencies": { - "hubot": ">=5.0.0 <7.0.0 || 0.0.0-development" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "node": ">= 0.4" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dependencies": { - "punycode": "2.1.0" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=0.12.0" } }, - "node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "dev": true, - "engines": { - "node": ">=0.8.19" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -6262,420 +8416,765 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, - "node_modules/is-async-function": { + "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/is-boolean-object": { + "node_modules/iterator.prototype": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=12" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "node_modules/jest-config/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": ">=0.12.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" + "engines": { + "node": ">=6" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-sha3": { @@ -6769,6 +9268,18 @@ "node": ">=8" } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -6780,6 +9291,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -6850,12 +9367,6 @@ "node": ">=4.0" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, "node_modules/keccak": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", @@ -6905,6 +9416,15 @@ "graceful-fs": "^4.1.9" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -6925,6 +9445,15 @@ "node": ">=0.10" } }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6938,6 +9467,12 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", @@ -6997,12 +9532,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, "node_modules/lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -7033,22 +9562,6 @@ "integrity": "sha512-Hk8otPCkVM4UxRoft3E5dAREwExyXci6iVPCibHIEiG7neb9KAdWHYS75MYpVTvxDrnpp7WCJNZ84vAk7j7tVA==", "dev": true }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7061,15 +9574,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -7125,6 +9629,15 @@ "semver": "bin/semver.js" } }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/markdown-it": { "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", @@ -7212,6 +9725,15 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -7225,6 +9747,19 @@ "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -7359,129 +9894,6 @@ "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.5.tgz", "integrity": "sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==" }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/mock-env": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/mock-env/-/mock-env-0.2.0.tgz", @@ -7856,20 +10268,8 @@ }, "node_modules/nano-json-stream-parser": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -7902,43 +10302,6 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "node_modules/nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -7992,6 +10355,18 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -8410,13 +10785,13 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, "node_modules/pbkdf2": { @@ -8445,6 +10820,12 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -8504,6 +10885,15 @@ "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==", "dev": true }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-conf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", @@ -8723,6 +11113,38 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -8737,6 +11159,19 @@ "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", "dev": true }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -8796,6 +11231,22 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -8854,12 +11305,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rambda": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", - "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", - "dev": true - }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -9111,6 +11556,27 @@ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -9120,6 +11586,15 @@ "node": ">=4" } }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -9389,15 +11864,6 @@ "node": ">=0.6" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -9557,42 +12023,19 @@ "node": ">=4" } }, - "node_modules/sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", - "deprecated": "16.1.1", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.4", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, - "node_modules/sinon/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=8" } }, "node_modules/smart-buffer": { @@ -9626,6 +12069,25 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -9644,6 +12106,12 @@ "node": ">= 10.x" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/sshpk": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", @@ -9668,6 +12136,27 @@ "node": ">=0.10.0" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/standard": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.0.tgz", @@ -9812,6 +12301,19 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -10179,6 +12681,20 @@ "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz", "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==" }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -10202,6 +12718,21 @@ "node": ">=0.10.0" } }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10276,6 +12807,27 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "devOptional": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -10415,6 +12967,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/typical": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", @@ -10483,6 +13049,36 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -10550,6 +13146,20 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/varint": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", @@ -10593,6 +13203,15 @@ "node": ">=12.17" } }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/web3": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.3.tgz", @@ -11116,12 +13735,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -11144,6 +13757,19 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/ws": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", @@ -11230,48 +13856,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index c70a571..adf17d4 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ } }, "scripts": { - "test": "HUBOT_LOG_LEVEL=error mocha", + "test": "jest", "test:watch": "npm run test -- --watch", "lint": "eslint .", "lint:watch": "esw . -w", @@ -50,6 +50,7 @@ }, "dependencies": { "@slack/client": "^5.0.2", + "@slack/web-api": "^6.11.0", "@snyk/protect": "^1.1127.0", "axios": "^1.4.0", "clark": "^0.0.6", @@ -62,25 +63,21 @@ "token-buddy": "^1.0.0" }, "devDependencies": { - "bluebird": "^3.7.2", - "chai": "^4.3.7", - "eslint-config-airbnb-base": "^15.0.0", + "eslint": "^8.56.0", "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-mocha": "^10.1.0", + "eslint-plugin-jest": "^27.6.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-promise": "^6.1.1", "eslint-watch": "^8.0.0", - "eslint": "^8.56.0", "hubot-test-helper": "github:vpeltola/hubot-test-helper#fixes-for-hubot-5.x", - "mocha": "^10.2.0", + "jest": "^29.7.0", "mock-env": "^0.2.0", - "mongo-unit": "^3.3.0", - "sinon-chai": "^3.7.0", - "sinon": "^15.2.0" + "mongo-unit": "^3.3.0" }, "contributors": [], "snyk": true diff --git a/src/lib/Helpers.js b/src/lib/Helpers.js index dcd06bd..1cacb51 100644 --- a/src/lib/Helpers.js +++ b/src/lib/Helpers.js @@ -168,7 +168,7 @@ class Helpers { premessage && !conjunction && reason && - operator.match(rpp.negativeOperators); + new RegExp(rpp.negativeOperators).test(operator); return falsePositive; } diff --git a/src/lib/Helpers.test.js b/src/lib/Helpers.test.js index c487321..617d69c 100644 --- a/src/lib/Helpers.test.js +++ b/src/lib/Helpers.test.js @@ -1,6 +1,6 @@ /* eslint-disable new-cap */ /* eslint-disable mocha/no-setup-in-describe */ -const Helpers = require('./Helpers'); +const { H } = require('./helpers'); describe('Helpers', () => { describe('cleanName', () => { @@ -8,42 +8,42 @@ describe('Helpers', () => { const fullName = '@matt'; const cleaned = 'matt'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "hello @derp" of the @ sign and be "hello @derp" if @ is not the first char', () => { const fullName = 'hello @derp'; const cleaned = 'hello @derp'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "what" of the @ sign and be "what" if @ is not present', () => { const fullName = 'what'; const cleaned = 'what'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean an empty string "" and return an empty string', () => { const fullName = ''; const cleaned = ''; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "name.hyphe-nated" of the @ sign and be "name.hyphe-nated" if @ is not present', () => { const fullName = 'name.hyphe-nated'; const cleaned = 'name.hyphe-nated'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "dot.name" of the @ sign and be "dot.name" if @ is not present', () => { const fullName = 'dot.name'; const cleaned = 'dot.name'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); }); @@ -52,42 +52,42 @@ describe('Helpers', () => { const fullName = '@matt'; const cleaned = 'matt'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "hello @derp" of the @ sign and be "hello @derp" if @ is not the first char', () => { const fullName = 'hello @derp'; const cleaned = 'hello @derp'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "what" of the @ sign and be "what" if @ is not present', () => { const fullName = 'what'; const cleaned = 'what'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean an empty string "" and return an empty string', () => { const fullName = ''; const cleaned = ''; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "name.hyphe-nated" of the @ sign and be "name.hyphe-nated" if @ is not present', () => { const fullName = 'name.hyphe-nated'; const cleaned = 'name.hyphe-nated'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); it('should clean "dot.name" of the @ sign and be "dot.name" if @ is not present', () => { const fullName = 'dot.name'; const cleaned = 'dot.name'; - expect(Helpers.cleanName(fullName)).toBe(cleaned); + expect(H.cleanName(fullName)).toBe(cleaned); }); }); @@ -96,14 +96,14 @@ describe('Helpers', () => { const encoded = Buffer.from('you are the best!').toString('base64'); const cleaned = 'you are the best!'; - expect(Helpers.decode(encoded)).toBe(cleaned); + expect(H.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "this.should.work" to "this.should.work"', () => { const encoded = Buffer.from('this.should.work').toString('base64'); const cleaned = 'this.should.work'; - expect(Helpers.decode(encoded)).toBe(cleaned); + expect(H.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "why are you so good?!" to "why are you so good?!"', () => { @@ -112,35 +112,35 @@ describe('Helpers', () => { ); const cleaned = 'why are you so good?!'; - expect(Helpers.decode(encoded)).toBe(cleaned); + expect(H.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "hello" to "hello"', () => { const encoded = Buffer.from('hello').toString('base64'); const cleaned = 'hello'; - expect(Helpers.decode(encoded)).toBe(cleaned); + expect(H.decode(encoded)).toBe(cleaned); }); it('should decode the reason from base64 encoded "“hello“" to "“hello“"', () => { const encoded = Buffer.from('“hello“').toString('base64'); const cleaned = '“hello“'; - expect(Helpers.decode(encoded)).toBe(cleaned); + expect(H.decode(encoded)).toBe(cleaned); }); it('should decode undefined input to undefined output', () => { const encoded = undefined; const cleaned = undefined; - expect(Helpers.decode(encoded)).toBe(cleaned); + expect(H.decode(encoded)).toBe(cleaned); }); it('should decode undefined input to undefined output', () => { const encoded = undefined; const cleaned = undefined; - expect(Helpers.decode(encoded)).toBe(cleaned); + expect(H.decode(encoded)).toBe(cleaned); }); }); }); diff --git a/src/lib/MessageFactory.js b/src/lib/MessageFactory.js index 3bda00d..646f37b 100644 --- a/src/lib/MessageFactory.js +++ b/src/lib/MessageFactory.js @@ -12,7 +12,8 @@ class MessageFactory { * @memberof MessageFactory * @static */ - static BuildScoreLookup(robotName, user) { + static BuildScoreLookup(robot, user) { + const robotName = robot.name; const pVars = H.getProcessVariables(process.env); if (_.isEmpty(user) || _.isEmpty(pVars)) return ''; let tokenString = '.'; @@ -140,7 +141,7 @@ class MessageFactory { } let normalMessage = `${scoreStr}${reasonStr}${cakeDayStr}`; if (H.isA1Day()) { - normalMessage = this.GetA1DayMessage(normalMessage); + normalMessage = this.GetA1DayMessage(robot, normalMessage); } return normalMessage; @@ -148,6 +149,7 @@ class MessageFactory { /** * Builds a message for the user's score + * @param {object} robot - The robot object * @param {object} user - The user object * @param {string} reason - The reason for the score * @returns {string} - The message @@ -155,7 +157,7 @@ class MessageFactory { * @static */ static GetA1DayMessage( - robotName, + robot, originalMessage, randomIndex = Math.floor(Math.random() * 7), force = false, @@ -170,7 +172,7 @@ class MessageFactory { (letter) => alpha[alpha.indexOf(letter) + 13], ); }, - () => `I'm ${robotName}. Not a mind reader!`, + () => `I'm ${robot.name}. Not a mind reader!`, () => "That's classified information, I'm afraid I cannot disclose that.", (message) => { let newMessage = message; diff --git a/src/lib/MessageFactory.test.js b/src/lib/MessageFactory.test.js index f72de3e..7c27628 100644 --- a/src/lib/MessageFactory.test.js +++ b/src/lib/MessageFactory.test.js @@ -1,35 +1,27 @@ -const sinon = require('sinon'); +const { subYears, addDays, format, parseISO } = require('date-fns'); -const { subYears, addDays } = require('date-fns'); - -const { helpers } = require('./helpers'); -const MessageFactory = require('./messageFactory'); +const { H } = require('./helpers'); +const { mfs } = require('./messageFactory'); const { nonSequiturs } = require('./static/a1'); describe('MessageFactory', () => { - const mockRobot = { name: 'Robit' }; const mockProcVars = { reasonsKeyword: 'reasons' }; let notBotDay; let botDay; - let instance; + let capRobotName; beforeEach(() => { - instance = new MessageFactory(mockRobot); - const mockHelpers = sinon.stub(helpers, 'decode'); - mockHelpers.returnsArg(0); notBotDay = addDays(subYears(new Date(), 1), 5); botDay = subYears(new Date(), 1); - }); - - afterEach(() => { - helpers.decode.restore(); + capRobotName = H.capitalizeFirstLetter(mockRobot.name); }); // This method expects base64 encoded reasons but we are stubbing out the decode method describe('BuildNewScoreMessage', () => { it("should handle undefined user, undefined reason, and print ''", () => { const user = undefined; - const emptyReasons = helpers.cleanAndEncode(undefined); - const msg = MessageFactory.BuildNewScoreMessage( + const emptyReasons = H.cleanAndEncode(undefined); + const msg = mfs.BuildNewScoreMessage( + mockRobot, user, emptyReasons, mockRobot, @@ -44,8 +36,9 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = helpers.cleanAndEncode(undefined); - const msg = MessageFactory.BuildNewScoreMessage( + const emptyReasons = H.cleanAndEncode(undefined); + const msg = mfs.BuildNewScoreMessage( + mockRobot, user, emptyReasons, mockRobot, @@ -60,8 +53,9 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = helpers.cleanAndEncode(undefined); - const msg = MessageFactory.BuildNewScoreMessage( + const emptyReasons = H.cleanAndEncode(undefined); + const msg = mfs.BuildNewScoreMessage( + mockRobot, user, emptyReasons, mockRobot, @@ -76,8 +70,9 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = helpers.cleanAndEncode(undefined); - const msg = MessageFactory.BuildNewScoreMessage( + const emptyReasons = H.cleanAndEncode(undefined); + const msg = mfs.BuildNewScoreMessage( + mockRobot, user, emptyReasons, mockRobot, @@ -92,8 +87,9 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = helpers.cleanAndEncode(undefined); - const msg = MessageFactory.BuildNewScoreMessage( + const emptyReasons = H.cleanAndEncode(undefined); + const msg = mfs.BuildNewScoreMessage( + mockRobot, user, emptyReasons, mockRobot, @@ -108,8 +104,9 @@ describe('MessageFactory', () => { reasons: {}, hubotDay: notBotDay, }; - const emptyReasons = helpers.cleanAndEncode(undefined); - const msg = MessageFactory.BuildNewScoreMessage( + const emptyReasons = H.cleanAndEncode(undefined); + const msg = mfs.BuildNewScoreMessage( + mockRobot, user, emptyReasons, mockRobot, @@ -118,16 +115,18 @@ describe('MessageFactory', () => { }); it('should take the user object and reason "winning" and print the expected message', () => { + const reason = H.cleanAndEncode('winning'); + const decoded = 'winning'; const user = { name: 'matt', score: 45, - reasons: { winning: 1 }, + reasons: { [reason]: 1 }, hubotDay: notBotDay, }; - const reason = 'winning'; - const expectedMessage = 'matt has 45 points, 1 of which is for winning.'; + const expectedMessage = `matt has 45 points, 1 of which is for ${decoded}.`; - const message = MessageFactory.BuildNewScoreMessage( + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -136,16 +135,18 @@ describe('MessageFactory', () => { }); it('should take the user object and reason "cool runnings!" and print the expected message', () => { + const reason = H.cleanAndEncode('cool runnings!'); + const decoded = 'cool runnings!'; const user = { name: 'matt', score: 1, - reasons: { 'cool runnings!': 1 }, + reasons: { [reason]: 1 }, hubotDay: notBotDay, }; - const reason = 'cool runnings!'; const expectedMessage = 'matt has 1 point for cool runnings!'; - const message = MessageFactory.BuildNewScoreMessage( + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -154,17 +155,19 @@ describe('MessageFactory', () => { }); it('should take the user object and reason "cool runnings!" and print the expected message for botDay', () => { + const reason = H.cleanAndEncode('cool runnings!'); + const decoded = 'cool runnings!'; const user = { name: 'matt', score: 1, - reasons: { 'cool runnings!': 1 }, + reasons: { [reason]: 1 }, hubotDay: botDay, }; - const reason = 'cool runnings!'; - const expectedMessage = - "matt has 1 point for cool runnings!\n:birthday: Today is matt's 1st hubotday! :birthday:"; - const message = MessageFactory.BuildNewScoreMessage( + const expectedMessage = `matt has 1 point for ${decoded}\n:birthday: Today is matt's 1st ${mockRobot.name}day! :birthday:`; + + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -173,17 +176,19 @@ describe('MessageFactory', () => { }); it('should take the user object and reason "cool runnings!" and print the expected message when no points for the reason', () => { + const reason = H.cleanAndEncode('cool runnings!'); + const decoded = 'cool runnings!'; const user = { name: 'matt', score: 99, - reasons: { 'cool runnings!': 0 }, + reasons: { [reason]: 0 }, hubotDay: notBotDay, }; - const reason = 'cool runnings!'; - const expectedMessage = - 'matt has 99 points, none of which are for cool runnings!'; - const message = MessageFactory.BuildNewScoreMessage( + const expectedMessage = `matt has 99 points, none of which are for ${decoded}`; + + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -192,17 +197,19 @@ describe('MessageFactory', () => { }); it('should take the user object and reason "cool runnings!" and print the expected message when 99 points for the reason', () => { + const reason = H.cleanAndEncode('cool runnings!'); + const decoded = 'cool runnings!'; const user = { name: 'matt', score: 1, - reasons: { 'cool runnings!': 99 }, + reasons: { [reason]: 99 }, hubotDay: notBotDay, }; - const reason = 'cool runnings!'; - const expectedMessage = - 'matt has 1 point, 99 of which are for cool runnings!'; - const message = MessageFactory.BuildNewScoreMessage( + const expectedMessage = `matt has 1 point, 99 of which are for ${decoded}`; + + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -211,17 +218,19 @@ describe('MessageFactory', () => { }); it('should take the user object and reason "cool runnings!" and print the expected message when 99 points for the reason and 145 total points', () => { + const reason = H.cleanAndEncode('cool runnings!'); + const decoded = 'cool runnings!'; const user = { name: 'matt', score: 145, - reasons: { 'cool runnings!': 99 }, + reasons: { [reason]: 99 }, hubotDay: notBotDay, }; - const reason = 'cool runnings!'; - const expectedMessage = - 'matt has 145 points, 99 of which are for cool runnings!'; - const message = MessageFactory.BuildNewScoreMessage( + const expectedMessage = `matt has 145 points, 99 of which are for ${decoded}`; + + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -230,17 +239,20 @@ describe('MessageFactory', () => { }); it('should take the user object and reason "cool runnings!" and print the expected message when 99 points for the reason and 200 total points', () => { + const reason = H.cleanAndEncode('cool runnings!'); + const decoded = 'cool runnings!'; + const user = { name: 'matt', score: 200, - reasons: { 'cool runnings!': 99 }, + reasons: { [reason]: 99 }, hubotDay: notBotDay, }; - const reason = 'cool runnings!'; - const expectedMessage = - ':200: matt has 200 points :200:, 99 of which are for cool runnings!'; - const message = MessageFactory.BuildNewScoreMessage( + const expectedMessage = `:200: matt has 200 points :200:, 99 of which are for ${decoded}`; + + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -258,7 +270,8 @@ describe('MessageFactory', () => { const reason = undefined; const expectedMessage = ':zero: matt has 0 points :zero:'; - const message = MessageFactory.BuildNewScoreMessage( + const message = mfs.BuildNewScoreMessage( + mockRobot, user, reason, 'hubot', @@ -267,22 +280,24 @@ describe('MessageFactory', () => { }); it('should take the user object with multiple reasons and print the expected message for each reason', () => { + const reason1 = H.cleanAndEncode('cool runnings!'); + const reason2 = H.cleanAndEncode('winning'); + const decoded1 = 'cool runnings!'; + const decoded2 = 'winning'; const user = { name: 'matt', score: 50, reasons: { - 'cool runnings!': 10, - winning: 2, + [reason1]: 10, + [reason2]: 2, }, hubotDay: notBotDay, }; - const reason1 = 'cool runnings!'; - const reason2 = 'winning'; - const expectedMessage1 = - 'matt has 50 points, 10 of which are for cool runnings!'; - const expectedMessage2 = - 'matt has 50 points, 2 of which are for winning.'; - const message1 = MessageFactory.BuildNewScoreMessage( + + const expectedMessage1 = `matt has 50 points, 10 of which are for ${decoded1}`; + const expectedMessage2 = `matt has 50 points, 2 of which are for ${decoded2}.`; + const message1 = mfs.BuildNewScoreMessage( + mockRobot, user, reason1, 'hubot', @@ -290,7 +305,8 @@ describe('MessageFactory', () => { expect(message1).toBe(expectedMessage1); - const message2 = MessageFactory.BuildNewScoreMessage( + const message2 = mfs.BuildNewScoreMessage( + mockRobot, user, reason2, 'hubot', @@ -301,144 +317,179 @@ describe('MessageFactory', () => { describe('BuildScoreLookup', () => { it('should respond with empty if any vars are undefined or empty', () => { - let dummyMsg = MessageFactory.BuildScoreLookup( + let dummyMsg = mfs.BuildScoreLookup( + mockRobot, undefined, undefined, undefined, ); expect(dummyMsg).toBe(''); - dummyMsg = MessageFactory.BuildScoreLookup({}, undefined, undefined); + dummyMsg = mfs.BuildScoreLookup(mockRobot, {}, undefined, undefined); expect(dummyMsg).toBe(''); - dummyMsg = MessageFactory.BuildScoreLookup(undefined, {}, undefined); + dummyMsg = mfs.BuildScoreLookup(mockRobot, undefined, {}, undefined); expect(dummyMsg).toBe(''); - dummyMsg = MessageFactory.BuildScoreLookup(undefined, undefined, {}); + dummyMsg = mfs.BuildScoreLookup(mockRobot, undefined, undefined, {}); expect(dummyMsg).toBe(''); - dummyMsg = MessageFactory.BuildScoreLookup({}, undefined, {}); + dummyMsg = mfs.BuildScoreLookup(mockRobot, {}, undefined, {}); expect(dummyMsg).toBe(''); - dummyMsg = MessageFactory.BuildScoreLookup({}, {}, undefined); + dummyMsg = mfs.BuildScoreLookup(mockRobot, {}, {}, undefined); expect(dummyMsg).toBe(''); - dummyMsg = MessageFactory.BuildScoreLookup(undefined, {}, {}); + dummyMsg = mfs.BuildScoreLookup(mockRobot, undefined, {}, {}); expect(dummyMsg).toBe(''); - dummyMsg = MessageFactory.BuildScoreLookup({}, {}, {}); + dummyMsg = mfs.BuildScoreLookup(mockRobot, {}, {}, {}); expect(dummyMsg).toBe(''); }); it('should respond with 5 reasons if the user has 5 or more', async () => { // eslint-disable-next-line global-require const baseUser = require('../../test/mockData/mockFullUser.json'); - const scoreMs = MessageFactory.BuildScoreLookup( + const scoreMs = mfs.BuildScoreLookup( + mockRobot, baseUser, mockRobot, mockProcVars, ); - expect(scoreMs).toMatch(new RegExp( - `^<@${baseUser.name}> has ${baseUser.score} points.` + - `\nAccount Level: ${baseUser.accountLevel}` + - `\nTotal Points Given: ${baseUser.totalPointsGiven}` + - '\n\n:star: Here are some reasons :star:' + - '(\n.*:.*){5}$', - )); + const splitString = scoreMs.split('\n'); + const botDay = format( + parseISO(baseUser[`${mockRobot.name}Day`]), + 'MMM. do yyyy', + ); + expect(splitString).toEqual([ + `<@${baseUser.name}> has ${baseUser.score} points.`, + `Account Level: ${baseUser.accountLevel}`, + `Total Points Given: ${baseUser.totalPointsGiven}`, + `:birthday: ${capRobotName}day is ${botDay}`, + '', + ':star: Here are some reasons :star:', + expect.any(String), + expect.any(String), + expect.any(String), + expect.any(String), + expect.any(String), + ]); }); it('should respond with score and no reasons if the user has no reasons', async () => { // eslint-disable-next-line global-require const baseUser = require('../../test/mockData/mockMultiUser1.json'); - const scoreMs = MessageFactory.BuildScoreLookup( + const scoreMs = mfs.BuildScoreLookup( + mockRobot, baseUser, mockRobot, mockProcVars, ); - expect(scoreMs).toBe(`<@${baseUser.name}> has ${baseUser.score} points.` + - `\nAccount Level: ${baseUser.accountLevel}` + - `\nTotal Points Given: ${baseUser.totalPointsGiven}`); + expect(scoreMs).toBe( + `<@${baseUser.name}> has ${baseUser.score} points.` + + `\nAccount Level: ${baseUser.accountLevel}` + + `\nTotal Points Given: ${baseUser.totalPointsGiven}`, + ); }); it('should respond with 3 reasons if the user has 3', async () => { // eslint-disable-next-line global-require const baseUser = require('../../test/mockData/mockMinimalUser.json'); - const scoreMs = MessageFactory.BuildScoreLookup( + const scoreMs = mfs.BuildScoreLookup( + mockRobot, baseUser, mockRobot, mockProcVars, ); - expect(scoreMs).toMatch(new RegExp( - `^<@${baseUser.name}> has ${baseUser.score} points.` + - `\nAccount Level: ${baseUser.accountLevel}` + - `\nTotal Points Given: ${baseUser.totalPointsGiven}` + - '\n\n:star: Here are some reasons :star:' + - '(\n.*:.*){3}$', - )); + const splitLines = scoreMs.split('\n'); + const botDay = format( + parseISO(baseUser[`${mockRobot.name}Day`]), + 'MMM. do yyyy', + ); + expect(splitLines).toEqual([ + `<@${baseUser.name}> has ${baseUser.score} points.`, + `Account Level: ${baseUser.accountLevel}`, + `Total Points Given: ${baseUser.totalPointsGiven}`, + `:birthday: ${capRobotName}day is ${botDay}`, + '', + ':star: Here are some reasons :star:', + expect.any(String), + expect.any(String), + expect.any(String), + ]); }); it('should respond with 3 reasons if the user has 3 and token count', async () => { - // eslint-disable-next-line global-require const baseUser = require('../../test/mockData/mockMinimalUserLevel2.json'); - const scoreMs = MessageFactory.BuildScoreLookup( + const scoreMs = mfs.BuildScoreLookup( + mockRobot, baseUser, mockRobot, mockProcVars, ); - expect(scoreMs).toMatch( - /<@peter\.parker\.min> has 8 points \(\*8 Robit Tokens\*\)\.\nAccount Level: 2\nTotal Points Given: -2\n\n:star: Here are some reasons :star:(\n.*:.*){3}/ + const splitLines = scoreMs.split('\n'); + const botDay = format( + parseISO(baseUser[`${mockRobot.name}Day`]), + 'MMM. do yyyy', ); + expect(splitLines).toEqual([ + `<@${baseUser.name}> has ${baseUser.score} points (*8 Hubot Tokens*).`, + `Account Level: ${baseUser.accountLevel}`, + `Total Points Given: ${baseUser.totalPointsGiven}`, + `:birthday: ${capRobotName}day is ${botDay}`, + '', + ':star: Here are some reasons :star:', + expect.any(String), + expect.any(String), + expect.any(String), + ]); }); }); describe('GetA1DayMessage', () => { const BASE_MSG = 'Hello World I Am Turtle'; - const ROBOT_NAME = 'Robit'; it('returns a string', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG); expect(typeof typeof message).toBe('string'); }); it('returns a modified message', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, -1); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, -1); expect(message).toBe(BASE_MSG); }); it('returns a message with vowels removed', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 0); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 0); const expectedMessage = 'Hll Wrld m Trtl'; expect(message).toBe(expectedMessage); }); it('returns a message with letters rotated 13 positions', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 1); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 1); const expectedMessage = 'Uryyb Jbeyq V Nz Ghegyr'; expect(message).toBe(expectedMessage); }); it('returns static string about itself', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 2); - expect(message).toBe(`I'm ${ROBOT_NAME}. Not a mind reader!`); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 2); + expect(message).toBe(`I'm ${mockRobot.name}. Not a mind reader!`); }); it('returns static string about classified info', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 3); - expect(message).toBe("That's classified information, I'm afraid I cannot disclose that."); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 3); + expect(message).toBe( + "That's classified information, I'm afraid I cannot disclose that.", + ); }); it('returns a message with random casing', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 4); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 4); expect(message).not.toBe(BASE_MSG); expect(message.toLowerCase()).toBe(BASE_MSG.toLowerCase()); }); it('returns a message with a random non sequitur added', () => { - const message = MessageFactory.GetA1DayMessage( - BASE_MSG, - ROBOT_NAME, - 5, - true, - ); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 5, true); const expectedNonSequitur = nonSequiturs.some((nonSequitur) => message.includes(nonSequitur), ); @@ -446,22 +497,17 @@ describe('MessageFactory', () => { }); it('returns a message that is misspelled in some way', () => { - const message = MessageFactory.GetA1DayMessage( - BASE_MSG, - ROBOT_NAME, - 6, - true, - ); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 6, true); expect(message).not.toBe(BASE_MSG); }); it('returns a flipped and reversed message', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 7); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 7); expect(message).toBe('ǝlʇɹn┴ ɯ∀ I plɹoM ollǝH'); }); it('should return the original message when the index is outside the array', () => { - const message = MessageFactory.GetA1DayMessage(BASE_MSG, ROBOT_NAME, 8); + const message = mfs.GetA1DayMessage(mockRobot, BASE_MSG, 8); expect(message).toBe(BASE_MSG); }); }); diff --git a/src/lib/RegExpPlusPlus.test.js b/src/lib/RegExpPlusPlus.test.js index eb8813f..2843e9b 100644 --- a/src/lib/RegExpPlusPlus.test.js +++ b/src/lib/RegExpPlusPlus.test.js @@ -1,14 +1,18 @@ -/* eslint-disable new-cap */ -/* eslint-disable mocha/no-setup-in-describe */ -const { RegExpPlusPlus } = require('./regExpPlusPlus'); +const { RegExpPlusPlus } = jest.requireActual('./regExpPlusPlus'); describe('RegExpPlusPlus', () => { describe('createGiveTokenRegExp', () => { it('should match a name + number', () => { + const fullText = '@matt + 5'; + const expected = [fullText, undefined, 'matt', '5', undefined, undefined]; + expected.index = 0; + expected.input = fullText; + expected.groups = undefined; + const giveTokenMatcher = RegExpPlusPlus.createGiveTokenRegExp(); - const match = '@matt + 5'.match(giveTokenMatcher); - expect('@matt + 5').toMatch(giveTokenMatcher); - expect(match).toEqual(expect.arrayContaining(['matt', '+', '5'])); + const match = fullText.match(giveTokenMatcher); + expect(fullText).toMatch(giveTokenMatcher); + expect(match).toEqual(expected); }); }); @@ -111,7 +115,9 @@ describe('RegExpPlusPlus', () => { expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); expect(fullText.match(askForScoreRegExp)[1]).toBeUndefined(); expect(fullText.match(askForScoreRegExp)[2]).toBeUndefined(); - expect(fullText.match(askForScoreRegExp)[3]).toBe('such.a.complex-name-hyphens'); + expect(fullText.match(askForScoreRegExp)[3]).toBe( + 'such.a.complex-name-hyphens', + ); }); it('should match `what even should it be score with @matt`', () => { @@ -120,7 +126,9 @@ describe('RegExpPlusPlus', () => { expect(Array.isArray(fullText.match(askForScoreRegExp))).toBe(true); expect(fullText.match(askForScoreRegExp).length).toBe(4); expect(fullText.match(askForScoreRegExp)[0]).toBe(fullText); - expect(fullText.match(askForScoreRegExp)[1]).toBe('what even should it be '); + expect(fullText.match(askForScoreRegExp)[1]).toBe( + 'what even should it be ', + ); expect(fullText.match(askForScoreRegExp)[2]).toBe('with '); expect(fullText.match(askForScoreRegExp)[3]).toBe('matt'); }); @@ -129,15 +137,17 @@ describe('RegExpPlusPlus', () => { describe('createEraseUserScoreRegExp', () => { it('`erase @matt cuz he is bad` should match the erase user regexp', () => { const fullText = 'erase @matt cuz he is bad'; + const expected = [fullText, undefined, 'matt', 'cuz', 'he is bad']; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; + const eraseUserScoreRegExp = RegExpPlusPlus.createEraseUserScoreRegExp(); expect(eraseUserScoreRegExp).toBeInstanceOf(RegExp); - expect(Array.isArray(fullText.match(eraseUserScoreRegExp))).toBe(true); - expect(fullText.match(eraseUserScoreRegExp).length).toBe(5); - expect(fullText.match(eraseUserScoreRegExp)[0]).toBe('erase @matt cuz he is bad'); - expect(fullText.match(eraseUserScoreRegExp)[1]).toBeUndefined(); - expect(fullText.match(eraseUserScoreRegExp)[2]).toBe('matt'); - expect(fullText.match(eraseUserScoreRegExp)[3]).toBe('cuz'); - expect(fullText.match(eraseUserScoreRegExp)[4]).toBe('he is bad'); + const match = fullText.match(eraseUserScoreRegExp); + expect(Array.isArray(match)).toBe(true); + expect(match.length).toBe(5); + expect(match).toEqual(expected); }); it('`erase @frank` should match the erase user regexp', () => { const fullText = 'erase @frank'; @@ -161,7 +171,7 @@ describe('RegExpPlusPlus', () => { it("should match '{@matt, @phil}++'", () => { const fullText = '{@matt, @phil}++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt, @phil', @@ -169,16 +179,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '{@matt, @phil}-- cuz they are the best team'", () => { const fullText = '{@matt, @phil}-- cuz they are the best team'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt, @phil', @@ -186,16 +199,19 @@ describe('RegExpPlusPlus', () => { 'cuz', 'they are the best team', ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '{@user, @phil.user}--'", () => { const fullText = '{@user, @phil.user}--'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@user, @phil.user', @@ -203,16 +219,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '{ @darf, @greg, @tank } ++'", () => { const fullText = '{ @darf, @greg, @tank } ++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@darf, @greg, @tank ', @@ -220,17 +239,20 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match 'where in the world is Carmen Sandiego { @carmen.sandiego, @sarah.nade, @eartha.brute, @double.trouble, @wonder.rat } ++'", () => { const fullText = 'where in the world is Carmen Sandiego { @carmen.sandiego, @sarah.nade, @eartha.brute, @double.trouble, @wonder.rat } ++'; - const expectedMatch = [ + const expected = [ fullText, 'where in the world is Carmen Sandiego ', '@carmen.sandiego, @sarah.nade, @eartha.brute, @double.trouble, @wonder.rat ', @@ -238,16 +260,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '{@matt @phil}++'", () => { const fullText = '{@matt @phil}++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt @phil', @@ -255,16 +280,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '( @matt, @phil )++'", () => { const fullText = '( @matt, @phil )++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt, @phil ', @@ -272,16 +300,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '[ @matt : @phil ]++'", () => { const fullText = '[ @matt : @phil ]++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt : @phil ', @@ -289,16 +320,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '[ @matt: @phil ]++'", () => { const fullText = '[ @matt: @phil ]++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt: @phil ', @@ -306,16 +340,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '[ @matt:@phil ]++'", () => { const fullText = '[ @matt:@phil ]++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt:@phil ', @@ -323,16 +360,19 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it("should match '{@matt,@phil}++'", () => { const fullText = '{@matt,@phil}++'; - const expectedMatch = [ + const expected = [ fullText, undefined, '@matt,@phil', @@ -340,11 +380,14 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); const match = fullText.match(multiUserVoteRegExp); - expect(match).toEqual(expectedMatch); + expect(match).toEqual(expected); }); it('should match `{ @Chelo, @Kahou_Lei, @wimdec_PTO_back_Aug_21 , @guillaume_Back_Aug_6th, @Cherry, @singaravelan } ++ you’re all awesome, I’m only here for the fun!`', () => { @@ -359,6 +402,9 @@ describe('RegExpPlusPlus', () => { undefined, 'you’re all awesome, I’m only here for the fun!', ]; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; expect(multiUserVoteRegExp).toBeInstanceOf(RegExp); @@ -366,12 +412,6 @@ describe('RegExpPlusPlus', () => { expect(typeof match).toBe('object'); expect(match.length).toBe(expected.length); expect(match).toEqual(expected); - expect(match[0]).toBe(expected[0]); - expect(match[1]).toBe(expected[1]); - expect(match[2]).toBe(expected[2]); - expect(match[3]).toBe(expected[3]); - expect(match[4]).toBe(expected[4]); - expect(match[5]).toBe(expected[5]); }); }); @@ -379,6 +419,10 @@ describe('RegExpPlusPlus', () => { it('should match top 10', () => { const topBottomRegExp = RegExpPlusPlus.createTopBottomRegExp(); const expected = ['top 10', 'top', '10']; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; + expect(topBottomRegExp).toBeInstanceOf(RegExp); expect(expected[0]).toMatch(topBottomRegExp); const match = expected[0].match(topBottomRegExp); @@ -389,6 +433,10 @@ describe('RegExpPlusPlus', () => { it('should match bottom 5', () => { const topBottomRegExp = RegExpPlusPlus.createTopBottomRegExp(); const expected = ['bottom 5', 'bottom', '5']; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; + expect(topBottomRegExp).toBeInstanceOf(RegExp); expect(expected[0]).toMatch(topBottomRegExp); const match = expected[0].match(topBottomRegExp); @@ -402,6 +450,10 @@ describe('RegExpPlusPlus', () => { it('should match top tokens 10', () => { const topBottomTokenRegExp = RegExpPlusPlus.createTopBottomTokenRegExp(); const expected = ['top tokens 10', 'top', '10']; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; + expect(topBottomTokenRegExp).toBeInstanceOf(RegExp); expect(expected[0]).toMatch(topBottomTokenRegExp); const match = expected[0].match(topBottomTokenRegExp); @@ -412,6 +464,10 @@ describe('RegExpPlusPlus', () => { it('should match bottom tokens 5', () => { const topBottomRegExp = RegExpPlusPlus.createTopBottomTokenRegExp(); const expected = ['bottom tokens 5', 'bottom', '5']; + expected.index = 0; + expected.input = expected[0]; + expected.groups = undefined; + expect(topBottomRegExp).toBeInstanceOf(RegExp); expect(expected[0]).toMatch(topBottomRegExp); const match = expected[0].match(topBottomRegExp); @@ -423,9 +479,9 @@ describe('RegExpPlusPlus', () => { describe('createUpDownVoteRegExp', () => { describe('Matching names with @ symbols', () => { - it('should match name [matt] up/down [++] with reason [undefined]', () => { + it('should match name [@matt] up/down [++] with reason [undefined]', () => { const fullText = '@matt++'; - const expectedMatch = [ + const expected = [ fullText, undefined, 'matt', @@ -433,6 +489,9 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = '@matt++'; + expected.groups = undefined; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); @@ -441,12 +500,12 @@ describe('RegExpPlusPlus', () => { expect(fullText).toMatch(upVoteOrDownVoteRegExp); expect(Array.isArray(fullMatch)).toBe(true); expect(fullMatch.length).toBe(6); - expect(fullMatch).toEqual(expectedMatch); + expect(fullMatch).toEqual(expected); }); - it('should match name [matt] up/down [++] with reason [for being "great"]', () => { + it('should match name [@matt] up/down [++] with reason [for being "great"]', () => { const fullText = '@matt ++ for being "great"'; - const expectedMatch = [ + const expected = [ fullText, undefined, 'matt', @@ -454,6 +513,9 @@ describe('RegExpPlusPlus', () => { 'for', 'being "great"', ]; + expected.index = 0; + expected.input = fullText; + expected.groups = undefined; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); @@ -462,12 +524,12 @@ describe('RegExpPlusPlus', () => { expect(fullText).toMatch(upVoteOrDownVoteRegExp); expect(Array.isArray(fullMatch)).toBe(true); expect(fullMatch.length).toBe(6); - expect(fullMatch).toEqual(expectedMatch); + expect(fullMatch).toEqual(expected); }); - it('should match name [matt] up/down [++] with reason [cuz he is awesome]', () => { + it('should match name [@matt] up/down [++] with reason [cuz he is awesome]', () => { const fullText = '@matt++ cuz he is awesome'; - const expectedMatch = [ + const expected = [ fullText, undefined, 'matt', @@ -475,6 +537,9 @@ describe('RegExpPlusPlus', () => { 'cuz', 'he is awesome', ]; + expected.index = 0; + expected.input = fullText; + expected.groups = undefined; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); @@ -483,12 +548,12 @@ describe('RegExpPlusPlus', () => { expect(fullText).toMatch(upVoteOrDownVoteRegExp); expect(Array.isArray(fullMatch)).toBe(true); expect(fullMatch.length).toBe(6); - expect(fullMatch).toEqual(expectedMatch); + expect(fullMatch).toEqual(expected); }); - it('should match name [matt] up/down [++] with reason [thanks for being awesome]', () => { + it('should match name [@matt] up/down [++] with reason [thanks for being awesome]', () => { const fullText = '@matt ++ thanks for being awesome'; - const expectedMatch = [ + const expected = [ fullText, undefined, 'matt', @@ -496,6 +561,9 @@ describe('RegExpPlusPlus', () => { 'thanks for', 'being awesome', ]; + expected.index = 0; + expected.input = fullText; + expected.groups = undefined; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); @@ -504,12 +572,12 @@ describe('RegExpPlusPlus', () => { expect(fullText).toMatch(upVoteOrDownVoteRegExp); expect(Array.isArray(fullMatch)).toBe(true); expect(fullMatch.length).toBe(6); - expect(fullMatch).toEqual(expectedMatch); + expect(fullMatch).toEqual(expected); }); - it('should match name [matt] up/down [—] with reason [undefined]', () => { + it('should match name [@matt] up/down [—] with reason [undefined]', () => { const fullText = '@matt—'; - const expectedMatch = [ + const expected = [ fullText, undefined, 'matt', @@ -517,6 +585,9 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = fullText; + expected.groups = undefined; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); @@ -525,12 +596,12 @@ describe('RegExpPlusPlus', () => { expect(fullText).toMatch(upVoteOrDownVoteRegExp); expect(Array.isArray(fullMatch)).toBe(true); expect(fullMatch.length).toBe(6); - expect(fullMatch).toEqual(expectedMatch); + expect(fullMatch).toEqual(expected); }); - it('should match name [matt] up/down [++] with reason [undefined]', () => { + it('should match name [@matt] up/down [++] with reason [undefined]', () => { const fullText = 'hello world this is @matt++'; - const expectedMatch = [ + const expected = [ fullText, 'hello world this is ', 'matt', @@ -538,6 +609,9 @@ describe('RegExpPlusPlus', () => { undefined, undefined, ]; + expected.index = 0; + expected.input = fullText; + expected.groups = undefined; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); @@ -546,12 +620,12 @@ describe('RegExpPlusPlus', () => { expect(fullText).toMatch(upVoteOrDownVoteRegExp); expect(Array.isArray(fullMatch)).toBe(true); expect(fullMatch.length).toBe(6); - expect(fullMatch).toEqual(expectedMatch); + expect(fullMatch).toEqual(expected); }); - it("should match name [matt] up/down [++] with reason [man, you're awesome]", () => { + it("should match name [@matt] up/down [++] with reason [man, you're awesome]", () => { const fullText = "@matt ++ man, you're awesome"; - const expectedMatch = [ + const expected = [ fullText, undefined, 'matt', @@ -559,6 +633,9 @@ describe('RegExpPlusPlus', () => { undefined, "man, you're awesome", ]; + expected.index = 0; + expected.input = fullText; + expected.groups = undefined; const upVoteOrDownVoteRegExp = RegExpPlusPlus.createUpDownVoteRegExp(); expect(upVoteOrDownVoteRegExp).toBeInstanceOf(RegExp); @@ -567,7 +644,7 @@ describe('RegExpPlusPlus', () => { expect(fullText).toMatch(upVoteOrDownVoteRegExp); expect(Array.isArray(fullMatch)).toBe(true); expect(fullMatch.length).toBe(6); - expect(fullMatch).toEqual(expectedMatch); + expect(fullMatch).toEqual(expected); }); }); diff --git a/src/lib/data/scores.js b/src/lib/data/scores.js index 2b3143e..6ae3a8a 100644 --- a/src/lib/data/scores.js +++ b/src/lib/data/scores.js @@ -1,4 +1,4 @@ -const SlackClient = require('@slack/client'); +const { WebClient } = require('@slack/web-api'); /* * Scores Object * -------------------------------- @@ -58,7 +58,7 @@ async function createNewLevelOneUser(createUser, robot) { robot.adapter.options && robot.adapter.options.token ) { - const web = new SlackClient.WebClient(robot.adapter.options.token); + const web = new WebClient(robot.adapter.options.token); const result = await web.users.info({ user: newUser.slackId }); newUser.slackEmail = getEmail(result.user); } diff --git a/src/lib/services/database.js b/src/lib/services/database.js index 40671a9..ea60044 100644 --- a/src/lib/services/database.js +++ b/src/lib/services/database.js @@ -157,7 +157,7 @@ class DatabaseService { * score - the number of score that is being sent */ async savePointsGiven(robot, from, to, score) { - const { furtherFeedbackScore, peerFeedbackUrl } = H.getProcessVars( + const { furtherFeedbackSuggestedScore, peerFeedbackUrl } = H.getProcessVars( process.env, ); const db = await this.getDb(); @@ -171,7 +171,7 @@ class DatabaseService { ? fromUser.pointsGiven[cleanName] : 0; // even if they are down voting them they should still get a tally as they ++/-- the same person - fromUser.pointsGiven[cleanName] = oldScore + 1; + fromUser.pointsGiven[cleanName] = oldScore + score; const result = await db .collection(scores.scoresDocumentName) .findOneAndUpdate( @@ -183,9 +183,9 @@ class DatabaseService { sort: { score: -1 }, }, ); - const updatedUser = result.value; + const upUser = result.value; - if (updatedUser.pointsGiven[cleanName] % furtherFeedbackScore === 0) { + if (upUser.pointsGiven[cleanName] % furtherFeedbackSuggestedScore === 0) { robot.logger.debug( `${from.name} has sent a lot of points to ${to.name} suggesting further feedback ${score}`, ); @@ -366,7 +366,11 @@ class DatabaseService { await db .collection(scores.scoresDocumentName) .updateOne(search, { $set: foundUser }); - const newScore = await this.transferScoreFromBotToUser(user, tokensAdded); + const newScore = await this.transferScoreFromBotToUser( + robot, + user, + tokensAdded, + ); return newScore; } diff --git a/src/lib/services/scoreboard.js b/src/lib/services/scoreboard.js index e321844..a0ae01e 100644 --- a/src/lib/services/scoreboard.js +++ b/src/lib/services/scoreboard.js @@ -1,6 +1,6 @@ const clark = require('clark'); const _ = require('lodash'); -const { helpers } = require('../helpers'); +const { H } = require('../helpers'); const { mfs } = require('../messageFactory'); const { dbs } = require('./database'); @@ -8,25 +8,26 @@ class ScoreboardService { static async respondWithScore(msg) { const { mentions } = msg.message; const [_fullText, _premessage, _conjunction, name] = msg.match; - let to = { name: helpers.cleanName(name) }; + let to = { name: H.cleanName(name) }; if (mentions) { const userMentions = mentions.filter((men) => men.type === 'user'); to = userMentions.pop(); to.name = name; } - const user = await dbs.getUser(to); + const user = await dbs.getUser(msg.robot, to); - const scoreString = mfs.BuildScoreLookup(user); + const scoreString = mfs.BuildScoreLookup(msg.robot, user); msg.send(scoreString); } static async respondWithLeaderLoserBoard(msg) { const amount = parseInt(msg.match[2], 10) || 10; - const topOrBottom = helpers.capitalizeFirstLetter(msg.match[1].trim()); + + const topOrBottom = H.capitalizeFirstLetter(msg.match[1].trim()); const methodName = `get${topOrBottom}Scores`; - const tops = await dbs[methodName](amount); + const tops = await dbs[methodName](msg.robot, amount); const message = []; if (tops.length > 0) { for ( @@ -40,7 +41,7 @@ class ScoreboardService { message.push( `${i + 1}. ${person}: ${tops[i].score} (*${ tops[i].token - } ${helpers.capitalizeFirstLetter(msg.robot.name)} ${tokenStr}*)`, + } ${H.capitalizeFirstLetter(msg.robot.name)} ${tokenStr}*)`, ); } else { message.push(`${i + 1}. ${person}: ${tops[i].score}`); @@ -58,10 +59,10 @@ class ScoreboardService { static async respondWithLeaderLoserTokenBoard(msg) { const amount = parseInt(msg.match[2], 10) || 10; - const topOrBottom = helpers.capitalizeFirstLetter(msg.match[1].trim()); + const topOrBottom = H.capitalizeFirstLetter(msg.match[1].trim()); const methodName = `get${topOrBottom}Tokens`; - const tops = await dbs[methodName](amount); + const tops = await dbs[methodName](msg.robot, amount); const message = []; if (tops.length > 0) { @@ -74,11 +75,9 @@ class ScoreboardService { const tokenStr = tops[i].token > 1 ? 'Tokens' : 'Token'; const pointStr = tops[i].score > 1 ? 'points' : 'point'; message.push( - `${i + 1}. ${person}: *${ - tops[i].token - } ${helpers.capitalizeFirstLetter(msg.robot.name)} ${tokenStr}* (${ - tops[i].score - } ${pointStr})`, + `${i + 1}. ${person}: *${tops[i].token} ${H.capitalizeFirstLetter( + msg.robot.name, + )} ${tokenStr}* (${tops[i].score} ${pointStr})`, ); } } else { @@ -93,9 +92,9 @@ class ScoreboardService { static async getTopPointSenders(msg) { const amount = parseInt(msg.match[2], 10) || 10; - const topOrBottom = helpers.capitalizeFirstLetter(msg.match[1].trim()); + const topOrBottom = H.capitalizeFirstLetter(msg.match[1].trim()); const methodName = `get${topOrBottom}Sender`; - const tops = await dbs[methodName](amount); + const tops = await dbs[methodName](msg.robot, amount); const message = []; if (tops.length > 0) { diff --git a/src/lib/services/scorekeeper.test.js b/src/lib/services/scorekeeper.test.js index a458217..66634d3 100644 --- a/src/lib/services/scorekeeper.test.js +++ b/src/lib/services/scorekeeper.test.js @@ -1,39 +1,13 @@ -const { MongoClient } = require('mongodb'); -const sinon = require('sinon'); -const SlackClient = require('@slack/client'); - -const ScoreKeeperService = require('./scorekeeper'); const { H } = require('../helpers'); -const { robotStub } = require('../../../test/test_helpers'); - -const defaultData = { - scores: [{}], - scoreLog: [{}], -}; +const { wait } = require('../../../test/test_helpers'); describe('ScoreKeeper', () => { - let msgSpy; - let emitSpy; - + let instance; beforeEach(async () => { - msgSpy = sinon.spy(robotStub, 'messageRoom'); - emitSpy = sinon.spy(robotStub, 'emit'); - sinon - .stub(SlackClient, 'WebClient') - .withArgs('token') - .returns({ - users: { - info: sinon - .stub() - .returns({ user: { profile: { email: 'test@email.com' } } }), - }, - }); + instance = require('./scorekeeper'); }); - afterEach(async () => { - sinon.restore(); - msgSpy.resetHistory(); - }); + afterEach(async () => {}); describe('adding', () => { it('should add 1 point to "pointReceiver" with no reason and return the expected result', async () => { @@ -43,10 +17,11 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await ScoreKeeperService.getUser(to); + const beforeUser = await instance.getUser(mockRobot, to); expect(beforeUser.score).toBe(0); - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, to, from, room, @@ -55,9 +30,11 @@ describe('ScoreKeeper', () => { ); expect(r).toBeInstanceOf(Object); expect(r.score).toBe(expectedResult.score); - expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); + expect(r.reasons['because points']).toBe( + expectedResult.reasons['because points'], + ); - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(1); }); @@ -68,10 +45,11 @@ describe('ScoreKeeper', () => { const reason = 'because points'; const expectedResult = { score: 1, reasons: { 'because points': 1 } }; - const beforeUser = await ScoreKeeperService.getUser(to); + const beforeUser = await instance.getUser(mockRobot, to); expect(beforeUser.score).toBe(0); - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, to, from, room, @@ -80,9 +58,11 @@ describe('ScoreKeeper', () => { ); expect(r).toBeInstanceOf(Object); expect(r.score).toBe(expectedResult.score); - expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); + expect(r.reasons['because points']).toBe( + expectedResult.reasons['because points'], + ); - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(1); }); @@ -93,10 +73,11 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await ScoreKeeperService.getUser(to); + const beforeUser = await instance.getUser(mockRobot, to); expect(beforeUser.score).toBe(0); - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, to, from, room, @@ -105,9 +86,11 @@ describe('ScoreKeeper', () => { ); expect(r).toBeInstanceOf(Object); expect(r.score).toBe(expectedResult.score); - expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); + expect(r.reasons['because points']).toBe( + expectedResult.reasons['because points'], + ); - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(1); }); @@ -118,10 +101,11 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await ScoreKeeperService.getUser(to); + const beforeUser = await instance.getUser(mockRobot, to); expect(beforeUser.score).toBe(0); - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, to, from, room, @@ -130,9 +114,11 @@ describe('ScoreKeeper', () => { ); expect(r).toBeInstanceOf(Object); expect(r.score).toBe(expectedResult.score); - expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); + expect(r.reasons['because points']).toBe( + expectedResult.reasons['because points'], + ); - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(1); }); @@ -143,10 +129,11 @@ describe('ScoreKeeper', () => { const reason = undefined; const expectedResult = { score: 1, reasons: {} }; - const beforeUser = await ScoreKeeperService.getUser(to); + const beforeUser = await instance.getUser(mockRobot, to); expect(beforeUser.score).toBe(0); - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, to, from, room, @@ -155,20 +142,24 @@ describe('ScoreKeeper', () => { ); expect(r).toBeInstanceOf(Object); expect(r.score).toBe(expectedResult.score); - expect(r.reasons['because points']).toBe(expectedResult.reasons['because points']); + expect(r.reasons['because points']).toBe( + expectedResult.reasons['because points'], + ); - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(1); }); it('does not allow spamming points', async () => { - const to = { name: 'matt.erickson', id: 'matt.erickson' }; + const to = { name: 'matt.erickson.empty', id: 'matt.erickson.empty' }; + const spamUser = { name: 'matt.erickson.from', id: '123' }; // empty score to start - const beforeUser = await ScoreKeeperService.getUser(to); + const beforeUser = await instance.getUser(mockRobot, to); expect(beforeUser.score).toBe(0); - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, to, - { name: 'matt.erickson.min', id: '123' }, + spamUser, 'room', 'because points', 1, @@ -176,31 +167,37 @@ describe('ScoreKeeper', () => { expect(r).toBeInstanceOf(Object); expect(r.score).toBe(1); expect(r.reasons['because points']).toBe(1); - expect(emitSpy.called).toBe(false); + expect(mockRobot.emit).not.toHaveBeenCalled(); // score added - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(1); // Try to spam let r2; try { - ({ toUser: r2 } = await ScoreKeeperService.incrementScore( + ({ toUser: r2 } = await instance.incrementScore( + mockRobot, to, - { name: 'from', id: '123' }, + spamUser, 'room', 'because points', 1, )); expect(r2).toBeUndefined(); } catch (e) { - expect(e.message).toBe("I'm sorry <@123>, I'm afraid I can't do that."); + expect(e.message).toBe( + `I'm sorry <@${spamUser.id}>, I'm afraid I can't do that.`, + ); } - const spamScore = await ScoreKeeperService.getUser(to); + const spamScore = await instance.getUser(mockRobot, to); expect(spamScore).not.toBe(2); - expect(emitSpy.called).toBe(true); - expect(emitSpy).toHaveBeenCalledWith('plus-plus-spam'); + expect(mockRobot.emit).toHaveBeenCalled(); + expect(mockRobot.emit).toHaveBeenCalledWith( + 'plus-plus-spam', + expect.anything(), + ); }); describe('special increment value response', () => { @@ -216,27 +213,31 @@ describe('ScoreKeeper', () => { }); it('should call for a special response if user has 10 "gives"', async () => { - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, { name: 'derp' }, { name: 'matt', id: '123' }, 'room', 'because points', - 1, + 10, ); expect(r).toBeInstanceOf(Object); - expect(r.score).toBe(1); - expect(r.reasons['because points']).toBe(1); - expect(msgSpy.called).toBe(true); - expect(msgSpy).toHaveBeenCalledWith( + expect(r.score).toBe(10); + expect(r.reasons['because points']).toBe(10); + expect(mockRobot.messageRoom).toHaveBeenCalled(); + expect(mockRobot.messageRoom).toHaveBeenCalledWith( '123', - `Looks like you've given derp quite a few points, maybe you should look at submitting ${ScoreKeeperService.peerFeedbackUrl}` + `Looks like you've given derp quite a few points, maybe you should look at submitting ${ + H.getProcessVariables(process.env).peerFeedbackUrl + }`, ); }); }); it('adds more points to a user for a reason', async () => { const to = 'to'; - let { toUser: r } = await ScoreKeeperService.incrementScore( + let { toUser: r } = await instance.incrementScore( + mockRobot, to, { name: 'from', id: '123' }, 'room', @@ -247,7 +248,8 @@ describe('ScoreKeeper', () => { expect(r.score).toBe(1); expect(r.reasons['because points']).toBe(1); - ({ toUser: r } = await ScoreKeeperService.incrementScore( + ({ toUser: r } = await instance.incrementScore( + mockRobot, to, { name: 'another-from', id: '321' }, 'room', @@ -257,16 +259,17 @@ describe('ScoreKeeper', () => { expect(r).toBeInstanceOf(Object); expect(r.score).toBe(2); expect(r.reasons['because points']).toBe(2); - expect(typeof r[`${robotStub.name}Day`]).toBe('object'); + expect(typeof r[`${mockRobot.name}Day`]).toBe('object'); - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(2); }); }); describe('subtracting', () => { it('adds points to a user', async () => { - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -277,7 +280,8 @@ describe('ScoreKeeper', () => { }); it('subtracts points from a user for a reason', async () => { - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -291,12 +295,14 @@ describe('ScoreKeeper', () => { it('does not allow spamming points', async () => { const to = 'mahMainBuddy'; + const spamUser = { name: 'matt.erickson.from', id: '123' }; // empty score to start - const beforeUser = await ScoreKeeperService.getUser(to); + const beforeUser = await instance.getUser(mockRobot, to); expect(beforeUser.score).toBe(0); - const { toUser: r } = await ScoreKeeperService.incrementScore( + const { toUser: r } = await instance.incrementScore( + mockRobot, to, - { name: 'from', id: '123' }, + spamUser, 'room', 'because points', -1, @@ -304,41 +310,50 @@ describe('ScoreKeeper', () => { expect(r).toBeInstanceOf(Object); expect(r.score).toBe(-1); expect(r.reasons['because points']).toBe(-1); + expect(mockRobot.emit).not.toHaveBeenCalled(); // score added - const afterUser = await ScoreKeeperService.getUser(to); + const afterUser = await instance.getUser(mockRobot, to); expect(afterUser.score).toBe(-1); // Try to spam let r2; try { - ({ toUser: r2 } = await ScoreKeeperService.incrementScore( + ({ toUser: r2 } = await instance.incrementScore( + mockRobot, to, - { name: 'from', id: '123' }, + spamUser, 'room', 'because points', -1, )); expect(r2).toBeUndefined(); } catch (e) { - expect(e.message).toBe("I'm sorry <@123>, I'm afraid I can't do that."); + expect(e.message).toBe( + `I'm sorry <@${spamUser.id}>, I'm afraid I can't do that.`, + ); } - const spamScore = await ScoreKeeperService.getUser(to); + const spamScore = await instance.getUser(mockRobot, to); expect(spamScore).not.toBe(-2); - expect(emitSpy.called).toBe(true); - expect(emitSpy).toHaveBeenCalledWith('plus-plus-spam'); + expect(mockRobot.emit).toHaveBeenCalled(); + expect(mockRobot.emit).toHaveBeenCalledWith( + 'plus-plus-spam', + expect.anything(), + ); }); it('subtracts more points from a user for a reason', async () => { - let { toUser: r } = await ScoreKeeperService.incrementScore( + let { toUser: r } = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', 'because points', -1, ); - ({ toUser: r } = await ScoreKeeperService.incrementScore( + ({ toUser: r } = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, 'another-from', 'room', @@ -353,7 +368,8 @@ describe('ScoreKeeper', () => { describe('erasing', () => { it('erases a reason from a user', async () => { - const { toUser: p } = await ScoreKeeperService.incrementScore( + const { toUser: p } = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -363,20 +379,22 @@ describe('ScoreKeeper', () => { expect(p).toBeInstanceOf(Object); expect(p.score).toBe(1); expect(p.reasons.reason).toBe(1); - const r = await ScoreKeeperService.erase( + const r = await instance.erase( + mockRobot, 'to', { name: 'from', id: '123' }, 'room', 'reason', ); expect(r).toEqual(true); - const rs = await ScoreKeeperService.getUser('to'); + const rs = await instance.getUser(mockRobot, 'to'); expect(rs.reasons).toEqual({ reason: 0 }); expect(rs.reasons.reason).toBe(0); }); it('erases a user from the scoreboard', async () => { - const { toUser: p } = await ScoreKeeperService.incrementScore( + const { toUser: p } = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -386,20 +404,22 @@ describe('ScoreKeeper', () => { expect(p).toBeInstanceOf(Object); expect(p.score).toBe(1); expect(p.reasons.reason).toBe(1); - const r = await ScoreKeeperService.erase( + const r = await instance.erase( + mockRobot, 'to', { name: 'from', id: '123' }, 'room', ); expect(r).toBe(true); - const user2 = await ScoreKeeperService.getUser('to'); + const user2 = await instance.getUser(mockRobot, 'to'); expect(user2.score).toBe(0); }); }); describe('scores', () => { it('returns the score for a user', async () => { - const { toUser: p } = await ScoreKeeperService.incrementScore( + const { toUser: p } = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', @@ -407,13 +427,14 @@ describe('ScoreKeeper', () => { 1, ); expect(p.score).toBe(1); - const user = await ScoreKeeperService.getUser('to'); + const user = await instance.getUser(mockRobot, 'to'); expect(user.score).toBe(1); }); it('returns the reasons for a user', async () => { try { - const user = await ScoreKeeperService.incrementScore( + const user = await instance.incrementScore( + mockRobot, { name: 'to', id: 'to' }, { name: 'from', id: '123' }, 'room', diff --git a/src/lib/services/wallet.js b/src/lib/services/wallet.js index f2474c9..c813892 100644 --- a/src/lib/services/wallet.js +++ b/src/lib/services/wallet.js @@ -2,10 +2,11 @@ const Conversation = require('hubot-conversation'); const tokenBuddy = require('token-buddy'); const _ = require('lodash'); const { dbs } = require('./database'); -const { helpers } = require('../helpers'); +const { H } = require('../helpers'); class WalletService { static async levelUpAccount(msg) { + const capRobotName = H.capitalizeFirstLetter(msg.robot.name); const switchBoard = new Conversation(msg.robot); const dialog = switchBoard.startDialog(msg); dialog.dialogTimeout = (timeoutMsg) => { @@ -14,20 +15,16 @@ class WalletService { ); }; - if (!helpers.isPrivateMessage(msg.message.room)) { + if (!H.isPrivateMessage(msg.message.room)) { return msg.reply( `You should only execute a level up from within the context of a DM with ${msg.robot.name}`, ); } - const user = await dbs.getUser(msg.message.user); + const user = await dbs.getUser(msg.robot, msg.message.user); if (user.accountLevel === 2) { msg.reply( - `You are already Level 2, ${ - user.name - }. It looks as if you are ready for Level 3 where you can deposit/withdraw ${helpers.capitalizeFirstLetter( - msg.robot.name, - )} Tokens! Is that correct? [Yes/No]`, + `You are already Level 2, ${user.name}. It looks as if you are ready for Level 3 where you can deposit/withdraw ${capRobotName} Tokens! Is that correct? [Yes/No]`, ); dialog.addChoice(/yes/i, (msg2) => { // do the level 3 step up, get their info for deposit withdrawal @@ -41,21 +38,18 @@ class WalletService { return false; } - const leveledUpUser = await dbs.updateAccountLevelToTwo(user); + const leveledUpUser = await dbs.updateAccountLevelToTwo(msg.robot, user); msg.robot.logger.debug('DB results', leveledUpUser); msg.reply( - `${ - user.name - }, we are going to level up your account to Level 2! This means you will start getting ${helpers.capitalizeFirstLetter( - msg.robot.name, - )} Tokens as well as points!`, + `${user.name}, we are going to level up your account to Level 2! This means you will start getting ${capRobotName} Tokens as well as points!`, ); return true; } static async botWalletCount(msg) { - const botWallet = await dbs.getBotWallet(); + const capRobotName = H.capitalizeFirstLetter(msg.robot.name); + const botWallet = await dbs.getBotWallet(msg.robot); msg.robot.logger.debug( `Get the bot wallet by user ${msg.message.user.name}, ${botWallet}`, ); @@ -81,9 +75,7 @@ class WalletService { type: 'section', text: { type: 'mrkdwn', - text: `${helpers.capitalizeFirstLetter( - msg.robot.name, - )} Token Wallet Info:`, + text: `${capRobotName} Token Wallet Info:`, }, }, { type: 'divider' }, diff --git a/src/help.js b/src/messageHandlers/helpMessage.js similarity index 85% rename from src/help.js rename to src/messageHandlers/helpMessage.js index 9e3291d..6b2e209 100644 --- a/src/help.js +++ b/src/messageHandlers/helpMessage.js @@ -10,8 +10,8 @@ // Author: // O'Mutt (Matt@OKeefe.dev) -const { RegExpPlusPlus } = require('./lib/regExpPlusPlus'); -const HelpService = require('./lib/services/help'); +const { RegExpPlusPlus } = require('../lib/regExpPlusPlus'); +const HelpService = require('../lib/services/help'); module.exports = function help(robot) { robot.respond(RegExpPlusPlus.getHelp(), HelpService.respondWithHelpGuidance); diff --git a/src/help.test.js b/src/messageHandlers/helpMessage.test.js similarity index 61% rename from src/help.test.js rename to src/messageHandlers/helpMessage.test.js index abe69a2..13e53df 100644 --- a/src/help.test.js +++ b/src/messageHandlers/helpMessage.test.js @@ -1,24 +1,25 @@ -const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); -const { H } = require('./lib/helpers'); -const pjson = require('../package.json'); -const { wait } = require('../test/test_helpers'); +const { H } = require('../lib/helpers'); +const pjson = require('../../package.json'); +const { wait } = require('../../test/test_helpers'); -describe('help', () => { +describe('helpMessage', () => { let room; let helpHelper; + let roomRobot; beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - helpHelper = new TestHelper('./help.js'); + helpHelper = new TestHelper('../../../src/messageHandlers/helpMessage.js'); }); beforeEach(() => { + process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; room = helpHelper.createRoom({ httpd: false }); + roomRobot = room.robot; }); afterEach(async () => { - sinon.restore(); room.destroy(); }); @@ -29,8 +30,8 @@ describe('help', () => { room.destroy(); process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = url; room = helpHelper.createRoom({ httpd: false }); - room.user.say('peter.nguyen', '@hubot -h'); - await wait(55); + room.user.say('peter.nguyen', `@${roomRobot.name} -h`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); const message = room.messages[1][1]; @@ -38,7 +39,7 @@ describe('help', () => { expect(blocks.length).toBe(4); expect(blocks[0]).toMatchObject({ type: 'section', - text: { type: 'mrkdwn', text: 'Need help with hubot?' }, + text: { type: 'mrkdwn', text: `Need help with ${roomRobot.name}?` }, }); expect(blocks[1]).toMatchObject({ type: 'section', @@ -59,8 +60,8 @@ describe('help', () => { }); it('should respond with hubot usage guidance', async () => { - room.user.say('peter.nguyen', '@hubot help'); - await wait(55); + room.user.say('peter.nguyen', `@${roomRobot.name} help`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); const message = room.messages[1][1]; @@ -70,7 +71,7 @@ describe('help', () => { type: 'section', text: { type: 'mrkdwn', - text: 'Need help with hubot?', + text: `Need help with ${roomRobot.name}?`, }, }); expect(blocks[1]).toMatchObject({ @@ -86,33 +87,42 @@ describe('help', () => { describe('version', () => { it('should respond with the name and version of the package when asked --version', async () => { - await room.user.say('matt.erickson', '@hubot --version'); - await wait(55); + await room.user.say('matt.erickson', `@${roomRobot.name} --version`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe(`${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ - pjson.name - }> .`); + expect(room.messages[1][1]).toBe( + `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`, + ); }); it('should respond with the name and version of the package when asked -v', async () => { - await room.user.say('matt.erickson', '@hubot -v'); - await wait(55); + await room.user.say('matt.erickson', `@${roomRobot.name} -v`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe(`${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ - pjson.name - }> .`); + expect(room.messages[1][1]).toBe( + `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`, + ); }); it('should respond with the name and version of the package when asked `plusplus version`', async () => { - await room.user.say('matt.erickson', '@hubot plusplus version'); - await wait(55); + await room.user.say( + 'matt.erickson', + `@${roomRobot.name} plusplus version`, + ); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe(`${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ - pjson.name - }> .`); + expect(room.messages[1][1]).toBe( + `${H.capitalizeFirstLetter(room.robot.name)} <${pjson.repository.url}|${ + pjson.name + }> .`, + ); }); }); }); diff --git a/src/messageHandlers/plusplus.test.js b/src/messageHandlers/plusplus.test.js index db32690..99d0044 100644 --- a/src/messageHandlers/plusplus.test.js +++ b/src/messageHandlers/plusplus.test.js @@ -1,40 +1,33 @@ -const sinon = require('sinon'); - const TestHelper = require('hubot-test-helper'); -const SlackClient = require('@slack/client'); const { H } = require('../lib/helpers'); -const { wait } = require('../../test/test_helpers'); +const { wait, mockSlackClient } = require('../../test/test_helpers'); describe('PlusPlus', () => { let room; let plusPlusHelper; + let emitSpy; beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - plusPlusHelper = new TestHelper('./messageHandlers/plusplus.js'); + plusPlusHelper = new TestHelper('../../../src/messageHandlers/plusplus.js'); }); - afterAll(async () => { - sinon.restore(); - }); + afterAll(async () => {}); beforeEach(() => { - sinon - .stub(SlackClient, 'WebClient') - .withArgs('token') - .returns({ - users: { - info: sinon - .stub() - .returns({ user: { profile: { email: 'test@email.com' } } }), - }, - }); - sinon.stub(H, 'isA1Day').returns(false); + mockSlackClient(); + jest.mock('../lib/helpers', () => { + const actual = jest.requireActual('../lib/helpers'); + return { + ...actual, + isA1Day: jest.fn().mockReturnValue(false), + }; + }); room = plusPlusHelper.createRoom({ httpd: false }); + emitSpy = jest.spyOn(room.robot, 'emit'); }); afterEach(async () => { - sinon.restore(); room.destroy(); }); @@ -42,21 +35,24 @@ describe('PlusPlus', () => { describe('adding points', () => { it("should add a point when a user is ++'d", async () => { room.user.say('matt.erickson', '@derp++'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe("derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:"); + expect(room.messages[1][1]).toBe( + "derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:", + ); const user = await db.collection('scores').findOne({ name: 'derp' }); expect(user.score).toBe(1); }); it("should add a point when a user is ++'d with pre-text", async () => { - const emitSpy = sinon.spy(room.robot, 'emit'); room.user.say('matt.erickson', 'where are you d00d @derp++'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe("derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:"); + expect(room.messages[1][1]).toBe( + "derp has 1 point.\n:birthday: Today is derp's hubotday! :birthday:", + ); expect(emitSpy).not.toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: 'False positive detected in <#room1> from <@matt.erickson>:\n' + @@ -73,13 +69,12 @@ describe('PlusPlus', () => { }); it("should add a point when a user is ++'d without a conjunction", async () => { - const emitSpy = sinon.spy(room.robot, 'emit'); room.user.say('matt.erickson', '@derp++ winning the business'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toMatch( - /derp has 1 point for winning the business\.\n:birthday: Today is derp's hubotday! :birthday:/ + /derp has 1 point for winning the business\.\n:birthday: Today is derp's hubotday! :birthday:/, ); expect(emitSpy).not.toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: @@ -98,7 +93,7 @@ describe('PlusPlus', () => { it("should add a point when a user is :clap:'d", async () => { room.user.say('matt.erickson', '@derp :clap:'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toMatch(/derp has 1 point\./); @@ -108,17 +103,19 @@ describe('PlusPlus', () => { it("should add a point when a user is :thumbsup:'d", async () => { room.user.say('matt.erickson', '@derp :thumbsup: for being the best'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toMatch(/derp has 1 point for being the best\./); + expect(room.messages[1][1]).toMatch( + /derp has 1 point for being the best\./, + ); const user = await db.collection('scores').findOne({ name: 'derp' }); expect(user.score).toBe(1); }); it("should add a point when a user that is already in the db is ++'d", async () => { room.user.say('matt.erickson.min', '@matt.erickson++'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toBe('<@matt.erickson> has 228 points.'); @@ -131,12 +128,14 @@ describe('PlusPlus', () => { describe('multi user vote', () => { it('should add a point to each user in the multi-user plus plus', async () => { room.user.say('matt.erickson', '{ @darf, @greg, @tank }++'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe('<@darf> has -1 point.' + - '\n<@greg> has -9 points.' + - '\n<@tank> has 2 points.'); + expect(room.messages[1][1]).toBe( + '<@darf> has -1 point.' + + '\n<@greg> has -9 points.' + + '\n<@tank> has 2 points.', + ); }); it('should add a point to each user in the multi-user plus plus with text before it', async () => { @@ -144,12 +143,14 @@ describe('PlusPlus', () => { 'matt.erickson', 'hello world! { @darf, @greg, @tank }++', ); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe('<@darf> has -1 point.' + - '\n<@greg> has -9 points.' + - '\n<@tank> has 2 points.'); + expect(room.messages[1][1]).toBe( + '<@darf> has -1 point.' + + '\n<@greg> has -9 points.' + + '\n<@tank> has 2 points.', + ); }); it('should add a point to each user in the multi-user plus plus with periods in their names', async () => { @@ -157,11 +158,11 @@ describe('PlusPlus', () => { 'matt.erickson', '{ @darf.arg, @pirate.jack123, @ted.phil } ++', ); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toBe( - '<@darf.arg> has 2 points.\n<@pirate.jack123> has 2 points.\n<@ted.phil> has 2 points.' + '<@darf.arg> has 2 points.\n<@pirate.jack123> has 2 points.\n<@ted.phil> has 2 points.', ); }); }); @@ -171,22 +172,25 @@ describe('PlusPlus', () => { 'matt.erickson.min', '@matt.erickson++ for being awesome', ); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe('<@matt.erickson> has 228 points, 2 of which are for being awesome.'); + expect(room.messages[1][1]).toBe( + '<@matt.erickson> has 228 points, 2 of which are for being awesome.', + ); }); it('should add a point to user with (sans) conjunction reason', async () => { - const emitSpy = sinon.spy(room.robot, 'emit'); room.user.say( 'matt.erickson.min', "@matt.erickson++ gawd you're awesome", ); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe("<@matt.erickson> has 228 points, 1 of which is for gawd you're awesome."); + expect(room.messages[1][1]).toBe( + "<@matt.erickson> has 228 points, 1 of which is for gawd you're awesome.", + ); expect(emitSpy).not.toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: 'False positive detected in <#room1> from <@derp>:\n' + @@ -206,7 +210,7 @@ describe('PlusPlus', () => { .findOne({ name: 'matt.erickson.min' }); expect(user.score).toBe(8); room.user.say('matt.erickson', '@matt.erickson.min--'); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toBe('<@matt.erickson.min> has 7 points.'); @@ -221,10 +225,12 @@ describe('PlusPlus', () => { 'matt.erickson', '@matt.erickson.min :thumbsdown: for being the best', ); - await wait(55); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe('<@matt.erickson.min> has 7 points, -1 of which is for being the best.'); + expect(room.messages[1][1]).toBe( + '<@matt.erickson.min> has 7 points, -1 of which is for being the best.', + ); const user = await db .collection('scores') .findOne({ name: 'matt.erickson.min' }); @@ -232,12 +238,11 @@ describe('PlusPlus', () => { }); it("shouldn't remove a point when a user is ++'d with pre-text and no conjunction", async () => { - const emitSpy = sinon.spy(room.robot, 'emit'); room.user.say( 'matt.erickson', 'hello, @derp -- i have no idea what you are doing', ); - await wait(55); + await wait(); expect(emitSpy).toHaveBeenCalledWith('plus-plus-failure', { notificationMessage: 'False positive detected in <#room1> from <@matt.erickson>\n' + diff --git a/src/messageHandlers/scoreboard.test.js b/src/messageHandlers/scoreboard.test.js index 3dd96b2..f45ca5d 100644 --- a/src/messageHandlers/scoreboard.test.js +++ b/src/messageHandlers/scoreboard.test.js @@ -1,102 +1,153 @@ -const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); +const { H } = require('../lib/helpers'); const { wait } = require('../../test/test_helpers'); describe('Scoreboard', () => { let room; let scoreboard; - let sandbox; + let capRobotName; + let roomRobot; + beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - scoreboard = new TestHelper('./messageHandlers/scoreboard.js'); + scoreboard = new TestHelper('../../../src/messageHandlers/scoreboard.js'); }); beforeEach(async () => { room = scoreboard.createRoom({ httpd: false }); + roomRobot = room.robot; + capRobotName = H.capitalizeFirstLetter(roomRobot.name); }); afterEach(async () => { - sandbox.restore(); room.destroy(); }); describe('getScore', () => { it('should respond with 5 reasons if the user has 5', async () => { - room.user.say('matt.erickson', '@hubot score for @matt.erickson'); - await wait(55); + room.user.say( + 'matt.erickson', + `@${roomRobot.name} score for @matt.erickson`, + ); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toMatch( - /<@matt\.erickson> has 227 points\.\nAccount Level: 1\nTotal Points Given: 13\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){5}/ - ); + const messageLines = room.messages[1][1].split('\n'); + expect(messageLines).toEqual([ + `<@matt.erickson> has 227 points.`, + `Account Level: 1`, + `Total Points Given: 13`, + `:birthday: ${capRobotName}day is Jul. 9th 2020`, + '', + `:star: Here are some reasons :star:`, + expect.any(String), + expect.any(String), + expect.any(String), + expect.any(String), + expect.any(String), + ]); }); it('should respond with 3 reasons if the user has 3', async () => { - room.user.say('matt.erickson.min', '@hubot score for @matt.erickson.min'); - await wait(55); + room.user.say( + 'matt.erickson.min', + `@${roomRobot.name} score for @matt.erickson.min`, + ); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toMatch( - /<@matt\.erickson\.min> has 8 points\.\nAccount Level: 1\nTotal Points Given: -2\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){3}/ - ); + const messageLines = room.messages[1][1].split('\n'); + expect(messageLines).toEqual([ + `<@matt.erickson.min> has 8 points.`, + `Account Level: 1`, + `Total Points Given: -2`, + `:birthday: ${capRobotName}day is Jul. 9th 2020`, + '', + `:star: Here are some reasons :star:`, + expect.any(String), + expect.any(String), + expect.any(String), + ]); }); it('should respond with 3 reasons if the user has 3 and token count', async () => { - room.user.say('peter.parker.min', '@hubot score for @peter.parker.min'); - await wait(55); + room.user.say( + 'peter.parker.min', + `@${roomRobot.name} score for @peter.parker.min`, + ); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toMatch( - /<@peter\.parker\.min> has 8 points \(\*8 Hubot Tokens\*\)\.\nAccount Level: 2\nTotal Points Given: -2\n:birthday: Hubotday is Jul. 9th 2020\n\n:star: Here are some reasons :star:(\n.*:.*){3}/ - ); + const messageLines = room.messages[1][1].split('\n'); + expect(messageLines).toEqual([ + `<@peter.parker.min> has 8 points (*8 ${capRobotName} Tokens*).`, + `Account Level: 2`, + `Total Points Given: -2`, + `:birthday: ${capRobotName}day is Jul. 9th 2020`, + '', + `:star: Here are some reasons :star:`, + expect.any(String), + expect.any(String), + expect.any(String), + ]); }); }); describe('respondWithLeaderLoserBoard', () => { it('should respond with top 2 leaders on the scoreboard', async () => { - room.user.say('matt.erickson', '@hubot top 2'); - await wait(55); + room.user.say('matt.erickson', `@${roomRobot.name} top 2`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toContain('\n1. <@matt.erickson>: 227\n2. <@peter.parker>: 200 (*200 Hubot Tokens*)'); + expect(room.messages[1][1]).toEqual( + `▇▁ +1. <@matt.erickson>: 227 +2. <@peter.parker>: 200 (*200 ${capRobotName} Tokens*)`, + ); }); it('should respond with bottom 2 losers on the scoreboard', async () => { - room.user.say('matt.erickson', '@hubot bottom 2'); - await wait(55); + room.user.say('matt.erickson', `@${roomRobot.name} bottom 2`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe('▁▇\n1. <@greg>: -10\n2. <@darf>: -2'); + expect(room.messages[1][1]).toBe(`▁▇ +1. <@greg>: -10 +2. <@darf>: -2`); }); it('should respond with top 2 leaders on the scoreboard if account level of one user is level 2', async () => { - room.user.say('matt.erickson', '@hubot top 2'); - await wait(55); + room.user.say('matt.erickson', `@${roomRobot.name} top 2`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toContain('\n1. <@matt.erickson>: 227\n2. <@peter.parker>: 200 (*200 Hubot Tokens*)'); + expect(room.messages[1][1]).toContain( + `\n1. <@matt.erickson>: 227\n2. <@peter.parker>: 200 (*200 ${capRobotName} Tokens*)`, + ); }); }); describe('respondWithLeaderLoserTokenBoard', () => { it('should respond with top 2 leaders on the scoreboard', async () => { - room.user.say('matt.erickson', '@hubot top tokens 2'); - await wait(55); + room.user.say('matt.erickson', `@${roomRobot.name} top tokens 2`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toContain( - '\n1. <@peter.parker>: *200 Hubot Tokens* (200 points)\n2. <@peter.parker.min>: *8 Hubot Tokens* (8 points)' + expect(room.messages[1][1]).toEqual( + `▇▁ +1. <@peter.parker>: *200 ${capRobotName} Tokens* (200 points) +2. <@peter.parker.min>: *8 ${capRobotName} Tokens* (8 points)`, ); }); it('should respond with bottom 2 leaders on the scoreboard', async () => { - room.user.say('matt.erickson', '@hubot bottom tokens 2'); - await wait(55); + room.user.say('matt.erickson', `@${roomRobot.name} bottom tokens 2`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toContain( - '\n1. <@peter.parker.min>: *8 Hubot Tokens* (8 points)\n2. <@peter.parker>: *200 Hubot Tokens* (200 points)' + `\n1. <@peter.parker.min>: *8 ${capRobotName} Tokens* (8 points)\n2. <@peter.parker>: *200 ${capRobotName} Tokens* (200 points)`, ); }); }); diff --git a/src/messageHandlers/tokens.test.js b/src/messageHandlers/tokens.test.js index 329e826..b980b9f 100644 --- a/src/messageHandlers/tokens.test.js +++ b/src/messageHandlers/tokens.test.js @@ -1,54 +1,48 @@ -const sinon = require('sinon'); - const TestHelper = require('hubot-test-helper'); -const SlackClient = require('@slack/client'); -const { H } = require('../lib/helpers'); -const { wait } = require('../../test/test_helpers'); +const { wait, mockSlackClient } = require('../../test/test_helpers'); describe('Tokens', () => { let room; let tokenHelper; + let roomRobot; beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - tokenHelper = new TestHelper('./messageHandlers/tokens.js'); + tokenHelper = new TestHelper('../../../src/messageHandlers/tokens.js'); }); - afterAll(async () => { - sinon.restore(); - }); + afterAll(async () => {}); beforeEach(async () => { - sinon - .stub(SlackClient, 'WebClient') - .withArgs('token') - .returns({ - users: { - info: sinon - .stub() - .returns({ user: { profile: { email: 'test@email.com' } } }), - }, - }); + mockSlackClient(); - sinon.stub(H, 'isA1Day').returns(false); + jest.mock('../lib/helpers', () => { + const actualHelpers = jest.requireActual('../lib/helpers'); + return { + ...actualHelpers, + isA1Day: jest.fn().mockReturnValue(false), + }; + }); room = tokenHelper.createRoom({ httpd: false }); + roomRobot = room.robot; }); afterEach(async () => { - sinon.restore(); room.destroy(); }); describe('giveTokenBetweenUsers', () => { - it("should add a X points when a user is + #'d", async () => { - room.user.say('peter.parker', '@hubot @peter.parker.min + 5'); - await wait(55); + it("should add n points when a user is + n'd", async () => { + room.user.say('peter.parker', `@${roomRobot.name} @peter.parker.min + 5`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe('<@peter.parker> transferred *5* hubot Tokens to <@peter.parker.min>.' + - '\n<@peter.parker.min> now has 13 tokens.' + - '\n_<@peter.parker> has 195 tokens_'); + expect(room.messages[1][1]).toBe( + `<@peter.parker> transferred *5* ${roomRobot.name} Tokens to <@peter.parker.min>.` + + '\n<@peter.parker.min> now has 13 tokens.' + + '\n_<@peter.parker> has 195 tokens_', + ); const to = await db .collection('scores') .findOne({ name: 'peter.parker.min' }); @@ -62,11 +56,16 @@ describe('Tokens', () => { }); it('should error and message if sender is short on tokens', async () => { - room.user.say('peter.parker.min', '@hubot @peter.parker + 55'); - await wait(55); + room.user.say( + 'peter.parker.min', + `@${roomRobot.name} @peter.parker + 55`, + ); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toMatch(/You don't have enough tokens to send 55 to peter.parker/); + expect(room.messages[1][1]).toMatch( + /You don't have enough tokens to send 55 to peter.parker/, + ); const to = await db .collection('scores') .findOne({ name: 'peter.parker' }); @@ -80,12 +79,15 @@ describe('Tokens', () => { }); it('should error and message if sender is not level 2', async () => { - room.user.say('matt.erickson.min', '@hubot @peter.parker + 55'); - await wait(55); + room.user.say( + 'matt.erickson.min', + `@${roomRobot.name} @peter.parker + 55`, + ); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toBe( - 'In order to send tokens to peter.parker you both must be, at least, level 2.' + 'In order to send tokens to peter.parker you both must be, at least, level 2.', ); const to = await db .collection('scores') @@ -100,12 +102,12 @@ describe('Tokens', () => { }); it('should error and message if recipient is not level 2', async () => { - room.user.say('peter.parker', '@hubot @matt.erickson + 55'); - await wait(55); + room.user.say('peter.parker', `@${roomRobot.name} @matt.erickson + 55`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); expect(room.messages[1][1]).toBe( - 'In order to send tokens to matt.erickson you both must be, at least, level 2.' + 'In order to send tokens to matt.erickson you both must be, at least, level 2.', ); const to = await db .collection('scores') @@ -120,13 +122,15 @@ describe('Tokens', () => { }); it('should error on second point (for spam check)', async () => { - room.user.say('peter.parker', '@hubot @peter.parker.min + 2'); - await wait(55); + room.user.say('peter.parker', `@${roomRobot.name} @peter.parker.min + 2`); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1].length).toBe(2); - expect(room.messages[1][1]).toBe('<@peter.parker> transferred *2* hubot Tokens to <@peter.parker.min>.' + - '\n<@peter.parker.min> now has 10 tokens.' + - '\n_<@peter.parker> has 198 tokens_'); + expect(room.messages[1][1]).toBe( + `<@peter.parker> transferred *2* ${roomRobot.name} Tokens to <@peter.parker.min>.` + + '\n<@peter.parker.min> now has 10 tokens.' + + '\n_<@peter.parker> has 198 tokens_', + ); const to = await db .collection('scores') .findOne({ name: 'peter.parker.min' }); @@ -137,8 +141,8 @@ describe('Tokens', () => { .findOne({ name: 'peter.parker' }); expect(from.score).toBe(200); expect(from.token).toBe(198); - room.user.say('peter.parker', '@hubot @peter.parker.min + 2'); - await wait(55); + room.user.say('peter.parker', `@${roomRobot.name} @peter.parker.min + 2`); + await wait(); const spamCheck = await db .collection('scoreLog') .findOne({ from: 'peter.parker' }); @@ -162,7 +166,9 @@ describe('Tokens', () => { _id: '1', date: '123', }); - expect(room.messages[3][1]).toBe("I'm sorry <@peter.parker>, I'm afraid I can't do that."); + expect(room.messages[3][1]).toBe( + "I'm sorry <@peter.parker>, I'm afraid I can't do that.", + ); }); }); }); diff --git a/src/messageHandlers/wallet.test.js b/src/messageHandlers/wallet.test.js index 0f5faaa..e8dca18 100644 --- a/src/messageHandlers/wallet.test.js +++ b/src/messageHandlers/wallet.test.js @@ -1,4 +1,3 @@ -const sinon = require('sinon'); const TestHelper = require('hubot-test-helper'); const { H } = require('../lib/helpers'); @@ -6,35 +5,37 @@ const { wait } = require('../../test/test_helpers'); describe('PlusPlus', () => { let room; - let db; let wallet; - let sandbox; + let capRobotName; + let roomRobot; beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - wallet = new TestHelper('./messageHandlers/wallet.js'); + wallet = new TestHelper('../../../src/messageHandlers/wallet.js'); }); beforeEach(async () => { - sandbox = sinon.createSandbox(); room = wallet.createRoom({ httpd: false }); + roomRobot = room.robot; + capRobotName = H.capitalizeFirstLetter(roomRobot.name); }); afterEach(async () => { - sandbox.restore(); room.destroy(); }); describe('upgrade my account', () => { it('should respond with message and level up account', async () => { room.name = 'D123'; - await room.user.say('matt.erickson', '@hubot upgrade my account'); - await wait(55); + await room.user.say( + 'matt.erickson', + `@${roomRobot.name} upgrade my account`, + ); + await wait(); expect(room.messages.length).toBe(2); expect(room.messages[1][1]).toBe( - `@matt.erickson matt.erickson, we are going to level up your account to Level 2! This means you will start getting ${H.capitalizeFirstLetter( - room.robot.name, - )} Tokens as well as points!` + `@matt.erickson matt.erickson, we are going to level up your account to Level 2! This means you will start getting ${capRobotName} Tokens as well as points!`, ); + const user = await db .collection('scores') .findOne({ name: 'matt.erickson' }); diff --git a/test/globalFixture.js b/test/globalTeardown.js similarity index 86% rename from test/globalFixture.js rename to test/globalTeardown.js index 80b7a6a..80fbed7 100644 --- a/test/globalFixture.js +++ b/test/globalTeardown.js @@ -1,10 +1,9 @@ const mongoUnit = require('mongo-unit'); const { MongoClient } = require('mongodb'); -const sinon = require('sinon'); + const testData = require('./mockData'); -// can be async or not -exports.mochaGlobalSetup = async function () { +module.exports = async function (_globalConfig, _projectConfig) { const url = await mongoUnit.start(); const client = new MongoClient(url, { useNewUrlParser: true, @@ -15,7 +14,7 @@ exports.mochaGlobalSetup = async function () { //stub the process.env pieces - sinon.stub(process, 'env').value({ + jest.mock(process, 'env').value({ ...process.env, MONGODB_URI: url, HUBOT_PEER_FEEDBACK_URL: `'Formal Praise' (company.formal-praise.com)`, diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 0000000..411f34b --- /dev/null +++ b/test/setup.js @@ -0,0 +1,45 @@ +const mongoUnit = require('mongo-unit'); +const fs = require('fs/promises'); + +const { MongoClient } = require('mongodb'); +const testData = require('./mockData'); +const { mockSlackClient, mockHubot } = require('./test_helpers'); + +beforeAll(async () => { + globalThis.testMongoPath = `./test/mongo-unit-tmp-${Math.floor( + Math.random() * 9999, + )}`; + await mongoUnit.start({ + port: Math.floor(Math.random() * 10000) + 27017, + dbpath: globalThis.testMongoPath, + }); + const client = new MongoClient(mongoUnit.getUrl(), { + useNewUrlParser: true, + useUnifiedTopology: true, + }); + const connection = await client.connect(); + globalThis.db = connection.db(); + await mongoUnit.load(testData); + + process.env.MONGODB_URI = mongoUnit.getUrl(); +}); + +beforeEach(async () => { + jest.resetAllMocks(); + jest.resetModules(); + mockSlackClient(); + globalThis.mockRobot = mockHubot(); + await mongoUnit.drop(); + await mongoUnit.load(testData); + process.env.HUBOT_PEER_FEEDBACK_URL = `'Formal Praise' (company.formal-praise.com)`; + process.env.HUBOT_SPAM_MESSAGE = 'Please slow your roll.'; + process.env.HUBOT_FURTHER_FEEDBACK_SCORE = 10; + process.env.SPAM_TIME_LIMIT = 5; +}); + +afterEach(async () => {}); + +afterAll(async () => { + await mongoUnit.stop(); + await fs.rm(globalThis.testMongoPath, { recursive: true }); +}); diff --git a/test/test_helpers.js b/test/test_helpers.js index c7e1b0b..1b20636 100644 --- a/test/test_helpers.js +++ b/test/test_helpers.js @@ -1,32 +1,52 @@ -const sinon = require('sinon'); - -const robotStub = { - brain: { - data: {}, - on() {}, - emit() {}, - save() {}, - }, - logger: { - debug() {}, - info() {}, - warning() {}, - error() {}, - }, - emit: (not) => not, - name: 'mockHubot', - messageRoom: (message) => message, - adapter: { - options: { - token: 'token', +const mockHubot = () => { + return { + brain: { + data: {}, + on: jest.fn(), + emit: jest.fn(), + save: jest.fn(), + }, + logger: { + debug: jest.fn(), + info: jest.fn(), + warning: jest.fn(), + error: jest.fn(), + }, + emit: jest.fn((not) => not), + name: 'hubot', + messageRoom: jest.fn((message) => message), + adapter: { + options: { + token: 'token', + }, }, - }, + }; }; -function wait(ms) { +function wait(ms = 150) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } -module.exports = { robotStub, wait }; +const mockSlackClient = () => { + jest.mock('@slack/web-api', () => { + const actual = jest.requireActual('@slack/web-api'); + return { + ...actual, + WebClient: jest.fn().mockReturnValue({ + users: { + info: jest.fn().mockResolvedValue({ + user: { + profile: { + email: 'test@email.com', + }, + }, + }), + }, + }), + }; + }); +}; + +module.exports = { mockHubot, wait, mockSlackClient }; From 7f1192959050cc17b2bbac0b1f5c9e1feb080032 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Tue, 2 Jan 2024 12:08:03 -0600 Subject: [PATCH 08/12] copy+pasta mess-up --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c398f01..22a3b4c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout repository - uses: actions/setup-node@v4 + uses: actions/checkout@v4 with: fetch-depth: 2 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a48ed5d..cd5fa4b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,7 +10,7 @@ jobs: name: Publish to npm runs-on: ubuntu-latest steps: - - uses: actions/setup-node@v4 + - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ff58a01..984a15e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: os: [ubuntu-latest] steps: - - uses: actions/setup-node@v4 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: From 56d3935486dfcc5b89076cb7f0e268dba20d9706 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Tue, 2 Jan 2024 12:11:48 -0600 Subject: [PATCH 09/12] renames --- src/lib/{Helpers.js => helpers.js} | 0 src/lib/{Helpers.test.js => helpers.test.js} | 0 src/lib/{MessageFactory.js => messageFactory.js} | 0 src/lib/{MessageFactory.test.js => messageFactory.test.js} | 0 src/lib/{RegExpPlusPlus.js => regExpPlusPlus.js} | 0 src/lib/{RegExpPlusPlus.test.js => regExpPlusPlus.test.js} | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename src/lib/{Helpers.js => helpers.js} (100%) rename src/lib/{Helpers.test.js => helpers.test.js} (100%) rename src/lib/{MessageFactory.js => messageFactory.js} (100%) rename src/lib/{MessageFactory.test.js => messageFactory.test.js} (100%) rename src/lib/{RegExpPlusPlus.js => regExpPlusPlus.js} (100%) rename src/lib/{RegExpPlusPlus.test.js => regExpPlusPlus.test.js} (100%) diff --git a/src/lib/Helpers.js b/src/lib/helpers.js similarity index 100% rename from src/lib/Helpers.js rename to src/lib/helpers.js diff --git a/src/lib/Helpers.test.js b/src/lib/helpers.test.js similarity index 100% rename from src/lib/Helpers.test.js rename to src/lib/helpers.test.js diff --git a/src/lib/MessageFactory.js b/src/lib/messageFactory.js similarity index 100% rename from src/lib/MessageFactory.js rename to src/lib/messageFactory.js diff --git a/src/lib/MessageFactory.test.js b/src/lib/messageFactory.test.js similarity index 100% rename from src/lib/MessageFactory.test.js rename to src/lib/messageFactory.test.js diff --git a/src/lib/RegExpPlusPlus.js b/src/lib/regExpPlusPlus.js similarity index 100% rename from src/lib/RegExpPlusPlus.js rename to src/lib/regExpPlusPlus.js diff --git a/src/lib/RegExpPlusPlus.test.js b/src/lib/regExpPlusPlus.test.js similarity index 100% rename from src/lib/RegExpPlusPlus.test.js rename to src/lib/regExpPlusPlus.test.js From a8208637e41c0ab8a5bd41506bbc4f6523f2e7f2 Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Tue, 2 Jan 2024 12:21:52 -0600 Subject: [PATCH 10/12] Fix pathing issue --- .github/workflows/publish.yml | 9 ++++----- .github/workflows/test.yml | 2 +- package.json | 1 + src/lib/services/database.js | 2 +- src/messageHandlers/helpMessage.test.js | 9 +++++++-- src/messageHandlers/plusplus.test.js | 10 ++++++++-- src/messageHandlers/scoreboard.test.js | 9 +++++++-- src/messageHandlers/tokens.test.js | 10 ++++++++-- src/messageHandlers/wallet.test.js | 9 +++++++-- test/test_helpers.js | 14 +++++++++++++- 10 files changed, 57 insertions(+), 18 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index cd5fa4b..a325dfc 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,10 +15,9 @@ jobs: with: node-version: 18 registry-url: https://registry.npmjs.org/ - - run: | - npm install - npm run build --if-present - npm test - npm publish --access public + - run: npm ci + - run: npm run build --if-present + - run: npm run test:ci + - run: npm publish --access public env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 984a15e..43f16f0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,4 +26,4 @@ jobs: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm run build --if-present - - run: npm test + - run: npm run test:ci diff --git a/package.json b/package.json index adf17d4..2dcb5ec 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ }, "scripts": { "test": "jest", + "test:ci": "CI=true jest", "test:watch": "npm run test -- --watch", "lint": "eslint .", "lint:watch": "esw . -w", diff --git a/src/lib/services/database.js b/src/lib/services/database.js index ea60044..001c6ed 100644 --- a/src/lib/services/database.js +++ b/src/lib/services/database.js @@ -144,7 +144,7 @@ class DatabaseService { }); robot.logger.debug('spam check result', previousScoreExists); if (previousScoreExists !== 0) { - robot.logger.error(`${from} is spamming points to ${to}! STOP THEM!!!!`); + robot.logger.error(`${from} is spamming points to ${to}! STOP 'EM!!!!`); return true; } diff --git a/src/messageHandlers/helpMessage.test.js b/src/messageHandlers/helpMessage.test.js index 13e53df..f174527 100644 --- a/src/messageHandlers/helpMessage.test.js +++ b/src/messageHandlers/helpMessage.test.js @@ -2,7 +2,10 @@ const TestHelper = require('hubot-test-helper'); const { H } = require('../lib/helpers'); const pjson = require('../../package.json'); -const { wait } = require('../../test/test_helpers'); +const { + wait, + relativeTestHelperPathHelper, +} = require('../../test/test_helpers'); describe('helpMessage', () => { let room; @@ -10,7 +13,9 @@ describe('helpMessage', () => { let roomRobot; beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - helpHelper = new TestHelper('../../../src/messageHandlers/helpMessage.js'); + helpHelper = new TestHelper( + `${relativeTestHelperPathHelper()}/messageHandlers/helpMessage.js`, + ); }); beforeEach(() => { diff --git a/src/messageHandlers/plusplus.test.js b/src/messageHandlers/plusplus.test.js index 99d0044..88daea5 100644 --- a/src/messageHandlers/plusplus.test.js +++ b/src/messageHandlers/plusplus.test.js @@ -1,7 +1,11 @@ const TestHelper = require('hubot-test-helper'); const { H } = require('../lib/helpers'); -const { wait, mockSlackClient } = require('../../test/test_helpers'); +const { + wait, + mockSlackClient, + relativeTestHelperPathHelper, +} = require('../../test/test_helpers'); describe('PlusPlus', () => { let room; @@ -9,7 +13,9 @@ describe('PlusPlus', () => { let emitSpy; beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - plusPlusHelper = new TestHelper('../../../src/messageHandlers/plusplus.js'); + plusPlusHelper = new TestHelper( + `${relativeTestHelperPathHelper()}/messageHandlers/plusplus.js`, + ); }); afterAll(async () => {}); diff --git a/src/messageHandlers/scoreboard.test.js b/src/messageHandlers/scoreboard.test.js index f45ca5d..bd8640d 100644 --- a/src/messageHandlers/scoreboard.test.js +++ b/src/messageHandlers/scoreboard.test.js @@ -1,7 +1,10 @@ const TestHelper = require('hubot-test-helper'); const { H } = require('../lib/helpers'); -const { wait } = require('../../test/test_helpers'); +const { + wait, + relativeTestHelperPathHelper, +} = require('../../test/test_helpers'); describe('Scoreboard', () => { let room; @@ -11,7 +14,9 @@ describe('Scoreboard', () => { beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - scoreboard = new TestHelper('../../../src/messageHandlers/scoreboard.js'); + scoreboard = new TestHelper( + `${relativeTestHelperPathHelper()}/messageHandlers/scoreboard.js`, + ); }); beforeEach(async () => { diff --git a/src/messageHandlers/tokens.test.js b/src/messageHandlers/tokens.test.js index b980b9f..7708b99 100644 --- a/src/messageHandlers/tokens.test.js +++ b/src/messageHandlers/tokens.test.js @@ -1,6 +1,10 @@ const TestHelper = require('hubot-test-helper'); -const { wait, mockSlackClient } = require('../../test/test_helpers'); +const { + wait, + mockSlackClient, + relativeTestHelperPathHelper, +} = require('../../test/test_helpers'); describe('Tokens', () => { let room; @@ -9,7 +13,9 @@ describe('Tokens', () => { beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - tokenHelper = new TestHelper('../../../src/messageHandlers/tokens.js'); + tokenHelper = new TestHelper( + `${relativeTestHelperPathHelper()}/messageHandlers/tokens.js`, + ); }); afterAll(async () => {}); diff --git a/src/messageHandlers/wallet.test.js b/src/messageHandlers/wallet.test.js index e8dca18..ff7cd1e 100644 --- a/src/messageHandlers/wallet.test.js +++ b/src/messageHandlers/wallet.test.js @@ -1,7 +1,10 @@ const TestHelper = require('hubot-test-helper'); const { H } = require('../lib/helpers'); -const { wait } = require('../../test/test_helpers'); +const { + wait, + relativeTestHelperPathHelper, +} = require('../../test/test_helpers'); describe('PlusPlus', () => { let room; @@ -10,7 +13,9 @@ describe('PlusPlus', () => { let roomRobot; beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - wallet = new TestHelper('../../../src/messageHandlers/wallet.js'); + wallet = new TestHelper( + `${relativeTestHelperPathHelper()}/messageHandlers/wallet.js`, + ); }); beforeEach(async () => { diff --git a/test/test_helpers.js b/test/test_helpers.js index 1b20636..95bf70c 100644 --- a/test/test_helpers.js +++ b/test/test_helpers.js @@ -49,4 +49,16 @@ const mockSlackClient = () => { }); }; -module.exports = { mockHubot, wait, mockSlackClient }; +function relativeTestHelperPathHelper() { + if (process.env.CI) { + return '.'; + } + return '../../../src'; +} + +module.exports = { + mockHubot, + wait, + mockSlackClient, + relativeTestHelperPathHelper, +}; From 53d779b30249e774ad71b84784af9f8002c2671f Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Tue, 2 Jan 2024 13:17:56 -0600 Subject: [PATCH 11/12] move to different package for testing --- package-lock.json | 1737 +++++++++++------------ package.json | 2 +- src/messageHandlers/helpMessage.test.js | 8 +- src/messageHandlers/plusplus.test.js | 6 +- src/messageHandlers/scoreboard.test.js | 4 +- src/messageHandlers/tokens.test.js | 5 +- src/messageHandlers/wallet.test.js | 4 +- test/test_helpers.js | 16 +- 8 files changed, 857 insertions(+), 925 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5888d18..c89c043 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-promise": "^6.1.1", "eslint-watch": "^8.0.0", - "hubot-test-helper": "github:vpeltola/hubot-test-helper#fixes-for-hubot-5.x", + "hubot-test-helper": "github:synyx/hubot-test-helper#update-hubot-10", "jest": "^29.7.0", "mock-env": "^0.2.0", "mongo-unit": "^3.3.0" @@ -169,27 +169,27 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.481.0.tgz", - "integrity": "sha512-yt3kDnsEixMEa1mQRRB0dbLfrmDgeLK/7/DEka23w0FdryAYm5eZzVpUtaUJpAd6x6FgJ5xuN7fpeXpzOnxI9A==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.484.0.tgz", + "integrity": "sha512-xjibqYYx8I8lYM17q3THMC8WpJihzio3+Wd6oAMdcaw+EBsgUcphsRHL5YO8wNEzNiMeXrXOPPUBapxpBmFPBA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.481.0", + "@aws-sdk/client-sts": "3.484.0", "@aws-sdk/core": "3.481.0", - "@aws-sdk/credential-provider-node": "3.481.0", + "@aws-sdk/credential-provider-node": "3.484.0", "@aws-sdk/middleware-host-header": "3.468.0", "@aws-sdk/middleware-logger": "3.468.0", "@aws-sdk/middleware-recursion-detection": "3.468.0", "@aws-sdk/middleware-signing": "3.468.0", "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/region-config-resolver": "3.484.0", "@aws-sdk/types": "3.468.0", "@aws-sdk/util-endpoints": "3.478.0", "@aws-sdk/util-user-agent-browser": "3.468.0", "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", + "@smithy/config-resolver": "^2.0.22", "@smithy/core": "^1.2.1", "@smithy/fetch-http-handler": "^2.3.1", "@smithy/hash-node": "^2.0.17", @@ -209,7 +209,7 @@ "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.23", - "@smithy/util-defaults-mode-node": "^2.0.30", + "@smithy/util-defaults-mode-node": "^2.0.31", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-retry": "^2.0.8", "@smithy/util-utf8": "^2.0.2", @@ -220,9 +220,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.481.0.tgz", - "integrity": "sha512-d+crFfW8HSDXa68MSfMDX6LH0J22P29SxJW4IGgRZKwHWEaSf4UjOP0mjA4V26R50suAV052/WBY6LjtGsZsHg==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.484.0.tgz", + "integrity": "sha512-eHKXDHqgPt99977hNissa1y/efwXZ9kg3EKPLK13b6VzTC8s0+Ih+YZemNE22ahw6SYnRiGglYdkdypJ/uPHkg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", @@ -232,12 +232,12 @@ "@aws-sdk/middleware-logger": "3.468.0", "@aws-sdk/middleware-recursion-detection": "3.468.0", "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/region-config-resolver": "3.484.0", "@aws-sdk/types": "3.468.0", "@aws-sdk/util-endpoints": "3.478.0", "@aws-sdk/util-user-agent-browser": "3.468.0", "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", + "@smithy/config-resolver": "^2.0.22", "@smithy/core": "^1.2.1", "@smithy/fetch-http-handler": "^2.3.1", "@smithy/hash-node": "^2.0.17", @@ -257,7 +257,7 @@ "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.23", - "@smithy/util-defaults-mode-node": "^2.0.30", + "@smithy/util-defaults-mode-node": "^2.0.31", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-retry": "^2.0.8", "@smithy/util-utf8": "^2.0.2", @@ -268,25 +268,25 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.481.0.tgz", - "integrity": "sha512-GSnJiceKpwLSEW5q2KRu9zHNJgtYysiy9Xkey0EKLKCdDRdM62yCJEFerAbvRRVJsF2LTSrmBmUl2zWB5RT8mw==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.484.0.tgz", + "integrity": "sha512-psQxH0mYhTVvZhfca3s9NbXgnuOM8l+5LtF7fZBF5y4xaPpfAPicPWp6po69J3ynwyXi/MpHNXd/13d/L09TTA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", "@aws-sdk/core": "3.481.0", - "@aws-sdk/credential-provider-node": "3.481.0", + "@aws-sdk/credential-provider-node": "3.484.0", "@aws-sdk/middleware-host-header": "3.468.0", "@aws-sdk/middleware-logger": "3.468.0", "@aws-sdk/middleware-recursion-detection": "3.468.0", "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/region-config-resolver": "3.484.0", "@aws-sdk/types": "3.468.0", "@aws-sdk/util-endpoints": "3.478.0", "@aws-sdk/util-user-agent-browser": "3.468.0", "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", + "@smithy/config-resolver": "^2.0.22", "@smithy/core": "^1.2.1", "@smithy/fetch-http-handler": "^2.3.1", "@smithy/hash-node": "^2.0.17", @@ -306,7 +306,7 @@ "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.23", - "@smithy/util-defaults-mode-node": "^2.0.30", + "@smithy/util-defaults-mode-node": "^2.0.31", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-middleware": "^2.0.8", "@smithy/util-retry": "^2.0.8", @@ -336,12 +336,12 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.481.0.tgz", - "integrity": "sha512-zuveZv/pK4wl/Pabq2233MmoGAqInSPaxRMvtLGKpIM1E7MGRiaIDfT2PelF62n2ptn4IceXE8xmoHNUDdKGkw==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.484.0.tgz", + "integrity": "sha512-kIusxi5f9jcNfLjNv/fv6eNRHN1bSQhN8nS31jBRemQL3zBuUePk50MqbciZUh29Rf/ATOVvH6UStaxnV6ivlg==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.481.0", + "@aws-sdk/client-cognito-identity": "3.484.0", "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.7.0", @@ -387,14 +387,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.481.0.tgz", - "integrity": "sha512-QXMlILewLV/yQHkyjXsu7PhvmTZIDAaQ4uAfhjnqbH1B8mErRpZKkzHWwp4yeZdTcHfenTVqoTnx9WDa+SnK/Q==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.484.0.tgz", + "integrity": "sha512-BbvU7seI0RPPwpujnz4LA1lC53Cj4BOSRpYYZbrxA6C7SzW0D/IQBZQP3JBbrxIhqewSROSsYGDjvYbyi5aDEw==", "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.468.0", "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.481.0", + "@aws-sdk/credential-provider-sso": "3.484.0", "@aws-sdk/credential-provider-web-identity": "3.468.0", "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -408,15 +408,15 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.481.0.tgz", - "integrity": "sha512-148Ztn2FjlS3VdGWJnAMjuXiZ55/tD823I/koawgp80LnDqMiKfmSGAioXIikqaBHl40K7ZvtBMqP/n/6GM41A==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.484.0.tgz", + "integrity": "sha512-Ylqej3FqRwUD3I7929k214LRH1bUz7f2hfV4ZqY7teM9hQC5Ov5SpVtOtLKNfgaaxAkhD2ffMNfmq8TAg824+g==", "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.468.0", - "@aws-sdk/credential-provider-ini": "3.481.0", + "@aws-sdk/credential-provider-ini": "3.484.0", "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.481.0", + "@aws-sdk/credential-provider-sso": "3.484.0", "@aws-sdk/credential-provider-web-identity": "3.468.0", "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -446,13 +446,13 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.481.0.tgz", - "integrity": "sha512-3MrSIQPQDOxhZDppC2XpOLVfuUm7iqRfTrwjSYGeWc//pUZtUI7nMXYjEDL+li5gvasw1lYfYX3VHNdwNnvyOQ==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.484.0.tgz", + "integrity": "sha512-Fl7+YhrlU2icZkz18z9aj4SiWb2aQlWp5LsVqMfSzTlJFc9yPlD9e7F33gnL7kKLVSnAVxsr5v4y4pFC6FZUSw==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.481.0", - "@aws-sdk/token-providers": "3.481.0", + "@aws-sdk/client-sso": "3.484.0", + "@aws-sdk/token-providers": "3.484.0", "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", @@ -479,21 +479,21 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.481.0.tgz", - "integrity": "sha512-bZfl50WtY9nYNuBb9KiP7Sm+C86dc8u40FkyNFFu7xzEmSmT2FVipjBSM63YjE6AKO23AKgTMU3tU9xTy5KRpw==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.484.0.tgz", + "integrity": "sha512-Yl4YPlML79TUir6QPUsgBWFwDu3FOiQGdAnN2eei4ce76ZI5JwPIiBNP0S2qK63R40CeoBqRlSIveBX9v10jjQ==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.481.0", - "@aws-sdk/client-sso": "3.481.0", - "@aws-sdk/client-sts": "3.481.0", - "@aws-sdk/credential-provider-cognito-identity": "3.481.0", + "@aws-sdk/client-cognito-identity": "3.484.0", + "@aws-sdk/client-sso": "3.484.0", + "@aws-sdk/client-sts": "3.484.0", + "@aws-sdk/credential-provider-cognito-identity": "3.484.0", "@aws-sdk/credential-provider-env": "3.468.0", "@aws-sdk/credential-provider-http": "3.481.0", - "@aws-sdk/credential-provider-ini": "3.481.0", - "@aws-sdk/credential-provider-node": "3.481.0", + "@aws-sdk/credential-provider-ini": "3.484.0", + "@aws-sdk/credential-provider-node": "3.484.0", "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.481.0", + "@aws-sdk/credential-provider-sso": "3.484.0", "@aws-sdk/credential-provider-web-identity": "3.468.0", "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -584,14 +584,14 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", - "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.484.0.tgz", + "integrity": "sha512-qfYSwSIc9GasHFrJidydlQE433mB93d31dfypFWhrJPXRv1fhopO72NSfsY2WCcbaRkADc4AajLZFly4J96abw==", "optional": true, "dependencies": { "@smithy/node-config-provider": "^2.1.8", "@smithy/types": "^2.7.0", - "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-config-provider": "^2.1.0", "@smithy/util-middleware": "^2.0.8", "tslib": "^2.5.0" }, @@ -600,9 +600,9 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.481.0.tgz", - "integrity": "sha512-G4ObHF2A/FlvQG7Lb/2sjuklG89IiH3TI1EiNZSzgu6TvY904Js72Slldls4VeJLY2zAnZgyZ9903pBMkDrcxQ==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.484.0.tgz", + "integrity": "sha512-9Eb7X0sNhJANfYCeEYWCvfeD4shMZEse3YUz5EALzbpzi/So56ZaeA/lWWeh0fkYiByq74eA2QkC/tXZkHw6EQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", @@ -611,12 +611,12 @@ "@aws-sdk/middleware-logger": "3.468.0", "@aws-sdk/middleware-recursion-detection": "3.468.0", "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/region-config-resolver": "3.484.0", "@aws-sdk/types": "3.468.0", "@aws-sdk/util-endpoints": "3.478.0", "@aws-sdk/util-user-agent-browser": "3.468.0", "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", + "@smithy/config-resolver": "^2.0.22", "@smithy/fetch-http-handler": "^2.3.1", "@smithy/hash-node": "^2.0.17", "@smithy/invalid-dependency": "^2.0.15", @@ -637,7 +637,7 @@ "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.23", - "@smithy/util-defaults-mode-node": "^2.0.30", + "@smithy/util-defaults-mode-node": "^2.0.31", "@smithy/util-endpoints": "^1.0.7", "@smithy/util-retry": "^2.0.8", "@smithy/util-utf8": "^2.0.2", @@ -853,27 +853,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", @@ -905,30 +884,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -1342,9 +1297,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1431,18 +1386,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", @@ -1980,15 +1923,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2809,12 +2743,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", - "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.16.tgz", + "integrity": "sha512-4foO7738k8kM9flMHu3VLabqu7nPgvIj8TB909S0CnKx0YZz/dcDH3pZ/4JHdatfxlZdKF1JWOYCw9+v3HVVsw==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -2822,15 +2756,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.22.tgz", - "integrity": "sha512-YuPjsLnq6I5ZQBTx6BL5NsCLtcLel5YIMf3gDeEa+GSCXn5mgRXm+8XO8HtjR3Xf69b88aY4c7bwKQQS2i8vtA==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.23.tgz", + "integrity": "sha512-XakUqgtP2YY8Mi+Nlif5BiqJgWdvfxJafSpOSQeCOMizu+PUhE4fBQSy6xFcR+eInrwVadaABNxoJyGUMn15ew==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/types": "^2.8.0", "@smithy/util-config-provider": "^2.1.0", - "@smithy/util-middleware": "^2.0.8", + "@smithy/util-middleware": "^2.0.9", "tslib": "^2.5.0" }, "engines": { @@ -2838,18 +2772,18 @@ } }, "node_modules/@smithy/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz", - "integrity": "sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.2.tgz", + "integrity": "sha512-uLjrskLT+mWb0emTR5QaiAIxVEU7ndpptDaVDrTwwhD+RjvHhjIiGQ3YL5jKk1a5VSDQUA2RGkXvJ6XKRcz6Dg==", "optional": true, "dependencies": { - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.25", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", - "@smithy/util-middleware": "^2.0.8", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-retry": "^2.0.26", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/protocol-http": "^3.0.12", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/util-middleware": "^2.0.9", "tslib": "^2.5.0" }, "engines": { @@ -2857,15 +2791,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", - "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.5.tgz", + "integrity": "sha512-VfvE6Wg1MUWwpTZFBnUD7zxvPhLY8jlHCzu6bCjlIYoWgXCDzZAML76IlZUEf45nib3rjehnFgg0s1rgsuN/bg==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/property-provider": "^2.0.16", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/property-provider": "^2.0.17", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", "tslib": "^2.5.0" }, "engines": { @@ -2873,37 +2807,37 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", - "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.16.tgz", + "integrity": "sha512-umYh5pdCE9GHgiMAH49zu9wXWZKNHHdKPm/lK22WYISTjqu29SepmpWNmPiBLy/yUu4HFEGJHIFrDWhbDlApaw==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", - "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.2.tgz", + "integrity": "sha512-O9R/OlnAOTsnysuSDjt0v2q6DcSvCz5cCFC/CFAWWcLyBwJDeFyGTCTszgpQTb19+Fi8uRwZE5/3ziAQBFeDMQ==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.11", - "@smithy/querystring-builder": "^2.0.15", - "@smithy/types": "^2.7.0", + "@smithy/protocol-http": "^3.0.12", + "@smithy/querystring-builder": "^2.0.16", + "@smithy/types": "^2.8.0", "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", - "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.18.tgz", + "integrity": "sha512-gN2JFvAgnZCyDN9rJgcejfpK0uPPJrSortVVVVWsru9whS7eQey6+gj2eM5ln2i6rHNntIXzal1Fm9XOPuoaKA==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" @@ -2913,12 +2847,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", - "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.16.tgz", + "integrity": "sha512-apEHakT/kmpNo1VFHP4W/cjfeP9U0x5qvfsLJubgp7UM/gq4qYp0GbqdE7QhsjUaYvEnrftRqs7+YrtWreV0wA==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" } }, @@ -2935,13 +2869,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", - "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.18.tgz", + "integrity": "sha512-ZJ9uKPTfxYheTKSKYB+GCvcj+izw9WGzRLhjn8n254q0jWLojUzn7Vw0l4R/Gq7Wdpf/qmk/ptD+6CCXHNVCaw==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", + "@smithy/protocol-http": "^3.0.12", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -2949,17 +2883,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", - "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.3.0.tgz", + "integrity": "sha512-VsOAG2YQ8ykjSmKO+CIXdJBIWFo6AAvG6Iw95BakBTqk66/4BI7XyqLevoNSq/lZ6NgZv24sLmrcIN+fLDWBCg==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.15", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/shared-ini-file-loader": "^2.2.7", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-middleware": "^2.0.8", + "@smithy/middleware-serde": "^2.0.16", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/shared-ini-file-loader": "^2.2.8", + "@smithy/types": "^2.8.0", + "@smithy/url-parser": "^2.0.16", + "@smithy/util-middleware": "^2.0.9", "tslib": "^2.5.0" }, "engines": { @@ -2967,18 +2901,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz", - "integrity": "sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.26.tgz", + "integrity": "sha512-Qzpxo0U5jfNiq9iD38U3e2bheXwvTEX4eue9xruIvEgh+UKq6dKuGqcB66oBDV7TD/mfoJi9Q/VmaiqwWbEp7A==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/protocol-http": "^3.0.11", - "@smithy/service-error-classification": "^2.0.8", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", - "@smithy/util-middleware": "^2.0.8", - "@smithy/util-retry": "^2.0.8", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/protocol-http": "^3.0.12", + "@smithy/service-error-classification": "^2.0.9", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", + "@smithy/util-middleware": "^2.0.9", + "@smithy/util-retry": "^2.0.9", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -2996,12 +2930,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", - "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.16.tgz", + "integrity": "sha512-5EAd4t30pcc4M8TSSGq7q/x5IKrxfXR5+SrU4bgxNy7RPHQo2PSWBUco9C+D9Tfqp/JZvprRpK42dnupZafk2g==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3009,12 +2943,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", - "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.10.tgz", + "integrity": "sha512-I2rbxctNq9FAPPEcuA1ntZxkTKOPQFy7YBPOaD/MLg1zCvzv21CoNxR0py6J8ZVC35l4qE4nhxB0f7TF5/+Ldw==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3022,14 +2956,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", - "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.9.tgz", + "integrity": "sha512-tUyW/9xrRy+s7RXkmQhgYkAPMpTIF8izK4orhHjNFEKR3QZiOCbWB546Y8iB/Fpbm3O9+q0Af9rpywLKJOwtaQ==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.16", - "@smithy/shared-ini-file-loader": "^2.2.7", - "@smithy/types": "^2.7.0", + "@smithy/property-provider": "^2.0.17", + "@smithy/shared-ini-file-loader": "^2.2.8", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3037,15 +2971,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", - "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.2.tgz", + "integrity": "sha512-XO58TO/Eul/IBQKFKaaBtXJi0ItEQQCT+NI4IiKHCY/4KtqaUT6y/wC1EvDqlA9cP7Dyjdj7FdPs4DyynH3u7g==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.15", - "@smithy/protocol-http": "^3.0.11", - "@smithy/querystring-builder": "^2.0.15", - "@smithy/types": "^2.7.0", + "@smithy/abort-controller": "^2.0.16", + "@smithy/protocol-http": "^3.0.12", + "@smithy/querystring-builder": "^2.0.16", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3053,12 +2987,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", - "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.17.tgz", + "integrity": "sha512-+VkeZbVu7qtQ2DjI48Qwaf9fPOr3gZIwxQpuLJgRRSkWsdSvmaTCxI3gzRFKePB63Ts9r4yjn4HkxSCSkdWmcQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3066,12 +3000,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", - "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.12.tgz", + "integrity": "sha512-Xz4iaqLiaBfbQpB9Hgi3VcZYbP7xRDXYhd8XWChh4v94uw7qwmvlxdU5yxzfm6ACJM66phHrTbS5TVvj5uQ72w==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3079,12 +3013,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", - "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.16.tgz", + "integrity": "sha512-Q/GsJT0C0mijXMRs7YhZLLCP5FcuC4797lYjKQkME5CZohnLC4bEhylAd2QcD3gbMKNjCw8+T2I27WKiV/wToA==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -3093,12 +3027,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", - "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.16.tgz", + "integrity": "sha512-c4ueAuL6BDYKWpkubjrQthZKoC3L5kql5O++ovekNxiexRXTlLIVlCR4q3KziOktLIw66EU9SQljPXd/oN6Okg==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3106,24 +3040,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", - "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.9.tgz", + "integrity": "sha512-0K+8GvtwI7VkGmmInPydM2XZyBfIqLIbfR7mDQ+oPiz8mIinuHbV6sxOLdvX1Jv/myk7XTK9orgt3tuEpBu/zg==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0" + "@smithy/types": "^2.8.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", - "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.8.tgz", + "integrity": "sha512-E62byatbwSWrtq9RJ7xN40tqrRKDGrEL4EluyNpaIDvfvet06a/QC58oHw2FgVaEgkj0tXZPjZaKrhPfpoU0qw==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3131,16 +3065,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.18.tgz", - "integrity": "sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.19.tgz", + "integrity": "sha512-nwc3JihdM+kcJjtORv/n7qRHN2Kfh7S2RJI2qr8pz9UcY5TD8rSCRGQ0g81HgyS3jZ5X9U/L4p014P3FonBPhg==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.15", + "@smithy/eventstream-codec": "^2.0.16", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.8", + "@smithy/util-middleware": "^2.0.9", "@smithy/util-uri-escape": "^2.0.0", "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" @@ -3150,16 +3084,16 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz", - "integrity": "sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.1.tgz", + "integrity": "sha512-SpD7FLK92XV2fon2hMotaNDa2w5VAy5/uVjP9WFmjGSgWM8pTPVkHcDl1yFs5Z8LYbij0FSz+DbCBK6i+uXXUA==", "optional": true, "dependencies": { - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", - "@smithy/util-stream": "^2.0.23", + "@smithy/middleware-endpoint": "^2.3.0", + "@smithy/middleware-stack": "^2.0.10", + "@smithy/protocol-http": "^3.0.12", + "@smithy/types": "^2.8.0", + "@smithy/util-stream": "^2.0.24", "tslib": "^2.5.0" }, "engines": { @@ -3167,9 +3101,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", - "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.8.0.tgz", + "integrity": "sha512-h9sz24cFgt/W1Re22OlhQKmUZkNh244ApgRsUDYinqF8R+QgcsBIX344u2j61TPshsTz3CvL6HYU1DnQdsSrHA==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -3179,13 +3113,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", - "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.16.tgz", + "integrity": "sha512-Wfz5WqAoRT91TjRy1JeLR0fXtkIXHGsMbgzKFTx7E68SrZ55TB8xoG+vm11Ru4gheFTMXjAjwAxv1jQdC+pAQA==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.15", - "@smithy/types": "^2.7.0", + "@smithy/querystring-parser": "^2.0.16", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" } }, @@ -3249,14 +3183,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz", - "integrity": "sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w==", + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.24.tgz", + "integrity": "sha512-TsP5mBuLgO2C21+laNG2nHYZEyUdkbGURv2tHvSuQQxLz952MegX95uwdxOY2jR2H4GoKuVRfdJq7w4eIjGYeg==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.16", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", + "@smithy/property-provider": "^2.0.17", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -3265,17 +3199,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.31.tgz", - "integrity": "sha512-ZwdjAJAFkkQQ4hdE8HOcxFAWC3GPFXQ3yQ8IBwHH5nQBlr9q+p5eRQ7Y8iRRORJe4vksR+NASRXZ+E81Us1aXQ==", + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.32.tgz", + "integrity": "sha512-d0S33dXA2cq1NyorVMroMrEtqKMr3MlyLITcfTBf9pXiigYiPMOtbSI7czHIfDbuVuM89Cg0urAgpt73QV9mPQ==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.22", - "@smithy/credential-provider-imds": "^2.1.4", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/property-provider": "^2.0.16", - "@smithy/smithy-client": "^2.2.0", - "@smithy/types": "^2.7.0", + "@smithy/config-resolver": "^2.0.23", + "@smithy/credential-provider-imds": "^2.1.5", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/property-provider": "^2.0.17", + "@smithy/smithy-client": "^2.2.1", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3283,13 +3217,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", - "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.8.tgz", + "integrity": "sha512-l8zVuyZZ61IzZBYp5NWvsAhbaAjYkt0xg9R4xUASkg5SEeTT2meHOJwJHctKMFUXe4QZbn9fR2MaBYjP2119+w==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", + "@smithy/node-config-provider": "^2.1.9", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3309,12 +3243,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", - "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.9.tgz", + "integrity": "sha512-PnCnBJ07noMX1lMDTEefmxSlusWJUiLfrme++MfK5TD0xz8NYmakgoXy5zkF/16zKGmiwOeKAztWT/Vjk1KRIQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3322,13 +3256,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", - "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.9.tgz", + "integrity": "sha512-46BFWe9RqB6g7f4mxm3W3HlqknqQQmWHKlhoqSFZuGNuiDU5KqmpebMbvC3tjTlUkqn4xa2Z7s3Hwb0HNs5scw==", "optional": true, "dependencies": { - "@smithy/service-error-classification": "^2.0.8", - "@smithy/types": "^2.7.0", + "@smithy/service-error-classification": "^2.0.9", + "@smithy/types": "^2.8.0", "tslib": "^2.5.0" }, "engines": { @@ -3336,14 +3270,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", - "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.24.tgz", + "integrity": "sha512-hRpbcRrOxDriMVmbya+Mv77VZVupxRAsfxVDKS54XuiURhdiwCUXJP0X1iJhHinuUf6n8pBF0MkG9C8VooMnWw==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/types": "^2.7.0", + "@smithy/fetch-http-handler": "^2.3.2", + "@smithy/node-http-handler": "^2.2.2", + "@smithy/types": "^2.8.0", "@smithy/util-base64": "^2.0.1", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -3380,9 +3314,9 @@ } }, "node_modules/@snyk/protect": { - "version": "1.1266.0", - "resolved": "https://registry.npmjs.org/@snyk/protect/-/protect-1.1266.0.tgz", - "integrity": "sha512-SDrW7b4x4NQG/0aylXTi6QqMopXB1Kogga6bNp31lmR00eitGssINEoEBJMyXz4uj0cKDu/PzpwdNHDP6/ntbA==", + "version": "1.1267.0", + "resolved": "https://registry.npmjs.org/@snyk/protect/-/protect-1.1267.0.tgz", + "integrity": "sha512-GV+PyMS9WdSQw6f3jYroO5xQ7bnx3aL5N4CowlQ/f/A1z7cGiA4E7wQyjZy4utohJ+O4z1naMPP2/Zr5IGlqOg==", "bin": { "snyk-protect": "bin/snyk-protect" }, @@ -3552,9 +3486,9 @@ "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==" }, "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dependencies": { "undici-types": "~5.26.4" } @@ -3699,6 +3633,39 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", @@ -3747,6 +3714,39 @@ "node": ">=4.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", @@ -3764,18 +3764,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -4066,6 +4054,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4119,14 +4108,17 @@ "peer": true }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "node_modules/async-mutex": { @@ -4143,6 +4135,7 @@ "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", "dev": true, + "peer": true, "dependencies": { "has-symbols": "^1.0.3" } @@ -4281,15 +4274,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", @@ -4748,15 +4732,65 @@ "node": ">=6.14.2" } }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, + "peer": true, "dependencies": { "semver": "^7.0.0" } }, + "node_modules/builtins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "peer": true + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4856,15 +4890,12 @@ } }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/caniuse-lite": { @@ -4955,6 +4986,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -5056,13 +5099,18 @@ "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, - "node_modules/cline": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/cline/-/cline-0.8.2.tgz", - "integrity": "sha512-xcRdiR3vm9XdLmsMkK3XkKOHzOmKxl8eVTO739O6KinC0kRdCGV4jYnItccNMReymKYhQ9obOlMscic5spP3mQ==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">=12" } }, "node_modules/clone-response": { @@ -5640,10 +5688,11 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "peer": true }, "node_modules/encodeurl": { "version": "1.0.2", @@ -5736,6 +5785,7 @@ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, + "peer": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", @@ -5912,6 +5962,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-airbnb": { "version": "19.0.4", "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", @@ -5952,15 +6015,6 @@ "eslint-plugin-import": "^2.25.2" } }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", @@ -6067,6 +6121,27 @@ "eslint": ">=4.19.1" } }, + "node_modules/eslint-plugin-es-x": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", @@ -6119,19 +6194,10 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jest": { - "version": "27.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", - "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "version": "27.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.1.tgz", + "integrity": "sha512-WEYkyVXD9NlmFBKvrkmzrC+C9yZoz5pAml2hO19PlS3spJtoiwj4p2u8spd/7zx5IvRsZsCmsoImaAvBB9X93Q==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -6184,30 +6250,27 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "peer": true - }, "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.1.tgz", + "integrity": "sha512-M1kE5bVQRLBMDYRZwDhWzlzbp370SRRRC1MHqq4I3L2Tatey+9/2csc5mwLDPlmhJaDvkojbrNUME5/llpRyDg==", "dev": true, + "peer": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" }, "engines": { - "node": ">=12.22.0" + "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" @@ -6216,66 +6279,41 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "node_modules/eslint-plugin-n/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "peer": true, "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "node": ">=10" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "peer": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "lru-cache": "^6.0.0" }, - "engines": { - "node": ">=6" + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/eslint-plugin-n/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } + "peer": true }, "node_modules/eslint-plugin-node": { "version": "11.1.0", @@ -6297,15 +6335,6 @@ "eslint": ">=5.16.0" } }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-prettier": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz", @@ -6353,6 +6382,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, + "peer": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", @@ -6396,6 +6426,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -6408,6 +6439,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "peer": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6420,15 +6452,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -6470,12 +6493,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-watch": { @@ -6505,30 +6531,6 @@ "eslint": ">=8 <9.0.0" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -6546,18 +6548,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -7010,6 +7000,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -7181,6 +7183,21 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -7223,9 +7240,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -7430,18 +7447,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -7469,6 +7474,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "peer": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -7497,15 +7515,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/global": { @@ -7870,27 +7888,23 @@ } }, "node_modules/hubot": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hubot/-/hubot-6.0.0.tgz", - "integrity": "sha512-Tk7/AoLEmtDU/zyGNpEH5oCrkJDZSpEDQ6AByPS974aLkufyGTjtrrBOhoavQgJZm7s43Z9Rh0Nbkof2M+FETQ==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/hubot/-/hubot-10.0.5.tgz", + "integrity": "sha512-vs6PuWb4B+7ZtUEUozF0rT5jQxHLPovTZ0MeTZ1TpRx4jTvLY0cZBIBBVjr09iSnuIhqRQD5QSA0NBBZhqypdA==", "dev": true, "dependencies": { - "async": "^3.2.4", - "cline": "^0.8.2", "coffeescript": "^2.7.0", "connect-multiparty": "^2.2.0", "express": "^4.18.2", "express-basic-auth": "^1.2.1", - "optparse": "^1.0.5", - "pino": "^8.11.0", - "standard": "^17.1.0" + "pino": "^8.11.0" }, "bin": { "hubot": "bin/hubot" }, "engines": { - "node": "> 4.0.0", - "npm": "> 2.0.0" + "node": ">= 18", + "npm": ">= 9" } }, "node_modules/hubot-conversation": { @@ -7902,11 +7916,14 @@ } }, "node_modules/hubot-test-helper": { - "resolved": "git+ssh://git@github.com/vpeltola/hubot-test-helper.git#d7a6e13c6680349a933a74d7f56364df6c376f32", + "resolved": "git+ssh://git@github.com/synyx/hubot-test-helper.git#2bff37184986bc97e7b44695d00608a684076817", "dev": true, "license": "MIT", "dependencies": { - "hubot": ">=5.0.0 <7.0.0 || 0.0.0-development" + "hubot": "^10.0.5" + }, + "engines": { + "node": ">=20" } }, "node_modules/human-signals": { @@ -8101,6 +8118,7 @@ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8151,6 +8169,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "peer": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -8208,6 +8242,7 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -8278,6 +8313,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8348,6 +8384,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "dev": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8426,6 +8463,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "dev": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8447,6 +8485,7 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -8497,33 +8536,51 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { - "semver": "^7.5.3" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -8558,6 +8615,7 @@ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, + "peer": true, "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -8670,47 +8728,6 @@ } } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -8756,24 +8773,6 @@ } } }, - "node_modules/jest-config/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -9054,15 +9053,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", @@ -9094,6 +9084,39 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -9128,6 +9151,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", @@ -9285,12 +9320,6 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -9319,15 +9348,15 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonfile": { @@ -9357,6 +9386,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "peer": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -9481,31 +9511,6 @@ "uc.micro": "^1.0.1" } }, - "node_modules/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -9567,6 +9572,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, + "peer": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -9586,15 +9592,12 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/luxon": { @@ -9606,29 +9609,53 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -9853,11 +9880,6 @@ "yallist": "^3.0.0" } }, - "node_modules/minipass/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/minizlib": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", @@ -10100,6 +10122,30 @@ "ieee754": "^1.1.13" } }, + "node_modules/mongodb-memory-server-core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mongodb-memory-server-core/node_modules/mongodb": { "version": "4.17.2", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.2.tgz", @@ -10118,6 +10164,27 @@ "@mongodb-js/saslprep": "^1.1.0" } }, + "node_modules/mongodb-memory-server-core/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10524,6 +10591,7 @@ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, + "peer": true, "dependencies": { "define-properties": "^1.2.0", "es-abstract": "^1.22.1" @@ -10618,12 +10686,6 @@ "node": ">= 0.8.0" } }, - "node_modules/optparse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/optparse/-/optparse-1.0.5.tgz", - "integrity": "sha512-WfnNWLS3vr8omCm8nKYKaRbapuy6pEbx1O0B+eP5sUf/a++sT9/h8PflqBoHsY9N+YdzUT12T8snXigq13QpJg==", - "dev": true - }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -10728,16 +10790,21 @@ "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parseurl": { @@ -10838,15 +10905,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pino": { "version": "8.17.2", "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.2.tgz", @@ -10894,80 +10952,6 @@ "node": ">= 6" } }, - "node_modules/pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -11046,15 +11030,6 @@ "node": ">= 0.12.0" } }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -11139,12 +11114,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11177,12 +11146,20 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "peer": true + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -11368,9 +11345,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "node_modules/readable-stream": { @@ -11415,6 +11392,7 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -11586,6 +11564,16 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -11775,18 +11763,12 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/send": { @@ -12157,96 +12139,6 @@ "node": ">=8" } }, - "node_modules/standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.0.tgz", - "integrity": "sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "eslint": "^8.41.0", - "eslint-config-standard": "17.1.0", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.32.2", - "standard-engine": "^15.0.0", - "version-guard": "^1.1.1" - }, - "bin": { - "standard": "bin/cmd.cjs" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-engine": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", - "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.6", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard/node_modules/eslint-config-standard-jsx": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", - "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peerDependencies": { - "eslint": "^8.8.0", - "eslint-plugin-react": "^7.28.0" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -12328,11 +12220,18 @@ "node": ">=8" } }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -12406,12 +12305,12 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-final-newline": { @@ -12671,11 +12570,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/tar/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/temp-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz", @@ -12801,6 +12695,27 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -13186,15 +13101,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/version-guard": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.1.tgz", - "integrity": "sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ==", - "dev": true, - "engines": { - "node": ">=0.10.48" - } - }, "node_modules/walk-back": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz", @@ -13681,6 +13587,7 @@ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", "dev": true, + "peer": true, "dependencies": { "function.prototype.name": "^1.1.5", "has-tostringtag": "^1.0.0", @@ -13707,6 +13614,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "dev": true, + "peer": true, "dependencies": { "is-map": "^2.0.1", "is-set": "^2.0.1", @@ -13778,15 +13686,6 @@ "async-limiter": "~1.0.0" } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/xhr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", @@ -13851,10 +13750,36 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/yauzl": { "version": "2.10.0", diff --git a/package.json b/package.json index 2dcb5ec..0a15c86 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-promise": "^6.1.1", "eslint-watch": "^8.0.0", - "hubot-test-helper": "github:vpeltola/hubot-test-helper#fixes-for-hubot-5.x", + "hubot-test-helper": "github:synyx/hubot-test-helper#update-hubot-10", "jest": "^29.7.0", "mock-env": "^0.2.0", "mongo-unit": "^3.3.0" diff --git a/src/messageHandlers/helpMessage.test.js b/src/messageHandlers/helpMessage.test.js index f174527..502dc26 100644 --- a/src/messageHandlers/helpMessage.test.js +++ b/src/messageHandlers/helpMessage.test.js @@ -14,13 +14,13 @@ describe('helpMessage', () => { beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; helpHelper = new TestHelper( - `${relativeTestHelperPathHelper()}/messageHandlers/helpMessage.js`, + relativeTestHelperPathHelper('src/messageHandlers/helpMessage.js'), ); }); - beforeEach(() => { + beforeEach(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; - room = helpHelper.createRoom({ httpd: false }); + room = await helpHelper.createRoom({ httpd: false }); roomRobot = room.robot; }); @@ -34,7 +34,7 @@ describe('helpMessage', () => { const url = 'https://derp.com'; room.destroy(); process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = url; - room = helpHelper.createRoom({ httpd: false }); + room = await helpHelper.createRoom({ httpd: false }); room.user.say('peter.nguyen', `@${roomRobot.name} -h`); await wait(); expect(room.messages.length).toBe(2); diff --git a/src/messageHandlers/plusplus.test.js b/src/messageHandlers/plusplus.test.js index 88daea5..1053744 100644 --- a/src/messageHandlers/plusplus.test.js +++ b/src/messageHandlers/plusplus.test.js @@ -14,13 +14,13 @@ describe('PlusPlus', () => { beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; plusPlusHelper = new TestHelper( - `${relativeTestHelperPathHelper()}/messageHandlers/plusplus.js`, + relativeTestHelperPathHelper('src/messageHandlers/plusplus.js'), ); }); afterAll(async () => {}); - beforeEach(() => { + beforeEach(async () => { mockSlackClient(); jest.mock('../lib/helpers', () => { const actual = jest.requireActual('../lib/helpers'); @@ -29,7 +29,7 @@ describe('PlusPlus', () => { isA1Day: jest.fn().mockReturnValue(false), }; }); - room = plusPlusHelper.createRoom({ httpd: false }); + room = await plusPlusHelper.createRoom({ httpd: false }); emitSpy = jest.spyOn(room.robot, 'emit'); }); diff --git a/src/messageHandlers/scoreboard.test.js b/src/messageHandlers/scoreboard.test.js index bd8640d..75f6a19 100644 --- a/src/messageHandlers/scoreboard.test.js +++ b/src/messageHandlers/scoreboard.test.js @@ -15,12 +15,12 @@ describe('Scoreboard', () => { beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; scoreboard = new TestHelper( - `${relativeTestHelperPathHelper()}/messageHandlers/scoreboard.js`, + relativeTestHelperPathHelper('src/messageHandlers/scoreboard.js'), ); }); beforeEach(async () => { - room = scoreboard.createRoom({ httpd: false }); + room = await scoreboard.createRoom({ httpd: false }); roomRobot = room.robot; capRobotName = H.capitalizeFirstLetter(roomRobot.name); }); diff --git a/src/messageHandlers/tokens.test.js b/src/messageHandlers/tokens.test.js index 7708b99..4cced45 100644 --- a/src/messageHandlers/tokens.test.js +++ b/src/messageHandlers/tokens.test.js @@ -14,7 +14,7 @@ describe('Tokens', () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; tokenHelper = new TestHelper( - `${relativeTestHelperPathHelper()}/messageHandlers/tokens.js`, + relativeTestHelperPathHelper('src/messageHandlers/tokens.js'), ); }); @@ -30,7 +30,7 @@ describe('Tokens', () => { isA1Day: jest.fn().mockReturnValue(false), }; }); - room = tokenHelper.createRoom({ httpd: false }); + room = await tokenHelper.createRoom({ httpd: false }); roomRobot = room.robot; }); @@ -40,6 +40,7 @@ describe('Tokens', () => { describe('giveTokenBetweenUsers', () => { it("should add n points when a user is + n'd", async () => { + console.log(`$$$$ === room tokens.test.js [43] ===`, room); room.user.say('peter.parker', `@${roomRobot.name} @peter.parker.min + 5`); await wait(); expect(room.messages.length).toBe(2); diff --git a/src/messageHandlers/wallet.test.js b/src/messageHandlers/wallet.test.js index ff7cd1e..de39dcc 100644 --- a/src/messageHandlers/wallet.test.js +++ b/src/messageHandlers/wallet.test.js @@ -14,12 +14,12 @@ describe('PlusPlus', () => { beforeAll(async () => { process.env.HUBOT_CRYPTO_FURTHER_HELP_URL = undefined; wallet = new TestHelper( - `${relativeTestHelperPathHelper()}/messageHandlers/wallet.js`, + relativeTestHelperPathHelper('src/messageHandlers/wallet.js'), ); }); beforeEach(async () => { - room = wallet.createRoom({ httpd: false }); + room = await wallet.createRoom({ httpd: false }); roomRobot = room.robot; capRobotName = H.capitalizeFirstLetter(roomRobot.name); }); diff --git a/test/test_helpers.js b/test/test_helpers.js index 95bf70c..4f9bfdb 100644 --- a/test/test_helpers.js +++ b/test/test_helpers.js @@ -1,3 +1,5 @@ +const path = require('path'); + const mockHubot = () => { return { brain: { @@ -49,11 +51,15 @@ const mockSlackClient = () => { }); }; -function relativeTestHelperPathHelper() { - if (process.env.CI) { - return '.'; - } - return '../../../src'; +function relativeTestHelperPathHelper(file) { + const fileDirectory = path.join(__dirname, '..', file); + console.log(`$$$$ === process.env test_helpers.js [53] ===`, fileDirectory); + // return path.resolve(currentDirectory, file); + return fileDirectory; + // if (process.env.CI) { + // return '.'; + // } + // return '../../../src'; } module.exports = { From bbb6db007b7d48246e1e6f6a0334020fb992fd9c Mon Sep 17 00:00:00 2001 From: Matt O'Keefe Date: Tue, 2 Jan 2024 13:19:46 -0600 Subject: [PATCH 12/12] Pulling debug consoles --- src/messageHandlers/tokens.test.js | 1 - test/test_helpers.js | 6 ------ 2 files changed, 7 deletions(-) diff --git a/src/messageHandlers/tokens.test.js b/src/messageHandlers/tokens.test.js index 4cced45..c6d1efd 100644 --- a/src/messageHandlers/tokens.test.js +++ b/src/messageHandlers/tokens.test.js @@ -40,7 +40,6 @@ describe('Tokens', () => { describe('giveTokenBetweenUsers', () => { it("should add n points when a user is + n'd", async () => { - console.log(`$$$$ === room tokens.test.js [43] ===`, room); room.user.say('peter.parker', `@${roomRobot.name} @peter.parker.min + 5`); await wait(); expect(room.messages.length).toBe(2); diff --git a/test/test_helpers.js b/test/test_helpers.js index 4f9bfdb..961d5ca 100644 --- a/test/test_helpers.js +++ b/test/test_helpers.js @@ -53,13 +53,7 @@ const mockSlackClient = () => { function relativeTestHelperPathHelper(file) { const fileDirectory = path.join(__dirname, '..', file); - console.log(`$$$$ === process.env test_helpers.js [53] ===`, fileDirectory); - // return path.resolve(currentDirectory, file); return fileDirectory; - // if (process.env.CI) { - // return '.'; - // } - // return '../../../src'; } module.exports = {